From d8d2ab6a6948481bca3ed158adb0a98851b3d41a Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Tue, 15 Oct 2019 10:32:58 -0400 Subject: [PATCH 01/42] new build process for brownser/cdn --- demo/index.html | 12 +- package-lock.json | 73 ++++++++++- package.json | 3 + roll.js | 213 ++++++++++++++++++++++++++++++++ src/languages/1c.js | 2 +- src/languages/abnf.js | 2 +- src/languages/accesslog.js | 2 +- src/languages/actionscript.js | 2 +- src/languages/ada.js | 2 +- src/languages/angelscript.js | 2 +- src/languages/apache.js | 2 +- src/languages/applescript.js | 2 +- src/languages/arcade.js | 2 +- src/languages/arduino.js | 2 +- src/languages/armasm.js | 2 +- src/languages/asciidoc.js | 2 +- src/languages/aspectj.js | 2 +- src/languages/autohotkey.js | 4 +- src/languages/autoit.js | 2 +- src/languages/avrasm.js | 2 +- src/languages/awk.js | 2 +- src/languages/axapta.js | 2 +- src/languages/bash.js | 2 +- src/languages/basic.js | 3 +- src/languages/bnf.js | 2 +- src/languages/brainfuck.js | 2 +- src/languages/cal.js | 2 +- src/languages/capnproto.js | 2 +- src/languages/ceylon.js | 2 +- src/languages/clean.js | 2 +- src/languages/clojure-repl.js | 2 +- src/languages/clojure.js | 2 +- src/languages/cmake.js | 2 +- src/languages/coffeescript.js | 2 +- src/languages/coq.js | 2 +- src/languages/cos.js | 2 +- src/languages/cpp.js | 2 +- src/languages/crmsh.js | 2 +- src/languages/crystal.js | 2 +- src/languages/csharp.js | 2 +- src/languages/csp.js | 2 +- src/languages/css.js | 2 +- src/languages/d.js | 2 +- src/languages/dart.js | 2 +- src/languages/delphi.js | 2 +- src/languages/diff.js | 2 +- src/languages/django.js | 2 +- src/languages/dns.js | 2 +- src/languages/dockerfile.js | 2 +- src/languages/dos.js | 2 +- src/languages/dsconfig.js | 2 +- src/languages/dts.js | 2 +- src/languages/dust.js | 2 +- src/languages/ebnf.js | 2 +- src/languages/elixir.js | 2 +- src/languages/elm.js | 2 +- src/languages/erb.js | 2 +- src/languages/erlang-repl.js | 2 +- src/languages/erlang.js | 2 +- src/languages/excel.js | 2 +- src/languages/fix.js | 2 +- src/languages/flix.js | 2 +- src/languages/fortran.js | 2 +- src/languages/fsharp.js | 2 +- src/languages/gams.js | 2 +- src/languages/gauss.js | 2 +- src/languages/gcode.js | 2 +- src/languages/gherkin.js | 2 +- src/languages/glsl.js | 2 +- src/languages/gml.js | 2 +- src/languages/go.js | 2 +- src/languages/golo.js | 2 +- src/languages/gradle.js | 2 +- src/languages/groovy.js | 2 +- src/languages/haml.js | 2 +- src/languages/handlebars.js | 3 +- src/languages/haskell.js | 2 +- src/languages/haxe.js | 2 +- src/languages/hsp.js | 2 +- src/languages/htmlbars.js | 2 +- src/languages/http.js | 2 +- src/languages/hy.js | 2 +- src/languages/inform7.js | 2 +- src/languages/ini.js | 2 +- src/languages/irpf90.js | 2 +- src/languages/isbl.js | 2 +- src/languages/java.js | 2 +- src/languages/javascript.js | 2 +- src/languages/jboss-cli.js | 2 +- src/languages/json.js | 2 +- src/languages/julia-repl.js | 2 +- src/languages/julia.js | 2 +- src/languages/kotlin.js | 2 +- src/languages/lasso.js | 2 +- src/languages/latex.js | 2 +- src/languages/ldif.js | 2 +- src/languages/leaf.js | 2 +- src/languages/less.js | 2 +- src/languages/lisp.js | 2 +- src/languages/livecodeserver.js | 2 +- src/languages/livescript.js | 2 +- src/languages/llvm.js | 2 +- src/languages/lsl.js | 2 +- src/languages/lua.js | 2 +- src/languages/makefile.js | 2 +- src/languages/markdown.js | 2 +- src/languages/mathematica.js | 2 +- src/languages/matlab.js | 2 +- src/languages/maxima.js | 2 +- src/languages/mel.js | 2 +- src/languages/mercury.js | 2 +- src/languages/mipsasm.js | 2 +- src/languages/mizar.js | 2 +- src/languages/mojolicious.js | 2 +- src/languages/monkey.js | 2 +- src/languages/moonscript.js | 2 +- src/languages/n1ql.js | 2 +- src/languages/nginx.js | 2 +- src/languages/nim.js | 2 +- src/languages/nix.js | 2 +- src/languages/nsis.js | 2 +- src/languages/objectivec.js | 2 +- src/languages/ocaml.js | 2 +- src/languages/openscad.js | 2 +- src/languages/oxygene.js | 2 +- src/languages/parser3.js | 2 +- src/languages/perl.js | 2 +- src/languages/pf.js | 2 +- src/languages/pgsql.js | 2 +- src/languages/php.js | 2 +- src/languages/plaintext.js | 2 +- src/languages/pony.js | 2 +- src/languages/powershell.js | 2 +- src/languages/processing.js | 2 +- src/languages/profile.js | 2 +- src/languages/prolog.js | 2 +- src/languages/properties.js | 2 +- src/languages/protobuf.js | 2 +- src/languages/puppet.js | 2 +- src/languages/purebasic.js | 2 +- src/languages/python.js | 2 +- src/languages/q.js | 2 +- src/languages/qml.js | 2 +- src/languages/r.js | 2 +- src/languages/reasonml.js | 2 +- src/languages/rib.js | 2 +- src/languages/roboconf.js | 2 +- src/languages/routeros.js | 2 +- src/languages/rsl.js | 2 +- src/languages/ruby.js | 2 +- src/languages/ruleslanguage.js | 2 +- src/languages/rust.js | 2 +- src/languages/sas.js | 2 +- src/languages/scala.js | 2 +- src/languages/scheme.js | 2 +- src/languages/scilab.js | 2 +- src/languages/scss.js | 2 +- src/languages/shell.js | 2 +- src/languages/smali.js | 2 +- src/languages/smalltalk.js | 2 +- src/languages/sml.js | 2 +- src/languages/sqf.js | 2 +- src/languages/sql.js | 2 +- src/languages/stan.js | 2 +- src/languages/stata.js | 2 +- src/languages/step21.js | 2 +- src/languages/stylus.js | 2 +- src/languages/subunit.js | 2 +- src/languages/swift.js | 2 +- src/languages/taggerscript.js | 2 +- src/languages/tap.js | 2 +- src/languages/tcl.js | 2 +- src/languages/thrift.js | 2 +- src/languages/tp.js | 2 +- src/languages/twig.js | 2 +- src/languages/typescript.js | 2 +- src/languages/vala.js | 2 +- src/languages/vbnet.js | 2 +- src/languages/vbscript-html.js | 2 +- src/languages/vbscript.js | 2 +- src/languages/verilog.js | 2 +- src/languages/vhdl.js | 2 +- src/languages/vim.js | 2 +- src/languages/x86asm.js | 2 +- src/languages/xl.js | 2 +- src/languages/xml.js | 2 +- src/languages/xquery.js | 2 +- src/languages/yaml.js | 2 +- src/languages/zephir.js | 2 +- tools/build.js | 9 +- tools/build_config.js | 66 ++++++++++ tools/lib/bundling.js | 59 +++++++++ tools/lib/dependencies.js | 103 +++++++++++++++ tools/lib/language.js | 98 +++++++++++++++ tools/lib/makestuff.js | 29 +++++ tools/node.js | 7 +- tools/roll_browser.js | 148 ++++++++++++++++++++++ tools/roll_cdn.js | 87 +++++++++++++ tools/tasks.js | 1 + tools/utility.js | 1 + 200 files changed, 1082 insertions(+), 201 deletions(-) create mode 100644 roll.js create mode 100644 tools/build_config.js create mode 100644 tools/lib/bundling.js create mode 100644 tools/lib/dependencies.js create mode 100644 tools/lib/language.js create mode 100644 tools/lib/makestuff.js create mode 100644 tools/roll_browser.js create mode 100644 tools/roll_cdn.js diff --git a/demo/index.html b/demo/index.html index 14becb4962..6ff356a32c 100644 --- a/demo/index.html +++ b/demo/index.html @@ -36,18 +36,18 @@

Styles

