diff --git a/build/prepare-website-branch.js b/build/prepare-website-branch.js new file mode 100644 index 00000000..2f550900 --- /dev/null +++ b/build/prepare-website-branch.js @@ -0,0 +1,42 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +/** @typedef {import('../build/utils').IFile} IFile */ + +const path = require('path'); +const cp = require('child_process'); +const { REPO_ROOT } = require('./utils'); + +cp.execSync('git init', { + cwd: path.join(REPO_ROOT, '../monaco-editor-website') +}); + +const remoteUrl = cp.execSync('git remote get-url origin'); +const committerUserName = cp.execSync("git log --format='%an' -1"); +const committerEmail = cp.execSync("git log --format='%ae' -1"); + +cp.execSync(`git config user.name ${committerUserName}`, { + cwd: path.join(REPO_ROOT, '../monaco-editor-website') +}); +cp.execSync(`git config user.email ${committerEmail}`, { + cwd: path.join(REPO_ROOT, '../monaco-editor-website') +}); + +cp.execSync(`git remote add origin ${remoteUrl}`, { + cwd: path.join(REPO_ROOT, '../monaco-editor-website') +}); +cp.execSync('git checkout -b gh-pages', { + cwd: path.join(REPO_ROOT, '../monaco-editor-website') +}); +cp.execSync('git add .', { + cwd: path.join(REPO_ROOT, '../monaco-editor-website') +}); +cp.execSync('git commit -m "Publish website"', { + cwd: path.join(REPO_ROOT, '../monaco-editor-website') +}); + +console.log('RUN monaco-editor-website>git push origin gh-pages --force'); diff --git a/build/release.js b/build/release.js index a5a48bb1..7548f358 100644 --- a/build/release.js +++ b/build/release.js @@ -11,17 +11,16 @@ * @typedef { { name:string; contrib:string; modulePrefix:string; rootPath:string; paths:IPluginPaths } } IPlugin * @typedef { { METADATA: {CORE:{paths:ICorePaths}; PLUGINS:IPlugin[];} } } IMetadata */ +/** @typedef {import('../build/utils').IFile} IFile */ const glob = require('glob'); const path = require('path'); const fs = require('fs'); -const { REPO_ROOT, removeDir, ensureDir } = require('../build/utils'); +const { REPO_ROOT, removeDir, ensureDir, readFiles, writeFiles } = require('../build/utils'); const ts = require('typescript'); /**@type { IMetadata } */ const metadata = require('../metadata.js'); -/** @typedef {{ path:string; contents:Buffer;}} IFile */ - removeDir(`release`); // dev folder @@ -466,42 +465,3 @@ function releaseThirdPartyNotices() { writeFiles([tpn], `release`); } - -/** - * @param {string} pattern - * @param {{ base:string; ignore?:string[] }} options - * @returns {IFile[]} - */ -function readFiles(pattern, options) { - let files = glob.sync(pattern, { cwd: REPO_ROOT, ignore: options.ignore }); - // remove dirs - files = files.filter((file) => { - const fullPath = path.join(REPO_ROOT, file); - const stats = fs.statSync(fullPath); - return stats.isFile(); - }); - - const base = options.base; - const baseLength = base === '' ? 0 : base.endsWith('/') ? base.length : base.length + 1; - return files.map((file) => { - const fullPath = path.join(REPO_ROOT, file); - const contents = fs.readFileSync(fullPath); - const relativePath = file.substring(baseLength); - return { - path: relativePath, - contents - }; - }); -} - -/** - * @param {IFile[]} files - * @param {string} dest - */ -function writeFiles(files, dest) { - for (const file of files) { - const fullPath = path.join(REPO_ROOT, dest, file.path); - ensureDir(path.dirname(fullPath)); - fs.writeFileSync(fullPath, file.contents); - } -} diff --git a/build/utils.js b/build/utils.js index 8d998c2f..052b65eb 100644 --- a/build/utils.js +++ b/build/utils.js @@ -11,6 +11,7 @@ const cp = require('child_process'); const esbuild = require('esbuild'); /** @type {any} */ const alias = require('esbuild-plugin-alias'); +const glob = require('glob'); const REPO_ROOT = path.join(__dirname, '../'); exports.REPO_ROOT = REPO_ROOT; @@ -340,3 +341,46 @@ const bundledFileHeader = (() => { return BUNDLED_FILE_HEADER; })(); exports.bundledFileHeader = bundledFileHeader; + +/** @typedef {{ path:string; contents:Buffer;}} IFile */ + +/** + * @param {string} pattern + * @param {{ base:string; ignore?:string[]; dot?:boolean; }} options + * @returns {IFile[]} + */ +function readFiles(pattern, options) { + let files = glob.sync(pattern, { cwd: REPO_ROOT, ignore: options.ignore, dot: options.dot }); + // remove dirs + files = files.filter((file) => { + const fullPath = path.join(REPO_ROOT, file); + const stats = fs.statSync(fullPath); + return stats.isFile(); + }); + + const base = options.base; + const baseLength = base === '' ? 0 : base.endsWith('/') ? base.length : base.length + 1; + return files.map((file) => { + const fullPath = path.join(REPO_ROOT, file); + const contents = fs.readFileSync(fullPath); + const relativePath = file.substring(baseLength); + return { + path: relativePath, + contents + }; + }); +} +exports.readFiles = readFiles; + +/** + * @param {IFile[]} files + * @param {string} dest + */ +function writeFiles(files, dest) { + for (const file of files) { + const fullPath = path.join(REPO_ROOT, dest, file.path); + ensureDir(path.dirname(fullPath)); + fs.writeFileSync(fullPath, file.contents); + } +} +exports.writeFiles = writeFiles; diff --git a/build/website.js b/build/website.js new file mode 100644 index 00000000..ee959ed1 --- /dev/null +++ b/build/website.js @@ -0,0 +1,126 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +/** @typedef {import('../build/utils').IFile} IFile */ + +const path = require('path'); +const fs = require('fs'); +const cp = require('child_process'); +const CleanCSS = require('clean-css'); +const { REPO_ROOT, removeDir, readFiles, writeFiles } = require('./utils'); + +/** @type {string} */ +const MONACO_EDITOR_VERSION = (() => { + const packageJsonPath = path.join(REPO_ROOT, 'package.json'); + const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString()); + const version = packageJson.version; + if (!/\d+\.\d+\.\d+/.test(version)) { + console.log('unrecognized package.json version: ' + version); + process.exit(1); + } + return version; +})(); + +removeDir(`../monaco-editor-website`); + +generateWebsite(); + +/** + * @param {string} dataPath + * @param {string} contents + * @param {RegExp} regex + * @param {(match:string, fileContents:Buffer)=>string} callback + * @returns {string} + */ +function replaceWithRelativeResource(dataPath, contents, regex, callback) { + return contents.replace(regex, function (_, m0) { + const filePath = path.join(REPO_ROOT, 'monaco-editor/website', path.dirname(dataPath), m0); + return callback(m0, fs.readFileSync(filePath)); + }); +} + +function generateWebsite() { + const files = readFiles('monaco-editor/website/**/*', { + base: 'monaco-editor/website', + dot: true + }); + + for (const file of files) { + if (!file.contents || !/\.(html)$/.test(file.path) || /new-samples/.test(file.path)) { + continue; + } + + let contents = file.contents.toString(); + contents = contents.replace(/\.\.\/\.\.\/release\/dev/g, 'node_modules/monaco-editor/min'); + // contents = contents.replace(/\.\.\/\.\.\/release\/dev/g, '../monaco-editor/release/dev'); + contents = contents.replace(/{{version}}/g, MONACO_EDITOR_VERSION); + contents = contents.replace(/{{year}}/g, String(new Date().getFullYear())); + + // Preload xhr contents + contents = replaceWithRelativeResource( + file.path, + contents, + /
' +
+					fileContents
+						.toString('utf8')
+						.replace(/&/g, '&')
+						.replace(//g, '>') +
+					'
' + ); + } + ); + + // Inline fork.png + contents = replaceWithRelativeResource( + file.path, + contents, + /src="(\.\/fork.png)"/g, + function (m0, fileContents) { + return 'src="data:image/png;base64,' + fileContents.toString('base64') + '"'; + } + ); + + // let allCSS = ''; + contents = replaceWithRelativeResource( + file.path, + contents, + /${minifiedCSS}`; + } + ); + + // Inline javascript + contents = replaceWithRelativeResource( + file.path, + contents, + /'; + } + ); + + file.contents = Buffer.from(contents.split(/\r\n|\r|\n/).join('\n')); + } + + writeFiles(files, `../monaco-editor-website`); + + // temporarily create package.json so that npm install doesn't bark + fs.writeFileSync(path.join(REPO_ROOT, '../monaco-editor-website/package.json'), '{}'); + fs.writeFileSync(path.join(REPO_ROOT, '../monaco-editor-website/.nojekyll'), ''); + cp.execSync('npm install monaco-editor', { + cwd: path.join(REPO_ROOT, '../monaco-editor-website') + }); + fs.unlinkSync(path.join(REPO_ROOT, '../monaco-editor-website/package.json')); +} diff --git a/gulpfile.js b/gulpfile.js index 46b5bf00..b59b7b03 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -7,247 +7,3 @@ const cp = require('child_process'); const CleanCSS = require('clean-css'); const uncss = require('uncss'); const File = require('vinyl'); - -/** @type {string} */ -const MONACO_EDITOR_VERSION = (function () { - const packageJsonPath = path.join(__dirname, 'package.json'); - const packageJson = JSON.parse(fs.readFileSync(packageJsonPath).toString()); - const version = packageJson.version; - if (!/\d+\.\d+\.\d+/.test(version)) { - console.log('unrecognized package.json version: ' + version); - process.exit(0); - } - return version; -})(); - -async function _execute(task) { - // Always invoke as if it were a callback task - return new Promise((resolve, reject) => { - if (task.length === 1) { - // this is a calback task - task((err) => { - if (err) { - return reject(err); - } - resolve(); - }); - return; - } - const taskResult = task(); - if (typeof taskResult === 'undefined') { - // this is a sync task - resolve(); - return; - } - if (typeof taskResult.then === 'function') { - // this is a promise returning task - taskResult.then(resolve, reject); - return; - } - // this is a stream returning task - taskResult.on('end', (_) => resolve()); - taskResult.on('error', (err) => reject(err)); - }); -} - -function taskSeries(...tasks) { - return async () => { - for (let i = 0; i < tasks.length; i++) { - await _execute(tasks[i]); - } - }; -} - -// --- website -const cleanWebsiteTask = function (cb) { - rimraf('../monaco-editor-website', { maxBusyTries: 1 }, cb); -}; -const buildWebsiteTask = taskSeries(cleanWebsiteTask, function () { - /** - * @param {string} dataPath - * @param {string} contents - * @param {RegExp} regex - * @param {(match:string, fileContents:Buffer)=>string} callback - * @returns {string} - */ - function replaceWithRelativeResource(dataPath, contents, regex, callback) { - return contents.replace(regex, function (_, m0) { - var filePath = path.join(path.dirname(dataPath), m0); - return callback(m0, fs.readFileSync(filePath)); - }); - } - - var waiting = 0; - var done = false; - - return es - .merge( - gulp - .src(['monaco-editor/website/**/*'], { dot: true }) - .pipe( - es.through( - /** - * @param {File} data - */ - function (data) { - if (!data.contents || !/\.(html)$/.test(data.path) || /new-samples/.test(data.path)) { - return this.emit('data', data); - } - - let contents = data.contents.toString(); - contents = contents.replace(/\.\.\/release\/dev/g, 'node_modules/monaco-editor/min'); - contents = contents.replace(/{{version}}/g, MONACO_EDITOR_VERSION); - contents = contents.replace(/{{year}}/g, new Date().getFullYear()); - - // Preload xhr contents - contents = replaceWithRelativeResource( - data.path, - contents, - /
' +
-										fileContents
-											.toString('utf8')
-											.replace(/&/g, '&')
-											.replace(//g, '>') +
-										'
' - ); - } - ); - - // Inline fork.png - contents = replaceWithRelativeResource( - data.path, - contents, - /src="(\.\/fork.png)"/g, - function (m0, fileContents) { - return 'src="data:image/png;base64,' + fileContents.toString('base64') + '"'; - } - ); - - let allCSS = ''; - let tmpcontents = replaceWithRelativeResource( - data.path, - contents, - /' + output + ''; - } - return ''; - } - ); - } - - // Inline javascript - contents = replaceWithRelativeResource( - data.path, - contents, - /'; - } - ); - - data.contents = Buffer.from(contents.split(/\r\n|\r|\n/).join('\n')); - this.emit('data', data); - - if (done && waiting === 0) { - this.emit('end'); - } - }.bind(this) - ); - }, - function () { - done = true; - if (waiting === 0) { - this.emit('end'); - } - } - ) - ) - .pipe(gulp.dest('../monaco-editor-website')) - ) - - .pipe( - es.through( - /** - * @param {File} data - */ - function (data) { - this.emit('data', data); - }, - function () { - // temporarily create package.json so that npm install doesn't bark - fs.writeFileSync('../monaco-editor-website/package.json', '{}'); - fs.writeFileSync('../monaco-editor-website/.nojekyll', ''); - cp.execSync('npm install monaco-editor', { - cwd: path.join(__dirname, '../monaco-editor-website') - }); - fs.unlinkSync('../monaco-editor-website/package.json'); - - this.emit('end'); - } - ) - ); -}); -gulp.task('build-website', buildWebsiteTask); - -gulp.task('prepare-website-branch', async function () { - cp.execSync('git init', { - cwd: path.join(__dirname, '../monaco-editor-website') - }); - - let remoteUrl = cp.execSync('git remote get-url origin'); - let committerUserName = cp.execSync("git log --format='%an' -1"); - let committerEmail = cp.execSync("git log --format='%ae' -1"); - - cp.execSync(`git config user.name ${committerUserName}`, { - cwd: path.join(__dirname, '../monaco-editor-website') - }); - cp.execSync(`git config user.email ${committerEmail}`, { - cwd: path.join(__dirname, '../monaco-editor-website') - }); - - cp.execSync(`git remote add origin ${remoteUrl}`, { - cwd: path.join(__dirname, '../monaco-editor-website') - }); - cp.execSync('git checkout -b gh-pages', { - cwd: path.join(__dirname, '../monaco-editor-website') - }); - cp.execSync('git add .', { - cwd: path.join(__dirname, '../monaco-editor-website') - }); - cp.execSync('git commit -m "Publish website"', { - cwd: path.join(__dirname, '../monaco-editor-website') - }); - console.log('RUN monaco-editor-website>git push origin gh-pages --force'); -}); diff --git a/monaco-editor/website/index.html b/monaco-editor/website/index.html index 48aab720..b1872eb0 100644 --- a/monaco-editor/website/index.html +++ b/monaco-editor/website/index.html @@ -14,7 +14,7 @@ @@ -219,11 +219,11 @@ > - - - + + + diff --git a/monaco-editor/website/monarch.html b/monaco-editor/website/monarch.html index e9c68829..f0ac96b7 100644 --- a/monaco-editor/website/monarch.html +++ b/monaco-editor/website/monarch.html @@ -14,7 +14,7 @@ @@ -5067,11 +5067,11 @@ return { > - - - + + + diff --git a/monaco-editor/website/playground.html b/monaco-editor/website/playground.html index 1aae8dbe..bb92f431 100644 --- a/monaco-editor/website/playground.html +++ b/monaco-editor/website/playground.html @@ -15,7 +15,7 @@ @@ -96,11 +96,11 @@ > - - - + + + diff --git a/monaco-editor/website/playground/playground-runner.html b/monaco-editor/website/playground/playground-runner.html index b8db012e..2ef82502 100644 --- a/monaco-editor/website/playground/playground-runner.html +++ b/monaco-editor/website/playground/playground-runner.html @@ -6,7 +6,7 @@