Build project using esbuild

This is much more flexible than `monaco-plugin-helpers`. Because of
this, it’s possible to use Prettier as an external dependency, so users
can ignore it in their own build process of they choose not to support
formatting.

Instead of rewriting YAML language service imports in the build tool, I
decided to just import them from where they need to be imported in the
source code.

Closes #63
This commit is contained in:
Remco Haszing 2021-08-15 12:37:13 +02:00
parent c2e6af4198
commit 95fd123191
No known key found for this signature in database
GPG key ID: 40D9F5FE9155FD3C
8 changed files with 81 additions and 142 deletions

View file

@ -20,4 +20,5 @@ rules:
node/no-extraneous-import: off
node/no-unpublished-import: off
node/no-unsupported-features/es-syntax: off
node/no-unsupported-features/node-builtins: off

1
.gitignore vendored
View file

@ -1,6 +1,5 @@
dist/
node_modules/
/out/
/lib/
*.log
*.tgz

43
build.js Executable file
View file

@ -0,0 +1,43 @@
const { promises: fs } = require('fs');
const { join } = require('path');
const { build } = require('esbuild');
const { dependencies, peerDependencies } = require('./package.json');
fs.rm(join(__dirname, 'lib'), { force: true, recursive: true })
.then(() =>
build({
entryPoints: ['src/monaco.contribution.ts', 'src/yaml.worker.ts'],
bundle: true,
external: Object.keys({ ...dependencies, ...peerDependencies }),
logLevel: 'info',
outdir: 'lib/esm',
sourcemap: true,
format: 'esm',
target: ['es2019'],
plugins: [
{
name: 'alias',
setup({ onResolve }) {
onResolve({ filter: /^prettier$/ }, () => ({
path: 'prettier/standalone',
external: true,
}));
onResolve({ filter: /vscode-nls/ }, () => ({
path: require.resolve('./src/fillers/vscode-nls.ts'),
}));
onResolve({ filter: /\/umd\// }, (args) => ({
path: require.resolve(args.path.replace(/\/umd\//, '/esm/'), {
paths: [args.resolveDir],
}),
}));
},
},
],
}),
)
.catch((error) => {
console.error(error);
process.exit(1);
});

106
package-lock.json generated
View file

