ace-mode-move
Version:
Syntax highlighting for Libra's Move language (https://developers.libra.org/docs/move-paper), for Ace ( https://ace.c9.io/ )
143 lines (128 loc) • 4.39 kB
JavaScript
/**
* Re-created ACE build process for older versions <=1.2.3
*/
const path = require('path');
const download = require('download');
const readFilePromise = require('fs-readfile-promise');
const solveDependencies = require('dependency-solver').solve;
const project = require('../project.js');
const stopBuild = require('./stopBuild.js');
const localAce = require('./localAceRepository.js');
const writeFile = require('./writeFile.js');
const parseRequires = require('./parseRequires.js');
const normalizeRequires = require('./normalizeRequires.js');
const ignoreCoreFileRequires = require('./ignoreCoreFileRequires.js');
const renderCode = require('./renderCode.js');
const getExportsSuffix = require('./getExportsSuffix.js');
const VERSIONS = [
// legacy versions
'v1.1.8', 'v1.1.9', 'v1.2.0', 'v1.2.1', 'v1.2.2', 'v1.2.3',
// overlap with buildWithAce.js as a consistency check.
'v1.2.4', 'v1.2.5', 'v1.2.6', 'v1.2.7', 'v1.2.8', 'v1.2.9', 'v1.3.0',
'v1.3.1', 'v1.3.2', 'v1.3.3'
];
async function checkoutFile(fileId, gitTag) {
localAce.createOrRefresh();
localAce.setVersion(gitTag, false);
return (await readFilePromise(project.dir(`build_cache/ace/lib/${fileId}.js`))).toString('utf8');
}
async function downloadFile(fileId, gitTag) {
let url = `https://github.com/ajaxorg/ace/raw/${gitTag}/lib/${fileId}.js`;
return (await download(url)).toString('utf8');
}
async function loadFile(fileId, gitTag) {
if ('ace/mode/move' == fileId) {
return (await readFilePromise(project.dir('lib/ace/mode/move.js'))).toString('utf8');
}
if ('ace/mode/move_highlight_rules' == fileId) {
return (await readFilePromise(project.dir('lib/ace/mode/move_highlight_rules.js'))).toString('utf8');
}
// return await downloadFile(fileId, gitTag);
return await checkoutFile(fileId, gitTag);
}
class DependencyCollector {
constructor(version) {
this.version = version;
this.deps = {};
this.depsIncludingCore = {};
}
async collect(fileId) {
if (this.deps[fileId]) {
return;
}
let code = await loadFile(fileId, this.version);
let requires;
try {
requires = parseRequires(code);
}
catch (err) {
stopBuild('DependencyCollector parseRequires()', err, fileId, code, 14);
}
requires = normalizeRequires(fileId, requires);
this.depsIncludingCore[fileId] = requires;
this.deps[fileId] = ignoreCoreFileRequires(requires, this.version);
for (let require of this.deps[fileId]) {
await this.collect(require);
}
}
async start(fileId) {
await this.collect(fileId);
}
getDependencies() {
return this.deps;
}
getDependenciesIncludingCore() {
return this.depsIncludingCore;
}
}
const varieties = [
{
destination: 'src',
defineNamespace: null,
requireName: 'require'
},
{
destination: 'src-noconflict',
defineNamespace: 'ace',
requireName: 'require'
},
{
destination: 'src-brace',
defineNamespace: 'ace',
requireName: 'acequire'
}
];
async function build(language, version) {
let collector = new DependencyCollector(version);
let mainFileId = `ace/mode/${language}`;
await collector.start(mainFileId);
let deps = collector.getDependencies();
let dependenciesIncludingCore = collector.getDependenciesIncludingCore();
let orderedFileIds = solveDependencies(deps);
for (let variety of varieties) {
let parts = [];
for (let fileId of orderedFileIds) {
let code = await loadFile(fileId, version);
if (! dependenciesIncludingCore[fileId]) {
stopBuild('buildLegacy() build() deficient dependenciesIncludingCore', language, version, variety, fileId, dependenciesIncludingCore, deps, orderedFileIds, 16);
}
code = renderCode(code, fileId, dependenciesIncludingCore[fileId], variety.defineNamespace, variety.requireName);
parts.push(code);
}
let output = parts.join('\n\n') + '\n';
output += getExportsSuffix(version, mainFileId, variety.defineNamespace);
let outputFilename = project.dir(`build/legacy/${version}/${variety.destination}/mode-${language}.js`);
await writeFile(outputFilename, output);
}
}
async function buildLegacy() {
for (version of VERSIONS) {
for (language of ['move', 'javascript']) {
await build(language, version);
}
}
}
module.exports = buildLegacy;
if (! module.parent) {
buildLegacy();
}