- <% _.each(blobs, function(blob) { %> - <% var categories = blob.fileInfo.Category; %> -
class="<%= categories.join(' ') %>"<% } %>> -

<%- blob.fileInfo.Language %>

-
<%- blob.result %>
+ <% _.each(languages, function(language) { %> + <% var categories = language.categories; %> +
0) { %>class="<%= categories.join(' ') %>"<% } %>> +

<%- language.prettyName %>

+
<%- language.sample %>
<% }); %>
- + diff --git a/package-lock.json b/package-lock.json index 4cafcd0ff1..e8814a4650 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,9 +31,9 @@ } }, "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "version": "0.0.40", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.40.tgz", + "integrity": "sha512-p3KZgMto/JyxosKGmnLDJ/dG5wf+qTRMUjHJcspC2oQKa4jP7mz+tv0ND56lLBu3ojHlhzY33Ol+khLyNmilkA==", "dev": true }, "@types/events": { @@ -393,6 +393,12 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, "buffer-shims": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", @@ -533,6 +539,15 @@ } } }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -1573,6 +1588,15 @@ "is-glob": "^4.0.1" } }, + "glob-promise": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", + "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", + "dev": true, + "requires": { + "@types/glob": "*" + } + }, "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", @@ -1982,6 +2006,14 @@ "dev": true, "requires": { "@types/estree": "0.0.39" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + } } }, "is-regex": { @@ -3135,9 +3167,9 @@ }, "dependencies": { "resolve": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", - "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", + "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -3450,6 +3482,16 @@ "urix": "^0.1.0" } }, + "source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", @@ -3590,6 +3632,25 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "terser": { + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.3.9.tgz", + "integrity": "sha512-NFGMpHjlzmyOtPL+fDw3G7+6Ueh/sz4mkaUYa4lJCxOPTNzd0Uj0aZJOmsDYoSQyfuVoWDMSWTPU3huyOm2zdA==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, "tiny-worker": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/tiny-worker/-/tiny-worker-2.3.0.tgz", diff --git a/package.json b/package.json index 37c1fd7577..90b8b5a741 100644 --- a/package.json +++ b/package.json @@ -34,11 +34,13 @@ "cli-table": "^0.3.1", "colors": "^1.1.2", "commander": "^4.0.0", + "clean-css": "^4.2.1", "del": "^5.1.0", "gear": "github:highlightjs/gear", "gear-lib": "github:highlightjs/gear-lib", "glob": "^7.1.4", "handlebars": "^4.5.3", + "glob-promise": "^3.4.0", "js-beautify": "^1.10.2", "jsdom": "^16.0.1", "lodash": "^4.17.15", @@ -46,6 +48,7 @@ "rollup": "^1.27.8", "rollup-plugin-commonjs": "^10.1.0", "should": "^13.2.3", + "terser": "^4.3.9", "tiny-worker": "^2.3.0" }, "dependencies": {} diff --git a/roll.js b/roll.js new file mode 100644 index 0000000000..13642b6591 --- /dev/null +++ b/roll.js @@ -0,0 +1,213 @@ +const rollup = require('rollup') +const fs = require("fs") +const BUILD_DIR = "build" +const CJS = { format: "cjs", strict: false } + +const reorderDependencies = (languages) => { + var languages = [...languages] // clone + var moved + do { + moved = false + let loaded = [] + for (let lang of languages) { + loaded.push(lang.name) + if (lang.requires.length === 0) continue; + for (let needed of lang.requires) { + if (loaded.includes(needed)) continue; + moved = true + + let i = languages.findIndex((el) => el.name == needed) + let removed = languages.splice(i, 1) + let me = languages.findIndex((el) => el.name == lang.name) + languages.splice(me,0, ...removed) + + loaded.push(needed) + } + } + } while(moved===true) + return languages +} + +function buildNodeIndex(languages) { + const header = "var hljs = require('./highlight');" + const footer = "module.exports = hljs;" + + const registration = reorderDependencies(languages).map((lang) => + `hljs.registerLanguage('${lang.name}', require('./languages/${lang.name}'));` + ) + + const index = `${header}\n\n${registration.join("\n")}\n\n${footer}` + fs.writeFile(`${BUILD_DIR}/lib/index.js`, index, (err) => 0) +} + + async function buildNodeLanguage (language) { + const input = { input: `src/languages/${language.name}.js` } + const output = { ...CJS, file: `${BUILD_DIR}/lib/languages/${language.name}.js` } + build(input, output) +} + +async function buildNodeHighlightJS() { + const input = { input: `src/highlight.js` } + const output = { ...CJS, file: `${BUILD_DIR}/lib/highlight.js` } + build(input, output) +} + +const REQUIRES_REGEX = /\/\*.*Requires: (.*?)\n/s + +class Language { + + constructor(name, path) { + this.name = name + this.requires = [] + + this.data = fs.readFileSync(path, {encoding: "utf8"}) + this.determineRequires() + } + + determineRequires() { + var requiresMatch = REQUIRES_REGEX.exec(this.data) + if (requiresMatch) + this.requires = requiresMatch[1].split(", ").map((n) => n.replace(".js","")) + } + + static fromFile(filename) { + var path = `./src/languages/${filename}` + return new Language( + filename.replace(".js",""), + path + ) + } +} + +function getLanguages() { + let languages = [] + fs.readdirSync("./src/languages/").forEach((file) => { + languages.push(Language.fromFile(file)) + }) + return languages +} + +function install(file, dest) { + fs.copyFileSync(file, `${BUILD_DIR}/${dest}`) +} + +function mkdir(dirname) { + fs.mkdirSync(`${BUILD_DIR}/${dirname}`, {recursive: true}) +} + +// tasks.buildPackage = function(json, blob, done) { +// let result, +// lines = blob.result.split(/\r?\n/), +// regex = /^- (.*) <(.*)>$/; + +// json.contributors = _.transform(lines, function(result, line) { +// let matches = line.match(regex); + +// if(matches) { +// result.push({ +// name: matches[1], +// email: matches[2] +// }); +// } +// }, []); + +// result = JSON.stringify(json, null, ' '); + +// return done(null, new gear.Blob(result, blob)); +// }; + +function buildPackageJSON() { + const CONTRIBUTOR = /^- (.*) <(.*)>$/ + + var authors = fs.readFileSync("AUTHORS.en.txt", {encoding: "utf8"}) + var lines = authors.split(/\r?\n/) + var json = require("./package") + json.contributors = lines.reduce((acc, line) => { + let matches = line.match(CONTRIBUTOR) + + if (matches) { + acc.push({ + name: matches[1], + email: matches[2] + }) + } + return acc; + }, []) + fs.writeFileSync(`${BUILD_DIR}/package.json`, JSON.stringify(json, null, ' ')) +} + +async function build_node() { + mkdir("lib/languages") + mkdir("scss") + mkdir("styles") + + install("./LICENSE", "LICENSE") + install("./README.md","README.md") + fs.readdirSync("./src/styles/").forEach((file) => { + install(`./src/styles/${file}`,`styles/${file}`) + install(`./src/styles/${file}`,`scss/${file.replace(".css",".scss")}`) + }) + buildPackageJSON() + + const languages = getLanguages() + // filter languages + + buildNodeIndex(languages) + languages.forEach(async (lang) => { + await buildNodeLanguage(lang) + }) + await buildNodeHighlightJS() + + +} + +async function build(inputOptions, outputOptions) { + // create a bundle + const bundle = await rollup.rollup(inputOptions).catch(err => console.log(err));; + + // console.log(bundle.watchFiles); // an array of file names this bundle depends on + + // generate code + const { output } = await bundle.generate(outputOptions); + + for (const chunkOrAsset of output) { + if (chunkOrAsset.type === 'asset') { + // For assets, this contains + // { + // fileName: string, // the asset file name + // source: string | Buffer // the asset source + // type: 'asset' // signifies that this is an asset + // } + // console.log('Asset', chunkOrAsset); + } else { + // For chunks, this contains + // { + // code: string, // the generated JS code + // dynamicImports: string[], // external modules imported dynamically by the chunk + // exports: string[], // exported variable names + // facadeModuleId: string | null, // the id of a module that this chunk corresponds to + // fileName: string, // the chunk file name + // imports: string[], // external modules imported statically by the chunk + // isDynamicEntry: boolean, // is this chunk a dynamic entry point + // isEntry: boolean, // is this chunk a static entry point + // map: string | null, // sourcemaps if present + // modules: { // information about the modules in this chunk + // [id: string]: { + // renderedExports: string[]; // exported variable names that were included + // removedExports: string[]; // exported variable names that were removed + // renderedLength: number; // the length of the remaining code in this module + // originalLength: number; // the original length of the code in this module + // }; + // }, + // name: string // the name of this chunk as used in naming patterns + // type: 'chunk', // signifies that this is a chunk + // } + // console.log('Chunk', chunkOrAsset.modules); + } + } + + // or write the bundle to disk + await bundle.write(outputOptions) +} + +build_node() diff --git a/src/languages/1c.js b/src/languages/1c.js index 4ba317dd9f..43b72e15c6 100644 --- a/src/languages/1c.js +++ b/src/languages/1c.js @@ -5,7 +5,7 @@ Description: built-in language 1C:Enterprise (v7, v8) Category: enterprise */ -function(hljs){ +export default function(hljs){ // общий паттерн для определения идентификаторов var UNDERSCORE_IDENT_RE = '[A-Za-zА-Яа-яёЁ_][A-Za-zА-Яа-яёЁ_0-9]+'; diff --git a/src/languages/abnf.js b/src/languages/abnf.js index 5b0f5d4030..e3b3a8f2bd 100644 --- a/src/languages/abnf.js +++ b/src/languages/abnf.js @@ -4,7 +4,7 @@ Author: Alex McKibben Website: https://tools.ietf.org/html/rfc5234 */ -function(hljs) { +export default function(hljs) { var regexes = { ruleDeclaration: "^[a-zA-Z][a-zA-Z0-9-]*", unexpectedChars: "[!@#$^&',?+~`|:]" diff --git a/src/languages/accesslog.js b/src/languages/accesslog.js index 06d359094c..22c794b3b8 100644 --- a/src/languages/accesslog.js +++ b/src/languages/accesslog.js @@ -5,7 +5,7 @@ Website: https://httpd.apache.org/docs/2.4/logs.html#accesslog */ -function(hljs) { +export default function(hljs) { // https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods var HTTP_VERBS = [ "GET", "POST", "HEAD", "PUT", "DELETE", "CONNECT", "OPTIONS", "PATCH", "TRACE" diff --git a/src/languages/actionscript.js b/src/languages/actionscript.js index 3d52035b73..9649399308 100644 --- a/src/languages/actionscript.js +++ b/src/languages/actionscript.js @@ -4,7 +4,7 @@ Author: Alexander Myadzel Category: scripting */ -function(hljs) { +export default function(hljs) { var IDENT_RE = '[a-zA-Z_$][a-zA-Z0-9_$]*'; var IDENT_FUNC_RETURN_TYPE_RE = '([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)'; diff --git a/src/languages/ada.js b/src/languages/ada.js index 2220b11405..eeb7f17f27 100644 --- a/src/languages/ada.js +++ b/src/languages/ada.js @@ -17,7 +17,7 @@ Description: Ada is a general-purpose programming language that has great suppor // xml (broken by Foo : Bar type), elm (broken by Foo : Bar type), vbscript-html (broken by body keyword) // sql (ada default.txt has a lot of sql keywords) -function(hljs) { +export default function(hljs) { // Regular expression for Ada numeric literals. // stolen form the VHDL highlighter diff --git a/src/languages/angelscript.js b/src/languages/angelscript.js index e71049073b..07ec36bf3e 100644 --- a/src/languages/angelscript.js +++ b/src/languages/angelscript.js @@ -5,7 +5,7 @@ Category: scripting Website: https://www.angelcode.com/angelscript/ */ -function(hljs) { +export default function(hljs) { var builtInTypeMode = { className: 'built_in', begin: '\\b(void|bool|int|int8|int16|int32|int64|uint|uint8|uint16|uint32|uint64|string|ref|array|double|float|auto|dictionary)' diff --git a/src/languages/apache.js b/src/languages/apache.js index 01da9e1886..591054e4d1 100644 --- a/src/languages/apache.js +++ b/src/languages/apache.js @@ -7,7 +7,7 @@ Description: language definition for Apache configuration files (httpd.conf & .h Category: common, config */ -function(hljs) { +export default function(hljs) { var NUMBER_REF = {className: 'number', begin: '[\\$%]\\d+'}; var NUMBER = {className: 'number', begin: '\\d+'}; var IP_ADDRESS = { diff --git a/src/languages/applescript.js b/src/languages/applescript.js index 801d1363f6..903233a932 100644 --- a/src/languages/applescript.js +++ b/src/languages/applescript.js @@ -5,7 +5,7 @@ Category: scripting Website: https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html */ -function(hljs) { +export default function(hljs) { var STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: ''}); var PARAMS = { className: 'params', diff --git a/src/languages/arcade.js b/src/languages/arcade.js index 6cdd848e0f..3e44c1c996 100644 --- a/src/languages/arcade.js +++ b/src/languages/arcade.js @@ -5,7 +5,7 @@ Website: https://developers.arcgis.com/arcade/ Description: ArcGIS Arcade is an expression language used in many Esri ArcGIS products such as Pro, Online, Server, Runtime, JavaScript, and Python */ -function(hljs) { +export default function(hljs) { var IDENT_RE = '[A-Za-z_][0-9A-Za-z_]*'; var KEYWORDS = { keyword: diff --git a/src/languages/arduino.js b/src/languages/arduino.js index 1d835e01c7..73c0f9309a 100644 --- a/src/languages/arduino.js +++ b/src/languages/arduino.js @@ -6,7 +6,7 @@ Requires: cpp.js Website: https://www.arduino.cc */ -function(hljs) { +export default function(hljs) { var ARDUINO_KW = { keyword: diff --git a/src/languages/armasm.js b/src/languages/armasm.js index 652e270ce7..60da65a7b9 100644 --- a/src/languages/armasm.js +++ b/src/languages/armasm.js @@ -5,7 +5,7 @@ Description: ARM Assembly including Thumb and Thumb2 instructions Category: assembler */ -function(hljs) { +export default function(hljs) { //local labels: %?[FB]?[AT]?\d{1,2}\w+ return { case_insensitive: true, diff --git a/src/languages/asciidoc.js b/src/languages/asciidoc.js index 4a00a9c566..42a9dfa8ea 100644 --- a/src/languages/asciidoc.js +++ b/src/languages/asciidoc.js @@ -7,7 +7,7 @@ Description: A semantic, text-based document format that can be exported to HTML Category: markup */ -function(hljs) { +export default function(hljs) { return { aliases: ['adoc'], contains: [ diff --git a/src/languages/aspectj.js b/src/languages/aspectj.js index 6521fe12d1..d7874347a3 100644 --- a/src/languages/aspectj.js +++ b/src/languages/aspectj.js @@ -4,7 +4,7 @@ Author: Hakan Ozler Website: https://www.eclipse.org/aspectj/ Description: Syntax Highlighting for the AspectJ Language which is a general-purpose aspect-oriented extension to the Java programming language. */ -function (hljs) { +export default function (hljs) { var KEYWORDS = 'false synchronized int abstract float private char boolean static null if const ' + 'for true while long throw strictfp finally protected import native final return void ' + diff --git a/src/languages/autohotkey.js b/src/languages/autohotkey.js index 5384f9d5a1..eca4806225 100644 --- a/src/languages/autohotkey.js +++ b/src/languages/autohotkey.js @@ -5,7 +5,7 @@ Description: AutoHotkey language definition Category: scripting */ -function(hljs) { +export default function(hljs) { var BACKTICK_ESCAPE = { begin: '`[\\s\\S]' }; @@ -47,7 +47,7 @@ function(hljs) { ] }, { - className: 'meta', + className: 'meta', begin: '^\\s*#\\w+', end:'$', relevance: 0 }, diff --git a/src/languages/autoit.js b/src/languages/autoit.js index 6f6b73af71..b8155cfc3c 100644 --- a/src/languages/autoit.js +++ b/src/languages/autoit.js @@ -5,7 +5,7 @@ Description: AutoIt language definition Category: scripting */ -function(hljs) { +export default function(hljs) { var KEYWORDS = 'ByRef Case Const ContinueCase ContinueLoop ' + 'Default Dim Do Else ElseIf EndFunc EndIf EndSelect ' + 'EndSwitch EndWith Enum Exit ExitLoop For Func ' + diff --git a/src/languages/avrasm.js b/src/languages/avrasm.js index da331ad18e..fdc538cf71 100644 --- a/src/languages/avrasm.js +++ b/src/languages/avrasm.js @@ -5,7 +5,7 @@ Category: assembler Website: https://www.microchip.com/webdoc/avrassembler/avrassembler.wb_instruction_list.html */ -function(hljs) { +export default function(hljs) { return { case_insensitive: true, lexemes: '\\.?' + hljs.IDENT_RE, diff --git a/src/languages/awk.js b/src/languages/awk.js index 0b66a42051..32dcf395bd 100644 --- a/src/languages/awk.js +++ b/src/languages/awk.js @@ -5,7 +5,7 @@ Website: https://www.gnu.org/software/gawk/manual/gawk.html Description: language definition for Awk scripts */ -function(hljs) { +export default function(hljs) { var VARIABLE = { className: 'variable', variants: [ diff --git a/src/languages/axapta.js b/src/languages/axapta.js index ea83f591dd..9e52ce7d84 100644 --- a/src/languages/axapta.js +++ b/src/languages/axapta.js @@ -5,7 +5,7 @@ Website: https://dynamics.microsoft.com/en-us/ax-overview/ Category: enterprise */ -function(hljs) { +export default function(hljs) { return { keywords: 'false int abstract private char boolean static null if for true ' + 'while long throw finally protected final return void enum else ' + diff --git a/src/languages/bash.js b/src/languages/bash.js index 51a7587048..0fc27a8ede 100644 --- a/src/languages/bash.js +++ b/src/languages/bash.js @@ -6,7 +6,7 @@ Website: https://www.gnu.org/software/bash/ Category: common */ -function(hljs) { +export default function(hljs) { var VAR = { className: 'variable', variants: [ diff --git a/src/languages/basic.js b/src/languages/basic.js index 5a1ae3dfb8..b7810a99c4 100644 --- a/src/languages/basic.js +++ b/src/languages/basic.js @@ -4,7 +4,8 @@ Author: Raphaël Assénat Description: Based on the BASIC reference from the Tandy 1000 guide Website: https://en.wikipedia.org/wiki/Tandy_1000 */ -function(hljs) { + +export default function(hljs) { return { case_insensitive: true, illegal: '^\.', diff --git a/src/languages/bnf.js b/src/languages/bnf.js index 86ed09b387..a634993e6c 100644 --- a/src/languages/bnf.js +++ b/src/languages/bnf.js @@ -4,7 +4,7 @@ Website: https://en.wikipedia.org/wiki/Backus–Naur_form Author: Oleg Efimov */ -function(hljs){ +export default function(hljs){ return { contains: [ // Attribute diff --git a/src/languages/brainfuck.js b/src/languages/brainfuck.js index e4e87c4c2e..4d599b3ff6 100644 --- a/src/languages/brainfuck.js +++ b/src/languages/brainfuck.js @@ -4,7 +4,7 @@ Author: Evgeny Stepanischev Website: https://esolangs.org/wiki/Brainfuck */ -function(hljs){ +export default function(hljs){ var LITERAL = { className: 'literal', begin: '[\\+\\-]', diff --git a/src/languages/cal.js b/src/languages/cal.js index d1e098cf13..4df7930d02 100644 --- a/src/languages/cal.js +++ b/src/languages/cal.js @@ -5,7 +5,7 @@ Description: Provides highlighting of Microsoft Dynamics NAV C/AL code files Website: https://docs.microsoft.com/en-us/dynamics-nav/programming-in-c-al */ -function(hljs) { +export default function(hljs) { var KEYWORDS = 'div mod in and or not xor asserterror begin case do downto else end exit for if of repeat then to ' + 'until while with var'; diff --git a/src/languages/capnproto.js b/src/languages/capnproto.js index 8c5845f07c..eaf3887f26 100644 --- a/src/languages/capnproto.js +++ b/src/languages/capnproto.js @@ -6,7 +6,7 @@ Website: https://capnproto.org/capnp-tool.html Category: protocols */ -function(hljs) { +export default function(hljs) { return { aliases: ['capnp'], keywords: { diff --git a/src/languages/ceylon.js b/src/languages/ceylon.js index 29533a5d01..98ff38a6c7 100644 --- a/src/languages/ceylon.js +++ b/src/languages/ceylon.js @@ -3,7 +3,7 @@ Language: Ceylon Author: Lucas Werkmeister Website: https://ceylon-lang.org */ -function(hljs) { +export default function(hljs) { // 2.3. Identifiers and keywords var KEYWORDS = 'assembly module package import alias class interface object given value ' + diff --git a/src/languages/clean.js b/src/languages/clean.js index 4c3acf070d..e03da3218f 100644 --- a/src/languages/clean.js +++ b/src/languages/clean.js @@ -5,7 +5,7 @@ Category: functional Website: http://clean.cs.ru.nl */ -function(hljs) { +export default function(hljs) { return { aliases: ['clean','icl','dcl'], keywords: { diff --git a/src/languages/clojure-repl.js b/src/languages/clojure-repl.js index cd351a2aa4..124c803a45 100644 --- a/src/languages/clojure-repl.js +++ b/src/languages/clojure-repl.js @@ -7,7 +7,7 @@ Website: https://clojure.org Category: lisp */ -function(hljs) { +export default function(hljs) { return { contains: [ { diff --git a/src/languages/clojure.js b/src/languages/clojure.js index 9e69379ef7..7f89ddc7fc 100644 --- a/src/languages/clojure.js +++ b/src/languages/clojure.js @@ -7,7 +7,7 @@ Website: https://clojure.org Category: lisp */ -function(hljs) { +export default function(hljs) { var keywords = { 'builtin-name': // Clojure keywords diff --git a/src/languages/cmake.js b/src/languages/cmake.js index 6b8c85c621..e54b26fc32 100644 --- a/src/languages/cmake.js +++ b/src/languages/cmake.js @@ -5,7 +5,7 @@ Author: Igor Kalnitsky Website: https://cmake.org */ -function(hljs) { +export default function(hljs) { return { aliases: ['cmake.in'], case_insensitive: true, diff --git a/src/languages/coffeescript.js b/src/languages/coffeescript.js index b37c99cff3..8b762e3fa7 100644 --- a/src/languages/coffeescript.js +++ b/src/languages/coffeescript.js @@ -7,7 +7,7 @@ Category: common, scripting Website: https://coffeescript.org */ -function(hljs) { +export default function(hljs) { var KEYWORDS = { keyword: // JS keywords diff --git a/src/languages/coq.js b/src/languages/coq.js index 6f7972da42..ea71543942 100644 --- a/src/languages/coq.js +++ b/src/languages/coq.js @@ -5,7 +5,7 @@ Category: functional Website: https://coq.inria.fr */ -function(hljs) { +export default function(hljs) { return { keywords: { keyword: diff --git a/src/languages/cos.js b/src/languages/cos.js index 8c5be7426b..7588d4c77c 100644 --- a/src/languages/cos.js +++ b/src/languages/cos.js @@ -4,7 +4,7 @@ Author: Nikita Savchenko Category: enterprise, scripting Website: https://cedocs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls */ -function cos (hljs) { +export default function cos (hljs) { var STRINGS = { className: 'string', diff --git a/src/languages/cpp.js b/src/languages/cpp.js index 348704c9a7..24d5662f0c 100644 --- a/src/languages/cpp.js +++ b/src/languages/cpp.js @@ -5,7 +5,7 @@ Website: https://isocpp.org Requires: c-like.js */ -function(hljs) { +export default function(hljs) { var lang = hljs.getLanguage('c-like').rawDefinition(); // return auto-detection back on diff --git a/src/languages/crmsh.js b/src/languages/crmsh.js index 4819b46dc2..8e57706272 100644 --- a/src/languages/crmsh.js +++ b/src/languages/crmsh.js @@ -6,7 +6,7 @@ Description: Syntax Highlighting for the crmsh DSL Category: config */ -function(hljs) { +export default function(hljs) { var RESOURCES = 'primitive rsc_template'; var COMMANDS = 'group clone ms master location colocation order fencing_topology ' + diff --git a/src/languages/crystal.js b/src/languages/crystal.js index c1609e7f8c..5aeb12f0fb 100644 --- a/src/languages/crystal.js +++ b/src/languages/crystal.js @@ -4,7 +4,7 @@ Author: TSUYUSATO Kitsune Website: https://crystal-lang.org */ -function(hljs) { +export default function(hljs) { var INT_SUFFIX = '(_*[ui](8|16|32|64|128))?'; var FLOAT_SUFFIX = '(_*f(32|64))?'; var CRYSTAL_IDENT_RE = '[a-zA-Z_]\\w*[!?=]?'; diff --git a/src/languages/csharp.js b/src/languages/csharp.js index 9952fd22a1..9eaaa44091 100644 --- a/src/languages/csharp.js +++ b/src/languages/csharp.js @@ -6,7 +6,7 @@ Website: https://docs.microsoft.com/en-us/dotnet/csharp/ Category: common */ -function(hljs) { +export default function(hljs) { var KEYWORDS = { keyword: // Normal keywords. diff --git a/src/languages/csp.js b/src/languages/csp.js index 934e8ff6fa..2672cbe1ae 100644 --- a/src/languages/csp.js +++ b/src/languages/csp.js @@ -7,7 +7,7 @@ Website: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP vim: ts=2 sw=2 st=2 */ -function(hljs) { +export default function(hljs) { return { case_insensitive: false, lexemes: '[a-zA-Z][a-zA-Z0-9_-]*', diff --git a/src/languages/css.js b/src/languages/css.js index 9a9836a60b..d7d560e62b 100644 --- a/src/languages/css.js +++ b/src/languages/css.js @@ -4,7 +4,7 @@ Category: common, css Website: https://developer.mozilla.org/en-US/docs/Web/CSS */ -function(hljs) { +export default function(hljs) { var FUNCTION_LIKE = { begin: /[\w-]+\(/, returnBegin: true, contains: [ diff --git a/src/languages/d.js b/src/languages/d.js index e319f52c78..363d08bf12 100644 --- a/src/languages/d.js +++ b/src/languages/d.js @@ -23,7 +23,7 @@ Date: 2012-04-08 * up to the end of line is matched as special token sequence) */ -function(hljs) { +export default function(hljs) { /** * Language keywords * diff --git a/src/languages/dart.js b/src/languages/dart.js index bbaa94760a..58a71d4756 100644 --- a/src/languages/dart.js +++ b/src/languages/dart.js @@ -7,7 +7,7 @@ Website: https://dart.dev Category: scripting */ -function(hljs) { +export default function(hljs) { var SUBST = { className: 'subst', variants: [{ diff --git a/src/languages/delphi.js b/src/languages/delphi.js index f0e2e00842..f1845251b5 100644 --- a/src/languages/delphi.js +++ b/src/languages/delphi.js @@ -3,7 +3,7 @@ Language: Delphi Website: https://www.embarcadero.com/products/delphi */ -function(hljs) { +export default function(hljs) { var KEYWORDS = 'exports register file shl array record property for mod while set ally label uses raise not ' + 'stored class safecall var interface or private static exit index inherited to else stdcall ' + diff --git a/src/languages/diff.js b/src/languages/diff.js index bc1d246e02..806c84bc33 100644 --- a/src/languages/diff.js +++ b/src/languages/diff.js @@ -6,7 +6,7 @@ Website: https://www.gnu.org/software/diffutils/ Category: common */ -function(hljs) { +export default function(hljs) { return { aliases: ['patch'], contains: [ diff --git a/src/languages/django.js b/src/languages/django.js index 477cf6ecfb..4359a7a570 100644 --- a/src/languages/django.js +++ b/src/languages/django.js @@ -8,7 +8,7 @@ Website: https://www.djangoproject.com Category: template */ -function(hljs) { +export default function(hljs) { var FILTER = { begin: /\|[A-Za-z]+:?/, keywords: { diff --git a/src/languages/dns.js b/src/languages/dns.js index 62a3b3805a..54f87bfb77 100644 --- a/src/languages/dns.js +++ b/src/languages/dns.js @@ -5,7 +5,7 @@ Category: config Website: https://en.wikipedia.org/wiki/Zone_file */ -function(hljs) { +export default function(hljs) { return { aliases: ['bind', 'zone'], keywords: { diff --git a/src/languages/dockerfile.js b/src/languages/dockerfile.js index 5b81881d97..c7d25b6c2e 100644 --- a/src/languages/dockerfile.js +++ b/src/languages/dockerfile.js @@ -7,7 +7,7 @@ Website: https://docs.docker.com/engine/reference/builder/ Category: config */ -function(hljs) { +export default function(hljs) { return { aliases: ['docker'], case_insensitive: true, diff --git a/src/languages/dos.js b/src/languages/dos.js index 5370ee2030..5893ae879a 100644 --- a/src/languages/dos.js +++ b/src/languages/dos.js @@ -5,7 +5,7 @@ Contributors: Anton Kochkov Website: https://en.wikipedia.org/wiki/Batch_file */ -function(hljs) { +export default function(hljs) { var COMMENT = hljs.COMMENT( /^\s*@?rem\b/, /$/, { diff --git a/src/languages/dsconfig.js b/src/languages/dsconfig.js index e9fc0ab7c7..1974d690fb 100644 --- a/src/languages/dsconfig.js +++ b/src/languages/dsconfig.js @@ -4,7 +4,7 @@ Contributors: Jacob Childress Category: enterprise, config */ -function(hljs) { +export default function(hljs) { var QUOTED_PROPERTY = { className: 'string', begin: /"/, end: /"/ diff --git a/src/languages/dts.js b/src/languages/dts.js index 9d1ec3bef6..8898247242 100644 --- a/src/languages/dts.js +++ b/src/languages/dts.js @@ -6,7 +6,7 @@ Website: https://elinux.org/Device_Tree_Reference Category: config */ -function(hljs) { +export default function(hljs) { var STRINGS = { className: 'string', variants: [ diff --git a/src/languages/dust.js b/src/languages/dust.js index 262f6f1aad..416f07747e 100644 --- a/src/languages/dust.js +++ b/src/languages/dust.js @@ -7,7 +7,7 @@ Website: https://www.dustjs.com Category: template */ -function(hljs) { +export default function(hljs) { var EXPRESSION_KEYWORDS = 'if eq ne lt lte gt gte select default math sep'; return { aliases: ['dst'], diff --git a/src/languages/ebnf.js b/src/languages/ebnf.js index c4a2256ab3..b2d3f5a95a 100644 --- a/src/languages/ebnf.js +++ b/src/languages/ebnf.js @@ -4,7 +4,7 @@ Author: Alex McKibben Website: https://en.wikipedia.org/wiki/Extended_Backus–Naur_form */ -function(hljs) { +export default function(hljs) { var commentMode = hljs.COMMENT(/\(\*/, /\*\)/); var nonTerminalMode = { diff --git a/src/languages/elixir.js b/src/languages/elixir.js index d96f143ddb..89f498774d 100644 --- a/src/languages/elixir.js +++ b/src/languages/elixir.js @@ -6,7 +6,7 @@ Category: functional Website: https://elixir-lang.org */ -function(hljs) { +export default function(hljs) { var ELIXIR_IDENT_RE = '[a-zA-Z_][a-zA-Z0-9_.]*(\\!|\\?)?'; var ELIXIR_METHOD_RE = '[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?'; var ELIXIR_KEYWORDS = diff --git a/src/languages/elm.js b/src/languages/elm.js index c2ed5f3af2..7b70e3ffec 100644 --- a/src/languages/elm.js +++ b/src/languages/elm.js @@ -5,7 +5,7 @@ Website: https://elm-lang.org Category: functional */ -function(hljs) { +export default function(hljs) { var COMMENT = { variants: [ hljs.COMMENT('--', '$'), diff --git a/src/languages/erb.js b/src/languages/erb.js index bc4aa338b1..7197b9cb0a 100644 --- a/src/languages/erb.js +++ b/src/languages/erb.js @@ -8,7 +8,7 @@ Website: https://ruby-doc.org/stdlib-2.6.5/libdoc/erb/rdoc/ERB.html Category: template */ -function(hljs) { +export default function(hljs) { return { subLanguage: 'xml', contains: [ diff --git a/src/languages/erlang-repl.js b/src/languages/erlang-repl.js index ff59dc9b29..d471565de1 100644 --- a/src/languages/erlang-repl.js +++ b/src/languages/erlang-repl.js @@ -5,7 +5,7 @@ Website: https://www.erlang.org Category: functional */ -function(hljs) { +export default function(hljs) { return { keywords: { built_in: diff --git a/src/languages/erlang.js b/src/languages/erlang.js index 627514d188..940b631565 100644 --- a/src/languages/erlang.js +++ b/src/languages/erlang.js @@ -6,7 +6,7 @@ Website: https://www.erlang.org Category: functional */ -function(hljs) { +export default function(hljs) { var BASIC_ATOM_RE = '[a-z\'][a-zA-Z0-9_\']*'; var FUNCTION_NAME_RE = '(' + BASIC_ATOM_RE + ':' + BASIC_ATOM_RE + '|' + BASIC_ATOM_RE + ')'; var ERLANG_RESERVED = { diff --git a/src/languages/excel.js b/src/languages/excel.js index b04434476e..a839d9ac19 100644 --- a/src/languages/excel.js +++ b/src/languages/excel.js @@ -5,7 +5,7 @@ Description: Excel formulae Website: https://products.office.com/en-us/excel/ */ -function(hljs) { +export default function(hljs) { return { aliases: ['xlsx', 'xls'], case_insensitive: true, diff --git a/src/languages/fix.js b/src/languages/fix.js index d897a6e25b..8c6a961697 100644 --- a/src/languages/fix.js +++ b/src/languages/fix.js @@ -3,7 +3,7 @@ Language: FIX Author: Brent Bradbury */ -function(hljs) { +export default function(hljs) { return { contains: [ { diff --git a/src/languages/flix.js b/src/languages/flix.js index b13206a6ca..bc254e66fa 100644 --- a/src/languages/flix.js +++ b/src/languages/flix.js @@ -5,7 +5,7 @@ Website: https://flix.dev/ */ -function (hljs) { +export default function (hljs) { var CHAR = { className: 'string', diff --git a/src/languages/fortran.js b/src/languages/fortran.js index 9e40ed52ca..cbe33fe642 100644 --- a/src/languages/fortran.js +++ b/src/languages/fortran.js @@ -5,7 +5,7 @@ Website: https://en.wikipedia.org/wiki/Fortran Category: scientific */ -function(hljs) { +export default function(hljs) { var PARAMS = { className: 'params', begin: '\\(', end: '\\)' diff --git a/src/languages/fsharp.js b/src/languages/fsharp.js index 8f64aa8455..f0c9b7451a 100644 --- a/src/languages/fsharp.js +++ b/src/languages/fsharp.js @@ -5,7 +5,7 @@ Contributors: Troy Kershaw , Henrik Feldt Website: https://docs.microsoft.com/en-us/dotnet/fsharp/ Category: functional */ -function(hljs) { +export default function(hljs) { var TYPEPARAM = { begin: '<', end: '>', contains: [ diff --git a/src/languages/gams.js b/src/languages/gams.js index e35e0de533..d137d1a2be 100644 --- a/src/languages/gams.js +++ b/src/languages/gams.js @@ -8,7 +8,7 @@ Category: scientific */ -function (hljs) { +export default function (hljs) { var KEYWORDS = { 'keyword': 'abort acronym acronyms alias all and assign binary card diag display ' + diff --git a/src/languages/gauss.js b/src/languages/gauss.js index 0493f327eb..6e3780f9f4 100644 --- a/src/languages/gauss.js +++ b/src/languages/gauss.js @@ -5,7 +5,7 @@ Description: GAUSS Mathematical and Statistical language Website: https://www.aptech.com Category: scientific */ -function(hljs) { +export default function(hljs) { var KEYWORDS = { keyword: 'bool break call callexe checkinterrupt clear clearg closeall cls comlog compile ' + 'continue create debug declare delete disable dlibrary dllcall do dos ed edit else ' + diff --git a/src/languages/gcode.js b/src/languages/gcode.js index cc13b6d667..a724ab7b06 100644 --- a/src/languages/gcode.js +++ b/src/languages/gcode.js @@ -5,7 +5,7 @@ Website: https://www.sis.se/api/document/preview/911952/ */ -function(hljs) { +export default function(hljs) { var GCODE_IDENT_RE = '[A-Z_][A-Z0-9_.]*'; var GCODE_CLOSE_RE = '\\%'; var GCODE_KEYWORDS = diff --git a/src/languages/gherkin.js b/src/languages/gherkin.js index a13900077c..c6d89cb97d 100644 --- a/src/languages/gherkin.js +++ b/src/languages/gherkin.js @@ -5,7 +5,7 @@ Website: https://cucumber.io/docs/gherkin/ */ -function (hljs) { +export default function (hljs) { return { aliases: ['feature'], keywords: 'Feature Background Ability Business\ Need Scenario Scenarios Scenario\ Outline Scenario\ Template Examples Given And Then But When', diff --git a/src/languages/glsl.js b/src/languages/glsl.js index 19b395f41c..406f06fca4 100644 --- a/src/languages/glsl.js +++ b/src/languages/glsl.js @@ -6,7 +6,7 @@ Website: https://en.wikipedia.org/wiki/OpenGL_Shading_Language Category: graphics */ -function(hljs) { +export default function(hljs) { return { keywords: { keyword: diff --git a/src/languages/gml.js b/src/languages/gml.js index 242fa64768..32a040c440 100644 --- a/src/languages/gml.js +++ b/src/languages/gml.js @@ -6,7 +6,7 @@ Website: https://docs2.yoyogames.com Category: scripting */ -function(hljs) { +export default function(hljs) { var GML_KEYWORDS = { keyword: 'begin end if then else while do for break continue with until ' + 'repeat exit and or xor not return mod div switch case default var ' + diff --git a/src/languages/go.js b/src/languages/go.js index 5b6aff34d8..96adc48b7a 100644 --- a/src/languages/go.js +++ b/src/languages/go.js @@ -7,7 +7,7 @@ Website: http://golang.org/ Category: common, system */ -function(hljs) { +export default function(hljs) { var GO_KEYWORDS = { keyword: 'break default func interface select case map struct chan else goto package switch ' + diff --git a/src/languages/golo.js b/src/languages/golo.js index 03cb9510a2..618acdea8d 100644 --- a/src/languages/golo.js +++ b/src/languages/golo.js @@ -5,7 +5,7 @@ Description: a lightweight dynamic language for the JVM Website: http://golo-lang.org/ */ -function(hljs) { +export default function(hljs) { return { keywords: { keyword: diff --git a/src/languages/gradle.js b/src/languages/gradle.js index ac471e2746..fa2b87ca5b 100644 --- a/src/languages/gradle.js +++ b/src/languages/gradle.js @@ -5,7 +5,7 @@ Website: https://gradle.org Author: Damian Mee */ -function(hljs) { +export default function(hljs) { return { case_insensitive: true, keywords: { diff --git a/src/languages/groovy.js b/src/languages/groovy.js index bd602c2d07..0e1b635de8 100644 --- a/src/languages/groovy.js +++ b/src/languages/groovy.js @@ -5,7 +5,7 @@ Website: https://groovy-lang.org */ -function(hljs) { +export default function(hljs) { return { keywords: { literal : 'true false null', diff --git a/src/languages/haml.js b/src/languages/haml.js index 28f7bdb1f7..153c239c13 100644 --- a/src/languages/haml.js +++ b/src/languages/haml.js @@ -7,7 +7,7 @@ Category: template */ // TODO support filter tags like :javascript, support inline HTML -function(hljs) { +export default function(hljs) { return { case_insensitive: true, contains: [ diff --git a/src/languages/handlebars.js b/src/languages/handlebars.js index 825afdc79c..5845260558 100644 --- a/src/languages/handlebars.js +++ b/src/languages/handlebars.js @@ -6,7 +6,8 @@ Description: Matcher for Handlebars as well as EmberJS additions. Website: https://handlebarsjs.com Category: template */ -function (hljs) { + +export default function(hljs) { var BUILT_INS = {'builtin-name': 'each in with if else unless bindattr action collection debugger log outlet template unbound view yield lookup'}; var IDENTIFIER_PLAIN_OR_QUOTED = { diff --git a/src/languages/haskell.js b/src/languages/haskell.js index dc0b747638..9142697381 100644 --- a/src/languages/haskell.js +++ b/src/languages/haskell.js @@ -6,7 +6,7 @@ Website: https://www.haskell.org Category: functional */ -function(hljs) { +export default function(hljs) { var COMMENT = { variants: [ hljs.COMMENT('--', '$'), diff --git a/src/languages/haxe.js b/src/languages/haxe.js index aae58991e7..f51603919d 100644 --- a/src/languages/haxe.js +++ b/src/languages/haxe.js @@ -6,7 +6,7 @@ Contributors: Kenton Hamaluik Website: https://haxe.org */ -function(hljs) { +export default function(hljs) { var IDENT_RE = '[a-zA-Z_$][a-zA-Z0-9_$]*'; var IDENT_FUNC_RETURN_TYPE_RE = '([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)'; diff --git a/src/languages/hsp.js b/src/languages/hsp.js index 88c980e734..59b778c8f0 100644 --- a/src/languages/hsp.js +++ b/src/languages/hsp.js @@ -5,7 +5,7 @@ Website: https://en.wikipedia.org/wiki/Hot_Soup_Processor Category: scripting */ -function(hljs) { +export default function(hljs) { return { case_insensitive: true, lexemes: /[\w\._]+/, diff --git a/src/languages/htmlbars.js b/src/languages/htmlbars.js index 5dbbd8e64e..d08736be32 100644 --- a/src/languages/htmlbars.js +++ b/src/languages/htmlbars.js @@ -7,7 +7,7 @@ Website: https://github.com/tildeio/htmlbars Category: template */ -function(hljs) { +export default function(hljs) { var BUILT_INS = 'action collection component concat debugger each each-in else get hash if input link-to loc log mut outlet partial query-params render textarea unbound unless with yield view'; var ATTR_ASSIGNMENT = { diff --git a/src/languages/http.js b/src/languages/http.js index 9ba3c22f41..8edd0bb450 100644 --- a/src/languages/http.js +++ b/src/languages/http.js @@ -6,7 +6,7 @@ Category: common, protocols Website: https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview */ -function(hljs) { +export default function(hljs) { var VERSION = 'HTTP/[0-9\\.]+'; return { aliases: ['https'], diff --git a/src/languages/hy.js b/src/languages/hy.js index 0983231473..ee46e58fc1 100644 --- a/src/languages/hy.js +++ b/src/languages/hy.js @@ -6,7 +6,7 @@ Website: http://docs.hylang.org/en/stable/ Category: lisp */ -function(hljs) { +export default function(hljs) { var keywords = { 'builtin-name': // keywords diff --git a/src/languages/inform7.js b/src/languages/inform7.js index a9cd345407..696240961a 100644 --- a/src/languages/inform7.js +++ b/src/languages/inform7.js @@ -5,7 +5,7 @@ Description: Language definition for Inform 7, a DSL for writing parser interact Website: http://inform7.com */ -function(hljs) { +export default function(hljs) { var START_BRACKET = '\\['; var END_BRACKET = '\\]'; return { diff --git a/src/languages/ini.js b/src/languages/ini.js index 48ac5e4865..76d7641042 100644 --- a/src/languages/ini.js +++ b/src/languages/ini.js @@ -6,7 +6,7 @@ Category: common, config Website: https://github.com/toml-lang/toml */ -function(hljs) { +export default function(hljs) { var NUMBERS = { className: 'number', relevance: 0, diff --git a/src/languages/irpf90.js b/src/languages/irpf90.js index 3ec9acbad6..ab19604a8e 100644 --- a/src/languages/irpf90.js +++ b/src/languages/irpf90.js @@ -6,7 +6,7 @@ Website: http://irpf90.ups-tlse.fr Category: scientific */ -function(hljs) { +export default function(hljs) { var PARAMS = { className: 'params', begin: '\\(', end: '\\)' diff --git a/src/languages/isbl.js b/src/languages/isbl.js index 02a9577ca0..9d57d8ee30 100644 --- a/src/languages/isbl.js +++ b/src/languages/isbl.js @@ -5,7 +5,7 @@ Description: built-in language DIRECTUM Category: enterprise */ -function(hljs) { +export default function(hljs) { // Определение идентификаторов var UNDERSCORE_IDENT_RE = "[A-Za-zА-Яа-яёЁ_!][A-Za-zА-Яа-яёЁ_0-9]*"; diff --git a/src/languages/java.js b/src/languages/java.js index 4c4298ad0b..f5c48cfb98 100644 --- a/src/languages/java.js +++ b/src/languages/java.js @@ -5,7 +5,7 @@ Category: common, enterprise Website: https://www.java.com/ */ -function(hljs) { +export default function(hljs) { var JAVA_IDENT_RE = '[\u00C0-\u02B8a-zA-Z_$][\u00C0-\u02B8a-zA-Z_$0-9]*'; var GENERIC_IDENT_RE = JAVA_IDENT_RE + '(<' + JAVA_IDENT_RE + '(\\s*,\\s*' + JAVA_IDENT_RE + ')*>)?'; var KEYWORDS = diff --git a/src/languages/javascript.js b/src/languages/javascript.js index d7a6ec1f28..4ec89f3ca7 100644 --- a/src/languages/javascript.js +++ b/src/languages/javascript.js @@ -5,7 +5,7 @@ Category: common, scripting Website: https://developer.mozilla.org/en-US/docs/Web/JavaScript */ -function(hljs) { +export default function(hljs) { var FRAGMENT = { begin: '<>', end: '' diff --git a/src/languages/jboss-cli.js b/src/languages/jboss-cli.js index b9402043ca..5d578d3daf 100644 --- a/src/languages/jboss-cli.js +++ b/src/languages/jboss-cli.js @@ -6,7 +6,7 @@ Category: config */ -function (hljs) { +export default function (hljs) { var PARAM = { begin: /[\w-]+ *=/, returnBegin: true, relevance: 0, diff --git a/src/languages/json.js b/src/languages/json.js index b9c17f0da9..546c43e228 100644 --- a/src/languages/json.js +++ b/src/languages/json.js @@ -6,7 +6,7 @@ Website: http://www.json.org Category: common, protocols */ -function(hljs) { +export default function(hljs) { var LITERALS = {literal: 'true false null'}; var ALLOWED_COMMENTS = [ hljs.C_LINE_COMMENT_MODE, diff --git a/src/languages/julia-repl.js b/src/languages/julia-repl.js index 45ab93a469..7d28dd16df 100644 --- a/src/languages/julia-repl.js +++ b/src/languages/julia-repl.js @@ -22,7 +22,7 @@ Using simply spaces to identify line continuations may get a false-positive if t also prints out six spaces, but such cases should be rare. */ -function(hljs) { +export default function(hljs) { return { contains: [ { diff --git a/src/languages/julia.js b/src/languages/julia.js index 61a1ff72be..aa9a73c1a4 100644 --- a/src/languages/julia.js +++ b/src/languages/julia.js @@ -6,7 +6,7 @@ Contributors: Alex Arslan Website: https://julialang.org */ -function(hljs) { +export default function(hljs) { // Since there are numerous special names in Julia, it is too much trouble // to maintain them by hand. Hence these names (i.e. keywords, literals and // built-ins) are automatically generated from Julia v0.6 itself through diff --git a/src/languages/kotlin.js b/src/languages/kotlin.js index ceaf05a5f1..bbd8ed3560 100644 --- a/src/languages/kotlin.js +++ b/src/languages/kotlin.js @@ -7,7 +7,7 @@ */ -function(hljs) { +export default function(hljs) { var KEYWORDS = { keyword: 'abstract as val var vararg get set class object open private protected public noinline ' + diff --git a/src/languages/lasso.js b/src/languages/lasso.js index 1ed975d21d..12dc224ea2 100644 --- a/src/languages/lasso.js +++ b/src/languages/lasso.js @@ -5,7 +5,7 @@ Description: Lasso is a language and server platform for database-driven web app Website: http://www.lassosoft.com/What-Is-Lasso */ -function(hljs) { +export default function(hljs) { var LASSO_IDENT_RE = '[a-zA-Z_][\\w.]*'; var LASSO_ANGLE_RE = '<\\?(lasso(script)?|=)'; var LASSO_CLOSE_RE = '\\]|\\?>'; diff --git a/src/languages/latex.js b/src/languages/latex.js index c6e9daada7..db64634c5a 100644 --- a/src/languages/latex.js +++ b/src/languages/latex.js @@ -5,7 +5,7 @@ Website: https://www.latex-project.org Category: markup */ -function(hljs) { +export default function(hljs) { var COMMAND = { className: 'tag', begin: /\\/, diff --git a/src/languages/ldif.js b/src/languages/ldif.js index 644d5e82cd..90aaaea898 100644 --- a/src/languages/ldif.js +++ b/src/languages/ldif.js @@ -4,7 +4,7 @@ Contributors: Jacob Childress Category: enterprise, config Website: https://en.wikipedia.org/wiki/LDAP_Data_Interchange_Format */ -function(hljs) { +export default function(hljs) { return { contains: [ { diff --git a/src/languages/leaf.js b/src/languages/leaf.js index 146db7a6ff..2f66700d94 100644 --- a/src/languages/leaf.js +++ b/src/languages/leaf.js @@ -4,7 +4,7 @@ Author: Hale Chan Description: Based on the Leaf reference from https://vapor.github.io/documentation/guide/leaf.html. */ -function (hljs) { +export default function (hljs) { return { contains: [ { diff --git a/src/languages/less.js b/src/languages/less.js index 4dac32641a..da270929dc 100644 --- a/src/languages/less.js +++ b/src/languages/less.js @@ -6,7 +6,7 @@ Website: http://lesscss.org Category: common, css */ -function(hljs) { +export default function(hljs) { var IDENT_RE = '[\\w-]+'; // yes, Less identifiers may begin with a digit var INTERP_IDENT_RE = '(' + IDENT_RE + '|@{' + IDENT_RE + '})'; diff --git a/src/languages/lisp.js b/src/languages/lisp.js index 8f3d485a3a..f5abd52fcc 100644 --- a/src/languages/lisp.js +++ b/src/languages/lisp.js @@ -5,7 +5,7 @@ Author: Vasily Polovnyov Category: lisp */ -function(hljs) { +export default function(hljs) { var LISP_IDENT_RE = '[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*'; var MEC_RE = '\\|[^]*?\\|'; var LISP_SIMPLE_NUMBER_RE = '(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s|D|E|F|L|S)(\\+|\\-)?\\d+)?'; diff --git a/src/languages/livecodeserver.js b/src/languages/livecodeserver.js index 372b41bfe5..10f1a0210d 100644 --- a/src/languages/livecodeserver.js +++ b/src/languages/livecodeserver.js @@ -7,7 +7,7 @@ Date: 2019-04-17 Category: enterprise */ -function(hljs) { +export default function(hljs) { var VARIABLE = { className: 'variable', variants: [ diff --git a/src/languages/livescript.js b/src/languages/livescript.js index 4584ef82e2..4c4cf0d5f3 100644 --- a/src/languages/livescript.js +++ b/src/languages/livescript.js @@ -8,7 +8,7 @@ Website: https://livescript.net Category: scripting */ -function(hljs) { +export default function(hljs) { var KEYWORDS = { keyword: // JS keywords diff --git a/src/languages/llvm.js b/src/languages/llvm.js index 723579a833..dc5d244818 100644 --- a/src/languages/llvm.js +++ b/src/languages/llvm.js @@ -6,7 +6,7 @@ Website: https://llvm.org/docs/LangRef.html Category: assembler */ -function(hljs) { +export default function(hljs) { var identifier = '([-a-zA-Z$._][\\w\\-$.]*)'; return { //lexemes: '[.%]?' + hljs.IDENT_RE, diff --git a/src/languages/lsl.js b/src/languages/lsl.js index 3f9a6c41d5..19a24cdebe 100644 --- a/src/languages/lsl.js +++ b/src/languages/lsl.js @@ -6,7 +6,7 @@ Website: http://wiki.secondlife.com/wiki/LSL_Portal Category: scripting */ -function(hljs) { +export default function(hljs) { var LSL_STRING_ESCAPE_CHARS = { className: 'subst', diff --git a/src/languages/lua.js b/src/languages/lua.js index b9fa6ae5b7..01a0998994 100644 --- a/src/languages/lua.js +++ b/src/languages/lua.js @@ -6,7 +6,7 @@ Category: common, scripting Website: https://www.lua.org */ -function(hljs) { +export default function(hljs) { var OPENING_LONG_BRACKET = '\\[=*\\['; var CLOSING_LONG_BRACKET = '\\]=*\\]'; var LONG_BRACKETS = { diff --git a/src/languages/makefile.js b/src/languages/makefile.js index 6b469075ea..399e1e8f49 100644 --- a/src/languages/makefile.js +++ b/src/languages/makefile.js @@ -6,7 +6,7 @@ Website: https://www.gnu.org/software/make/manual/html_node/Introduction.html Category: common */ -function(hljs) { +export default function(hljs) { /* Variables: simple (eg $(var)) and special (eg $@) */ var VARIABLE = { className: 'variable', diff --git a/src/languages/markdown.js b/src/languages/markdown.js index e84cf9bc35..a0af0a17a2 100644 --- a/src/languages/markdown.js +++ b/src/languages/markdown.js @@ -6,7 +6,7 @@ Website: https://daringfireball.net/projects/markdown/ Category: common, markup */ -function(hljs) { +export default function(hljs) { INLINE_HTML = { begin: '<', end: '>', subLanguage: 'xml', diff --git a/src/languages/mathematica.js b/src/languages/mathematica.js index 3453be9221..2411014547 100644 --- a/src/languages/mathematica.js +++ b/src/languages/mathematica.js @@ -6,7 +6,7 @@ Website: https://www.wolfram.com/mathematica/ Category: scientific */ -function(hljs) { +export default function(hljs) { return { aliases: ['mma', 'wl'], lexemes: '(\\$|\\b)' + hljs.IDENT_RE + '\\b', diff --git a/src/languages/matlab.js b/src/languages/matlab.js index 89955f63b6..9ab0995e35 100644 --- a/src/languages/matlab.js +++ b/src/languages/matlab.js @@ -10,7 +10,7 @@ Category: scientific Formal syntax is not published, helpful link: https://github.com/kornilova-l/matlab-IntelliJ-plugin/blob/master/src/main/grammar/Matlab.bnf */ -function(hljs) { +export default function(hljs) { var TRANSPOSE_RE = '(\'|\\.\')+'; var TRANSPOSE = { diff --git a/src/languages/maxima.js b/src/languages/maxima.js index ce0f92a0b8..edc7d54fc6 100644 --- a/src/languages/maxima.js +++ b/src/languages/maxima.js @@ -5,7 +5,7 @@ Website: http://maxima.sourceforge.net Category: scientific */ -function(hljs) { +export default function(hljs) { var KEYWORDS = 'if then else elseif for thru do while unless step in and or not'; var LITERALS = 'true false unknown inf minf ind und %e %i %pi %phi %gamma'; var BUILTIN_FUNCTIONS = diff --git a/src/languages/mel.js b/src/languages/mel.js index a923f28fad..7b40d53d0f 100644 --- a/src/languages/mel.js +++ b/src/languages/mel.js @@ -6,7 +6,7 @@ Website: http://www.autodesk.com/products/autodesk-maya/overview Category: graphics */ -function(hljs) { +export default function(hljs) { return { keywords: 'int float string vector matrix if else switch case default while do for in break ' + diff --git a/src/languages/mercury.js b/src/languages/mercury.js index 0d0f08dacd..918ac3910f 100644 --- a/src/languages/mercury.js +++ b/src/languages/mercury.js @@ -5,7 +5,7 @@ Description: Mercury is a logic/functional programming language which combines t Website: https://www.mercurylang.org */ -function(hljs) { +export default function(hljs) { var KEYWORDS = { keyword: 'module use_module import_module include_module end_module initialise ' + diff --git a/src/languages/mipsasm.js b/src/languages/mipsasm.js index e29e2b340c..20c37ec442 100644 --- a/src/languages/mipsasm.js +++ b/src/languages/mipsasm.js @@ -6,7 +6,7 @@ Website: https://en.wikipedia.org/wiki/MIPS_architecture Category: assembler */ -function(hljs) { +export default function(hljs) { //local labels: %?[FB]?[AT]?\d{1,2}\w+ return { case_insensitive: true, diff --git a/src/languages/mizar.js b/src/languages/mizar.js index 13f9daa91e..f578ac10e3 100644 --- a/src/languages/mizar.js +++ b/src/languages/mizar.js @@ -6,7 +6,7 @@ Website: http://mizar.org/language/ Category: scientific */ -function(hljs) { +export default function(hljs) { return { keywords: 'environ vocabularies notations constructors definitions ' + diff --git a/src/languages/mojolicious.js b/src/languages/mojolicious.js index a4ddaf0b71..589bc92ce3 100644 --- a/src/languages/mojolicious.js +++ b/src/languages/mojolicious.js @@ -6,7 +6,7 @@ Description: Mojolicious .ep (Embedded Perl) templates Website: https://mojolicious.org Category: template */ -function(hljs) { +export default function(hljs) { return { subLanguage: 'xml', contains: [ diff --git a/src/languages/monkey.js b/src/languages/monkey.js index 472ab50205..29bf67c694 100644 --- a/src/languages/monkey.js +++ b/src/languages/monkey.js @@ -5,7 +5,7 @@ Author: Arthur Bikmullin Website: https://blitzresearch.itch.io/monkey2 */ -function(hljs) { +export default function(hljs) { var NUMBER = { className: 'number', relevance: 0, variants: [ diff --git a/src/languages/moonscript.js b/src/languages/moonscript.js index eb2bbae01b..f9a1f2211b 100644 --- a/src/languages/moonscript.js +++ b/src/languages/moonscript.js @@ -7,7 +7,7 @@ Website: http://moonscript.org/ Category: scripting */ -function(hljs) { +export default function(hljs) { var KEYWORDS = { keyword: // Moonscript keywords diff --git a/src/languages/n1ql.js b/src/languages/n1ql.js index a00cf70678..fc61f8a631 100644 --- a/src/languages/n1ql.js +++ b/src/languages/n1ql.js @@ -6,7 +6,7 @@ Website: https://www.couchbase.com/products/n1ql */ -function(hljs) { +export default function(hljs) { return { case_insensitive: true, contains: [ diff --git a/src/languages/nginx.js b/src/languages/nginx.js index 4ef9e45781..eee5ce50e7 100644 --- a/src/languages/nginx.js +++ b/src/languages/nginx.js @@ -6,7 +6,7 @@ Category: common, config Website: https://www.nginx.com */ -function(hljs) { +export default function(hljs) { var VAR = { className: 'variable', variants: [ diff --git a/src/languages/nim.js b/src/languages/nim.js index c673de007d..aa2ee8a143 100644 --- a/src/languages/nim.js +++ b/src/languages/nim.js @@ -5,7 +5,7 @@ Website: https://nim-lang.org Category: system */ -function(hljs) { +export default function(hljs) { return { aliases: ['nim'], keywords: { diff --git a/src/languages/nix.js b/src/languages/nix.js index 7d14ebd6a4..0b9ec66f73 100644 --- a/src/languages/nix.js +++ b/src/languages/nix.js @@ -6,7 +6,7 @@ Website: http://nixos.org/nix */ -function(hljs) { +export default function(hljs) { var NIX_KEYWORDS = { keyword: 'rec with let in inherit assert if else then', diff --git a/src/languages/nsis.js b/src/languages/nsis.js index d6a1387a5a..44cac0c1eb 100644 --- a/src/languages/nsis.js +++ b/src/languages/nsis.js @@ -5,7 +5,7 @@ Author: Jan T. Sott Website: https://nsis.sourceforge.io/Main_Page */ -function(hljs) { +export default function(hljs) { var CONSTANTS = { className: 'variable', begin: /\$(ADMINTOOLS|APPDATA|CDBURN_AREA|CMDLINE|COMMONFILES32|COMMONFILES64|COMMONFILES|COOKIES|DESKTOP|DOCUMENTS|EXEDIR|EXEFILE|EXEPATH|FAVORITES|FONTS|HISTORY|HWNDPARENT|INSTDIR|INTERNET_CACHE|LANGUAGE|LOCALAPPDATA|MUSIC|NETHOOD|OUTDIR|PICTURES|PLUGINSDIR|PRINTHOOD|PROFILE|PROGRAMFILES32|PROGRAMFILES64|PROGRAMFILES|QUICKLAUNCH|RECENT|RESOURCES_LOCALIZED|RESOURCES|SENDTO|SMPROGRAMS|SMSTARTUP|STARTMENU|SYSDIR|TEMP|TEMPLATES|VIDEOS|WINDIR)/ diff --git a/src/languages/objectivec.js b/src/languages/objectivec.js index 1a4a9fe1cc..7bb2afce68 100644 --- a/src/languages/objectivec.js +++ b/src/languages/objectivec.js @@ -6,7 +6,7 @@ Website: https://developer.apple.com/documentation/objectivec Category: common */ -function(hljs) { +export default function(hljs) { var API_CLASS = { className: 'built_in', begin: '\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+', diff --git a/src/languages/ocaml.js b/src/languages/ocaml.js index 26adc7645b..5fceaa25c5 100644 --- a/src/languages/ocaml.js +++ b/src/languages/ocaml.js @@ -7,7 +7,7 @@ Website: https://ocaml.org Category: functional */ -function(hljs) { +export default function(hljs) { /* missing support for heredoc-like string (OCaml 4.0.2+) */ return { aliases: ['ml'], diff --git a/src/languages/openscad.js b/src/languages/openscad.js index 47cb382246..945d15a440 100644 --- a/src/languages/openscad.js +++ b/src/languages/openscad.js @@ -6,7 +6,7 @@ Website: https://www.openscad.org Category: scientific */ -function(hljs) { +export default function(hljs) { var SPECIAL_VARS = { className: 'keyword', begin: '\\$(f[asn]|t|vp[rtd]|children)' diff --git a/src/languages/oxygene.js b/src/languages/oxygene.js index 3c3aa2640a..751e13054d 100644 --- a/src/languages/oxygene.js +++ b/src/languages/oxygene.js @@ -5,7 +5,7 @@ Description: Oxygene is built on the foundation of Object Pascal, revamped and e Website: https://www.elementscompiler.com/elements/default.aspx */ -function(hljs) { +export default function(hljs) { var OXYGENE_KEYWORDS = 'abstract add and array as asc aspect assembly async begin break block by case class concat const copy constructor continue '+ 'create default delegate desc distinct div do downto dynamic each else empty end ensure enum equals event except exit extension external false '+ 'final finalize finalizer finally flags for forward from function future global group has if implementation implements implies in index inherited '+ diff --git a/src/languages/parser3.js b/src/languages/parser3.js index 18611b42b1..a70cb5ddb4 100644 --- a/src/languages/parser3.js +++ b/src/languages/parser3.js @@ -6,7 +6,7 @@ Website: https://www.parser.ru/en/ Category: template */ -function(hljs) { +export default function(hljs) { var CURLY_SUBCOMMENT = hljs.COMMENT( '{', '}', diff --git a/src/languages/perl.js b/src/languages/perl.js index dd30597a71..aecace4007 100644 --- a/src/languages/perl.js +++ b/src/languages/perl.js @@ -5,7 +5,7 @@ Website: https://www.perl.org Category: common */ -function(hljs) { +export default function(hljs) { var PERL_KEYWORDS = 'getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ' + 'ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime ' + 'readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq' + diff --git a/src/languages/pf.js b/src/languages/pf.js index d4ab2908b7..3d2457df2f 100644 --- a/src/languages/pf.js +++ b/src/languages/pf.js @@ -6,7 +6,7 @@ Website: http://man.openbsd.org/pf.conf Category: config */ -function(hljs) { +export default function(hljs) { var MACRO = { className: 'variable', begin: /\$[\w\d#@][\w\d_]*/ diff --git a/src/languages/pgsql.js b/src/languages/pgsql.js index 7adb0b4165..bd9c8b1723 100644 --- a/src/languages/pgsql.js +++ b/src/languages/pgsql.js @@ -16,7 +16,7 @@ Description: some names highlighted while others not looks ugly. */ -function(hljs) { +export default function(hljs) { var COMMENT_MODE = hljs.COMMENT('--', '$'); var UNQUOTED_IDENT = '[a-zA-Z_][a-zA-Z_0-9$]*'; var DOLLAR_STRING = '\\$([a-zA-Z_]?|[a-zA-Z_][a-zA-Z_0-9]*)\\$'; diff --git a/src/languages/php.js b/src/languages/php.js index c2b19395a8..99e0c0d436 100644 --- a/src/languages/php.js +++ b/src/languages/php.js @@ -6,7 +6,7 @@ Website: https://www.php.net Category: common */ -function(hljs) { +export default function(hljs) { var VARIABLE = { begin: '\\$+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*' }; diff --git a/src/languages/plaintext.js b/src/languages/plaintext.js index e44111ab77..f0242aa958 100644 --- a/src/languages/plaintext.js +++ b/src/languages/plaintext.js @@ -5,7 +5,7 @@ Description: Plain text without any highlighting. Category: common */ -function(hljs) { +export default function(hljs) { return { aliases: ['text', 'txt'], disableAutodetect: true diff --git a/src/languages/pony.js b/src/languages/pony.js index 0113667108..426017ceec 100644 --- a/src/languages/pony.js +++ b/src/languages/pony.js @@ -6,7 +6,7 @@ Description: Pony is an open-source, object-oriented, actor-model, Website: https://www.ponylang.io */ -function(hljs) { +export default function(hljs) { var KEYWORDS = { keyword: 'actor addressof and as be break class compile_error compile_intrinsic ' + diff --git a/src/languages/powershell.js b/src/languages/powershell.js index fed4067c2b..f46bf6fda6 100644 --- a/src/languages/powershell.js +++ b/src/languages/powershell.js @@ -6,7 +6,7 @@ Contributors: Nicholas Blumhardt , Victor Zhou */ -function(hljs) { +export default function(hljs) { return { contains: [ hljs.C_NUMBER_MODE, diff --git a/src/languages/prolog.js b/src/languages/prolog.js index 8fa0fb0cc7..5c03a1e4a3 100644 --- a/src/languages/prolog.js +++ b/src/languages/prolog.js @@ -5,7 +5,7 @@ Author: Raivo Laanemets Website: https://en.wikipedia.org/wiki/Prolog */ -function(hljs) { +export default function(hljs) { var ATOM = { diff --git a/src/languages/properties.js b/src/languages/properties.js index 4c4efedfc4..9f0edc150d 100644 --- a/src/languages/properties.js +++ b/src/languages/properties.js @@ -5,7 +5,7 @@ Website: https://en.wikipedia.org/wiki/.properties Category: common, config */ -function(hljs) { +export default function(hljs) { // whitespaces: space, tab, formfeed var WS0 = '[ \\t\\f]*'; diff --git a/src/languages/protobuf.js b/src/languages/protobuf.js index 87963ce283..4075455fa7 100644 --- a/src/languages/protobuf.js +++ b/src/languages/protobuf.js @@ -6,7 +6,7 @@ Website: https://developers.google.com/protocol-buffers/docs/proto3 Category: protocols */ -function(hljs) { +export default function(hljs) { return { keywords: { keyword: 'package import option optional required repeated group oneof', diff --git a/src/languages/puppet.js b/src/languages/puppet.js index 26b1d26abf..7d714f3538 100644 --- a/src/languages/puppet.js +++ b/src/languages/puppet.js @@ -5,7 +5,7 @@ Website: https://puppet.com/docs Category: config */ -function(hljs) { +export default function(hljs) { var PUPPET_KEYWORDS = { keyword: diff --git a/src/languages/purebasic.js b/src/languages/purebasic.js index c6f4a25e7f..a9ca3ae674 100644 --- a/src/languages/purebasic.js +++ b/src/languages/purebasic.js @@ -8,7 +8,7 @@ Website: https://www.purebasic.com // Base deafult colors in PB IDE: background: #FFFFDF; foreground: #000000; -function(hljs) { +export default function(hljs) { var STRINGS = { // PB IDE color: #0080FF (Azure Radiance) className: 'string', begin: '(~)?"', end: '"', diff --git a/src/languages/python.js b/src/languages/python.js index 1b2b49b0e7..a55b0fd5b6 100644 --- a/src/languages/python.js +++ b/src/languages/python.js @@ -5,7 +5,7 @@ Website: https://www.python.org Category: common */ -function(hljs) { +export default function(hljs) { var KEYWORDS = { keyword: 'and elif is global as in if from raise for except finally print import pass return ' + diff --git a/src/languages/q.js b/src/languages/q.js index b6eb4474d8..c8845229bf 100644 --- a/src/languages/q.js +++ b/src/languages/q.js @@ -5,7 +5,7 @@ Description: Q is a vector-based functional paradigm programming language built Author: Sergey Vidyuk Website: https://kx.com/connect-with-us/developers/ */ -function(hljs) { +export default function(hljs) { var Q_KEYWORDS = { keyword: 'do while select delete by update from', diff --git a/src/languages/qml.js b/src/languages/qml.js index e5b3504b05..a0975ebe99 100644 --- a/src/languages/qml.js +++ b/src/languages/qml.js @@ -8,7 +8,7 @@ Website: https://doc.qt.io/qt-5/qmlapplications.html Category: scripting */ -function(hljs) { +export default function(hljs) { var KEYWORDS = { keyword: 'in of on if for while finally var new function do return void else break catch ' + diff --git a/src/languages/r.js b/src/languages/r.js index 8738eca108..1f8cf39156 100644 --- a/src/languages/r.js +++ b/src/languages/r.js @@ -6,7 +6,7 @@ Website: https://www.r-project.org Category: scientific */ -function(hljs) { +export default function(hljs) { var IDENT_RE = '([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*'; return { diff --git a/src/languages/reasonml.js b/src/languages/reasonml.js index 5a13496e86..d902d3fc17 100644 --- a/src/languages/reasonml.js +++ b/src/languages/reasonml.js @@ -5,7 +5,7 @@ Website: https://reasonml.github.io Author: Gidi Meir Morris Category: functional */ -function(hljs) { +export default function(hljs) { function orReValues(ops){ return ops .map(function(op) { diff --git a/src/languages/rib.js b/src/languages/rib.js index 61f9a31147..217e6fa768 100644 --- a/src/languages/rib.js +++ b/src/languages/rib.js @@ -6,7 +6,7 @@ Website: https://renderman.pixar.com/resources/RenderMan_20/ribBinding.html Category: graphics */ -function(hljs) { +export default function(hljs) { return { keywords: 'ArchiveRecord AreaLightSource Atmosphere Attribute AttributeBegin AttributeEnd Basis ' + diff --git a/src/languages/roboconf.js b/src/languages/roboconf.js index 5bbb818d69..7e82af6bee 100644 --- a/src/languages/roboconf.js +++ b/src/languages/roboconf.js @@ -6,7 +6,7 @@ Website: http://roboconf.net Category: config */ -function(hljs) { +export default function(hljs) { var IDENTIFIER = '[a-zA-Z-_][^\\n{]+\\{'; var PROPERTY = { diff --git a/src/languages/routeros.js b/src/languages/routeros.js index c5b3da7f35..e605518230 100644 --- a/src/languages/routeros.js +++ b/src/languages/routeros.js @@ -11,7 +11,7 @@ Website: https://wiki.mikrotik.com/wiki/Manual:Scripting // purple - #99069A // light-brown - #9A9900 -function(hljs) { +export default function(hljs) { var STATEMENTS = 'foreach do while for if from to step else on-error and or not in'; diff --git a/src/languages/rsl.js b/src/languages/rsl.js index ae132ea6ea..72ba3c133b 100644 --- a/src/languages/rsl.js +++ b/src/languages/rsl.js @@ -6,7 +6,7 @@ Website: https://renderman.pixar.com/resources/RenderMan_20/shadingLanguage.html Category: graphics */ -function(hljs) { +export default function(hljs) { return { keywords: { keyword: diff --git a/src/languages/ruby.js b/src/languages/ruby.js index 4ffbdb08d3..0f15104fe7 100644 --- a/src/languages/ruby.js +++ b/src/languages/ruby.js @@ -7,7 +7,7 @@ Contributors: Peter Leonov , Vasily Polovnyov Description: Syntax Highlighting for SAS */ -function(hljs) { +export default function(hljs) { // Data step and PROC SQL statements var SAS_KEYWORDS = ''+ diff --git a/src/languages/scala.js b/src/languages/scala.js index 89bf9bb4b9..86d44d7add 100644 --- a/src/languages/scala.js +++ b/src/languages/scala.js @@ -6,7 +6,7 @@ Contributors: Erik Osheim Website: https://www.scala-lang.org */ -function(hljs) { +export default function(hljs) { var ANNOTATION = { className: 'meta', begin: '@[A-Za-z]+' }; diff --git a/src/languages/scheme.js b/src/languages/scheme.js index a7ab7505d4..0b5d9ac99d 100644 --- a/src/languages/scheme.js +++ b/src/languages/scheme.js @@ -9,7 +9,7 @@ Website: http://community.schemewiki.org/?what-is-scheme Category: lisp */ -function(hljs) { +export default function(hljs) { var SCHEME_IDENT_RE = '[^\\(\\)\\[\\]\\{\\}",\'`;#|\\\\\\s]+'; var SCHEME_SIMPLE_NUMBER_RE = '(\\-|\\+)?\\d+([./]\\d+)?'; var SCHEME_COMPLEX_NUMBER_RE = SCHEME_SIMPLE_NUMBER_RE + '[+\\-]' + SCHEME_SIMPLE_NUMBER_RE + 'i'; diff --git a/src/languages/scilab.js b/src/languages/scilab.js index e9002ebd17..801c9fbba8 100644 --- a/src/languages/scilab.js +++ b/src/languages/scilab.js @@ -7,7 +7,7 @@ Website: https://www.scilab.org Category: scientific */ -function(hljs) { +export default function(hljs) { var COMMON_CONTAINS = [ hljs.C_NUMBER_MODE, diff --git a/src/languages/scss.js b/src/languages/scss.js index 28a96ddad9..89d738cfb5 100644 --- a/src/languages/scss.js +++ b/src/languages/scss.js @@ -5,7 +5,7 @@ Author: Kurt Emch Website: https://sass-lang.com Category: common, css */ -function(hljs) { +export default function(hljs) { var AT_IDENTIFIER = '@[a-z-]+' // @font-face var AT_MODIFIERS = "and or not only" var IDENT_RE = '[a-zA-Z-][a-zA-Z0-9_-]*'; diff --git a/src/languages/shell.js b/src/languages/shell.js index 62710f37ba..f9b4320be8 100644 --- a/src/languages/shell.js +++ b/src/languages/shell.js @@ -5,7 +5,7 @@ Author: TSUYUSATO Kitsune Category: common */ -function(hljs) { +export default function(hljs) { return { aliases: ['console'], contains: [ diff --git a/src/languages/smali.js b/src/languages/smali.js index 4c3cbf9c3e..4d3d730f45 100644 --- a/src/languages/smali.js +++ b/src/languages/smali.js @@ -5,7 +5,7 @@ Description: Basic Smali highlighting Website: https://github.com/JesusFreke/smali */ -function(hljs) { +export default function(hljs) { var smali_instr_low_prio = ['add', 'and', 'cmp', 'cmpg', 'cmpl', 'const', 'div', 'double', 'float', 'goto', 'if', 'int', 'long', 'move', 'mul', 'neg', 'new', 'nop', 'not', 'or', 'rem', 'return', 'shl', 'shr', 'sput', 'sub', 'throw', 'ushr', 'xor']; var smali_instr_high_prio = ['aget', 'aput', 'array', 'check', 'execute', 'fill', 'filled', 'goto/16', 'goto/32', 'iget', 'instance', 'invoke', 'iput', 'monitor', 'packed', 'sget', 'sparse']; var smali_keywords = ['transient', 'constructor', 'abstract', 'final', 'synthetic', 'public', 'private', 'protected', 'static', 'bridge', 'system']; diff --git a/src/languages/smalltalk.js b/src/languages/smalltalk.js index 50c8c092ca..7981753652 100644 --- a/src/languages/smalltalk.js +++ b/src/languages/smalltalk.js @@ -5,7 +5,7 @@ Author: Vladimir Gubarkov Website: https://en.wikipedia.org/wiki/Smalltalk */ -function(hljs) { +export default function(hljs) { var VAR_IDENT_RE = '[a-z][a-zA-Z0-9_]*'; var CHAR = { className: 'string', diff --git a/src/languages/sml.js b/src/languages/sml.js index 6b5685bba6..26d56b4ced 100644 --- a/src/languages/sml.js +++ b/src/languages/sml.js @@ -6,7 +6,7 @@ Website: https://www.smlnj.org Origin: ocaml.js Category: functional */ -function(hljs) { +export default function(hljs) { return { aliases: ['ml'], keywords: { diff --git a/src/languages/sqf.js b/src/languages/sqf.js index 89075cf1f5..d657aa6549 100644 --- a/src/languages/sqf.js +++ b/src/languages/sqf.js @@ -7,7 +7,7 @@ Website: https://community.bistudio.com/wiki/SQF_syntax Category: scripting */ -function(hljs) { +export default function(hljs) { // In SQF, a variable start with _ var VARIABLE = { className: 'variable', diff --git a/src/languages/sql.js b/src/languages/sql.js index 081a0ecc0a..7cf4679368 100644 --- a/src/languages/sql.js +++ b/src/languages/sql.js @@ -5,7 +5,7 @@ Category: common */ -function(hljs) { +export default function(hljs) { var COMMENT_MODE = hljs.COMMENT('--', '$'); return { case_insensitive: true, diff --git a/src/languages/stan.js b/src/languages/stan.js index ce2b63a804..56cbd05a0f 100644 --- a/src/languages/stan.js +++ b/src/languages/stan.js @@ -6,7 +6,7 @@ Website: http://mc-stan.org/ Category: scientific */ -function(hljs) { +export default function(hljs) { // variable names cannot conflict with block identifiers var BLOCKS = [ 'functions', diff --git a/src/languages/stata.js b/src/languages/stata.js index f5e2a2411d..2e7e8faf4a 100644 --- a/src/languages/stata.js +++ b/src/languages/stata.js @@ -11,7 +11,7 @@ Category: scientific This is a fork and modification of Drew McDonald's file (https://github.com/drewmcdonald/stata-highlighting). I have also included a list of builtin commands from https://bugs.kde.org/show_bug.cgi?id=135646. */ -function(hljs) { +export default function(hljs) { return { aliases: ['do', 'ado'], case_insensitive: true, diff --git a/src/languages/step21.js b/src/languages/step21.js index 43f6ddc86d..d060c93b9f 100644 --- a/src/languages/step21.js +++ b/src/languages/step21.js @@ -5,7 +5,7 @@ Description: Syntax highlighter for STEP Part 21 files (ISO 10303-21). Website: https://en.wikipedia.org/wiki/ISO_10303-21 */ -function(hljs) { +export default function(hljs) { var STEP21_IDENT_RE = '[A-Z_][A-Z0-9_.]*'; var STEP21_KEYWORDS = { keyword: 'HEADER ENDSEC DATA' diff --git a/src/languages/stylus.js b/src/languages/stylus.js index ff794862d3..f2934c7bf3 100644 --- a/src/languages/stylus.js +++ b/src/languages/stylus.js @@ -6,7 +6,7 @@ Website: https://github.com/stylus/stylus Category: css */ -function(hljs) { +export default function(hljs) { var VARIABLE = { className: 'variable', diff --git a/src/languages/subunit.js b/src/languages/subunit.js index b031feeb7b..545961a61b 100644 --- a/src/languages/subunit.js +++ b/src/languages/subunit.js @@ -4,7 +4,7 @@ Author: Sergey Bronnikov Website: https://pypi.org/project/python-subunit/ */ -function(hljs) { +export default function(hljs) { var DETAILS = { className: 'string', begin: '\\[\n(multipart)?', end: '\\]\n' diff --git a/src/languages/swift.js b/src/languages/swift.js index a6f4d91f8f..fc39dd941b 100644 --- a/src/languages/swift.js +++ b/src/languages/swift.js @@ -8,7 +8,7 @@ Category: common, system */ -function(hljs) { +export default function(hljs) { var SWIFT_KEYWORDS = { keyword: '#available #colorLiteral #column #else #elseif #endif #file ' + '#fileLiteral #function #if #imageLiteral #line #selector #sourceLocation ' + diff --git a/src/languages/taggerscript.js b/src/languages/taggerscript.js index c80bbd03de..3161c802ad 100644 --- a/src/languages/taggerscript.js +++ b/src/languages/taggerscript.js @@ -4,7 +4,7 @@ Author: Philipp Wolfer Description: Syntax Highlighting for the Tagger Script as used by MusicBrainz Picard. Website: https://picard.musicbrainz.org */ -function(hljs) { +export default function(hljs) { var COMMENT = { className: 'comment', diff --git a/src/languages/tap.js b/src/languages/tap.js index d622df55b0..07d68cff3d 100644 --- a/src/languages/tap.js +++ b/src/languages/tap.js @@ -6,7 +6,7 @@ Author: Sergey Bronnikov Website: https://testanything.org */ -function(hljs) { +export default function(hljs) { return { case_insensitive: true, contains: [ diff --git a/src/languages/tcl.js b/src/languages/tcl.js index 2a5ed00ddd..7492b2f303 100644 --- a/src/languages/tcl.js +++ b/src/languages/tcl.js @@ -5,7 +5,7 @@ Author: Radek Liska Website: https://www.tcl.tk/about/language.html */ -function(hljs) { +export default function(hljs) { return { aliases: ['tk'], keywords: 'after append apply array auto_execok auto_import auto_load auto_mkindex ' + diff --git a/src/languages/thrift.js b/src/languages/thrift.js index eb2f1dae6d..e8e983a82f 100644 --- a/src/languages/thrift.js +++ b/src/languages/thrift.js @@ -6,7 +6,7 @@ Website: https://thrift.apache.org Category: protocols */ -function(hljs) { +export default function(hljs) { var BUILT_IN_TYPES = 'bool byte i16 i32 i64 double string binary'; return { keywords: { diff --git a/src/languages/tp.js b/src/languages/tp.js index 5ac0a2348c..201ebce523 100644 --- a/src/languages/tp.js +++ b/src/languages/tp.js @@ -5,7 +5,7 @@ Description: FANUC TP programming language (TPP). */ -function(hljs) { +export default function(hljs) { var TPID = { className: 'number', begin: '[1-9][0-9]*', /* no leading zeros */ diff --git a/src/languages/twig.js b/src/languages/twig.js index 285db11de6..9cd0ba88d0 100644 --- a/src/languages/twig.js +++ b/src/languages/twig.js @@ -7,7 +7,7 @@ Website: https://twig.symfony.com Category: template */ -function(hljs) { +export default function(hljs) { var PARAMS = { className: 'params', begin: '\\(', end: '\\)' diff --git a/src/languages/typescript.js b/src/languages/typescript.js index dc0e76198b..71b2f7e8c1 100644 --- a/src/languages/typescript.js +++ b/src/languages/typescript.js @@ -7,7 +7,7 @@ Website: https://www.typescriptlang.org Category: common, scripting */ -function(hljs) { +export default function(hljs) { var JS_IDENT_RE = '[A-Za-z$_][0-9A-Za-z$_]*'; var KEYWORDS = { keyword: diff --git a/src/languages/vala.js b/src/languages/vala.js index d45c93fe12..297ae40597 100644 --- a/src/languages/vala.js +++ b/src/languages/vala.js @@ -5,7 +5,7 @@ Description: Vala is a new programming language that aims to bring modern progra Website: https://wiki.gnome.org/Projects/Vala */ -function(hljs) { +export default function(hljs) { return { keywords: { keyword: diff --git a/src/languages/vbnet.js b/src/languages/vbnet.js index 90c1d96fbd..e4eb38d740 100644 --- a/src/languages/vbnet.js +++ b/src/languages/vbnet.js @@ -5,7 +5,7 @@ Author: Poren Chiang Website: https://docs.microsoft.com/en-us/dotnet/visual-basic/getting-started/ */ -function(hljs) { +export default function(hljs) { return { aliases: ['vb'], case_insensitive: true, diff --git a/src/languages/vbscript-html.js b/src/languages/vbscript-html.js index b32be2f25c..582412c4e1 100644 --- a/src/languages/vbscript-html.js +++ b/src/languages/vbscript-html.js @@ -7,7 +7,7 @@ Website: https://en.wikipedia.org/wiki/VBScript Category: scripting */ -function(hljs) { +export default function(hljs) { return { subLanguage: 'xml', contains: [ diff --git a/src/languages/vbscript.js b/src/languages/vbscript.js index 7d1d648e0b..f96c4376aa 100644 --- a/src/languages/vbscript.js +++ b/src/languages/vbscript.js @@ -7,7 +7,7 @@ Website: https://en.wikipedia.org/wiki/VBScript Category: scripting */ -function(hljs) { +export default function(hljs) { return { aliases: ['vbs'], case_insensitive: true, diff --git a/src/languages/verilog.js b/src/languages/verilog.js index 02a8cf1357..a22254de6d 100644 --- a/src/languages/verilog.js +++ b/src/languages/verilog.js @@ -6,7 +6,7 @@ Description: Verilog is a hardware description language used in electronic desig Website: http://www.verilog.com */ -function(hljs) { +export default function(hljs) { var SV_KEYWORDS = { keyword: 'accept_on alias always always_comb always_ff always_latch and assert assign ' + diff --git a/src/languages/vhdl.js b/src/languages/vhdl.js index 4b44f4a1ba..b78ca82c74 100644 --- a/src/languages/vhdl.js +++ b/src/languages/vhdl.js @@ -6,7 +6,7 @@ Description: VHDL is a hardware description language used in electronic design a Website: https://en.wikipedia.org/wiki/VHDL */ -function(hljs) { +export default function(hljs) { // Regular expression for VHDL numeric literals. // Decimal literal: diff --git a/src/languages/vim.js b/src/languages/vim.js index 7df6fbc569..b9bc91f68e 100644 --- a/src/languages/vim.js +++ b/src/languages/vim.js @@ -6,7 +6,7 @@ Website: https://www.vim.org Category: scripting */ -function(hljs) { +export default function(hljs) { return { lexemes: /[!#@\w]+/, keywords: { diff --git a/src/languages/x86asm.js b/src/languages/x86asm.js index cd8cf87b2a..134c0d2221 100644 --- a/src/languages/x86asm.js +++ b/src/languages/x86asm.js @@ -6,7 +6,7 @@ Website: https://en.wikipedia.org/wiki/X86_assembly_language Category: assembler */ -function(hljs) { +export default function(hljs) { return { case_insensitive: true, lexemes: '[.%]?' + hljs.IDENT_RE, diff --git a/src/languages/xl.js b/src/languages/xl.js index adbbdc01ce..3a421ecb34 100644 --- a/src/languages/xl.js +++ b/src/languages/xl.js @@ -5,7 +5,7 @@ Description: An extensible programming language, based on parse tree rewriting Website: http://xlr.sf.net */ -function(hljs) { +export default function(hljs) { var BUILTIN_MODULES = 'ObjectLoader Animate MovieCredits Slides Filters Shading Materials LensFlare Mapping VLCAudioVideo ' + 'StereoDecoder PointCloud NetworkAccess RemoteControl RegExp ChromaKey Snowfall NodeJS Speech Charts'; diff --git a/src/languages/xml.js b/src/languages/xml.js index 11861f5823..e3146e3082 100644 --- a/src/languages/xml.js +++ b/src/languages/xml.js @@ -4,7 +4,7 @@ Website: https://www.w3.org/XML/ Category: common */ -function(hljs) { +export default function(hljs) { var XML_IDENT_RE = '[A-Za-z0-9\\._:-]+'; var XML_ENTITIES = { className: 'symbol', diff --git a/src/languages/xquery.js b/src/languages/xquery.js index e9ec8b91ae..0f22dd9dd9 100644 --- a/src/languages/xquery.js +++ b/src/languages/xquery.js @@ -8,7 +8,7 @@ Website: https://www.w3.org/XML/Query/ Category: functional */ -function(hljs) { +export default function(hljs) { // see https://www.w3.org/TR/xquery/#id-terminal-delimitation var KEYWORDS = 'module schema namespace boundary-space preserve no-preserve strip default collation base-uri ordering context decimal-format decimal-separator copy-namespaces empty-sequence except exponent-separator external grouping-separator inherit no-inherit lax minus-sign per-mille percent schema-attribute schema-element strict unordered zero-digit ' + 'declare import option function validate variable ' + diff --git a/src/languages/yaml.js b/src/languages/yaml.js index deeb4ae30a..3437d72f1c 100644 --- a/src/languages/yaml.js +++ b/src/languages/yaml.js @@ -7,7 +7,7 @@ Requires: ruby.js Website: https://yaml.org Category: common, config */ -function(hljs) { +export default function(hljs) { var LITERALS = 'true false yes no null'; // Define keys as starting with a word character diff --git a/src/languages/zephir.js b/src/languages/zephir.js index 96635280f3..70a28e6e0d 100644 --- a/src/languages/zephir.js +++ b/src/languages/zephir.js @@ -5,7 +5,7 @@ Website: https://zephir-lang.com/en */ -function(hljs) { +export default function(hljs) { var STRING = { className: 'string', contains: [hljs.BACKSLASH_ESCAPE], diff --git a/tools/build.js b/tools/build.js index d39955139b..0af495fedc 100644 --- a/tools/build.js +++ b/tools/build.js @@ -77,7 +77,14 @@ commander commander.target = commander.target.toLowerCase(); -build = require(`./${commander.target}`); +var target = commander.target +if (target=="cdn") + target = "./roll_cdn" +if (target=="browser") + target = "./roll_browser" + + +build = require(`./${target}`); dir.root = path.dirname(__dirname); dir.build = path.join(dir.root, 'build'); diff --git a/tools/build_config.js b/tools/build_config.js new file mode 100644 index 0000000000..94ea943908 --- /dev/null +++ b/tools/build_config.js @@ -0,0 +1,66 @@ +module.exports = { + "build_dir": "build", + "copyrightYears": "2006-2019", + "clean_css": {}, + "terser": { + // output: { ascii_only: true }, + "compress": { + passes: 2, + unsafe: true, + warnings: true, + dead_code: true, + toplevel: "funcs", + global_defs: { + LEGACY: false, + DEBUG: false + } + }, + "mangle": { +// "properties": { +// "only_cache": true, +// "reserved": [], +// // "keep_quoted": true, +// "builtins": [] +// , "cache": { +// "propsx" : new Map([ +// ["relevance","r"], +// ["contains", "c"], +// ["keywords", "k"], +// ['begin', 'b'], +// ['beginKeywords', 'bK'], +// ['end', 'e'], +// ['endsWithParent', 'eW'], +// ['excludeBegin', 'eB'], +// ['excludeEnd', 'eE'], +// ['returnBegin', 'rB'], +// ['returnEnd', 'rE'], +// ['variants', 'v'], +// // ['className', 'cN'], + +// ['IDENT_RE', 'IR'], +// ['UNDERSCORE_IDENT_RE', 'UIR'], +// ['NUMBER_RE', 'NR'], +// ['C_NUMBER_RE', 'CNR'], +// ['BINARY_NUMBER_RE', 'BNR'], +// ['RE_STARTERS_RE', 'RSR'], +// ['BACKSLASH_ESCAPE', 'BE'], +// ['APOS_STRING_MODE', 'ASM'], +// ['QUOTE_STRING_MODE', 'QSM'], +// ['PHRASAL_WORDS_MODE', 'PWM'], +// ['C_LINE_COMMENT_MODE', 'CLCM'], +// ['C_BLOCK_COMMENT_MODE', 'CBCM'], +// ['HASH_COMMENT_MODE', 'HCM'], +// ['NUMBER_MODE', 'NM'], +// ['C_NUMBER_MODE', 'CNM'], +// ['BINARY_NUMBER_MODE', 'BNM'], +// ['CSS_NUMBER_MODE', 'CSSNM'], +// ['REGEXP_MODE', 'RM'], +// ['TITLE_MODE', 'TM'], +// ['UNDERSCORE_TITLE_MODE', 'UTM'], +// ['COMMENT', 'C'], +// ]) +// } +// } + } + } +} diff --git a/tools/lib/bundling.js b/tools/lib/bundling.js new file mode 100644 index 0000000000..55c688e814 --- /dev/null +++ b/tools/lib/bundling.js @@ -0,0 +1,59 @@ +const rollup = require('rollup') + +async function buildOutput(inputOptions, outputOptions) { + const bundle = await rollup.rollup(inputOptions).catch(err => console.log(err));; + const { output } = await bundle.generate(outputOptions); + return output[0].code; +} + +async function build(inputOptions, outputOptions) { + // create a bundle + const bundle = await rollup.rollup(inputOptions).catch(err => console.log(err));; + + // console.log(bundle.watchFiles); // an array of file names this bundle depends on + + // generate code + const { output } = await bundle.generate(outputOptions); + + for (const chunkOrAsset of output) { + if (chunkOrAsset.type === 'asset') { + // For assets, this contains + // { + // fileName: string, // the asset file name + // source: string | Buffer // the asset source + // type: 'asset' // signifies that this is an asset + // } + // console.log('Asset', chunkOrAsset); + } else { + // For chunks, this contains + // { + // code: string, // the generated JS code + // dynamicImports: string[], // external modules imported dynamically by the chunk + // exports: string[], // exported variable names + // facadeModuleId: string | null, // the id of a module that this chunk corresponds to + // fileName: string, // the chunk file name + // imports: string[], // external modules imported statically by the chunk + // isDynamicEntry: boolean, // is this chunk a dynamic entry point + // isEntry: boolean, // is this chunk a static entry point + // map: string | null, // sourcemaps if present + // modules: { // information about the modules in this chunk + // [id: string]: { + // renderedExports: string[]; // exported variable names that were included + // removedExports: string[]; // exported variable names that were removed + // renderedLength: number; // the length of the remaining code in this module + // originalLength: number; // the original length of the code in this module + // }; + // }, + // name: string // the name of this chunk as used in naming patterns + // type: 'chunk', // signifies that this is a chunk + // } + // console.log('Chunk', chunkOrAsset.modules); + // console.log('Chunk', chunkOrAsset.code); + } + } + + // or write the bundle to disk + await bundle.write(outputOptions) +} + +module.exports = { build, buildOutput } diff --git a/tools/lib/dependencies.js b/tools/lib/dependencies.js new file mode 100644 index 0000000000..a12543a013 --- /dev/null +++ b/tools/lib/dependencies.js @@ -0,0 +1,103 @@ +const MAX_REORDER_ATTEMPTS = 10 + +/** + * Reorders languages, moving dependencies above the languages + * that depend on them. + * + * @param {array} languages list of languages to be reordered + * @returns {array} ordered list of languages +*/ + +const reorderDependencies = (languages) => { + var languages = [...languages] // clone + var moved + var attempts = 0 + do { + moved = false + let loaded = [] + for (let lang of languages) { + loaded.push(lang.name) + if (lang.requires.length === 0) continue; + for (let needed of lang.requires) { + if (loaded.includes(needed)) continue; + moved = true + + let i = languages.findIndex((el) => el.name == needed) + let removed = languages.splice(i, 1) + let me = languages.findIndex((el) => el.name == lang.name) + languages.splice(me,0, ...removed) + + loaded.push(needed) + } + } + attempts += 1 + } while(moved===true && attempts <= MAX_REORDER_ATTEMPTS) + if (attempts > MAX_REORDER_ATTEMPTS) { + let topOfStack = languages.slice(0,2).map((el) => el.name) + console.error("[ERROR] You have recursive dependencies:", topOfStack) + process.exit(1) + } + return languages +} + +/** + * Filters languages by group (common, etc) + * + * Groups are currently defined inside each language file with `Category` + * + * @param {array} languages full list of languages + * @returns {array} filtered list +*/ + +const languagesByGroup = (languages, groupName) => { + return languages.filter((el) => el.categories.includes(groupName)) +} +const isGroupName = (name) => name[0] == ":" + + +/** + * Filters languages by a list of languages or categories + * + * This also resolves any requires and dependency ordering issues. + * The returned list can be registered sequentially and should "just work". + * + * @param {array} allLanguages - full list of languages + * @param {array} includes - which languages or groups to include + * example: ":common elixir ruby" + * @returns {array} filtered list if languages +*/ +const filter = (allLanguages, includes) => { + if (includes==undefined || includes.length==0) + return reorderDependencies(allLanguages); + + let languages = []; + for (let lang of includes) { + if (isGroupName(lang)) { + let group = lang.substr(1) + languages = languages.concat(languagesByGroup(allLanguages,group)) + } else { + let found = allLanguages.find((el) => el.name == lang ) + if (found) + languages.push(found) + else { + console.error(`[ERROR] Language '${lang}' could not be found.`) + process.exit(1) + } + } + } + + // resolve requires + for (let lang of languages) { + lang.requires.forEach(needed => { + if (!languages.find((el) => el.name == needed)) { + console.info(`[INFO] Adding ${needed}... ${lang.name} requires ${needed}.`) + languages.push(allLanguages.find((el) => el.name == needed)) + } + }); + } + + // make sure our dependencies are in the correct order + return reorderDependencies(languages); +} + +module.exports = { reorderDependencies, filter } diff --git a/tools/lib/language.js b/tools/lib/language.js new file mode 100644 index 0000000000..bd6ecb38b7 --- /dev/null +++ b/tools/lib/language.js @@ -0,0 +1,98 @@ +const fs = require("fs") +const fsProm = require("fs").promises +const Terser = require("terser"); + +const REQUIRES_REGEX = /\/\*.*?Requires: (.*?)\n/s +const CATEGORY_REGEX = /\/\*.*?Category: (.*?)\n/s +const LANGUAGE_REGEX = /\/\*.*?Language: (.*?)\n/s +const {buildOutput} = require("./bundling.js") + +class Language { + + constructor(name, path) { + this.name = name + this.prettyName = name + this.requires = [] + this.categories = [] + + // compiled code + this.module = "" + this.minified = "" + + this.data = fs.readFileSync(path, {encoding: "utf8"}) + this.loadMetadata() + } + + async compile(options) { + await compileLanguage(this,options); + return this; + } + + get sample() { + if (this._sample) return this._sample; + + this._sample = fs.readFileSync(this.samplePath, {encoding: "utf8"}); + return this._sample; + } + + get samplePath() { + return `./test/detect/${this.name}/default.txt` + } + + loadMetadata() { + var requiresMatch = REQUIRES_REGEX.exec(this.data) + var categoryMatch = CATEGORY_REGEX.exec(this.data) + var languageMatch = LANGUAGE_REGEX.exec(this.data) + + if (requiresMatch) + this.requires = requiresMatch[1].split(", ").map((n) => n.replace(".js","")) + + if (categoryMatch) + this.categories = categoryMatch[1].split(/,\s?/) + + if (languageMatch) + this.prettyName = languageMatch[1] + } + + static fromFile(filename) { + var path = `./src/languages/${filename}` + return new Language( + filename.replace(".js",""), + path + ) + } +} + + +async function compileLanguage (language, options) { + const EXPORT = /export default (.*);/ + const opts = { format: "esm", strict: false, + outro: "", + compact: false, + interop: false, + extend: false, + } + + // TODO: cant we use the source we already have? + const input = { input: `src/languages/${language.name}.js` } + const output = { ...opts, name: `hljs`, file: "out.js" } + var data = await buildOutput(input, output) + + var m = EXPORT.exec(data) + data = data.replace(EXPORT, "") + data = data.replace(`function ${m[1]}`,`hljs.registerLanguage('${language.name}',function`) + data = data.replace(``,');') + language.module = data + data = Terser.minify(data, options["terser"]) + language.minified = data.code +} + +function getLanguages() { + let languages = [] + fs.readdirSync("./src/languages/").forEach((file) => { + languages.push(Language.fromFile(file)) + }) + return languages +} + +module.exports = { Language, getLanguages } diff --git a/tools/lib/makestuff.js b/tools/lib/makestuff.js new file mode 100644 index 0000000000..89ca2b469f --- /dev/null +++ b/tools/lib/makestuff.js @@ -0,0 +1,29 @@ +const fs = require("fs") +const CleanCSS = require('clean-css'); +const path = require('path'); +let _ = require('lodash'); +const config = require("../build_config") + +function install(file, dest=file) { + fs.copyFileSync(file, `${process.env.BUILD_DIR}/${dest}`) +} + +function install_cleancss(file, dest) { + var content = fs.readFileSync(file, {encoding: "utf8"}) + var out = new CleanCSS(config.clean_css).minify(content).styles; + fs.writeFileSync(`${process.env.BUILD_DIR}/${dest}`, out) +} + +function mkdir(dirname) { + fs.mkdirSync(`${process.env.BUILD_DIR}/${dirname}`, {recursive: true}) +} + +function renderTemplate(src, dest, data) +{ + data.path = path; + var content = fs.readFileSync(src, {encoding: "utf8"}) + var rendered = _.template(content)(data) + fs.writeFileSync(`${process.env.BUILD_DIR}/${dest}`, rendered) +} + +module.exports = { install, install_cleancss, mkdir, renderTemplate } diff --git a/tools/node.js b/tools/node.js index 8a38f899ec..5176712b4b 100644 --- a/tools/node.js +++ b/tools/node.js @@ -10,7 +10,8 @@ let utility = require('./utility'); let directory, filterCB, languages = utility.glob(path.join('src', 'languages', '*.js')), - header = utility.regex.header; + header = utility.regex.header, + exportDefault = utility.regex.exportDefault; function templateAllFunc(blobs) { const names = _.map(blobs, blob => path.basename(blob.name, '.js')); @@ -23,6 +24,7 @@ function buildLanguages() { output = path.join(directory.build, 'lib', 'languages'), replaceArgs = utility.replace(header, ''), + replaceExportDefault = utility.replace(exportDefault,""), template = 'module.exports = <%= content %>;'; return { @@ -30,7 +32,8 @@ function buildLanguages() { read: { requires: 'logStart', task: ['glob', input] }, filter: { requires: 'read', task: ['filter', filterCB] }, replace: { requires: 'filter', task: ['replace', replaceArgs] }, - template: { requires: 'replace', task: ['template', template] }, + replace2: { requires: 'replace', task: ['replace', replaceExportDefault] }, + template: { requires: 'replace2', task: ['template', template] }, writeLog: { requires: 'template', task: ['log', 'Writing language files.'] diff --git a/tools/roll_browser.js b/tools/roll_browser.js new file mode 100644 index 0000000000..2d58fa1c9f --- /dev/null +++ b/tools/roll_browser.js @@ -0,0 +1,148 @@ +const _ = require('lodash'); +const fs = require("fs").promises +const glob = require("glob-promise") +const path = require("path") +const zlib = require('zlib') +const Terser = require("terser"); +const child_process = require('child_process'); +const { getLanguages } = require("./lib/language") +const { filter } = require("./lib/dependencies") +const config = require("./build_config") + +const { install, install_cleancss, mkdir, renderTemplate } = require("./lib/makestuff") +const log = (...args) => console.log(...args) + +function buildHeader(args) { + return "/*\n" + + ` Highlight.js ${args.version} (${args.git_sha})\n` + + ` License: ${args.license}\n` + + ` Copyright (c) ${config.copyrightYears}, ${args.author.name}\n*/` +} + +async function buildBrowser(options) { + var languages = getLanguages() + // filter languages for inclusion in the highlight.js bundle + languages = filter(languages, options["languages"]) + + await installDocs(); + await installDemo(languages); + + + log("Preparing languages.") + await Promise.all( + languages.map(async (lang) => { + await lang.compile({terser: config.terser}); + process.stdout.write("."); + } ) + ) + log("") + + // config.terser.mangle.properties.cache.props.delete("className") + + var size = await buildBrowserHighlightJS(languages) + + log("-----") + log("Core :", size.core ,"bytes") + log("Languages :", languages.map((el) => el.data.length).reduce((acc, curr) => acc + curr, 0), "bytes") + log("Languages (min) :", languages.map((el) => el.minified.length).reduce((acc, curr) => acc + curr, 0), "bytes") + log("highlight.min :", size.regular ,"bytes") + log("highlight.min.js :", size.minified ,"bytes") + log("highlight.min.js.gz :", zlib.gzipSync(size.data).length ,"bytes") + log("-----") +} + +async function installDemo(languages) { + log("Writing demo files.") + mkdir("demo") + installDemoStyles(); + + const assets = await glob("./demo/*.{js,css}") + assets.forEach((file) => install(file)) + + const css = await glob("styles/*.css", {cwd:"./src"}) + const styles = css.map((el) => ( + { "name": _.startCase(path.basename(el,".css")), "path": el } + ) ) + renderTemplate("./demo/index.html", "./demo/index.html", { styles , languages }) +} + +async function installDocs() { + log("Writing docs files.") + mkdir("docs") + + let docs = await glob("./docs/*.rst") + docs.forEach((file) => install(file)) +} + +function installDemoStyles() { + log("Writing style files.") + mkdir("demo/styles") + + glob.sync("*", {cwd: "./src/styles"}).forEach((file) => { + if (file.endsWith(".css")) + install_cleancss(`./src/styles/${file}`,`demo/styles/${file}`) + else // images, backgrounds, etc + install(`./src/styles/${file}`,`demo/styles/${file}`) + }) +} + +async function buildBrowserHighlightJS(languages) { + log("Building highlight.js min file.") + + var git_sha = child_process + .execSync("git rev-parse HEAD") + .toString().trim() + .slice(0,8) + var versionDetails = {...require("../package"), git_sha} + var header = buildHeader(versionDetails) + + var out_file = `${process.env.BUILD_DIR}/highlight.js` + var min_file = `${process.env.BUILD_DIR}/highlight.min.js` + var data = await fs.readFile("src/highlight.js", {encoding: "utf8"}) + + // strip off the original top comment + data = data.replace(/\/\*.*?\*\//s,"") + + var worker_stub = "if (typeof importScripts === 'function') { var hljs = self.hljs; }" + + var tersed = Terser.minify(data, config.terser) + var minified = tersed.code; + minified = `${header}\n${minified}\n${worker_stub}\n` + data = `${header}\n${data}\n${worker_stub}\n` + + var minified_library = minified.length + + minified += languages.map((lang) => lang.minified).join("\n") + data += languages.map((lang) => lang.module).join("\n") + + // minified = Terser.minify(data, config.terser).code + + await Promise.all([ + fs.writeFile(out_file, data, {encoding: "utf8"}), + fs.writeFile(min_file, minified, {encoding: "utf8"}) + ]) + return {core: minified_library, minified: minified.length, data: minified, regular: data.length } +} + +/* glue code to tie into the existing Gear based system until it's replaced */ + +let gear = require('gear'); +let utility = require('./utility'); + +var tasks = { + build: async function([commander, dir], blobs, done) { + // console.log("commander", commander) + process.env.BUILD_DIR = dir.build + // console.log("dir", dir) + await buildBrowser({languages: commander.args}); + return done(null); + } +} +tasks.build.type = 'collect'; +let registry = new gear.Registry({ tasks: tasks }); + +module.exports = function(commander, dir) { + return utility.toQueue([{startLog: { task: ['build', [commander, dir]] }}], registry) +}; + +module.exports.buildBrowserHighlightJS = buildBrowserHighlightJS diff --git a/tools/roll_cdn.js b/tools/roll_cdn.js new file mode 100644 index 0000000000..359c50c59c --- /dev/null +++ b/tools/roll_cdn.js @@ -0,0 +1,87 @@ +const fs = require("fs").promises +const glob = require("glob") +const zlib = require('zlib') +const { getLanguages } = require("./lib/language") +const {filter} = require("./lib/dependencies") +const config = require("./build_config") + +const { install, install_cleancss, mkdir } = require("./lib/makestuff") +const log = (...args) => console.log(...args) + +const { buildBrowserHighlightJS } = require("./roll_browser") + +async function buildCDN(options) { + installStyles(); + + // all the languages are built for the CDN and placed into `/languages` + const languages = getLanguages() + await installLanguages(languages); + + // filter languages for inclusion in the highlight.js bundle + const embedLanguages = filter(languages, options["languages"]) + + var size = await buildBrowserHighlightJS(embedLanguages) + + log("-----") + log("Embedded Lang :", embedLanguages.map((el) => el.minified.length).reduce((acc, curr) => acc + curr, 0), "bytes") + log("All Lang :", languages.map((el) => el.minified.length).reduce((acc, curr) => acc + curr, 0), "bytes") + log("highlight.js :", size.regular, "bytes") + log("highlight.min.js:", size.minified, "bytes") + log("highlight.min.js.gz :", zlib.gzipSync(size.data).length ,"bytes") + log("-----") +} + +async function installLanguages(languages) { + log("Building language files.") + mkdir("languages") + + await Promise.all( + languages.map(async (lang) => { + await buildCDNLanguage(lang); + process.stdout.write("."); + } ) + ) + log("") +} + +function installStyles() { + log("Writing style files.") + mkdir("styles") + + glob.sync("*", {cwd: "./src/styles"}).forEach((file) => { + if (file.endsWith(".css")) + install_cleancss(`./src/styles/${file}`,`styles/${file.replace(".css",".min.css")}`) + else // images, backgrounds, etc + install(`./src/styles/${file}`,`styles/${file}`) + }) +} + + async function buildCDNLanguage (language) { + const out_file = `${process.env.BUILD_DIR}/languages/${language.name}.min.js` + + await language.compile({terser: config.terser}); + fs.writeFile(out_file, language.minified) +} + +/* glue code to tie into the existing Gear based system until it's replaced */ + +let gear = require('gear'); +let utility = require('./utility'); + +var tasks = { + build: async function([commander, dir], blobs, done) { + // console.log("commander", commander) + // console.log("dir", dir) + process.env.BUILD_DIR = dir.build + await buildCDN({languages: commander.args}); + return done(null); + } +} +tasks.build.type = 'collect'; +let registry = new gear.Registry({ tasks: tasks }); + +module.exports = function(commander, dir) { + return utility.toQueue([{startLog: { task: ['build', [commander, dir]] }}], registry) +}; + + diff --git a/tools/tasks.js b/tools/tasks.js index 934ebac402..3392756a8f 100644 --- a/tools/tasks.js +++ b/tools/tasks.js @@ -80,6 +80,7 @@ tasks.template = function(template, blob, done) { tasks.templateAll = function(options, blobs, done) { return options.callback(blobs) .then(function(data) { + let template = options.template || data.template, content = _.template(template)(data); diff --git a/tools/utility.js b/tools/utility.js index 0af88e606d..a9110c78ea 100644 --- a/tools/utility.js +++ b/tools/utility.js @@ -64,6 +64,7 @@ regex.replaces = new RegExp( regex.classname = /(block|parentNode)\.cN/g; regex.header = /^\s*(\/\*((.|\r?\n)*?)\*\/)?\s*/; +regex.exportDefault = /export default / regex.apiReplacesFrom = /\bvar\s*API_REPLACES\b/; regex.apiReplacesTo = `var API_REPLACES = ${JSON.stringify(REPLACES)}`; From 9dbdecb27e143bd59be67450f7d509a7a97edefe Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Fri, 6 Dec 2019 18:51:03 -0500 Subject: [PATCH 02/42] rename rollup build files --- tools/build.js | 4 ++-- tools/{roll_browser.js => rollup_browser.js} | 0 tools/{roll_cdn.js => rollup_cdn.js} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename tools/{roll_browser.js => rollup_browser.js} (100%) rename tools/{roll_cdn.js => rollup_cdn.js} (100%) diff --git a/tools/build.js b/tools/build.js index 0af495fedc..328fcab96e 100644 --- a/tools/build.js +++ b/tools/build.js @@ -79,9 +79,9 @@ commander.target = commander.target.toLowerCase(); var target = commander.target if (target=="cdn") - target = "./roll_cdn" + target = "./rollup_cdn" if (target=="browser") - target = "./roll_browser" + target = "./rollup_browser" build = require(`./${target}`); diff --git a/tools/roll_browser.js b/tools/rollup_browser.js similarity index 100% rename from tools/roll_browser.js rename to tools/rollup_browser.js diff --git a/tools/roll_cdn.js b/tools/rollup_cdn.js similarity index 100% rename from tools/roll_cdn.js rename to tools/rollup_cdn.js From efe4bb78d76c85dec3b468204fc30a010bb7b074 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Fri, 6 Dec 2019 19:30:36 -0500 Subject: [PATCH 03/42] fix output size logging --- tools/rollup_browser.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/rollup_browser.js b/tools/rollup_browser.js index 2d58fa1c9f..f0c3d92ded 100644 --- a/tools/rollup_browser.js +++ b/tools/rollup_browser.js @@ -43,9 +43,10 @@ async function buildBrowser(options) { log("-----") log("Core :", size.core ,"bytes") + log("Core (min) :", size.core_min ,"bytes") log("Languages :", languages.map((el) => el.data.length).reduce((acc, curr) => acc + curr, 0), "bytes") log("Languages (min) :", languages.map((el) => el.minified.length).reduce((acc, curr) => acc + curr, 0), "bytes") - log("highlight.min :", size.regular ,"bytes") + log("highlight.js :", size.regular ,"bytes") log("highlight.min.js :", size.minified ,"bytes") log("highlight.min.js.gz :", zlib.gzipSync(size.data).length ,"bytes") log("-----") @@ -99,6 +100,7 @@ async function buildBrowserHighlightJS(languages) { var out_file = `${process.env.BUILD_DIR}/highlight.js` var min_file = `${process.env.BUILD_DIR}/highlight.min.js` var data = await fs.readFile("src/highlight.js", {encoding: "utf8"}) + var lib_size = data.length // strip off the original top comment data = data.replace(/\/\*.*?\*\//s,"") @@ -121,7 +123,7 @@ async function buildBrowserHighlightJS(languages) { fs.writeFile(out_file, data, {encoding: "utf8"}), fs.writeFile(min_file, minified, {encoding: "utf8"}) ]) - return {core: minified_library, minified: minified.length, data: minified, regular: data.length } + return {core: lib_size, core_min: minified_library, minified: minified.length, data: minified, regular: data.length } } /* glue code to tie into the existing Gear based system until it's replaced */ From c0b69fbc7dd8e4299d0af687137c8ae0335b7c93 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Fri, 6 Dec 2019 21:08:53 -0500 Subject: [PATCH 04/42] clean up naming a bit --- tools/rollup_browser.js | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/tools/rollup_browser.js b/tools/rollup_browser.js index f0c3d92ded..4c5b47c015 100644 --- a/tools/rollup_browser.js +++ b/tools/rollup_browser.js @@ -88,7 +88,7 @@ function installDemoStyles() { } async function buildBrowserHighlightJS(languages) { - log("Building highlight.js min file.") + log("Building highlight.js library file.") var git_sha = child_process .execSync("git rev-parse HEAD") @@ -97,33 +97,33 @@ async function buildBrowserHighlightJS(languages) { var versionDetails = {...require("../package"), git_sha} var header = buildHeader(versionDetails) - var out_file = `${process.env.BUILD_DIR}/highlight.js` - var min_file = `${process.env.BUILD_DIR}/highlight.min.js` - var data = await fs.readFile("src/highlight.js", {encoding: "utf8"}) - var lib_size = data.length + var outFile = `${process.env.BUILD_DIR}/highlight.js` + var minifiedFile = outFile.replace(/js$/,"min.js") + var librarySrc = await fs.readFile("src/highlight.js", {encoding: "utf8"}) + var coreSize = librarySrc.length // strip off the original top comment - data = data.replace(/\/\*.*?\*\//s,"") + librarySrc = librarySrc.replace(/\/\*.*?\*\//s,"") - var worker_stub = "if (typeof importScripts === 'function') { var hljs = self.hljs; }" + var workerStub = "if (typeof importScripts === 'function') { var hljs = self.hljs; }" + var tersed = Terser.minify(librarySrc, config.terser) - var tersed = Terser.minify(data, config.terser) - var minified = tersed.code; - minified = `${header}\n${minified}\n${worker_stub}\n` - data = `${header}\n${data}\n${worker_stub}\n` + var minifiedSrc = [ + header, tersed.code, workerStub, + ...languages.map((lang) => lang.minified) ].join("\n") - var minified_library = minified.length + var fullSrc = [ + header, librarySrc, workerStub, + ...languages.map((lang) => lang.module) ].join("\n") - minified += languages.map((lang) => lang.minified).join("\n") - data += languages.map((lang) => lang.module).join("\n") - - // minified = Terser.minify(data, config.terser).code + // get approximate core minified size + var core_min = [ header, tersed.code, workerStub].join().length await Promise.all([ - fs.writeFile(out_file, data, {encoding: "utf8"}), - fs.writeFile(min_file, minified, {encoding: "utf8"}) + fs.writeFile(outFile, fullSrc, {encoding: "utf8"}), + fs.writeFile(minifiedFile, minifiedSrc, {encoding: "utf8"}) ]) - return {core: lib_size, core_min: minified_library, minified: minified.length, data: minified, regular: data.length } + return {core: coreSize, core_min: core_min, minified: minifiedSrc.length, data: minifiedSrc, regular: fullSrc.length } } /* glue code to tie into the existing Gear based system until it's replaced */ From 025fd9d3fb6a52018dcb2987cadbf9d61ae44cae Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Tue, 17 Dec 2019 09:01:07 -0500 Subject: [PATCH 05/42] build node --- roll.js | 213 ------------------------------------------ tools/build.js | 2 + tools/build_config.js | 4 + tools/rollup_cdn.js | 2 +- tools/rollup_node.js | 104 +++++++++++++++++++++ 5 files changed, 111 insertions(+), 214 deletions(-) delete mode 100644 roll.js create mode 100644 tools/rollup_node.js diff --git a/roll.js b/roll.js deleted file mode 100644 index 13642b6591..0000000000 --- a/roll.js +++ /dev/null @@ -1,213 +0,0 @@ -const rollup = require('rollup') -const fs = require("fs") -const BUILD_DIR = "build" -const CJS = { format: "cjs", strict: false } - -const reorderDependencies = (languages) => { - var languages = [...languages] // clone - var moved - do { - moved = false - let loaded = [] - for (let lang of languages) { - loaded.push(lang.name) - if (lang.requires.length === 0) continue; - for (let needed of lang.requires) { - if (loaded.includes(needed)) continue; - moved = true - - let i = languages.findIndex((el) => el.name == needed) - let removed = languages.splice(i, 1) - let me = languages.findIndex((el) => el.name == lang.name) - languages.splice(me,0, ...removed) - - loaded.push(needed) - } - } - } while(moved===true) - return languages -} - -function buildNodeIndex(languages) { - const header = "var hljs = require('./highlight');" - const footer = "module.exports = hljs;" - - const registration = reorderDependencies(languages).map((lang) => - `hljs.registerLanguage('${lang.name}', require('./languages/${lang.name}'));` - ) - - const index = `${header}\n\n${registration.join("\n")}\n\n${footer}` - fs.writeFile(`${BUILD_DIR}/lib/index.js`, index, (err) => 0) -} - - async function buildNodeLanguage (language) { - const input = { input: `src/languages/${language.name}.js` } - const output = { ...CJS, file: `${BUILD_DIR}/lib/languages/${language.name}.js` } - build(input, output) -} - -async function buildNodeHighlightJS() { - const input = { input: `src/highlight.js` } - const output = { ...CJS, file: `${BUILD_DIR}/lib/highlight.js` } - build(input, output) -} - -const REQUIRES_REGEX = /\/\*.*Requires: (.*?)\n/s - -class Language { - - constructor(name, path) { - this.name = name - this.requires = [] - - this.data = fs.readFileSync(path, {encoding: "utf8"}) - this.determineRequires() - } - - determineRequires() { - var requiresMatch = REQUIRES_REGEX.exec(this.data) - if (requiresMatch) - this.requires = requiresMatch[1].split(", ").map((n) => n.replace(".js","")) - } - - static fromFile(filename) { - var path = `./src/languages/${filename}` - return new Language( - filename.replace(".js",""), - path - ) - } -} - -function getLanguages() { - let languages = [] - fs.readdirSync("./src/languages/").forEach((file) => { - languages.push(Language.fromFile(file)) - }) - return languages -} - -function install(file, dest) { - fs.copyFileSync(file, `${BUILD_DIR}/${dest}`) -} - -function mkdir(dirname) { - fs.mkdirSync(`${BUILD_DIR}/${dirname}`, {recursive: true}) -} - -// tasks.buildPackage = function(json, blob, done) { -// let result, -// lines = blob.result.split(/\r?\n/), -// regex = /^- (.*) <(.*)>$/; - -// json.contributors = _.transform(lines, function(result, line) { -// let matches = line.match(regex); - -// if(matches) { -// result.push({ -// name: matches[1], -// email: matches[2] -// }); -// } -// }, []); - -// result = JSON.stringify(json, null, ' '); - -// return done(null, new gear.Blob(result, blob)); -// }; - -function buildPackageJSON() { - const CONTRIBUTOR = /^- (.*) <(.*)>$/ - - var authors = fs.readFileSync("AUTHORS.en.txt", {encoding: "utf8"}) - var lines = authors.split(/\r?\n/) - var json = require("./package") - json.contributors = lines.reduce((acc, line) => { - let matches = line.match(CONTRIBUTOR) - - if (matches) { - acc.push({ - name: matches[1], - email: matches[2] - }) - } - return acc; - }, []) - fs.writeFileSync(`${BUILD_DIR}/package.json`, JSON.stringify(json, null, ' ')) -} - -async function build_node() { - mkdir("lib/languages") - mkdir("scss") - mkdir("styles") - - install("./LICENSE", "LICENSE") - install("./README.md","README.md") - fs.readdirSync("./src/styles/").forEach((file) => { - install(`./src/styles/${file}`,`styles/${file}`) - install(`./src/styles/${file}`,`scss/${file.replace(".css",".scss")}`) - }) - buildPackageJSON() - - const languages = getLanguages() - // filter languages - - buildNodeIndex(languages) - languages.forEach(async (lang) => { - await buildNodeLanguage(lang) - }) - await buildNodeHighlightJS() - - -} - -async function build(inputOptions, outputOptions) { - // create a bundle - const bundle = await rollup.rollup(inputOptions).catch(err => console.log(err));; - - // console.log(bundle.watchFiles); // an array of file names this bundle depends on - - // generate code - const { output } = await bundle.generate(outputOptions); - - for (const chunkOrAsset of output) { - if (chunkOrAsset.type === 'asset') { - // For assets, this contains - // { - // fileName: string, // the asset file name - // source: string | Buffer // the asset source - // type: 'asset' // signifies that this is an asset - // } - // console.log('Asset', chunkOrAsset); - } else { - // For chunks, this contains - // { - // code: string, // the generated JS code - // dynamicImports: string[], // external modules imported dynamically by the chunk - // exports: string[], // exported variable names - // facadeModuleId: string | null, // the id of a module that this chunk corresponds to - // fileName: string, // the chunk file name - // imports: string[], // external modules imported statically by the chunk - // isDynamicEntry: boolean, // is this chunk a dynamic entry point - // isEntry: boolean, // is this chunk a static entry point - // map: string | null, // sourcemaps if present - // modules: { // information about the modules in this chunk - // [id: string]: { - // renderedExports: string[]; // exported variable names that were included - // removedExports: string[]; // exported variable names that were removed - // renderedLength: number; // the length of the remaining code in this module - // originalLength: number; // the original length of the code in this module - // }; - // }, - // name: string // the name of this chunk as used in naming patterns - // type: 'chunk', // signifies that this is a chunk - // } - // console.log('Chunk', chunkOrAsset.modules); - } - } - - // or write the bundle to disk - await bundle.write(outputOptions) -} - -build_node() diff --git a/tools/build.js b/tools/build.js index 328fcab96e..be2a59f4ca 100644 --- a/tools/build.js +++ b/tools/build.js @@ -82,6 +82,8 @@ if (target=="cdn") target = "./rollup_cdn" if (target=="browser") target = "./rollup_browser" +if (target=="node") + target = "./rollup_node" build = require(`./${target}`); diff --git a/tools/build_config.js b/tools/build_config.js index 94ea943908..a6a9913641 100644 --- a/tools/build_config.js +++ b/tools/build_config.js @@ -2,6 +2,10 @@ module.exports = { "build_dir": "build", "copyrightYears": "2006-2019", "clean_css": {}, + "CJS": { + format: "cjs", + strict: false + }, "terser": { // output: { ascii_only: true }, "compress": { diff --git a/tools/rollup_cdn.js b/tools/rollup_cdn.js index 359c50c59c..908af6913f 100644 --- a/tools/rollup_cdn.js +++ b/tools/rollup_cdn.js @@ -8,7 +8,7 @@ const config = require("./build_config") const { install, install_cleancss, mkdir } = require("./lib/makestuff") const log = (...args) => console.log(...args) -const { buildBrowserHighlightJS } = require("./roll_browser") +const { buildBrowserHighlightJS } = require("./rollup_browser") async function buildCDN(options) { installStyles(); diff --git a/tools/rollup_node.js b/tools/rollup_node.js new file mode 100644 index 0000000000..56846b7d95 --- /dev/null +++ b/tools/rollup_node.js @@ -0,0 +1,104 @@ +const fs = require("fs").promises +const config = require("./build_config") + +const { getLanguages } = require("./lib/language") +const { install, mkdir } = require("./lib/makestuff") +const { filter } = require("./lib/dependencies") +const { build } = require("./lib/bundling.js") +const log = (...args) => console.log(...args) + +function buildNodeIndex(languages) { + const header = "var hljs = require('./highlight');" + const footer = "module.exports = hljs;" + + const registration = languages.map((lang) => + `hljs.registerLanguage('${lang.name}', require('./languages/${lang.name}'));` + ) + + const index = `${header}\n\n${registration.join("\n")}\n\n${footer}` + fs.writeFile(`${process.env.BUILD_DIR}/lib/index.js`, index) +} + + async function buildNodeLanguage (language) { + const input = { input: `src/languages/${language.name}.js` } + const output = { ...config.CJS, file: `${process.env.BUILD_DIR}/lib/languages/${language.name}.js` } + build(input, output) +} + +async function buildNodeHighlightJS() { + const input = { input: `src/highlight.js` } + const output = { ...config.CJS, file: `${process.env.BUILD_DIR}/lib/highlight.js` } + build(input, output) +} + +async function buildPackageJSON() { + const CONTRIBUTOR = /^- (.*) <(.*)>$/ + + var authors = await fs.readFile("AUTHORS.en.txt", {encoding: "utf8"}) + var lines = authors.split(/\r?\n/) + var json = require("../package") + json.contributors = lines.reduce((acc, line) => { + let matches = line.match(CONTRIBUTOR) + + if (matches) { + acc.push({ + name: matches[1], + email: matches[2] + }) + } + return acc; + }, []) + fs.writeFile(`${process.env.BUILD_DIR}/package.json`, JSON.stringify(json, null, ' ')) +} + +async function buildNode(options) { + mkdir("lib/languages") + mkdir("scss") + mkdir("styles") + + log("Writing styles.") + install("./LICENSE", "LICENSE") + install("./README.md","README.md") + + const styles = await fs.readdir("./src/styles/") + styles.forEach((file) => { + install(`./src/styles/${file}`,`styles/${file}`) + install(`./src/styles/${file}`,`scss/${file.replace(".css",".scss")}`) + }) + log("Writing package.json.") + await buildPackageJSON() + + var languages = getLanguages() + // filter languages for inclusion in the highlight.js bundle + languages = filter(languages, options["languages"]) + + log("Writing languages.") + await buildNodeIndex(languages) + languages.forEach(async (lang) => { + await buildNodeLanguage(lang) + }) + log("Writing highlight.js") + await buildNodeHighlightJS() +} + +/* glue code to tie into the existing Gear based system until it's replaced */ + +let gear = require('gear'); +let utility = require('./utility'); + +var tasks = { + build: async function([commander, dir], blobs, done) { + // console.log("commander", commander) + process.env.BUILD_DIR = dir.build + // console.log("dir", dir) + await buildNode({languages: commander.args}); + return done(null); + } +} +tasks.build.type = 'collect'; +let registry = new gear.Registry({ tasks: tasks }); + +module.exports = function(commander, dir) { + return utility.toQueue([{startLog: { task: ['build', [commander, dir]] }}], registry) +}; + From ef6ac115b494c5b842d85e68e6daf21aa881b9b7 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Tue, 17 Dec 2019 09:52:16 -0500 Subject: [PATCH 06/42] remove most gear --- tools/build.js | 48 ++++++++++++++++++++++++++--------------- tools/lib/makestuff.js | 12 +++++++++-- tools/rollup_browser.js | 2 ++ tools/rollup_cdn.js | 1 + tools/rollup_node.js | 28 ++++++++++++++++-------- 5 files changed, 63 insertions(+), 28 deletions(-) diff --git a/tools/build.js b/tools/build.js index be2a59f4ca..d4054d5eae 100644 --- a/tools/build.js +++ b/tools/build.js @@ -64,8 +64,10 @@ let commander = require('commander'); let path = require('path'); let Queue = require('gear').Queue; let registry = require('./tasks'); +const { clean } = require("./lib/makestuff") +const log = (...args) => console.log(...args) -let build, dir = {}; +let dir = {}; commander .usage('[options] [...]') @@ -77,22 +79,34 @@ commander commander.target = commander.target.toLowerCase(); -var target = commander.target -if (target=="cdn") - target = "./rollup_cdn" -if (target=="browser") - target = "./rollup_browser" -if (target=="node") - target = "./rollup_node" +var target = `./rollup_${commander.target}` +// if (target=="cdn") +// target = "./rollup_cdn" +// if (target=="browser") +// target = "./rollup_browser" +// if (target=="node") +// target = "./rollup_node" +const build = require(`./${target}`); -build = require(`./${target}`); -dir.root = path.dirname(__dirname); -dir.build = path.join(dir.root, 'build'); +async function doBuild() { + dir.root = path.dirname(__dirname); + dir.build = path.join(dir.root, 'build'); -new Queue({ registry: registry }) - .clean(dir.build) - .log('Starting build.') - .series(build(commander, dir)) - .log('Finished build.') - .run(); + process.env.BUILD_DIR = dir.build + + log ("Starting build.") + await clean(dir.build); + await build.build({languages: commander.args}); + log ("Finished build.") +}; + + +doBuild(); + +// new Queue({ registry: registry }) +// .clean(dir.build) +// .log('Starting build.') +// .series(build(commander, dir)) +// .log('Finished build.') +// .run(); diff --git a/tools/lib/makestuff.js b/tools/lib/makestuff.js index 89ca2b469f..e0a78b61b8 100644 --- a/tools/lib/makestuff.js +++ b/tools/lib/makestuff.js @@ -1,8 +1,16 @@ const fs = require("fs") const CleanCSS = require('clean-css'); const path = require('path'); -let _ = require('lodash'); +const _ = require('lodash'); const config = require("../build_config") +const del = require('del'); + +async function clean(directory) { + await del([directory]).then(() => { + fs.mkdirSync(directory) + }); +}; + function install(file, dest=file) { fs.copyFileSync(file, `${process.env.BUILD_DIR}/${dest}`) @@ -26,4 +34,4 @@ function renderTemplate(src, dest, data) fs.writeFileSync(`${process.env.BUILD_DIR}/${dest}`, rendered) } -module.exports = { install, install_cleancss, mkdir, renderTemplate } +module.exports = { clean, install, install_cleancss, mkdir, renderTemplate } diff --git a/tools/rollup_browser.js b/tools/rollup_browser.js index 4c5b47c015..21559f3b7d 100644 --- a/tools/rollup_browser.js +++ b/tools/rollup_browser.js @@ -148,3 +148,5 @@ module.exports = function(commander, dir) { }; module.exports.buildBrowserHighlightJS = buildBrowserHighlightJS + +module.exports.build = buildBrowser; diff --git a/tools/rollup_cdn.js b/tools/rollup_cdn.js index 908af6913f..010d7b72fb 100644 --- a/tools/rollup_cdn.js +++ b/tools/rollup_cdn.js @@ -84,4 +84,5 @@ module.exports = function(commander, dir) { return utility.toQueue([{startLog: { task: ['build', [commander, dir]] }}], registry) }; +module.exports.build = buildCDN; diff --git a/tools/rollup_node.js b/tools/rollup_node.js index 56846b7d95..4eda45e991 100644 --- a/tools/rollup_node.js +++ b/tools/rollup_node.js @@ -7,7 +7,7 @@ const { filter } = require("./lib/dependencies") const { build } = require("./lib/bundling.js") const log = (...args) => console.log(...args) -function buildNodeIndex(languages) { +async function buildNodeIndex(languages) { const header = "var hljs = require('./highlight');" const footer = "module.exports = hljs;" @@ -16,19 +16,19 @@ function buildNodeIndex(languages) { ) const index = `${header}\n\n${registration.join("\n")}\n\n${footer}` - fs.writeFile(`${process.env.BUILD_DIR}/lib/index.js`, index) + await fs.writeFile(`${process.env.BUILD_DIR}/lib/index.js`, index) } async function buildNodeLanguage (language) { const input = { input: `src/languages/${language.name}.js` } const output = { ...config.CJS, file: `${process.env.BUILD_DIR}/lib/languages/${language.name}.js` } - build(input, output) + await build(input, output) } async function buildNodeHighlightJS() { const input = { input: `src/highlight.js` } const output = { ...config.CJS, file: `${process.env.BUILD_DIR}/lib/highlight.js` } - build(input, output) + await build(input, output) } async function buildPackageJSON() { @@ -51,15 +51,26 @@ async function buildPackageJSON() { fs.writeFile(`${process.env.BUILD_DIR}/package.json`, JSON.stringify(json, null, ' ')) } +async function buildLanguages(languages) { + log("Writing languages.") + await Promise.all( + languages.map(async (lang) => { + await buildNodeLanguage(lang); + process.stdout.write("."); + }) + ) + log("") +} + async function buildNode(options) { mkdir("lib/languages") mkdir("scss") mkdir("styles") - log("Writing styles.") install("./LICENSE", "LICENSE") install("./README.md","README.md") + log("Writing styles.") const styles = await fs.readdir("./src/styles/") styles.forEach((file) => { install(`./src/styles/${file}`,`styles/${file}`) @@ -72,11 +83,8 @@ async function buildNode(options) { // filter languages for inclusion in the highlight.js bundle languages = filter(languages, options["languages"]) - log("Writing languages.") await buildNodeIndex(languages) - languages.forEach(async (lang) => { - await buildNodeLanguage(lang) - }) + await buildLanguages(languages) log("Writing highlight.js") await buildNodeHighlightJS() } @@ -102,3 +110,5 @@ module.exports = function(commander, dir) { return utility.toQueue([{startLog: { task: ['build', [commander, dir]] }}], registry) }; + +module.exports.build = buildNode; From faf7eb4b98acf1b7f9d7f8503d78e2f363d58314 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Tue, 17 Dec 2019 10:37:45 -0500 Subject: [PATCH 07/42] clean and simplify --- tools/build.js | 36 +++++++------------------ tools/lib/makestuff.js | 1 - tools/rollup_browser.js | 59 ++++++++++++++++++----------------------- tools/rollup_cdn.js | 38 ++++++++------------------ tools/rollup_node.js | 22 --------------- 5 files changed, 46 insertions(+), 110 deletions(-) diff --git a/tools/build.js b/tools/build.js index d4054d5eae..2fe6b72302 100644 --- a/tools/build.js +++ b/tools/build.js @@ -62,8 +62,6 @@ let commander = require('commander'); let path = require('path'); -let Queue = require('gear').Queue; -let registry = require('./tasks'); const { clean } = require("./lib/makestuff") const log = (...args) => console.log(...args) @@ -71,7 +69,7 @@ let dir = {}; commander .usage('[options] [...]') - .option('-n, --no-compress', 'Disable compression') + .option('-n, --no-minify', 'Disable minification') .option('-t, --target ', 'Build for target ' + '[all, browser, cdn, node]', /^(browser|cdn|node|all)$/i, 'browser') @@ -79,34 +77,18 @@ commander commander.target = commander.target.toLowerCase(); -var target = `./rollup_${commander.target}` -// if (target=="cdn") -// target = "./rollup_cdn" -// if (target=="browser") -// target = "./rollup_browser" -// if (target=="node") -// target = "./rollup_node" +dir.root = path.dirname(__dirname); +dir.buildRoot = path.join(dir.root, 'build'); -const build = require(`./${target}`); +async function doBuild(target, buildDir) { + const build = require(`./rollup_${target}`); -async function doBuild() { - dir.root = path.dirname(__dirname); - dir.build = path.join(dir.root, 'build'); - - process.env.BUILD_DIR = dir.build + process.env.BUILD_DIR = buildDir log ("Starting build.") - await clean(dir.build); - await build.build({languages: commander.args}); + await clean(buildDir); + await build.build({languages: commander.args, minify: commander.minify}); log ("Finished build.") }; - -doBuild(); - -// new Queue({ registry: registry }) -// .clean(dir.build) -// .log('Starting build.') -// .series(build(commander, dir)) -// .log('Finished build.') -// .run(); +doBuild(commander.target, dir.buildRoot); diff --git a/tools/lib/makestuff.js b/tools/lib/makestuff.js index e0a78b61b8..220ca37729 100644 --- a/tools/lib/makestuff.js +++ b/tools/lib/makestuff.js @@ -11,7 +11,6 @@ async function clean(directory) { }); }; - function install(file, dest=file) { fs.copyFileSync(file, `${process.env.BUILD_DIR}/${dest}`) } diff --git a/tools/rollup_browser.js b/tools/rollup_browser.js index 21559f3b7d..78cc6bce0c 100644 --- a/tools/rollup_browser.js +++ b/tools/rollup_browser.js @@ -39,16 +39,23 @@ async function buildBrowser(options) { // config.terser.mangle.properties.cache.props.delete("className") - var size = await buildBrowserHighlightJS(languages) + var size = await buildBrowserHighlightJS(languages, {minify: options.minify}) log("-----") log("Core :", size.core ,"bytes") - log("Core (min) :", size.core_min ,"bytes") + if (options.minify) + log("Core (min) :", size.core_min ,"bytes") log("Languages :", languages.map((el) => el.data.length).reduce((acc, curr) => acc + curr, 0), "bytes") - log("Languages (min) :", languages.map((el) => el.minified.length).reduce((acc, curr) => acc + curr, 0), "bytes") + if (options.minify) { + log("Languages (min) :", languages.map((el) => el.minified.length).reduce((acc, curr) => acc + curr, 0), "bytes") + } log("highlight.js :", size.regular ,"bytes") - log("highlight.min.js :", size.minified ,"bytes") - log("highlight.min.js.gz :", zlib.gzipSync(size.data).length ,"bytes") + if (options.minify) { + log("highlight.min.js :", size.minified ,"bytes") + log("highlight.min.js.gz :", zlib.gzipSync(size.data).length ,"bytes") + } else { + log("highlight.js.gz :", zlib.gzipSync(size.fullSrc).length ,"bytes") + } log("-----") } @@ -87,7 +94,7 @@ function installDemoStyles() { }) } -async function buildBrowserHighlightJS(languages) { +async function buildBrowserHighlightJS(languages, {minify}) { log("Building highlight.js library file.") var git_sha = child_process @@ -119,34 +126,20 @@ async function buildBrowserHighlightJS(languages) { // get approximate core minified size var core_min = [ header, tersed.code, workerStub].join().length - await Promise.all([ - fs.writeFile(outFile, fullSrc, {encoding: "utf8"}), - fs.writeFile(minifiedFile, minifiedSrc, {encoding: "utf8"}) - ]) - return {core: coreSize, core_min: core_min, minified: minifiedSrc.length, data: minifiedSrc, regular: fullSrc.length } + var tasks = []; + tasks.push(fs.writeFile(outFile, fullSrc, {encoding: "utf8"})); + if (minify) + tasks.push(fs.writeFile(minifiedFile, minifiedSrc, {encoding: "utf8"})) + + await Promise.all(tasks); + return { + core: coreSize, + core_min: core_min, + minified: Buffer.byteLength(minifiedSrc, 'utf8'), + data: minifiedSrc, + fullSrc: fullSrc, + regular: Buffer.byteLength(fullSrc, 'utf8') } } -/* glue code to tie into the existing Gear based system until it's replaced */ - -let gear = require('gear'); -let utility = require('./utility'); - -var tasks = { - build: async function([commander, dir], blobs, done) { - // console.log("commander", commander) - process.env.BUILD_DIR = dir.build - // console.log("dir", dir) - await buildBrowser({languages: commander.args}); - return done(null); - } -} -tasks.build.type = 'collect'; -let registry = new gear.Registry({ tasks: tasks }); - -module.exports = function(commander, dir) { - return utility.toQueue([{startLog: { task: ['build', [commander, dir]] }}], registry) -}; - module.exports.buildBrowserHighlightJS = buildBrowserHighlightJS - module.exports.build = buildBrowser; diff --git a/tools/rollup_cdn.js b/tools/rollup_cdn.js index 010d7b72fb..18d434cc3b 100644 --- a/tools/rollup_cdn.js +++ b/tools/rollup_cdn.js @@ -20,14 +20,19 @@ async function buildCDN(options) { // filter languages for inclusion in the highlight.js bundle const embedLanguages = filter(languages, options["languages"]) - var size = await buildBrowserHighlightJS(embedLanguages) + var size = await buildBrowserHighlightJS(embedLanguages, {minify: options.minify}) log("-----") - log("Embedded Lang :", embedLanguages.map((el) => el.minified.length).reduce((acc, curr) => acc + curr, 0), "bytes") - log("All Lang :", languages.map((el) => el.minified.length).reduce((acc, curr) => acc + curr, 0), "bytes") - log("highlight.js :", size.regular, "bytes") - log("highlight.min.js:", size.minified, "bytes") - log("highlight.min.js.gz :", zlib.gzipSync(size.data).length ,"bytes") + log("Embedded Lang :", embedLanguages.map((el) => el.minified.length).reduce((acc, curr) => acc + curr, 0), "bytes") + log("All Lang :", languages.map((el) => el.minified.length).reduce((acc, curr) => acc + curr, 0), "bytes") + log("highlight.js :", size.regular, "bytes") + + if (options.minify) { + log("highlight.min.js :", size.minified ,"bytes") + log("highlight.min.js.gz :", zlib.gzipSync(size.data).length ,"bytes") + } else { + log("highlight.js.gz :", zlib.gzipSync(size.fullSrc).length ,"bytes") + } log("-----") } @@ -63,26 +68,5 @@ function installStyles() { fs.writeFile(out_file, language.minified) } -/* glue code to tie into the existing Gear based system until it's replaced */ - -let gear = require('gear'); -let utility = require('./utility'); - -var tasks = { - build: async function([commander, dir], blobs, done) { - // console.log("commander", commander) - // console.log("dir", dir) - process.env.BUILD_DIR = dir.build - await buildCDN({languages: commander.args}); - return done(null); - } -} -tasks.build.type = 'collect'; -let registry = new gear.Registry({ tasks: tasks }); - -module.exports = function(commander, dir) { - return utility.toQueue([{startLog: { task: ['build', [commander, dir]] }}], registry) -}; - module.exports.build = buildCDN; diff --git a/tools/rollup_node.js b/tools/rollup_node.js index 4eda45e991..4e6d94cdc4 100644 --- a/tools/rollup_node.js +++ b/tools/rollup_node.js @@ -89,26 +89,4 @@ async function buildNode(options) { await buildNodeHighlightJS() } -/* glue code to tie into the existing Gear based system until it's replaced */ - -let gear = require('gear'); -let utility = require('./utility'); - -var tasks = { - build: async function([commander, dir], blobs, done) { - // console.log("commander", commander) - process.env.BUILD_DIR = dir.build - // console.log("dir", dir) - await buildNode({languages: commander.args}); - return done(null); - } -} -tasks.build.type = 'collect'; -let registry = new gear.Registry({ tasks: tasks }); - -module.exports = function(commander, dir) { - return utility.toQueue([{startLog: { task: ['build', [commander, dir]] }}], registry) -}; - - module.exports.build = buildNode; From 6f3961927770ede31981087b898206df7689e624 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Tue, 17 Dec 2019 11:17:25 -0500 Subject: [PATCH 08/42] simplify --- tools/build.js | 25 +++++++++++++++++++------ tools/lib/makestuff.js | 2 +- tools/rollup_browser.js | 28 ++++++++++++++++++---------- tools/rollup_node.js | 1 + 4 files changed, 39 insertions(+), 17 deletions(-) diff --git a/tools/build.js b/tools/build.js index 2fe6b72302..f5ce94ed45 100644 --- a/tools/build.js +++ b/tools/build.js @@ -60,6 +60,8 @@ 'use strict'; +const TARGETS = ["cdn", "browser", "node"]; + let commander = require('commander'); let path = require('path'); const { clean } = require("./lib/makestuff") @@ -80,15 +82,26 @@ commander.target = commander.target.toLowerCase(); dir.root = path.dirname(__dirname); dir.buildRoot = path.join(dir.root, 'build'); -async function doBuild(target, buildDir) { +async function doTarget(target, buildDir) { const build = require(`./rollup_${target}`); - process.env.BUILD_DIR = buildDir - - log ("Starting build.") await clean(buildDir); await build.build({languages: commander.args, minify: commander.minify}); - log ("Finished build.") }; -doBuild(commander.target, dir.buildRoot); +async function doBuild() { + log ("Starting build."); + if (commander.target=="all") { + await clean(dir.buildRoot); + for (var target of TARGETS) { + log (`** Building ${target.toUpperCase()}. **`); + var buildDir = path.join(dir.buildRoot, target); + await doTarget(target, buildDir); + } + } else { + doTarget(commander.target, dir.buildRoot); + } + log ("Finished build."); +} + +doBuild(); diff --git a/tools/lib/makestuff.js b/tools/lib/makestuff.js index 220ca37729..3898d5c4b0 100644 --- a/tools/lib/makestuff.js +++ b/tools/lib/makestuff.js @@ -7,7 +7,7 @@ const del = require('del'); async function clean(directory) { await del([directory]).then(() => { - fs.mkdirSync(directory) + fs.mkdirSync(directory, {recursive: true}) }); }; diff --git a/tools/rollup_browser.js b/tools/rollup_browser.js index 78cc6bce0c..da47344539 100644 --- a/tools/rollup_browser.js +++ b/tools/rollup_browser.js @@ -95,7 +95,7 @@ function installDemoStyles() { } async function buildBrowserHighlightJS(languages, {minify}) { - log("Building highlight.js library file.") + log("Building highlight.js.") var git_sha = child_process .execSync("git rev-parse HEAD") @@ -113,23 +113,30 @@ async function buildBrowserHighlightJS(languages, {minify}) { librarySrc = librarySrc.replace(/\/\*.*?\*\//s,"") var workerStub = "if (typeof importScripts === 'function') { var hljs = self.hljs; }" - var tersed = Terser.minify(librarySrc, config.terser) - - var minifiedSrc = [ - header, tersed.code, workerStub, - ...languages.map((lang) => lang.minified) ].join("\n") var fullSrc = [ header, librarySrc, workerStub, ...languages.map((lang) => lang.module) ].join("\n") - // get approximate core minified size - var core_min = [ header, tersed.code, workerStub].join().length - var tasks = []; tasks.push(fs.writeFile(outFile, fullSrc, {encoding: "utf8"})); - if (minify) + + var core_min = [] + var minifiedSrc = "" + + if (minify) { + var tersed = Terser.minify(librarySrc, config.terser) + + minifiedSrc = [ + header, tersed.code, workerStub, + ...languages.map((lang) => lang.minified) ].join("\n") + + + // get approximate core minified size + core_min = [ header, tersed.code, workerStub].join().length + tasks.push(fs.writeFile(minifiedFile, minifiedSrc, {encoding: "utf8"})) + } await Promise.all(tasks); return { @@ -141,5 +148,6 @@ async function buildBrowserHighlightJS(languages, {minify}) { regular: Buffer.byteLength(fullSrc, 'utf8') } } +// CDN build uses the exact same highlight.js distributable module.exports.buildBrowserHighlightJS = buildBrowserHighlightJS module.exports.build = buildBrowser; diff --git a/tools/rollup_node.js b/tools/rollup_node.js index 4e6d94cdc4..c55323016a 100644 --- a/tools/rollup_node.js +++ b/tools/rollup_node.js @@ -85,6 +85,7 @@ async function buildNode(options) { await buildNodeIndex(languages) await buildLanguages(languages) + log("Writing highlight.js") await buildNodeHighlightJS() } From 31a5adc19f11f864755a8cbdfbdedb70eb31e74f Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Wed, 18 Dec 2019 11:31:09 -0500 Subject: [PATCH 09/42] detect 3rd party languages --- package-lock.json | 6 +++--- package.json | 2 +- tools/build_config.js | 17 ++++++++++++++++- tools/lib/language.js | 27 ++++++++++++++++++++++----- tools/rollup_browser.js | 1 - tools/rollup_node.js | 14 +++++++++----- 6 files changed, 51 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index e8814a4650..19a3dcbc00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3167,9 +3167,9 @@ }, "dependencies": { "resolve": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", - "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.0.tgz", + "integrity": "sha512-uviWSi5N67j3t3UKFxej1loCH0VZn5XuqdNxoLShPcYPw6cUZn74K1VRj+9myynRX03bxIBEkwlkob/ujLsJVw==", "dev": true, "requires": { "path-parse": "^1.0.6" diff --git a/package.json b/package.json index 90b8b5a741..a5cae80624 100644 --- a/package.json +++ b/package.json @@ -31,10 +31,10 @@ }, "devDependencies": { "bluebird": "^3.5.5", + "clean-css": "^4.2.1", "cli-table": "^0.3.1", "colors": "^1.1.2", "commander": "^4.0.0", - "clean-css": "^4.2.1", "del": "^5.1.0", "gear": "github:highlightjs/gear", "gear-lib": "github:highlightjs/gear-lib", diff --git a/tools/build_config.js b/tools/build_config.js index a6a9913641..ab4cdd1670 100644 --- a/tools/build_config.js +++ b/tools/build_config.js @@ -1,10 +1,25 @@ +const cjsPlugin = require('rollup-plugin-commonjs'); + module.exports = { "build_dir": "build", "copyrightYears": "2006-2019", "clean_css": {}, + "CJS.input" : { + plugins: [ + cjsPlugin(), + { + transform: (x) => { + if (/var module/.exec(x)) { + // remove shim that only breaks things for rollup + return x.replace(/var module\s*=.*$/m,"") + } + } + } + ], + }, "CJS": { format: "cjs", - strict: false + strict: false, }, "terser": { // output: { ascii_only: true }, diff --git a/tools/lib/language.js b/tools/lib/language.js index bd6ecb38b7..3b897d59d2 100644 --- a/tools/lib/language.js +++ b/tools/lib/language.js @@ -1,11 +1,14 @@ const fs = require("fs") const fsProm = require("fs").promises const Terser = require("terser"); +const glob = require("glob-promise") +const path = require("path") const REQUIRES_REGEX = /\/\*.*?Requires: (.*?)\n/s const CATEGORY_REGEX = /\/\*.*?Category: (.*?)\n/s const LANGUAGE_REGEX = /\/\*.*?Language: (.*?)\n/s const {buildOutput} = require("./bundling.js") +const { getExternals } = require("./external_language") class Language { @@ -19,6 +22,7 @@ class Language { this.module = "" this.minified = "" + this.path = path this.data = fs.readFileSync(path, {encoding: "utf8"}) this.loadMetadata() } @@ -55,10 +59,15 @@ class Language { } static fromFile(filename) { - var path = `./src/languages/${filename}` + if (filename.startsWith("/")) + { + var file = filename + } else { + var file = `./src/languages/${filename}` + } return new Language( - filename.replace(".js",""), - path + path.basename(filename).replace(".js",""), + file ) } } @@ -74,7 +83,7 @@ async function compileLanguage (language, options) { } // TODO: cant we use the source we already have? - const input = { input: `src/languages/${language.name}.js` } + const input = { input: language.path } const output = { ...opts, name: `hljs`, file: "out.js" } var data = await buildOutput(input, output) @@ -87,11 +96,19 @@ async function compileLanguage (language, options) { language.minified = data.code } -function getLanguages() { + + +async function getLanguages() { let languages = [] fs.readdirSync("./src/languages/").forEach((file) => { languages.push(Language.fromFile(file)) }) + var externals = await getExternals(); + for (let ext of externals) { + let l = Language.fromFile(ext.file) + l.loader = ext.loader + languages.push(l) + } return languages } diff --git a/tools/rollup_browser.js b/tools/rollup_browser.js index da47344539..8a1faaa7aa 100644 --- a/tools/rollup_browser.js +++ b/tools/rollup_browser.js @@ -131,7 +131,6 @@ async function buildBrowserHighlightJS(languages, {minify}) { header, tersed.code, workerStub, ...languages.map((lang) => lang.minified) ].join("\n") - // get approximate core minified size core_min = [ header, tersed.code, workerStub].join().length diff --git a/tools/rollup_node.js b/tools/rollup_node.js index c55323016a..c84f967632 100644 --- a/tools/rollup_node.js +++ b/tools/rollup_node.js @@ -11,16 +11,20 @@ async function buildNodeIndex(languages) { const header = "var hljs = require('./highlight');" const footer = "module.exports = hljs;" - const registration = languages.map((lang) => - `hljs.registerLanguage('${lang.name}', require('./languages/${lang.name}'));` - ) + const registration = languages.map((lang) => { + let require = `require('./languages/${lang.name}')` + if (lang.loader) { + require = require += `.${lang.loader}` + } + return `hljs.registerLanguage('${lang.name}', ${require});` + }) const index = `${header}\n\n${registration.join("\n")}\n\n${footer}` await fs.writeFile(`${process.env.BUILD_DIR}/lib/index.js`, index) } async function buildNodeLanguage (language) { - const input = { input: `src/languages/${language.name}.js` } + const input = { ...config["CJS.input"], input: language.path } const output = { ...config.CJS, file: `${process.env.BUILD_DIR}/lib/languages/${language.name}.js` } await build(input, output) } @@ -79,7 +83,7 @@ async function buildNode(options) { log("Writing package.json.") await buildPackageJSON() - var languages = getLanguages() + var languages = await getLanguages() // filter languages for inclusion in the highlight.js bundle languages = filter(languages, options["languages"]) From 75ab819f997cab92fa254e95bc8ba44ef0d15250 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Wed, 18 Dec 2019 15:56:31 -0500 Subject: [PATCH 10/42] can run markup tests in 3rd party bundles --- test/markup/index.js | 26 +++++++++---- tools/build_config.js | 5 +++ tools/developer.html | 2 +- tools/lib/bundling.js | 8 +++- tools/lib/external_language.js | 71 ++++++++++++++++++++++++++++++++++ tools/lib/language.js | 63 ++++++++++++++++++++++-------- tools/rollup_browser.js | 2 +- tools/rollup_cdn.js | 2 +- 8 files changed, 151 insertions(+), 28 deletions(-) create mode 100644 tools/lib/external_language.js diff --git a/test/markup/index.js b/test/markup/index.js index 01ba8c8a17..7673049298 100644 --- a/test/markup/index.js +++ b/test/markup/index.js @@ -7,9 +7,14 @@ const hljs = require('../../build'); const path = require('path'); const utility = require('../utility'); -function testLanguage(language) { +const { getThirdPartyLanguages } = require("../../tools/lib/external_language") + +function testLanguage(language, {dir}) { describe(language, function() { - const filePath = utility.buildPath('markup', language, '*.expect.txt'), + const where = dir ? + path.join(dir, '*.expect.txt') : + utility.buildPath('markup', language, '*.expect.txt') + const filePath = where, filenames = glob.sync(filePath); _.each(filenames, function(filename) { @@ -32,12 +37,19 @@ function testLanguage(language) { } describe('hljs.highlight()', async () => { + let languages,thirdPartyLanguages; + before(async function() { + const markupPath = utility.buildPath('markup'); + + if (!process.env.EXTRA) { + languages = await fs.readdir(markupPath) + languages.forEach(testLanguage); + } + + thirdPartyLanguages = await getThirdPartyLanguages(); + return thirdPartyLanguages.forEach((l) => testLanguage(l.name,{dir: `${l.dir}/test/markup`})); + }) // TODO: why? // ./node_modules/.bin/mocha test/markup it("needs this or it can't be run stand-alone", function() {} ); - - const markupPath = utility.buildPath('markup'); - - const languages = await fs.readdir(markupPath) - return languages.forEach(testLanguage); }); diff --git a/tools/build_config.js b/tools/build_config.js index ab4cdd1670..daf1eb3468 100644 --- a/tools/build_config.js +++ b/tools/build_config.js @@ -4,6 +4,11 @@ module.exports = { "build_dir": "build", "copyrightYears": "2006-2019", "clean_css": {}, + "CJS.input.browser" : { + plugins: [ + cjsPlugin() + ] + }, "CJS.input" : { plugins: [ cjsPlugin(), diff --git a/tools/developer.html b/tools/developer.html index b975a6d8ef..79e334540d 100644 --- a/tools/developer.html +++ b/tools/developer.html @@ -68,7 +68,7 @@

highlight.js developer

- + `).join(""); diff --git a/test/browser/worker.js b/test/browser/worker.js index 3f8a5b11a7..e7a25dac29 100644 --- a/test/browser/worker.js +++ b/test/browser/worker.js @@ -9,8 +9,8 @@ const {newTestCase, defaultCase } = require('./test_case') describe('web worker', function() { before(function() { - // Will match both `highlight.pack.js` and `highlight.min.js` - const filepath = utility.buildPath('..', 'build', 'highlight.*.js'); + // Will match both `highlight.js` and `highlight.min.js` + const filepath = utility.buildPath('..', 'build', 'highlight.*js'); return glob(filepath).then(hljsPath => { this.worker = new Worker(function() { From 03047f02298f8995d44e587bc03eb29ddd2d2061 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sun, 9 Feb 2020 22:04:34 -0500 Subject: [PATCH 21/42] load the single necessary file, not both --- test/browser/test_case.js | 18 +++++++++++++-- test/browser/worker.js | 47 +++++++++++++++++---------------------- 2 files changed, 36 insertions(+), 29 deletions(-) diff --git a/test/browser/test_case.js b/test/browser/test_case.js index cea609db05..50b55cbf6c 100644 --- a/test/browser/test_case.js +++ b/test/browser/test_case.js @@ -4,6 +4,20 @@ const utility = require('../utility'); const glob = promisify(require('glob')); const fs = require('fs'); +// default to the minified library if it was built, otherwise fallback to +// the non-minified +async function findLibrary() { + const files = ['highlight.min.js', 'highlight.js'] + + for (let file of files) { + try { + let path = utility.buildPath('..', 'build', file); + await fs.promises.stat(path); + return path; + } catch {} + } + throw "could not find library in `build`" +} function newTestCase(opts) { var test = {}; @@ -23,7 +37,7 @@ function newTestCase(opts) { const buildFakeDOM = async function(data) { // Will match both `highlight.pack.js` and `highlight.min.js` - const filePath = utility.buildPath('..', 'build', 'highlight.*js'); + const filePath = await findLibrary(); const hljsPath = await glob(filePath); const hljsFiles = await hljsPath.map(path => fs.readFileSync(path, 'utf8')); const hljsScript = await hljsFiles.map(file => ``).join(""); @@ -41,4 +55,4 @@ const defaultCase = newTestCase({ '"Hello";' }); -module.exports = { newTestCase, defaultCase, buildFakeDOM }; +module.exports = { newTestCase, defaultCase, buildFakeDOM, findLibrary }; diff --git a/test/browser/worker.js b/test/browser/worker.js index e7a25dac29..9cc04ef5b2 100644 --- a/test/browser/worker.js +++ b/test/browser/worker.js @@ -1,37 +1,30 @@ 'use strict'; const Worker = require('tiny-worker'); -const utility = require('../utility'); -const {promisify} = require('util'); -const glob = promisify(require('glob')); -const {newTestCase, defaultCase } = require('./test_case') +const {newTestCase, defaultCase, findLibrary } = require('./test_case') describe('web worker', function() { - before(function() { - // Will match both `highlight.js` and `highlight.min.js` - const filepath = utility.buildPath('..', 'build', 'highlight.*js'); - - return glob(filepath).then(hljsPath => { - this.worker = new Worker(function() { - self.onmessage = function(event) { - if (event.data.action === 'importScript') { - importScripts(event.data.script); - postMessage(1); - } else { - var result = self.hljs.highlight('javascript', event.data); - postMessage(result.value); - } - }; - }); - - const done = new Promise(resolve => this.worker.onmessage = resolve); - this.worker.postMessage({ - action: 'importScript', - script: hljsPath[0] - }); - return done; + before(async function() { + this.hljsPath = await findLibrary(); + this.worker = new Worker(function() { + self.onmessage = function(event) { + if (event.data.action === 'importScript') { + importScripts(event.data.script); + postMessage(1); + } else { + var result = self.hljs.highlight('javascript', event.data); + postMessage(result.value); + } + }; }); + + const done = new Promise(resolve => this.worker.onmessage = resolve); + this.worker.postMessage({ + action: 'importScript', + script: this.hljsPath + }); + return done; }); it('should highlight text', function(done) { From a9973a378a2da08c9ca59770493970a5d0e38907 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sun, 9 Feb 2020 22:04:53 -0500 Subject: [PATCH 22/42] fixup: export default --- src/languages/c-like.js | 2 +- src/languages/c.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/languages/c-like.js b/src/languages/c-like.js index 7762a81e35..8c2a2bc5ed 100644 --- a/src/languages/c-like.js +++ b/src/languages/c-like.js @@ -13,7 +13,7 @@ change in v10 and don't have to change the requirements again later. See: https://github.com/highlightjs/highlight.js/issues/2146 */ -function(hljs) { +export default function(hljs) { function optional(s) { return '(?:' + s + ')?'; } diff --git a/src/languages/c.js b/src/languages/c.js index 63423e0705..a892943fc6 100644 --- a/src/languages/c.js +++ b/src/languages/c.js @@ -5,7 +5,7 @@ Website: https://en.wikipedia.org/wiki/C_(programming_language) Requires: c-like.js */ -function(hljs) { +export default function(hljs) { var lang = hljs.getLanguage('c-like').rawDefinition(); // Until C is actually different than C++ there is no reason to auto-detect C From 741c9dc15a11af204ca19e95466b5fa107778fca Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 21 Dec 2019 17:36:30 -0500 Subject: [PATCH 23/42] remove old build scripts --- tools/all.js | 34 --- tools/browser.js | 143 ---------- tools/build.js | 2 +- tools/{rollup_browser.js => build_browser.js} | 0 tools/{rollup_cdn.js => build_cdn.js} | 2 +- tools/{rollup_node.js => build_node.js} | 0 tools/cdn.js | 88 ------ tools/node.js | 186 ------------- tools/tasks.js | 257 ------------------ 9 files changed, 2 insertions(+), 710 deletions(-) delete mode 100644 tools/all.js delete mode 100644 tools/browser.js rename tools/{rollup_browser.js => build_browser.js} (100%) rename tools/{rollup_cdn.js => build_cdn.js} (97%) rename tools/{rollup_node.js => build_node.js} (100%) delete mode 100644 tools/cdn.js delete mode 100644 tools/node.js delete mode 100644 tools/tasks.js diff --git a/tools/all.js b/tools/all.js deleted file mode 100644 index 6168be0e53..0000000000 --- a/tools/all.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict'; - -let _ = require('lodash'); -let path = require('path'); -let cdn = require('./cdn'); -let node = require('./node'); -let browser = require('./browser'); - -function newBuildDirectory(dir, subdir) { - const build = path.join(dir.build, subdir); - - return { build: build }; -} - -module.exports = function(commander, dir) { - let data = {}; - - _.each(['cdn', 'node', 'browser'], function(target) { - const newDirectory = newBuildDirectory(dir, target), - directory = _.defaults(newDirectory, dir), - options = _.defaults({ target: target }, commander); - - data[target] = { - directory: directory, - commander: options - }; - }); - - return [].concat( - cdn(data.cdn.commander, data.cdn.directory), - node(data.node.commander, data.node.directory), - browser(data.browser.commander, data.browser.directory) - ); -}; diff --git a/tools/browser.js b/tools/browser.js deleted file mode 100644 index a2f6ccdf81..0000000000 --- a/tools/browser.js +++ /dev/null @@ -1,143 +0,0 @@ -'use strict'; - -let _ = require('lodash'); -let bluebird = require('bluebird'); -let readFile = bluebird.promisify(require('fs').readFile); -let path = require('path'); - -let registry = require('./tasks'); -let utility = require('./utility'); - -let directory; - -function templateAllFunc(blobs) { - const name = path.join('demo', 'index.html'); - - blobs = _.compact(blobs); - - return bluebird.join( - readFile(name), - utility.getStyleNames(), - (template, styles) => ({ template, path, blobs, styles }) - ); -} - -function copyDocs() { - const input = path.join(directory.root, 'docs', '*.rst'), - output = path.join(directory.build, 'docs'); - - return { - startLog: { task: ['log', 'Copying documentation.'] }, - read: { requires: 'startLog', task: ['glob', utility.glob(input)] }, - writeLog: { requires: 'read', task: ['log', 'Writing documentation.'] }, - write: { requires: 'writeLog', task: ['dest', output] } - }; -} - -function generateDemo(filterCB, readArgs) { - let styleDir = path.join('src', 'styles'), - staticArgs = utility.glob(path.join('demo', '*.min.{js,css}')), - imageArgs = utility.glob(path.join(styleDir, '*.{png,jpg}'), - 'binary'), - stylesArgs = utility.glob(path.join(styleDir, '*.css')), - demoRoot = path.join(directory.build, 'demo'), - templateArgs = { callback: templateAllFunc }, - destArgs = { - dir: path.join(demoRoot, 'styles'), - encoding: 'binary' - }; - - return { - logStart: { task: ['log', 'Generating demo.'] }, - readLanguages: { requires: 'logStart', task: ['glob', readArgs] }, - filterSnippets: { requires: 'readLanguages', task: ['filter', filterCB] }, - readSnippet: { requires: 'filterSnippets', task: 'readSnippet' }, - template: { - requires: 'readSnippet', - task: ['templateAll', templateArgs] - }, - write: { - requires: 'template', - task: ['write', path.join(demoRoot, 'index.html')] - }, - readStatic: { requires: 'logStart', task: ['glob', staticArgs] }, - writeStatic: { requires: 'readStatic', task: ['dest', demoRoot] }, - readStyles: { requires: 'logStart', task: ['glob', stylesArgs] }, - compressStyles: { requires: 'readStyles', task: 'cssminify' }, - writeStyles: { requires: 'compressStyles', task: ['dest', destArgs] }, - readImages: { requires: 'logStart', task: ['glob', imageArgs] }, - writeImages: { requires:'readImages', task: ['dest', destArgs] }, - readDemoJS: { - requires: 'logStart', - task: ['read', path.join('demo', 'demo.js')] - }, - minifyDemoJS: { requires: 'readDemoJS', task: 'jsminify' }, - writeDemoJS: { requires: 'minifyDemoJS', task: ['dest', demoRoot] }, - readDemoCSS: { - requires: 'logStart', - task: ['read', path.join('demo', 'style.css')] - }, - minifyDemoCSS: { requires: 'readDemoCSS', task: 'cssminify' }, - writeDemoCSS: { requires: 'minifyDemoCSS', task: ['dest', demoRoot] } - }; -} - -module.exports = function(commander, dir) { - directory = dir; - - let hljsExt, output, requiresTask, tasks, - replace = utility.replace, - regex = utility.regex, - replaceClassNames = utility.replaceClassNames, - - coreFile = path.join('src', 'highlight.js'), - languages = utility.glob(path.join('src', 'languages', '*.js')), - filterCB = utility.buildFilterCallback(commander.args), - replaceArgs = replace(regex.header, ''), - templateArgs = - 'hljs.registerLanguage(\'<%= name %>\', <%= content %>);\n'; - - tasks = { - startLog: { task: ['log', 'Building highlight.js pack file.'] }, - readCore: { requires: 'startLog', task: ['read', coreFile] }, - read: { requires: 'startLog', task: ['glob', languages] }, - filter: { requires: 'read', task: ['filter', filterCB] }, - reorder: { requires: 'filter', task: 'reorderDeps' }, - replace: { requires: 'reorder', task: ['replace', replaceArgs] }, - template: { requires: 'replace', task: ['template', templateArgs] }, - packageFiles: { - requires: ['readCore', 'template'], - task: 'packageFiles' - } - }; - requiresTask = 'packageFiles'; - - if(commander.compress || commander.target === 'cdn') { - tasks.minify = { requires: requiresTask, task: 'jsminify' }; - requiresTask = 'minify'; - } - - tasks.insertLicenseTag = { - requires: requiresTask, - task: 'insertLicenseTag' - }; - - tasks.writelog = { - requires: 'insertLicenseTag', - task: ['log', 'Writing highlight.js pack file.'] - }; - - hljsExt = commander.target === 'cdn' ? 'min' : 'pack'; - output = path.join(directory.build, `highlight.${hljsExt}.js`); - - tasks.write = { - requires: 'writelog', - task: ['write', output] - }; - - tasks = (commander.target === 'browser') - ? [copyDocs(), generateDemo(filterCB, languages), tasks] - : [tasks]; - - return utility.toQueue(tasks, registry); -}; diff --git a/tools/build.js b/tools/build.js index 5604fa8050..a374b64ebe 100644 --- a/tools/build.js +++ b/tools/build.js @@ -81,7 +81,7 @@ dir.root = path.dirname(__dirname); dir.buildRoot = path.join(dir.root, 'build'); async function doTarget(target, buildDir) { - const build = require(`./rollup_${target}`); + const build = require(`./build_${target}`); process.env.BUILD_DIR = buildDir; await clean(buildDir); await build.build({languages: commander.args, minify: commander.minify}); diff --git a/tools/rollup_browser.js b/tools/build_browser.js similarity index 100% rename from tools/rollup_browser.js rename to tools/build_browser.js diff --git a/tools/rollup_cdn.js b/tools/build_cdn.js similarity index 97% rename from tools/rollup_cdn.js rename to tools/build_cdn.js index de4199ae66..fa8e220d15 100644 --- a/tools/rollup_cdn.js +++ b/tools/build_cdn.js @@ -6,7 +6,7 @@ const { filter } = require("./lib/dependencies"); const config = require("./build_config"); const { install, install_cleancss, mkdir } = require("./lib/makestuff"); const log = (...args) => console.log(...args); -const { buildBrowserHighlightJS } = require("./rollup_browser"); +const { buildBrowserHighlightJS } = require("./build_browser"); async function buildCDN(options) { installStyles(); diff --git a/tools/rollup_node.js b/tools/build_node.js similarity index 100% rename from tools/rollup_node.js rename to tools/build_node.js diff --git a/tools/cdn.js b/tools/cdn.js deleted file mode 100644 index 3d93c9c11b..0000000000 --- a/tools/cdn.js +++ /dev/null @@ -1,88 +0,0 @@ -'use strict'; - -let path = require('path'); - -let browserBuild = require('./browser'); -let registry = require('./tasks'); -let utility = require('./utility'); - -let directory; - -function moveLanguages() { - let input = path.join(directory.root, 'src', 'languages', '*.js'), - output = path.join(directory.build, 'languages'), - regex = utility.regex, - replace = utility.replace, - - replaceArgs = replace(regex.header, ''), - template = 'hljs.registerLanguage(\'<%= name %>\','+ - ' <%= content %>);\n'; - - return { - startLog: { task: ['log', 'Building language files.'] }, - read: { - requires: 'startLog', - task: ['glob', utility.glob(input)] - }, - replace: { requires: 'read', task: ['replace', replaceArgs] }, - template: { requires: 'replace', task: ['template', template] }, - replace2: { - requires: 'template', - task: [ 'replaceSkippingStrings' - , replace(regex.replaces, utility.replaceClassNames) - ] - }, - replace3: { - requires: 'replace2', - task: ['replace', replace(regex.classname, '$1.className')] - }, - compressLog: { - requires: 'replace3', - task: ['log', 'Compressing languages files.'] - }, - minify: { requires: 'compressLog', task: 'jsminify' }, - rename: { requires: 'minify', task: ['rename', { extname: '.min.js' }] }, - writeLog: { - requires: 'rename', - task: ['log', 'Writing language files.'] - }, - write: { requires: 'writeLog', task: ['dest', output] } - }; -} - -function moveStyles() { - const css = path.join(directory.root, 'src', 'styles', '*.css'), - images = path.join(directory.root, 'src', 'styles', '*.{jpg,png}'), - output = path.join(directory.build, 'styles'), - options = { dir: output, encoding: 'binary' }; - - return { - startLog: { task: ['log', 'Building style files.'] }, - readCSS: { requires: 'startLog', task: ['glob', utility.glob(css)] }, - readImages: { - requires: 'startLog', - task: ['glob', utility.glob(images, 'binary')] - }, - compressLog: { - requires: 'readCSS', - task: ['log', 'Compressing style files.'] - }, - minify: { requires: 'compressLog', task: 'cssminify' }, - rename: { - requires: 'minify', - task: ['rename', { extname: '.min.css' }] - }, - writeLog: { - requires: ['rename', 'readImages'], - task: ['log', 'Writing style files.'] - }, - write: { requires: 'writeLog', task: ['dest', options] } - }; -} - -module.exports = function(commander, dir) { - directory = dir; - - return utility.toQueue([moveLanguages(), moveStyles()], registry) - .concat(browserBuild(commander, dir)); -}; diff --git a/tools/node.js b/tools/node.js deleted file mode 100644 index 5176712b4b..0000000000 --- a/tools/node.js +++ /dev/null @@ -1,186 +0,0 @@ -'use strict'; - -let _ = require('lodash'); -let bluebird = require('bluebird'); -let path = require('path'); - -let packageJSON = require('../package'); -let registry = require('./tasks'); -let utility = require('./utility'); - -let directory, filterCB, - languages = utility.glob(path.join('src', 'languages', '*.js')), - header = utility.regex.header, - exportDefault = utility.regex.exportDefault; - -function templateAllFunc(blobs) { - const names = _.map(blobs, blob => path.basename(blob.name, '.js')); - - return bluebird.resolve({ names: names }); -} - -function buildLanguages() { - let input = languages, - output = path.join(directory.build, 'lib', 'languages'), - - replaceArgs = utility.replace(header, ''), - replaceExportDefault = utility.replace(exportDefault,""), - template = 'module.exports = <%= content %>;'; - - return { - logStart: { task: ['log', 'Building language files.'] }, - read: { requires: 'logStart', task: ['glob', input] }, - filter: { requires: 'read', task: ['filter', filterCB] }, - replace: { requires: 'filter', task: ['replace', replaceArgs] }, - replace2: { requires: 'replace', task: ['replace', replaceExportDefault] }, - template: { requires: 'replace2', task: ['template', template] }, - writeLog: { - requires: 'template', - task: ['log', 'Writing language files.'] - }, - write: { requires: 'writeLog', task: ['dest', output] } - }; -} - -function buildCore() { - const input = path.join(directory.root, 'src', 'highlight.js'), - output = path.join(directory.build, 'lib'); - - return { - startLog: { task: ['log', 'Building core file.'] }, - read: { requires: 'startLog', task: ['read', input] }, - writeLog: { requires: 'read', task: ['log', 'Writing core file.'] }, - write: { requires: 'writeLog', task: ['dest', output] } - }; -} - -function buildIndex() { - let input = languages, - output = path.join(directory.build, 'lib', 'index.js'), - - templateArgs = { - template: [ 'var hljs = require(\'./highlight\');\n' - , '<% _.each(names, function(name) { %>' + - 'hljs.registerLanguage(\'<%= name %>\', ' + - 'require(\'./languages/<%= name %>\'));' - , '<% }); %>' - , 'module.exports = hljs;' - ].join('\n'), - callback: templateAllFunc - }; - - return { - startLog: { task: ['log', 'Building index file.'] }, - read: { requires: 'startLog', task: ['glob', input] }, - filter: { requires: 'read', task: ['filter', filterCB] }, - reorder: { requires: 'filter', task: 'reorderDeps' }, - template: { requires: 'reorder', task: ['templateAll', templateArgs] }, - writeLog: { requires: 'template', task: ['log', 'Writing index file.'] }, - write: { requires: 'writeLog', task: ['write', output] } - }; -} - -function copyMetaFiles() { - let docs = path.join('docs', '*.rst'), - glob = `{README.md,LICENSE,${docs}}`, - - input = utility.glob(path.join(directory.root, glob)), - output = { dir: directory.build, base: '.' }; - - return { - startLog: { task: ['log', 'Copying meta files.'] }, - read: { requires: 'startLog', task: ['glob', input] }, - writeLog: { requires: 'read', task: ['log', 'Writing meta files.'] }, - write: { requires: 'writeLog', task: ['dest', output] } - }; -} - -function buildSCSSStyles() { - let input = path.join(directory.root, 'src', 'styles', '*.css'), - output = path.join(directory.build, 'scss'), - options = { encoding: 'utf8', dir: output } - - return { - startLog: { task: ['log', 'Building SCSS styles.'] }, - read: { requires: 'startLog', task: ['glob', utility.glob(input)] }, - writeLog: { requires: 'read', task: ['log', 'Writing SCSS styles.'] }, - rename: { requires: 'writeLog', task: ['rename', { extname: '.scss' }] }, - write: { requires: 'rename', task: ['dest', options] } - }; -} - -function buildSCSSImages() { - let input = path.join(directory.root, 'src', 'styles', '*.{jpg,png}'), - output = path.join(directory.build, 'scss'), - options = { encoding: 'binary', dir: output } - - return { - startLog: { task: ['log', 'Building SCSS files.'] }, - read: { requires: 'startLog', task: ['glob', utility.glob(input, 'binary')] }, - writeLog: { requires: 'read', task: ['log', 'Writing SCSS files.'] }, - write: { requires: 'writeLog', task: ['dest', options] } - }; -} - -function buildStyles() { - let input = path.join(directory.root, 'src', 'styles', '*.css'), - output = path.join(directory.build, 'styles'), - options = { encoding: 'utf8', dir: output }; - - return { - startLog: { task: ['log', 'Building style files.'] }, - read: { - requires: 'startLog', - task: ['glob', utility.glob(input, 'binary')] - }, - writeLog: { requires: 'read', task: ['log', 'Writing style files.'] }, - write: { requires: 'writeLog', task: ['dest', options] } - }; -} - -function buildCSSImages() { - let input = path.join(directory.root, 'src', 'styles', '*.{jpg,png}'), - output = path.join(directory.build, 'styles'), - options = { encoding: 'binary', dir: output } - - return { - startLog: { task: ['log', 'Building CSS image files.'] }, - read: { requires: 'startLog', task: ['glob', utility.glob(input, 'binary')] }, - writeLog: { requires: 'read', task: ['log', 'Writing CSS images files.'] }, - write: { requires: 'writeLog', task: ['dest', options] } - }; -} - -function buildPackageFile() { - const input = path.join(directory.root, 'AUTHORS.txt'), - output = path.join(directory.build, 'package.json'); - - return { - startLog: { task: ['log', 'Building package.json file.'] }, - read: { requires: 'startLog', task: ['read', input] }, - build: { requires: 'read', task: ['buildPackage', packageJSON] }, - writeLog: { - requires: 'build', - task: ['log', 'Writing package.json file.'] - }, - write: { requires: 'writeLog', task: ['write', output] } - }; -} - -module.exports = function(commander, dir) { - directory = dir; - filterCB = utility.buildFilterCallback(commander.args); - let tasks = [ - buildLanguages(), - buildCore(), - buildIndex(), - buildStyles(), - buildCSSImages(), - buildSCSSStyles(), - buildSCSSImages(), - copyMetaFiles(), - buildPackageFile() - ]; - - return utility.toQueue(tasks, registry); -}; diff --git a/tools/tasks.js b/tools/tasks.js deleted file mode 100644 index 3392756a8f..0000000000 --- a/tools/tasks.js +++ /dev/null @@ -1,257 +0,0 @@ -'use strict'; - -let _ = require('lodash'); -let del = require('del'); -let gear = require('gear'); -let path = require('path'); -let utility = require('./utility'); - -let parseHeader = utility.parseHeader; -let tasks = require('gear-lib'); - -tasks.clean = function(directories, blobs, done) { - directories = _.isString(directories) ? [directories] : directories; - - return del(directories).then(() => done(null, blobs)); -}; -tasks.clean.type = 'collect'; - -// Depending on the languages required for the current language being -// processed, this task reorders it's dependencies first then include the -// language. -tasks.reorderDeps = function(options, blobs, done) { - let buffer = {}, - newBlobOrder = []; - - _.each(blobs, function(blob) { - let basename = path.basename(blob.name), - fileInfo = parseHeader(blob.result), - extra = { blob: blob, processed: false }; - - buffer[basename] = _.merge(extra, fileInfo || {}); - }); - - function pushInBlob(object) { - if(!object.processed) { - object.processed = true; - newBlobOrder.push(object.blob); - } - } - - _.each(buffer, function(buf) { - let object; - - if(buf.Requires) { - _.each(buf.Requires, function(language) { - object = buffer[language]; - // go a second level deep for dependencies - // (new build system will eliminate this) - if (object.Requires) { - _.each(object.Requires, function(language) { - let object = buffer[language]; - pushInBlob(object); - }); - } - pushInBlob(object); - }); - } - - pushInBlob(buf); - }); - - done(null, newBlobOrder); -}; -tasks.reorderDeps.type = 'collect'; - -tasks.template = function(template, blob, done) { - template = template || ''; - - let filename = path.basename(blob.name), - basename = path.basename(filename, '.js'), - content = _.template(template)({ - name: basename, - filename: filename, - content: blob.result.trim() - }); - - return done(null, new gear.Blob(content, blob)); -}; - -tasks.templateAll = function(options, blobs, done) { - return options.callback(blobs) - .then(function(data) { - - let template = options.template || data.template, - content = _.template(template)(data); - - return done(null, [new gear.Blob(content)]); - }) - .catch(done); -}; -tasks.templateAll.type = 'collect'; - -tasks.rename = function(options, blob, done) { - options = options || {}; - - let name = blob.name, - ext = new RegExp(path.extname(name) + '$'); - - name = name.replace(ext, options.extname); - - return done(null, new gear.Blob(blob.result, { name: name })); -}; - -// Adds the contributors from `AUTHORS.txt` onto the `package.json` file -// and moves the result into the `build` directory. -tasks.buildPackage = function(json, blob, done) { - let result, - lines = blob.result.split(/\r?\n/), - regex = /^- (.*) <(.*)>$/; - - json.contributors = _.transform(lines, function(result, line) { - let matches = line.match(regex); - - if(matches) { - result.push({ - name: matches[1], - email: matches[2] - }); - } - }, []); - - result = JSON.stringify(json, null, ' '); - - return done(null, new gear.Blob(result, blob)); -}; - -// Mainly for replacing the keys of `utility.REPLACES` for it's values while -// skipping over strings, regular expressions, or comments. However, this is -// pretty generic so long as you use the `utility.replace` function, you can -// replace a regular expression with a string. -tasks.replaceSkippingStrings = function(params, blob, done) { - let content = blob.result, - length = content.length, - offset = 0, - - replace = params.replace || '', - regex = params.regex, - starts = /\/\/|['"\/]/, - - result = [], - chunk, end, match, start, terminator; - - while(offset < length) { - chunk = content.slice(offset); - match = chunk.match(starts); - end = match ? match.index : length; - - chunk = content.slice(offset, end + offset); - result.push(chunk.replace(regex, replace)); - - offset += end; - - if(match) { - // We found a starter sequence: either a `//` or a "quote" - // In the case of `//` our terminator is the end of line. - // Otherwise it's either a matching quote or an escape symbol. - terminator = match[0] !== '//' ? new RegExp(`[${match[0]}\\\\]`) - : /$/m; - start = offset; - offset += 1; - - while(true) { - chunk = content.slice(offset); - match = chunk.match(terminator); - - if(!match) { - return done('Unmatched quote'); - } - - if(match[0] === '\\') { - offset += match.index + 2; - } else { - offset += match.index + 1; - result.push(content.slice(start, offset)); - break; - } - } - } - } - - return done(null, new gear.Blob(result.join(''), blob)); -}; - -tasks.filter = function(callback, blobs, done) { - let filteredBlobs = _.filter(blobs, callback); - - // Re-add in blobs required from header definition - _.each(filteredBlobs, function(blob) { - let dirname = path.dirname(blob.name), - content = blob.result, - fileInfo = parseHeader(content); - - if(fileInfo && fileInfo.Requires) { - _.each(fileInfo.Requires, function(language) { - let filename = `${dirname}/${language}`, - fileFound = _.find(filteredBlobs, { name: filename }); - - if(!fileFound) { - filteredBlobs.push( - _.find(blobs, { name: filename })); - } - }); - } - }); - - return done(null, filteredBlobs); -}; -tasks.filter.type = 'collect'; - -tasks.readSnippet = function(options, blob, done) { - let name = path.basename(blob.name, '.js'), - fileInfo = parseHeader(blob.result), - snippetName = path.join('test', 'detect', name, 'default.txt'); - - function onRead(error, blob) { - if(error) return done(null); // ignore missing snippets - - let meta = { name: `${name}.js`, fileInfo: fileInfo }; - - return done(null, new gear.Blob(blob.result, meta)); - } - - gear.Blob.readFile(snippetName, 'utf8', onRead, false); -}; - -tasks.insertLicenseTag = function(options, blob, done) { - let hljsVersion = require('../package').version, - licenseTag = `/*! highlight.js v${hljsVersion} | ` + - `BSD3 License | git.io/hljslicense */\n`; - - return done(null, new gear.Blob(licenseTag + blob.result, blob)); -}; - -// Packages up included languages into the core `highlight.js` and moves the -// result into the `build` directory. -tasks.packageFiles = function(options, blobs, done) { - let content, - coreFile = _.head(blobs), - languages = _.tail(blobs), - - lines = coreFile.result - .replace(utility.regex.header, '') - .split('\n\n'), - lastLine = _.last(lines), - langStr = _.reduce(languages, (str, language) => - `${str + language.result}\n`, ''); - - lines[lines.length - 1] = langStr.trim(); - - lines = lines.concat(lastLine); - content = lines.join('\n\n'); - - return done(null, [new gear.Blob(content)]); -}; -tasks.packageFiles.type = 'collect'; - -module.exports = new gear.Registry({ tasks: tasks }); From 6d39f252bf58b764ad92a1ead23cf3c8c9785b39 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 21 Dec 2019 17:52:58 -0500 Subject: [PATCH 24/42] goodbye gear and bluebird --- package-lock.json | 1758 +-------------------------------------------- package.json | 5 +- tools/utility.js | 108 +-- 3 files changed, 20 insertions(+), 1851 deletions(-) diff --git a/package-lock.json b/package-lock.json index f171f37c92..82d11b5110 100644 --- a/package-lock.json +++ b/package-lock.json @@ -169,85 +169,24 @@ "sprintf-js": "~1.0.2" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true, - "optional": true - }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.8.0.tgz", - "integrity": "sha1-7mXsdymML/FFa8RBigUtDwZDURI=", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -266,61 +205,6 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -336,12 +220,6 @@ "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", "dev": true }, - "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", - "dev": true - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -353,32 +231,12 @@ } }, "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "fill-range": "^7.0.1" } }, "browser-process-hrtime": { @@ -399,29 +257,6 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -472,24 +307,6 @@ "readdirp": "~3.2.0" }, "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, "glob-parent": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", @@ -498,44 +315,6 @@ "requires": { "is-glob": "^4.0.1" } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } } } }, @@ -554,16 +333,6 @@ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, - "cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", - "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "^7.1.1" - } - }, "cli-table": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", @@ -620,22 +389,6 @@ } } }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -672,12 +425,6 @@ "integrity": "sha512-SEa2abMBTZuEjLVYpNrAFoRgxPwG4rXP3+SGY6CM/HZGeDzIA7Pzp+7H3AHDukKEpyy2SoSGGPShKqqfH9T9AQ==", "dev": true }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -694,36 +441,12 @@ "proto-list": "~1.2.1" } }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "csslint": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/csslint/-/csslint-0.10.0.tgz", - "integrity": "sha1-OmoE51Zcjp0ZvrSXZ8fslug2WAU=", - "dev": true, - "requires": { - "parserlib": "~0.2.2" - } - }, "cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", @@ -775,29 +498,6 @@ "whatwg-url": "^8.0.0" } }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.5.tgz", - "integrity": "sha1-9yQSF0MPmd7EwrRz6rkiKOh0wqw=", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -810,12 +510,6 @@ "integrity": "sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==", "dev": true }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -831,47 +525,6 @@ "object-keys": "^1.0.12" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "del": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", @@ -908,12 +561,6 @@ "integrity": "sha1-KwEHaIY+FvLXPjgcliN0Sm2MKks=", "dev": true }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -929,36 +576,6 @@ "path-type": "^4.0.0" } }, - "dom-serializer": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.1.tgz", - "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", - "dev": true - }, - "entities": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", - "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", - "dev": true - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, "domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", @@ -968,25 +585,6 @@ "webidl-conversions": "^5.0.0" } }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -1023,22 +621,6 @@ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "optional": true, - "requires": { - "prr": "~1.0.1" - } - }, "es-abstract": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", @@ -1113,163 +695,12 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -1363,26 +794,12 @@ } }, "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "to-regex-range": "^5.0.1" } }, "find-up": { @@ -1394,48 +811,6 @@ "locate-path": "^3.0.0" } }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - } - } - }, - "fined": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.1.tgz", - "integrity": "sha512-jQp949ZmEbiYHk3gkbdtpJ0G1+kgtLQBNdP5edFP7Fh+WAYceLQz6yO1SBj72Xkg8GVyTB3bBzAYrHJVh5Xd5g==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, "flat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", @@ -1453,21 +828,6 @@ } } }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -1485,15 +845,6 @@ "mime-types": "^2.1.12" } }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1513,47 +864,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "gear": { - "version": "github:highlightjs/gear#9e426cb803d132a379b63691a95ca56623c758f1", - "from": "github:highlightjs/gear", - "dev": true, - "requires": { - "async": "0.8.x", - "liftoff": "^3.0.0", - "minimist": "0.1.x", - "mkdirp": "0.5.x" - } - }, - "gear-lib": { - "version": "github:highlightjs/gear-lib#6048aa2ebe09b409804df3ddabe3b0776bfa0b7f", - "from": "github:highlightjs/gear-lib", - "dev": true, - "requires": { - "async": "0.8.x", - "csslint": "0.10.x", - "gear": "github:highlightjs/gear", - "glob": "^7.1.3", - "handlebars": "^4.1.0", - "jshint": "^2.10.1", - "jslint": "^0.12.1", - "knox": "^0.9.2", - "less": "^3.9.0", - "mime": "^2.4.0", - "uglify-js": "^3.4.9" - } - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -1603,30 +919,6 @@ "@types/glob": "*" } }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, "globby": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", @@ -1643,13 +935,6 @@ "slash": "^3.0.0" } }, - "graceful-fs": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", - "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", - "dev": true, - "optional": true - }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -1705,53 +990,12 @@ "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, "html-encoding-sniffer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.0.tgz", @@ -1761,19 +1005,6 @@ "whatwg-encoding": "^1.0.5" } }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", - "dev": true, - "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" - } - }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -1800,13 +1031,6 @@ "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", "dev": true }, - "image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", - "dev": true, - "optional": true - }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", @@ -1841,36 +1065,6 @@ "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", "dev": true }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1880,69 +1074,18 @@ "binary-extensions": "^2.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", "dev": true }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-date-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", "dev": true }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1965,24 +1108,10 @@ } }, "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true }, "is-path-cwd": { "version": "2.2.0", @@ -1996,15 +1125,6 @@ "integrity": "sha512-CKstxrctq1kUesU6WhtZDbYKzzYBuRH0UYInAVrkc/EYdB9ltbfE0gOoayG9nhohG6447sOOVGhHqsdmBvkbNg==", "dev": true }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, "is-reference": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz", @@ -2031,15 +1151,6 @@ "has": "^1.0.1" } }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", @@ -2055,39 +1166,12 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -2169,57 +1253,6 @@ } } }, - "jshint": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.10.2.tgz", - "integrity": "sha512-e7KZgCSXMJxznE/4WULzybCMNXNAd/bf5TSrvVEq78Q/K8ZwFpmBqQeDtNiHc3l49nV4E/+YeHU/JZjSUIrLAA==", - "dev": true, - "requires": { - "cli": "~1.0.0", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "~4.17.11", - "minimatch": "~3.0.2", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x" - } - }, - "jslint": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/jslint/-/jslint-0.12.1.tgz", - "integrity": "sha512-q5iHswjOmJffbsGVq/1umGh4YBxb5pCArNHCZeHpkuVDDKM6IldqUn4hLehKSwQr7Bn07VXjD34Lx3nw+6j8eA==", - "dev": true, - "requires": { - "exit": "~0.1.2", - "glob": "~7.1.3", - "nopt": "~4.0.1", - "readable-stream": "~2.1.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", - "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", - "dev": true, - "requires": { - "buffer-shims": "^1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~0.10.x", - "util-deprecate": "~1.0.1" - } - } - } - }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -2258,51 +1291,6 @@ } } }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "knox": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/knox/-/knox-0.9.2.tgz", - "integrity": "sha1-NzZZNmniTwJP2vcjtqHcSv2DmnE=", - "dev": true, - "requires": { - "debug": "^1.0.2", - "mime": "*", - "once": "^1.3.0", - "stream-counter": "^1.0.0", - "xml2js": "^0.4.4" - } - }, - "less": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/less/-/less-3.10.3.tgz", - "integrity": "sha512-vz32vqfgmoxF1h3K4J+yKCtajH0PWmjkIFgbs5d78E/c/e+UQTnI+lWK+1eQRE95PXM2mC3rJlLSSP9VQHnaow==", - "dev": true, - "requires": { - "clone": "^2.1.2", - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "mime": "^1.4.1", - "mkdirp": "^0.5.0", - "promise": "^7.1.1", - "request": "^2.83.0", - "source-map": "~0.6.0" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "optional": true - } - } - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -2313,22 +1301,6 @@ "type-check": "~0.3.2" } }, - "liftoff": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.0.0.tgz", - "integrity": "sha512-VzAsHEB70R7qCAYU7Ka+cO/Bihr8Dmt8jmJbXut+soBGAwMkbT3rePnOk+Cj/cN6alhrH8gdUGK5TS+EwG+Fnw==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - } - }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -2379,63 +1351,12 @@ "sourcemap-codec": "^1.4.4" } }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, "merge2": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.4.tgz", "integrity": "sha512-FYE8xI+6pjFOhokZu0We3S5NKCirLbCzSh2Usf3qEyr4X8U+0jNg9P8RZ4qz+V2UoECLVwSyzU3LxXBaLGtD3A==", "dev": true }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", - "dev": true - }, "mime-db": { "version": "1.38.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", @@ -2460,33 +1381,6 @@ "brace-expansion": "^1.1.7" } }, - "minimist": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", - "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=", - "dev": true - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -2573,25 +1467,6 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, "neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", @@ -2636,52 +1511,12 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", @@ -2694,18 +1529,6 @@ "object-keys": "^1.0.11" } }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", @@ -2716,25 +1539,6 @@ "es-abstract": "^1.5.1" } }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2831,41 +1635,12 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, "parse5": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", "dev": true }, - "parserlib": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/parserlib/-/parserlib-0.2.5.tgz", - "integrity": "sha1-hZB92GBaoGq7PdKV1QuyuPpN0Rc=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -2884,21 +1659,6 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -2917,47 +1677,18 @@ "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", "dev": true }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "requires": { - "asap": "~2.0.3" - } - }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", "dev": true }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true, - "optional": true - }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -2982,18 +1713,6 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, "readdirp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", @@ -3003,37 +1722,6 @@ "picomatch": "^2.0.4" } }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -3094,37 +1782,6 @@ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -3204,27 +1861,12 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, "saxes": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/saxes/-/saxes-4.0.2.tgz", @@ -3246,35 +1888,6 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "dev": true - }, "should": { "version": "13.2.3", "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", @@ -3341,153 +1954,12 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "source-map-support": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", @@ -3498,27 +1970,12 @@ "source-map": "^0.6.0" } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, "sourcemap-codec": { "version": "1.4.6", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", "dev": true }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -3559,39 +2016,12 @@ } } }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, - "stream-counter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-1.0.0.tgz", - "integrity": "sha1-kc8lac5NxQYf6816yyY5SloRR1E=", - "dev": true - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -3602,12 +2032,6 @@ "strip-ansi": "^4.0.0" } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", @@ -3617,12 +2041,6 @@ "ansi-regex": "^3.0.0" } }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - }, "supports-color": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", @@ -3666,46 +2084,13 @@ "esm": "^3.2.25" } }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "^7.0.0" } }, "tough-cookie": { @@ -3764,6 +2149,7 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.2.tgz", "integrity": "sha512-+gh/xFte41GPrgSMJ/oJVq15zYmqr74pY9VoM69UzMzq9NFk4YDylclb1/bhEzZSaUQjbW5RvniHeq1cdtRYjw==", "dev": true, + "optional": true, "requires": { "commander": "2.20.0", "source-map": "~0.6.1" @@ -3773,71 +2159,8 @@ "version": "2.20.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", - "dev": true - } - } - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "optional": true } } }, @@ -3850,34 +2173,6 @@ "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", @@ -4046,23 +2341,6 @@ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", "dev": true }, - "xml2js": { - "version": "0.4.22", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.22.tgz", - "integrity": "sha512-MWTbxAQqclRSTnehWWe5nMKzI3VmJ8ltiJEco8akcC6j3miOhjjfzKum5sId+CWhfxdOs/1xauYr8/ZDBtQiRw==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "util.promisify": "~1.0.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - }, "xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", diff --git a/package.json b/package.json index dfbead1bfa..e566ff8a27 100644 --- a/package.json +++ b/package.json @@ -30,18 +30,15 @@ "node": "*" }, "devDependencies": { - "bluebird": "^3.5.5", "clean-css": "^4.2.1", "cli-table": "^0.3.1", "colors": "^1.1.2", "commander": "^4.0.0", "del": "^5.1.0", "dependency-resolver": "^2.0.1", - "gear": "github:highlightjs/gear", - "gear-lib": "github:highlightjs/gear-lib", "glob": "^7.1.4", - "handlebars": "^4.5.3", "glob-promise": "^3.4.0", + "handlebars": "^4.5.3", "js-beautify": "^1.10.2", "jsdom": "^16.0.1", "lodash": "^4.17.15", diff --git a/tools/utility.js b/tools/utility.js index a9110c78ea..c244d67114 100644 --- a/tools/utility.js +++ b/tools/utility.js @@ -1,14 +1,6 @@ 'use strict'; -let _ = require('lodash'); -let bluebird = require('bluebird'); -let glob = bluebird.promisify(require('glob')); -let path = require('path'); - -let Queue = require('gear').Queue; - -let regex = {}, - headerRegex = /^\s*\/\*((.|\r?\n)*?)\*/; +let regex = {}; const REPLACES = { 'case_insensitive': 'cI', @@ -61,18 +53,9 @@ const REPLACES = { regex.replaces = new RegExp( `(?:([\\w\\d]+)\\.(${Object.keys(REPLACES).filter(r => r.toUpperCase() === r).join('|')})\\s*=(?!=)|\\b(${Object.keys(REPLACES).join('|')})\\b)`, 'g'); -regex.classname = /(block|parentNode)\.cN/g; - -regex.header = /^\s*(\/\*((.|\r?\n)*?)\*\/)?\s*/; -regex.exportDefault = /export default / - regex.apiReplacesFrom = /\bvar\s*API_REPLACES\b/; regex.apiReplacesTo = `var API_REPLACES = ${JSON.stringify(REPLACES)}`; -function replace(from, to) { - return { regex: from, replace: to }; -} - function replaceClassNames(match, gDeclObj, gDeclKey) { if(gDeclObj) return replaceAndSaveClassNames(gDeclObj, gDeclKey); @@ -84,97 +67,8 @@ function replaceAndSaveClassNames(obj, key) { return `${obj}.${REPLACES[key]} = ${obj}.${key} =`; } -// All meta data, for each language definition, it store within the headers -// of each file in `src/languages`. `parseHeader` extracts that data and -// turns it into a useful object -- mainly for categories and what language -// this definition requires. -function parseHeader(content) { - let headers, - match = content.match(headerRegex); - - if (!match) { - return null; - } - - headers = _.compact(match[1].split('\n')); - - return _.reduce(headers, function(result, header) { - let keyVal = header.trim().split(': '), - key = keyVal[0], - value = keyVal[1] || ''; - - if(key !== 'Description' && key !== 'Language') { - value = value.split(/\s*,\s*/); - } - - result[key] = value; - - return result; - }, {}); -} - -function filterByQualifiers(blob, languages, categories) { - if(_.isEmpty(languages) && _.isEmpty(categories)) return true; - - let language = path.basename(blob.name, '.js'), - fileInfo = parseHeader(blob.result), - containsCategory = _.partial(_.includes, categories); - - if(!fileInfo) return false; - - let fileCategories = fileInfo.Category || []; - - return _.includes(languages, language) || - _.some(fileCategories, containsCategory); -} - -// For the filter task in `tools/tasks.js`, this function will look for -// categories and languages specificed from the CLI. -function buildFilterCallback(qualifiers) { - const result = _.partition(qualifiers, { 0: ':' }), - languages = result[1], - categories = _.map(result[0], category => category.slice(1)); - - return blob => filterByQualifiers(blob, languages, categories); -} - -function globDefaults(pattern, encoding) { - encoding = encoding || 'utf8'; - - // The limit option is a fix for issue #636 when the build script would - // EMFILE error for those systems who had a limit of open files per - // process. - // - // - return { pattern: pattern, limit: 50, encoding: encoding }; -} - -function getStyleNames() { - let stylesDir = 'src/styles/', - options = { ignore: `${stylesDir}default.css` }; - - return glob(`${stylesDir}*.css`, options) - .map(function(style) { - let basename = path.basename(style, '.css'), - name = _.startCase(basename), - pathName = path.relative('src', style); - - return { path: pathName, name: name }; - }); -} - -function toQueue(tasks, registry) { - return _.map(tasks, task => new Queue({ registry }).tasks(task)); -} - module.exports = { - buildFilterCallback: buildFilterCallback, - getStyleNames: getStyleNames, - glob: globDefaults, - parseHeader: parseHeader, regex: regex, - replace: replace, replaceClassNames: replaceClassNames, - toQueue: toQueue, REPLACES: REPLACES }; From edbdbab9319fa126331d9fc5cf25b2c07c95ad53 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sun, 22 Dec 2019 09:04:37 -0500 Subject: [PATCH 25/42] clean up build config --- .jshintrc | 5 ++-- tools/build_config.js | 56 ++----------------------------------------- 2 files changed, 5 insertions(+), 56 deletions(-) diff --git a/.jshintrc b/.jshintrc index 2ef7a5797a..05e63ed4e0 100644 --- a/.jshintrc +++ b/.jshintrc @@ -1,4 +1,5 @@ -// whole codebase isn't ES8 yet, but our tests and some things are +// whole codebase isn't ES8/9 yet, but our tests and some things are { - "esversion": 8 + "esversion": 9, + "node": true } diff --git a/tools/build_config.js b/tools/build_config.js index 34839cff3e..24dcdc8c2b 100644 --- a/tools/build_config.js +++ b/tools/build_config.js @@ -2,7 +2,7 @@ const cjsPlugin = require('rollup-plugin-commonjs'); module.exports = { build_dir: "build", - copyrightYears: "2006-2019", + copyrightYears: "2006-2020", clean_css: {}, rollup: { node: { @@ -37,65 +37,13 @@ module.exports = { } } }, - - "CJS": { - format: "cjs", - strict: false, - }, - "terser": { + terser: { "compress": { passes: 2, unsafe: true, warnings: true, dead_code: true, toplevel: "funcs" - }, - "mangle": { -// "properties": { -// "only_cache": true, -// "reserved": [], -// // "keep_quoted": true, -// "builtins": [] -// , "cache": { -// "propsx" : new Map([ -// ["relevance","r"], -// ["contains", "c"], -// ["keywords", "k"], -// ['begin', 'b'], -// ['beginKeywords', 'bK'], -// ['end', 'e'], -// ['endsWithParent', 'eW'], -// ['excludeBegin', 'eB'], -// ['excludeEnd', 'eE'], -// ['returnBegin', 'rB'], -// ['returnEnd', 'rE'], -// ['variants', 'v'], -// // ['className', 'cN'], - -// ['IDENT_RE', 'IR'], -// ['UNDERSCORE_IDENT_RE', 'UIR'], -// ['NUMBER_RE', 'NR'], -// ['C_NUMBER_RE', 'CNR'], -// ['BINARY_NUMBER_RE', 'BNR'], -// ['RE_STARTERS_RE', 'RSR'], -// ['BACKSLASH_ESCAPE', 'BE'], -// ['APOS_STRING_MODE', 'ASM'], -// ['QUOTE_STRING_MODE', 'QSM'], -// ['PHRASAL_WORDS_MODE', 'PWM'], -// ['C_LINE_COMMENT_MODE', 'CLCM'], -// ['C_BLOCK_COMMENT_MODE', 'CBCM'], -// ['HASH_COMMENT_MODE', 'HCM'], -// ['NUMBER_MODE', 'NM'], -// ['C_NUMBER_MODE', 'CNM'], -// ['BINARY_NUMBER_MODE', 'BNM'], -// ['CSS_NUMBER_MODE', 'CSSNM'], -// ['REGEXP_MODE', 'RM'], -// ['TITLE_MODE', 'TM'], -// ['UNDERSCORE_TITLE_MODE', 'UTM'], -// ['COMMENT', 'C'], -// ]) -// } -// } } } } From 595d2b99d73881973d91d89efc09bb8ca213dddc Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sun, 22 Dec 2019 20:42:40 -0500 Subject: [PATCH 26/42] add readme and license to CDN build --- tools/build_cdn.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/build_cdn.js b/tools/build_cdn.js index fa8e220d15..c834d6e37b 100644 --- a/tools/build_cdn.js +++ b/tools/build_cdn.js @@ -9,6 +9,9 @@ const log = (...args) => console.log(...args); const { buildBrowserHighlightJS } = require("./build_browser"); async function buildCDN(options) { + install("./LICENSE", "LICENSE"); + install("./README.md","README.md"); + installStyles(); // all the languages are built for the CDN and placed into `/languages` From bf4b0dd50aa5c28ce93f0e2ee16b1ad725d975c3 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Mon, 23 Dec 2019 16:56:17 -0500 Subject: [PATCH 27/42] wip: package CDN distributable for 3rd party languages --- tools/build_cdn.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tools/build_cdn.js b/tools/build_cdn.js index c834d6e37b..ac97561e42 100644 --- a/tools/build_cdn.js +++ b/tools/build_cdn.js @@ -7,6 +7,7 @@ const config = require("./build_config"); const { install, install_cleancss, mkdir } = require("./lib/makestuff"); const log = (...args) => console.log(...args); const { buildBrowserHighlightJS } = require("./build_browser"); +const path = require("path"); async function buildCDN(options) { install("./LICENSE", "LICENSE"); @@ -69,7 +70,20 @@ function installStyles() { const filename = `${process.env.BUILD_DIR}/languages/${language.name}.min.js`; await language.compile({terser: config.terser}); - fs.writeFile(filename, language.minified) + fs.writeFile(filename, language.minified); + + // TODO: cleanup + const extra = path.resolve(__dirname,"../extra") + if (language.path.startsWith(extra)) { + var tmp = language.path.replace(extra,"") + var name = tmp.split("/")[1] + var libPath = path.join(extra, name) + + // console.log(libPath) + // add a distributable to the 3rd party directory + await fs.mkdir(path.join(libPath, "dist"), {recursive: true}); + fs.writeFile(path.join(libPath,"dist",path.basename(filename)), language.minified); + } } module.exports.build = buildCDN; From 69b91a990e0e8aba7abc3d8239e8902d493deec4 Mon Sep 17 00:00:00 2001 From: Eric Prud'hommeaux Date: Wed, 1 Jan 2020 13:58:44 +0100 Subject: [PATCH 28/42] + support for multi-language 3rd-party packages (#2336) * + support for multi-language 3rd-party packages --- test/detect/index.js | 14 ++++++++---- test/markup/index.js | 10 +++++--- tools/lib/external_language.js | 42 +++++++++++++++++----------------- tools/lib/language.js | 14 +++++++----- 4 files changed, 45 insertions(+), 35 deletions(-) diff --git a/test/detect/index.js b/test/detect/index.js index daf31fed3b..8e49e99144 100644 --- a/test/detect/index.js +++ b/test/detect/index.js @@ -8,7 +8,7 @@ const hljs = require('../../build'); hljs.debugMode(); // tests run in debug mode so errors are raised const path = require('path'); const utility = require('../utility'); -const { getThirdPartyLanguages } = require('../../tools/lib/external_language') +const { getThirdPartyPackages } = require('../../tools/lib/external_language') function testAutoDetection(language, {detectPath}) { const languagePath = detectPath || utility.buildPath('detect', language); @@ -35,7 +35,7 @@ function testAutoDetection(language, {detectPath}) { describe('hljs.highlightAuto()', () => { before( async function() { - let thirdPartyLanguages = await getThirdPartyLanguages(); + let thirdPartyPackages = await getThirdPartyPackages(); let languages = hljs.listLanguages(); describe(`hljs.highlightAuto()`, function() { @@ -45,11 +45,15 @@ describe('hljs.highlightAuto()', () => { }); }); + // assumes only one package provides the requested module name function detectTestDir(name) { - let language = thirdPartyLanguages.find((x) => x.name == name); - if (language) { - return language.detectTestPath; + for (let i = 0; i < thirdPartyPackages.length; ++i) { + const pkg = thirdPartyPackages[i]; + const idx = pkg.names.indexOf(name); + if (idx !== -1) + return pkg.detectTestPaths[idx] } + return null; // test not found } }); diff --git a/test/markup/index.js b/test/markup/index.js index 1f5133a065..bf3876437c 100644 --- a/test/markup/index.js +++ b/test/markup/index.js @@ -7,7 +7,7 @@ const hljs = require('../../build'); const path = require('path'); const utility = require('../utility'); -const { getThirdPartyLanguages } = require("../../tools/lib/external_language") +const { getThirdPartyPackages } = require("../../tools/lib/external_language") function testLanguage(language, {testDir}) { describe(language, function() { @@ -45,8 +45,12 @@ describe('highlight() markup', async () => { languages.forEach(testLanguage); } - let thirdPartyLanguages = await getThirdPartyLanguages(); - return thirdPartyLanguages.forEach((l) => testLanguage(l.name,{testDir: l.markupTestPath})); + let thirdPartyPackages = await getThirdPartyPackages(); + thirdPartyPackages.forEach( + (pkg) => pkg.names.forEach( + (name, idx) => testLanguage(name, {testDir: pkg.markupTestPaths[idx]}) + ) + ); }) it("adding dynamic tests...", async function() {} ); // this is required to work diff --git a/tools/lib/external_language.js b/tools/lib/external_language.js index ec124de7c7..f9bf49239c 100644 --- a/tools/lib/external_language.js +++ b/tools/lib/external_language.js @@ -13,28 +13,28 @@ class LanguagePackage { async trySrcLanguages() { let dir = path.join(this.dir,"src/languages/*"); let languages = await glob(dir); - if (languages[0]) { - this.file = path.join(process.cwd(), languages[0]); - this.name = path.basename(this.file,".js"); + if (languages.length > 0) { + this.files = languages.map(fn => path.join(process.cwd(), fn)); + this.names = this.files.map(fn => path.basename(fn,".js")); this._bundle = true; this._valid = true; return true; - } + } else { return false; } } - get markupTestPath() { + get markupTestPaths() { if (this.bundle) { - return `${this.dir}/test/markup/${this.name}`; + return this.names.map(name => `${this.dir}/test/markup/${name}`); } else { - return `${this.dir}/test/markup`; + return [`${this.dir}/test/markup`]; } } - get detectTestPath() { + get detectTestPaths() { if (this.bundle) { - return `${this.dir}/test/detect/${this.name}`; + return this.names.map(name => `${this.dir}/test/detect/${name}`); } else { - return `${this.dir}/test/detect`; + return [`${this.dir}/test/detect`]; } } @@ -50,8 +50,8 @@ class LanguagePackage { if (content.match(MODULE_DEFINER)) { this.loader = "definer"; } - this.file = file; - this.name = path.basename(file,".js"); + this.files = [file]; + this.names = [path.basename(file,".js")]; this._valid = true; return true; } @@ -74,17 +74,17 @@ class LanguagePackage { } } -async function getThirdPartyLanguages() { - let languages = []; - let otherLanguages = await glob("./extra/*"); - for (let packageDir of otherLanguages) { - let thirdPartyLanguage = new LanguagePackage(packageDir) - let valid = await thirdPartyLanguage.valid(); +async function getThirdPartyPackages() { + let packages = []; + let otherPackages = await glob("./extra/*"); + for (let packageDir of otherPackages) { + let thirdPartyPackage = new LanguagePackage(packageDir) + let valid = await thirdPartyPackage.valid(); if (valid) { - languages.push(thirdPartyLanguage) + packages.push(thirdPartyPackage) } } - return languages; + return packages; } -module.exports = { LanguagePackage, getThirdPartyLanguages} +module.exports = { LanguagePackage, getThirdPartyPackages} diff --git a/tools/lib/language.js b/tools/lib/language.js index 547128c6f7..1a45ac3b52 100644 --- a/tools/lib/language.js +++ b/tools/lib/language.js @@ -9,7 +9,7 @@ const REQUIRES_REGEX = /\/\*.*?Requires: (.*?)\n/s const CATEGORY_REGEX = /\/\*.*?Category: (.*?)\n/s const LANGUAGE_REGEX = /\/\*.*?Language: (.*?)\n/s const {rollupCode} = require("./bundling.js") -const { getThirdPartyLanguages } = require("./external_language") +const { getThirdPartyPackages } = require("./external_language") class Language { @@ -98,11 +98,13 @@ async function getLanguages() { fs.readdirSync("./src/languages/").forEach((file) => { languages.push(Language.fromFile(file)); }); - let extraLanguages = await getThirdPartyLanguages(); - for (let ext of extraLanguages) { - let l = Language.fromFile(ext.file); - l.loader = ext.loader; - languages.push(l); + let extraPackages = await getThirdPartyPackages(); + for (let ext of extraPackages) { + for (let file of ext.files) { + let l = Language.fromFile(file); + l.loader = ext.loader; + languages.push(l); + } } return languages; } From b5ad11b483e3f6e046506b1b545a512d115a53e9 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 18 Jan 2020 18:37:12 -0500 Subject: [PATCH 29/42] improve abstraction around group ids (:common) --- tools/lib/dependencies.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/tools/lib/dependencies.js b/tools/lib/dependencies.js index 25ec5d94ea..edc621adf7 100644 --- a/tools/lib/dependencies.js +++ b/tools/lib/dependencies.js @@ -30,10 +30,12 @@ const reorderDependencies = (languages) => { * @returns {array} filtered list */ -const languagesByGroup = (languages, groupName) => { - return languages.filter((el) => el.categories.includes(groupName)) +const languagesByGroup = (languages, groupIdentifier) => { + let groupName = groupIdentifier.replace(":",""); + return languages.filter((el) => el.categories.includes(groupName)); } -const isGroupName = (name) => name[0] == ":" +// :common is a group identifier, "common" is the group name +const isGroup = (id) => id[0] == ":" /** @@ -52,16 +54,16 @@ const filter = (allLanguages, includes) => { return reorderDependencies(allLanguages); let languages = []; - for (let lang of includes) { - if (isGroupName(lang)) { - let group = lang.substr(1) - languages = languages.concat(languagesByGroup(allLanguages,group)) + for (let item of includes) { + if (isGroup(item)) { + languages = languages.concat(languagesByGroup(allLanguages, item)) } else { - let found = allLanguages.find((el) => el.name == lang ) + let languageName = item; + let found = allLanguages.find((el) => el.name == languageName ) if (found) languages.push(found) else { - console.error(`[ERROR] Language '${lang}' could not be found.`) + console.error(`[ERROR] Language '${languageName}' could not be found.`) process.exit(1) } } From 2face2b6725aa511a55ddb4d66b8a08a31ae81e7 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 18 Jan 2020 18:47:18 -0500 Subject: [PATCH 30/42] explain what is happening more --- tools/lib/external_language.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tools/lib/external_language.js b/tools/lib/external_language.js index f9bf49239c..2115489cde 100644 --- a/tools/lib/external_language.js +++ b/tools/lib/external_language.js @@ -10,6 +10,7 @@ class LanguagePackage { this.dir = packageDir; } + // check for language modules in /src/languages async trySrcLanguages() { let dir = path.join(this.dir,"src/languages/*"); let languages = await glob(dir); @@ -38,6 +39,7 @@ class LanguagePackage { } } + // try to find a language module by probing package.json async tryPackageJSON() { let pack = path.join(this.dir,"package.json"); if (fs.existsSync(pack)) { @@ -47,6 +49,11 @@ class LanguagePackage { this.type = "npm"; let file = path.join(process.cwd(),this.dir, json.main); let content = await fsProm.readFile(file, { encoding: "utf8" }); + // many existing languages seem to export a `definer` function rather than + // simply export the language module directly. This checks for that and if + // so allows those existing modules to work "as is" by allowing the build + // system to know it should call `definer` to define the language not call + // the default export if (content.match(MODULE_DEFINER)) { this.loader = "definer"; } @@ -61,7 +68,13 @@ class LanguagePackage { get bundle() { return this._bundle; } async detect() { + // any bundle with files in ROOT/src/languages/ will be considered a potential + // multi language bundle and any files in that directy will be considered to be + // language modules await this.trySrcLanguages() || + // otherwise we fall back to looking for a package.json and whatever it's + // `main` entry point is that is the file we assume the language module is + // defined in await this.tryPackageJSON(); this._detected = true; } @@ -74,6 +87,8 @@ class LanguagePackage { } } +// third party language modules are dropped into the `highlight-js/extra` +// folder and will be auto-detected by the build system async function getThirdPartyPackages() { let packages = []; let otherPackages = await glob("./extra/*"); From 9f60d79b6972dc7bf1b0cb2f2f3a1e88a79fc8ee Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 18 Jan 2020 18:54:48 -0500 Subject: [PATCH 31/42] only glob *.js files for languages not any file in that folder --- tools/lib/language.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/lib/language.js b/tools/lib/language.js index 1a45ac3b52..f997ef4548 100644 --- a/tools/lib/language.js +++ b/tools/lib/language.js @@ -1,7 +1,7 @@ const fs = require("fs") const fsProm = require("fs").promises const Terser = require("terser"); -const glob = require("glob-promise") +const glob = require("glob") const path = require("path") const build_config = require("../build_config") @@ -62,7 +62,7 @@ class Language { } static fromFile(filename) { - if (filename.startsWith("/")) + if (filename.startsWith("/") || filename.startsWith(".")) { var file = filename } else { @@ -95,7 +95,7 @@ async function compileLanguage (language, options) { async function getLanguages() { let languages = []; - fs.readdirSync("./src/languages/").forEach((file) => { + glob.sync("./src/languages/*.js").forEach((file) => { languages.push(Language.fromFile(file)); }); let extraPackages = await getThirdPartyPackages(); From 5a7bdc97b6cbcbd79de432391eaef1a5ec6c56d1 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 18 Jan 2020 19:00:08 -0500 Subject: [PATCH 32/42] improve naming of build stat variables --- tools/build_browser.js | 10 +++++----- tools/build_cdn.js | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tools/build_browser.js b/tools/build_browser.js index 98848bc38b..6f2a972a33 100644 --- a/tools/build_browser.js +++ b/tools/build_browser.js @@ -47,10 +47,10 @@ async function buildBrowser(options) { log("Languages (min) :", languages.map((el) => el.minified.length).reduce((acc, curr) => acc + curr, 0), "bytes"); } - log("highlight.js :", size.regular ,"bytes"); + log("highlight.js :", size.full ,"bytes"); if (options.minify) { log("highlight.min.js :", size.minified ,"bytes"); - log("highlight.min.js.gz :", zlib.gzipSync(size.data).length ,"bytes"); + log("highlight.min.js.gz :", zlib.gzipSync(size.minifiedSrc).length ,"bytes"); } else { log("highlight.js.gz :", zlib.gzipSync(size.fullSrc).length ,"bytes"); } @@ -140,9 +140,9 @@ async function buildBrowserHighlightJS(languages, {minify}) { core: coreSize, core_min: core_min, minified: Buffer.byteLength(minifiedSrc, 'utf8'), - data: minifiedSrc, - fullSrc: fullSrc, - regular: Buffer.byteLength(fullSrc, 'utf8') }; + minifiedSrc, + fullSrc, + full: Buffer.byteLength(fullSrc, 'utf8') }; } // CDN build uses the exact same highlight.js distributable diff --git a/tools/build_cdn.js b/tools/build_cdn.js index ac97561e42..505d0f24ef 100644 --- a/tools/build_cdn.js +++ b/tools/build_cdn.js @@ -30,11 +30,11 @@ async function buildCDN(options) { log("All Lang :", languages.map((el) => el.minified.length).reduce((acc, curr) => acc + curr, 0), "bytes"); log("highlight.js :", - size.regular, "bytes"); + size.full, "bytes"); if (options.minify) { log("highlight.min.js :", size.minified ,"bytes"); - log("highlight.min.js.gz :", zlib.gzipSync(size.data).length ,"bytes"); + log("highlight.min.js.gz :", zlib.gzipSync(size.minifiedSrc).length ,"bytes"); } else { log("highlight.js.gz :", zlib.gzipSync(size.fullSrc).length ,"bytes"); } From cdf1cd6f8063f13f712925a15b09410355d10407 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 18 Jan 2020 19:40:21 -0500 Subject: [PATCH 33/42] clean up our 3rd party build process --- tools/build_cdn.js | 35 ++++++++++++++++++++--------------- tools/lib/language.js | 3 +++ 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/tools/build_cdn.js b/tools/build_cdn.js index 505d0f24ef..7efcb37f74 100644 --- a/tools/build_cdn.js +++ b/tools/build_cdn.js @@ -49,8 +49,16 @@ async function installLanguages(languages) { languages.map(async (language) => { await buildCDNLanguage(language); process.stdout.write("."); - } ) - ) + }) + ); + + await Promise.all( + languages.filter((l) => l.third_party) + .map(async (language) => { + await buildDistributable(language); + }) + ); + log(""); } @@ -66,24 +74,21 @@ function installStyles() { }) } +async function buildDistributable(language) { + const filename = `${language.name}.min.js`; + + let distDir = path.join(language.moduleDir,"dist") + log(`Building ${distDir}/${filename}.`) + await fs.mkdir(distDir, {recursive: true}); + fs.writeFile(path.join(language.moduleDir,"dist",filename), language.minified); + +} + async function buildCDNLanguage (language) { const filename = `${process.env.BUILD_DIR}/languages/${language.name}.min.js`; await language.compile({terser: config.terser}); fs.writeFile(filename, language.minified); - - // TODO: cleanup - const extra = path.resolve(__dirname,"../extra") - if (language.path.startsWith(extra)) { - var tmp = language.path.replace(extra,"") - var name = tmp.split("/")[1] - var libPath = path.join(extra, name) - - // console.log(libPath) - // add a distributable to the 3rd party directory - await fs.mkdir(path.join(libPath, "dist"), {recursive: true}); - fs.writeFile(path.join(libPath,"dist",path.basename(filename)), language.minified); - } } module.exports.build = buildCDN; diff --git a/tools/lib/language.js b/tools/lib/language.js index f997ef4548..5b237c101a 100644 --- a/tools/lib/language.js +++ b/tools/lib/language.js @@ -18,6 +18,7 @@ class Language { this.prettyName = name this.requires = [] this.categories = [] + this.third_party = false // compiled code this.module = "" @@ -103,6 +104,8 @@ async function getLanguages() { for (let file of ext.files) { let l = Language.fromFile(file); l.loader = ext.loader; + l.third_party = true; + l.moduleDir = ext.dir; languages.push(l); } } From 3517bb4e427e393d5e02c0497da126277dd1d184 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 18 Jan 2020 19:45:57 -0500 Subject: [PATCH 34/42] do not allow unknown builds --- tools/build.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/build.js b/tools/build.js index a374b64ebe..45ae780309 100644 --- a/tools/build.js +++ b/tools/build.js @@ -72,7 +72,7 @@ commander .option('-n, --no-minify', 'Disable minification') .option('-t, --target ', 'Build for target ' + '[all, browser, cdn, node]', - /^(browser|cdn|node|all)$/i, 'browser') + 'browser') .parse(process.argv); commander.target = commander.target.toLowerCase(); @@ -96,8 +96,10 @@ async function doBuild() { let buildDir = path.join(dir.buildRoot, target); await doTarget(target, buildDir); } - } else { + } else if (TARGETS.includes(commander.target)) { doTarget(commander.target, dir.buildRoot); + } else { + log(`ERROR: I do not know how to build '${commander.target}'`); } log ("Finished build."); } From f0ea263a2a487f3f23c10b54119381da845f69e2 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 18 Jan 2020 20:01:14 -0500 Subject: [PATCH 35/42] CDN embeds no languages vs all if no languages are passed in the list --- tools/build_cdn.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tools/build_cdn.js b/tools/build_cdn.js index 7efcb37f74..a5b1a761e7 100644 --- a/tools/build_cdn.js +++ b/tools/build_cdn.js @@ -20,7 +20,14 @@ async function buildCDN(options) { await installLanguages(languages); // filter languages for inclusion in the highlight.js bundle - const embedLanguages = filter(languages, options["languages"]) + let embedLanguages = filter(languages, options["languages"]) + + // it really makes no sense to embed ALL languages with the CDN build, it's + // more likely we want to embed NONE and have completely separate run-time + // loading of some sort + if (embedLanguages.length == languages.length) { + embedLanguages = [] + } var size = await buildBrowserHighlightJS(embedLanguages, {minify: options.minify}) @@ -51,6 +58,7 @@ async function installLanguages(languages) { process.stdout.write("."); }) ); + log(""); await Promise.all( languages.filter((l) => l.third_party) From de73a002f0e3b6375450c23976571fd72ca862f1 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Sat, 18 Jan 2020 20:38:22 -0500 Subject: [PATCH 36/42] add docs --- extra/.keep | 0 extra/3RD_PARTY_QUICK_START.md | 70 ++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 extra/.keep create mode 100644 extra/3RD_PARTY_QUICK_START.md diff --git a/extra/.keep b/extra/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/extra/3RD_PARTY_QUICK_START.md b/extra/3RD_PARTY_QUICK_START.md new file mode 100644 index 0000000000..5a6b73d5f6 --- /dev/null +++ b/extra/3RD_PARTY_QUICK_START.md @@ -0,0 +1,70 @@ +*This is a work in progress. PRs to improve these docs (or the process) would be welcome.* + +## Getting Started + +So you'd like to create and share you're own language for Highlight.js. That's awesome. + +Take a look at some of the real-life examples first: + +- https://github.com/highlightjs/highlightjs-cypher +- https://github.com/highlightjs/highlightjs-robots-txt + +Basically: + +- Checkout highlight-js from github... +- 3rd party languages are placed into the `extra` directory + +So if you had a `xzy` language you'd create an `extra/xyz` folder, and that would be your language module. All paths below are relative to that. + +- Put your language file in `src/languages/name.js`. +- Add detect tests in `test/detect/`. +- Add markup tests in `test/markup/`. +- Perhaps add a `package.json` for Node. +- Add a nice `README`. +- Don't forget to add a `LICENSE`. + + +## Testing + +To test (detect and markup tests), just build highlight.js and test it. Your tests should be automatically run with the suite: + +``` +node ./tools/build.js -t node +npm run test +``` + +If you can't get the auto-detect tests passing you should simply turn off auto-detection for your language in it's definition with `disableAutodetect: true`. Auto-detection is hard. + + +## Packaging + +Users will expect your package to include a minified CDN distributable in your `dist` folder. This should allow them to add the module to their website with only a single ` + ``` @@ -239,7 +239,7 @@ The table below shows the full list of supported languages (and corresponding cl | Zephir | zephir, zep | | Languages with the specified package name are defined in separate repositories -and not included in `highlight.pack.js`. +and not included in `highlight.min.js`. @@ -295,7 +295,7 @@ In worker.js: ```js onmessage = (event) => { - importScripts('/highlight.pack.js'); + importScripts('/highlight.min.js'); const result = self.hljs.highlightAuto(event.data); postMessage(result.value); }; diff --git a/test/browser/test_case.js b/test/browser/test_case.js index 50b55cbf6c..303c264802 100644 --- a/test/browser/test_case.js +++ b/test/browser/test_case.js @@ -36,7 +36,6 @@ function newTestCase(opts) { } const buildFakeDOM = async function(data) { - // Will match both `highlight.pack.js` and `highlight.min.js` const filePath = await findLibrary(); const hljsPath = await glob(filePath); const hljsFiles = await hljsPath.map(path => fs.readFileSync(path, 'utf8'));