@ -6,6 +6,7 @@
"dev": true,
"packages": {
"": {
"name": "monaco-yaml",
"version": "3.0.1",
"dev": true,
"license": "MIT",
@ -15,19 +16,18 @@
"dependencies": {
"@types/json-schema": "^7.0.9",
"js-yaml": "^3.14.1",
"prettier": "2.0.5",
"yaml-ast-parser-custom-tags": "^0.0.43"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^4.29.0",
"@typescript-eslint/parser": "^4.29.0",
"esbuild": "^0.12.20",
"eslint": "^7.32.0",
"eslint-config-remcohaszing": "^3.5.0",
"husky": "^7.0.1",
"lint-staged": "^11.1.1",
"monaco-editor": "^0.26.1",
"monaco-plugin-helpers": "^1.0.3",
"prettier": "2.0.5",
"rimraf": "^3.0.2",
"typescript": "^4.3.5",
"yaml-language-server": "^0.11.1"
},
@ -3484,6 +3484,16 @@
"es6-promise": "^4.0.3"
}
},
"node_modules/esbuild": {
"version": "0.12.20",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.20.tgz",
"integrity": "sha512-u7+0qTo9Z64MD9PhooEngCmzyEYJ6ovFhPp8PLNh3UasR5Ihjv6HWVXqm8uHmasdQlpsAf0IsY4U0YVUfCpt4Q==",
"dev": true,
"hasInstallScript": true,
"bin": {
"esbuild": "bin/esbuild"
}
},
"node_modules/escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@ -6947,32 +6957,6 @@
"integrity": "sha512-mm45nUrBDk0DgZKgbD7+bhDOtcAFNGPJJRAdS6Su1kTGl6XEgC7U3xOmDUW/0RrLf+jlvCGaqLvD4p2VjwuwwQ==",
"dev": true
},
"node_modules/monaco-plugin-helpers": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/monaco-plugin-helpers/-/monaco-plugin-helpers-1.0.3.tgz",
"integrity": "sha512-6AYI3ONAy8ki74qG2JqtFrLdiJHQlgeO5l4Rwr0OMyIpGXhc94y5rZuFxOtgGkxgSrZfHSwOt/MulUNZ/mOQOw==",
"dev": true,
"dependencies": {
"typescript": "^2.7.2"
},
"bin": {
"mcopy": "bin/mcopy",
"mrmdir": "bin/mrmdir"
}
},
"node_modules/monaco-plugin-helpers/node_modules/typescript": {
"version": "2.9.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz",
"integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=4.2.0"
}
},
"node_modules/monaco-yaml": {
"resolved": "",
"link": true
@ -8468,7 +8452,6 @@
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz",
"integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==",
"dev": true,
"bin": {
"prettier": "bin-prettier.js"
},
@ -14403,6 +14386,12 @@
"es6-promise": "^4.0.3"
}
},
"esbuild": {
"version": "0.12.20",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.20.tgz",
"integrity": "sha512-u7+0qTo9Z64MD9PhooEngCmzyEYJ6ovFhPp8PLNh3UasR5Ihjv6HWVXqm8uHmasdQlpsAf0IsY4U0YVUfCpt4Q==",
"dev": true
},
"escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@ -17038,38 +17027,20 @@
"integrity": "sha512-mm45nUrBDk0DgZKgbD7+bhDOtcAFNGPJJRAdS6Su1kTGl6XEgC7U3xOmDUW/0RrLf+jlvCGaqLvD4p2VjwuwwQ==",
"dev": true
},
"monaco-plugin-helpers": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/monaco-plugin-helpers/-/monaco-plugin-helpers-1.0.3.tgz",
"integrity": "sha512-6AYI3ONAy8ki74qG2JqtFrLdiJHQlgeO5l4Rwr0OMyIpGXhc94y5rZuFxOtgGkxgSrZfHSwOt/MulUNZ/mOQOw==",
"dev": true,
"requires": {
"typescript": "^2.7.2"
},
"dependencies": {
"typescript": {
"version": "2.9.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz",
"integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==",
"dev": true
}
}
},
"monaco-yaml": {
"version": "file:",
"requires": {
"@types/json-schema": "^7.0.9",
"@typescript-eslint/eslint-plugin": "^4.29.0",
"@typescript-eslint/parser": "^4.29.0",
"esbuild": "^0.12.20",
"eslint": "^7.32.0",
"eslint-config-remcohaszing": "^3.5.0",
"husky": "^7.0.1",
"js-yaml": "^3.14.1",
"lint-staged": "^11.1.1",
"monaco-editor": "^0.26.1",
"monaco-plugin-helpers": "^1.0.3",
"prettier": "2.0.5",
"rimraf": "^3.0.2",
"typescript": "^4.3.5",
"webpack-example": "file:examples/webpack",
"yaml-ast-parser-custom-tags": "^0.0.43",
@ -19775,6 +19746,12 @@
"es6-promise": "^4.0.3"
}
},
"esbuild": {
"version": "0.12.20",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.20.tgz",
"integrity": "sha512-u7+0qTo9Z64MD9PhooEngCmzyEYJ6ovFhPp8PLNh3UasR5Ihjv6HWVXqm8uHmasdQlpsAf0IsY4U0YVUfCpt4Q==",
"dev": true
},
"escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@ -22410,23 +22387,6 @@
"integrity": "sha512-mm45nUrBDk0DgZKgbD7+bhDOtcAFNGPJJRAdS6Su1kTGl6XEgC7U3xOmDUW/0RrLf+jlvCGaqLvD4p2VjwuwwQ==",
"dev": true
},
"monaco-plugin-helpers": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/monaco-plugin-helpers/-/monaco-plugin-helpers-1.0.3.tgz",
"integrity": "sha512-6AYI3ONAy8ki74qG2JqtFrLdiJHQlgeO5l4Rwr0OMyIpGXhc94y5rZuFxOtgGkxgSrZfHSwOt/MulUNZ/mOQOw==",
"dev": true,
"requires": {
"typescript": "^2.7.2"
},
"dependencies": {
"typescript": {
"version": "2.9.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz",
"integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==",
"dev": true
}
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@ -23519,8 +23479,7 @@
"prettier": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz",
"integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==",
"dev": true
"integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg=="
},
"prettier-linter-helpers": {
"version": "1.0.0",
@ -25815,9 +25774,9 @@
"requires": {
"@fortawesome/fontawesome-free": "^5.15.4",
"css-loader": "^6.2.0",
"css-minimizer-webpack-plugin": "*",
"css-minimizer-webpack-plugin": "^3.0.2",
"html-webpack-plugin": "^5.3.2",
"mini-css-extract-plugin": "*",
"mini-css-extract-plugin": "^2.2.0",
"monaco-editor": "^0.26.1",
"monaco-yaml": "file:../..",
"webpack": "^5.48.0",
@ -27201,8 +27160,7 @@
"prettier": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz",
"integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==",
"dev": true
"integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg=="
},
"prettier-linter-helpers": {
"version": "1.0.0",
@ -29497,9 +29455,9 @@
"requires": {
"@fortawesome/fontawesome-free": "^5.15.4",
"css-loader": "^6.2.0",
"css-minimizer-webpack-plugin": "*",
"css-minimizer-webpack-plugin": "^3.0.2",
"html-webpack-plugin": "^5.3.2",
"mini-css-extract-plugin": "*",
"mini-css-extract-plugin": "^2.2.0",
"monaco-editor": "^0.26.1",
"monaco-yaml": "file:../..",
"webpack": "^5.48.0",

View file

@ -4,10 +4,7 @@
"description": "YAML plugin for the Monaco Editor",
"homepage": "https://monaco-yaml.js.org",
"scripts": {
"watch": "tsc -p ./src --watch",
"compile": "rimraf ./out && tsc",
"bundle": "rimraf ./lib && node ./scripts/bundle-esm",
"prepack": "npm run compile && npm run bundle",
"prepack": "node build.js",
"prepare": "husky install",
"lint": "eslint . && prettier --check ."
},
@ -36,6 +33,7 @@
"dependencies": {
"@types/json-schema": "^7.0.9",
"js-yaml": "^3.14.1",
"prettier": "2.0.5",
"yaml-ast-parser-custom-tags": "^0.0.43"
},
"peerDependencies": {
@ -44,14 +42,12 @@
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^4.29.0",
"@typescript-eslint/parser": "^4.29.0",
"esbuild": "^0.12.20",
"eslint": "^7.32.0",
"eslint-config-remcohaszing": "^3.5.0",
"husky": "^7.0.1",
"lint-staged": "^11.1.1",
"monaco-editor": "^0.26.1",
"monaco-plugin-helpers": "^1.0.3",
"prettier": "2.0.5",
"rimraf": "^3.0.2",
"typescript": "^4.3.5",
"yaml-language-server": "^0.11.1"
},

View file

@ -1,58 +0,0 @@
const { join } = require('path');
const helpers = require('monaco-plugin-helpers');
const REPO_ROOT = join(__dirname, '../');
helpers.packageESM({
repoRoot: REPO_ROOT,
esmSource: 'out/esm',
esmDestination: 'lib/esm',
entryPoints: ['monaco.contribution.js', 'yamlMode.js', 'yaml.worker.js'],
resolveAlias: {
'vscode-nls': join(REPO_ROOT, 'out/esm/fillers/vscode-nls.js'),
'vscode-json-languageservice/lib/umd/services/jsonValidation': join(
REPO_ROOT,
'node_modules/vscode-json-languageservice/lib/esm/services/jsonValidation.js',
),
'vscode-json-languageservice': join(
REPO_ROOT,
'node_modules/vscode-json-languageservice/lib/esm/jsonLanguageService.js',
),
'vscode-json-languageservice/lib/umd/services/jsonHover': join(
REPO_ROOT,
'node_modules/vscode-json-languageservice/lib/esm/services/jsonHover.js',
),
'vscode-json-languageservice/lib/umd/services/jsonDocumentSymbols': join(
REPO_ROOT,
'node_modules/vscode-json-languageservice/lib/esm/services/jsonDocumentSymbols.js',
),
'vscode-json-languageservice/lib/umd/services/jsonSchemaService': join(
REPO_ROOT,
'node_modules/vscode-json-languageservice/lib/esm/services/jsonSchemaService.js',
),
'vscode-json-languageservice/lib/umd/services/jsonCompletion': join(
REPO_ROOT,
'node_modules/vscode-json-languageservice/lib/esm/services/jsonCompletion.js',
),
'vscode-json-languageservice/lib/umd/services/jsonDefinition': join(
REPO_ROOT,
'node_modules/vscode-json-languageservice/lib/esm/services/jsonDefinition.js',
),
'yaml-language-server': join(
REPO_ROOT,
'node_modules/yaml-language-server/lib/esm/languageservice/yamlLanguageService.js',
),
prettier: join(REPO_ROOT, 'node_modules/prettier/standalone.js'),
'prettier/parser-yaml': join(REPO_ROOT, 'node_modules/prettier/parser-yaml.js'),
},
resolveSkip: ['monaco-editor', 'monaco-editor-core', 'js-yaml', 'yaml-ast-parser-custom-tags'],
destinationFolderSimplification: {
// eslint-disable-next-line camelcase
node_modules: '_deps',
'jsonc-parser/lib/esm': 'jsonc-parser',
'vscode-languageserver-types/lib/esm': 'vscode-languageserver-types',
'vscode-uri/lib/esm': 'vscode-uri',
},
});

View file

@ -10,7 +10,7 @@ import {
Uri,
} from 'monaco-editor/esm/vs/editor/editor.api';
import * as ls from 'vscode-languageserver-types';
import { CustomFormatterOptions } from 'yaml-language-server';
import { CustomFormatterOptions } from 'yaml-language-server/lib/esm/languageservice/yamlLanguageService';
import { LanguageServiceDefaultsImpl } from './monaco.contribution';
import { YAMLWorker } from './yamlWorker';

View file

@ -1,6 +1,6 @@
import { worker } from 'monaco-editor/esm/vs/editor/editor.api';
import * as ls from 'vscode-languageserver-types';
import * as yamlService from 'yaml-language-server';
import * as yamlService from 'yaml-language-server/lib/esm/languageservice/yamlLanguageService';
let defaultSchemaRequestService: (url: string) => PromiseLike<string>;