generator-theia
Version:
Theia Generator
199 lines (189 loc) • 7.07 kB
text/typescript
/*
* Copyright (C) 2017 TypeFox and others.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
*/
import Base = require('yeoman-generator');
import { AbstractGenerator, sortByKey } from '../common';
import { NodePackage } from "./generator-model";
export class AppPackageGenerator extends AbstractGenerator {
generate(fs: Base.MemFsEditor): void {
fs.writeJSON('package.json', this.compilePackage());
if (!fs.exists('webpack.config.js')) {
fs.write('webpack.config.js', this.compileWebpackConfig());
}
}
protected compilePackage(): NodePackage {
const dependendencies = this.isWeb() ? {} : {}
const scripts = this.isWeb() ? {
"start": "concurrently -n backend,frontend -c blue,green \"yarn run start:backend\" \"yarn run start:frontend\"",
"start:backend": "yarn run build:backend && node ./src-gen/backend/main.js --port=3000| bunyan",
"start:backend:debug": "yarn run build:backend && node ./src-gen/backend/main.js --port=3000 --loglevel=debug | bunyan",
"start:frontend": "webpack-dev-server --open",
} : {
"start": "yarn run build:backend && electron ./src-gen/frontend/electron-main.js --hostname=localhost | bunyan",
"start:debug": "yarn run build:backend && electron ./src-gen/frontend/electron-main.js --hostname=localhost --loglevel=debug | bunyan"
}
const devDependencies = this.isWeb() ? {
"webpack-dev-server": "^2.5.0"
} : {
"electron": "^1.6.11",
"electron-rebuild": "^1.5.11"
}
return {
...this.model.pck,
"dependencies": sortByKey({
...dependendencies,
...this.model.pck.dependencies
}),
"scripts": sortByKey({
"clean": "rimraf lib",
"cold:start": "yarn run clean && yarn run start",
"build": "yarn run build:frontend && yarn run build:backend",
"build:frontend": "webpack",
"build:backend": `shx cp ${this.srcGen()}/frontend/index.html lib`,
"watch": "yarn run build:frontend && webpack --watch",
...scripts,
...this.model.pck.scripts
}),
"devDependencies": sortByKey({
"rimraf": "^2.6.1",
"concurrently": "^3.5.0",
"bunyan": "^1.8.10",
"webpack": "^2.2.1",
"copy-webpack-plugin": "^4.0.1",
"circular-dependency-plugin": "^2.0.0",
"css-loader": "^0.28.1",
"file-loader": "^0.11.1",
"source-map-loader": "^0.2.1",
"shx": "^0.2.2",
"url-loader": "^0.5.8",
"font-awesome-webpack": "0.0.5-beta.2",
"less": "^2.7.2",
...devDependencies,
...this.model.pck.devDependencies
})
}
}
protected compileWebpackConfig(): string {
return `${this.compileCopyright()}
// @ts-check
const path = require('path');
const webpack = require('webpack');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const CircularDependencyPlugin = require('circular-dependency-plugin');
const outputPath = path.resolve(__dirname, 'lib');
const monacoEditorPath = '${this.node_modulesPath()}/monaco-editor-core/min/vs';
const monacoLanguagesPath = '${this.node_modulesPath()}/monaco-languages/release';
const monacoCssLanguagePath = '${this.node_modulesPath()}/monaco-css/release/min';
const monacoTsLanguagePath = '${this.node_modulesPath()}/monaco-typescript/release';
const monacoJsonLanguagePath = '${this.node_modulesPath()}/monaco-json/release/min';
const monacoHtmlLanguagePath = '${this.node_modulesPath()}/monaco-html/release/min';${this.ifWeb(`
const requirePath = '${this.node_modulesPath()}/requirejs/require.js';
const port = require('yargs').argv.port || 3000;`)}
module.exports = {
entry: path.resolve(__dirname, 'src-gen/frontend/index.js'),
output: {
filename: 'bundle.js',
path: outputPath
},
target: '${this.model.target}',
node: {${this.ifElectron(`
__dirname: false,
__filename: false`, `
fs: 'empty',
child_process: 'empty',
net: 'empty',
crypto: 'empty'`)}
},
module: {
rules: [
{
test: /\\.css$/,
loader: 'style-loader!css-loader'
},
{
test: /\\.(ttf|eot|svg)(\\?v=\\d+\\.\\d+\\.\\d+)?$/,
loader: 'url-loader?limit=10000&mimetype=image/svg+xml'
},
{
test: /\\.js$/,
enforce: 'pre',
loader: 'source-map-loader'
},
{
test: /\\.woff(2)?(\\?v=[0-9]\\.[0-9]\\.[0-9])?$/,
loader: "url-loader?limit=10000&mimetype=application/font-woff"
}
],
noParse: /vscode-languageserver-types|vscode-uri/
},
resolve: {
extensions: ['.js'],
alias: {
'vs': path.resolve(outputPath, monacoEditorPath)
}
},
devtool: 'source-map',
plugins: [
new webpack.HotModuleReplacementPlugin(),
new CopyWebpackPlugin([${this.ifWeb(`
{
from: requirePath,
to: '.'
},`)}
{
from: monacoEditorPath,
to: 'vs'
},
{
from: monacoLanguagesPath,
to: 'vs/basic-languages'
},
{
from: monacoCssLanguagePath,
to: 'vs/language/css'
},
{
from: monacoTsLanguagePath,
to: 'vs/language/typescript'
},
{
from: monacoJsonLanguagePath,
to: 'vs/language/json'
},
{
from: monacoHtmlLanguagePath,
to: 'vs/language/html'
}
]),
new CircularDependencyPlugin({
exclude: /(node_modules|examples)\\/./,
failOnError: false // https://github.com/nodejs/readable-stream/issues/280#issuecomment-297076462
})
],
stats: {
warnings: true
}${this.ifWeb(`,
devServer: {
inline: true,
hot: true,
proxy: {
'/services/*': {
target: 'ws://localhost:' + port,
ws: true
},
'*': 'http://localhost:' + port,
},
historyApiFallback: true,
stats: {
colors: true,
warnings: false
},
host: process.env.HOST,
port: process.env.PORT
}`)}
};`
}
}