happy coding
This commit is contained in:
Коммит
2a664984b7
|
@ -0,0 +1 @@
|
||||||
|
node_modules
|
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
|
||||||
|
{
|
||||||
|
"name": "Attach",
|
||||||
|
"type": "node",
|
||||||
|
"request": "attach",
|
||||||
|
"port": 5858,
|
||||||
|
"address": "localhost",
|
||||||
|
"restart": false,
|
||||||
|
"sourceMaps": false,
|
||||||
|
"outDir": null,
|
||||||
|
"localRoot": "${workspaceRoot}",
|
||||||
|
"remoteRoot": null
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
// Place your settings in this file to overwrite default and user settings.
|
||||||
|
{
|
||||||
|
"typescript.tsdk": "node_modules/typescript/lib"
|
||||||
|
}
|
|
@ -0,0 +1,169 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
const generators = require('yeoman-generator');
|
||||||
|
const fs = require('fs');
|
||||||
|
const cp = require('child_process');
|
||||||
|
const yosay = require('yosay');
|
||||||
|
|
||||||
|
module.exports = generators.Base.extend({
|
||||||
|
|
||||||
|
constructor: function () {
|
||||||
|
generators.Base.apply(this, arguments);
|
||||||
|
|
||||||
|
this.argument('codeExec', { type: String, defaults: 'code', optional: true });
|
||||||
|
this.ctx = Object.create(null);
|
||||||
|
},
|
||||||
|
|
||||||
|
// --- init ------------
|
||||||
|
|
||||||
|
_checkConfigJson() {
|
||||||
|
// check/fetch jsconfig.json
|
||||||
|
this.ctx.jsConfigJson = this.fs.readJSON(this.destinationPath('jsconfig.json'))
|
||||||
|
this.ctx.tsConfigJson = this.fs.readJSON(this.destinationPath('tsconfig.json'))
|
||||||
|
},
|
||||||
|
|
||||||
|
_checkTypesDependencies() {
|
||||||
|
// check/fetch package.json
|
||||||
|
|
||||||
|
const pack = this.fs.readJSON(this.destinationPath('package.json'))
|
||||||
|
if (pack) {
|
||||||
|
const dependencies = new Set();
|
||||||
|
const typeDependencies = new Set();
|
||||||
|
|
||||||
|
const visit = (properties) => {
|
||||||
|
if (properties) {
|
||||||
|
for (let name in properties) {
|
||||||
|
if (name.indexOf('@types') === -1) {
|
||||||
|
dependencies.add(name);
|
||||||
|
} else {
|
||||||
|
typeDependencies.add(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
visit(pack.dependencies);
|
||||||
|
visit(pack.devDependencies);
|
||||||
|
visit(pack.optionalDependencies);
|
||||||
|
|
||||||
|
pack.optionalDependencies = pack.optionalDependencies || {};
|
||||||
|
|
||||||
|
for (const dep of dependencies) {
|
||||||
|
const typeDep = `@types/${dep}`;
|
||||||
|
if (!typeDependencies.has(typeDep)) {
|
||||||
|
pack.optionalDependencies[typeDep] = '*';
|
||||||
|
this.ctx.newPackageJson = pack;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_checkInstalledExtensions() {
|
||||||
|
// code-extensions
|
||||||
|
return new Promise(resolve => {
|
||||||
|
cp.exec(`${this.codeExec} --list-extensions`, (err, stdout, stderr) => {
|
||||||
|
if (!err) {
|
||||||
|
this.ctx.installedExtensions = new Set(stdout.trim().split(/[\r\n]/));
|
||||||
|
}
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
initializing() {
|
||||||
|
|
||||||
|
this.log(yosay('Welcome to the JavaScript project generator!'));
|
||||||
|
|
||||||
|
return Promise.all([
|
||||||
|
this._checkConfigJson(),
|
||||||
|
this._checkTypesDependencies(),
|
||||||
|
this._checkInstalledExtensions(),
|
||||||
|
]);
|
||||||
|
},
|
||||||
|
|
||||||
|
prompting() {
|
||||||
|
const prompts = [
|
||||||
|
{
|
||||||
|
when: () => !this.ctx.jsConfigJson && !this.ctx.tsConfigJson,
|
||||||
|
type: 'confirm',
|
||||||
|
name: 'createJsConfig',
|
||||||
|
message: 'Create \'jsconfig.json\' file?',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
when: () => this.ctx.tsConfigJson && (!this.ctx.tsConfigJson.compilerOptions || !this.ctx.tsConfigJson.compilerOptions.allowJs),
|
||||||
|
type: 'confirm',
|
||||||
|
name: 'setAllowJs',
|
||||||
|
message: 'Should I adjust \'tsconfig.json\' to allow for JavaScript files (strongly recommended)?',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
when: answers => !answers.setAllowJs && this.ctx.tsConfigJson && (!this.ctx.tsConfigJson.compilerOptions || !this.ctx.tsConfigJson.compilerOptions.allowJs),
|
||||||
|
type: 'confirm',
|
||||||
|
name: 'setAllowJs',
|
||||||
|
message: 'Sure about that? The presence of a \'tsconfig.json\'-file shadows a \'jsconfig.json\'-file and without the \'allowJs\'-flag there will be no support for JavaScript. Should I add the \'allowJs\'-flag?',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
when: () => this.ctx.newPackageJson,
|
||||||
|
type: 'confirm',
|
||||||
|
name: 'acquireTypes',
|
||||||
|
message: 'Install type-definition files (.d.ts) and adjust \'package.json\'?'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
when: () => this.ctx.installedExtensions && !this.ctx.installedExtensions.has('eg2.vscode-npm-script'),
|
||||||
|
type: 'confirm',
|
||||||
|
name: 'installNpmScriptRunner',
|
||||||
|
message: 'Install \'npm script runner\'-extension?'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
when: () => this.ctx.installedExtensions && !this.ctx.installedExtensions.has('dbaeumer.vscode-eslint'),
|
||||||
|
type: 'confirm',
|
||||||
|
name: 'installEsLint',
|
||||||
|
message: 'Install \'eslint\'-extension?'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
return this.prompt(prompts).then(answers => {
|
||||||
|
this.answers = answers;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
writing() {
|
||||||
|
if (this.answers.createJsConfig) {
|
||||||
|
// write jsconfig
|
||||||
|
this.fs.copy(this.templatePath('jsconfig.json'), this.destinationPath('jsconfig.json'));
|
||||||
|
|
||||||
|
} else if (this.answers.setAllowJs) {
|
||||||
|
// update tsconfig
|
||||||
|
if (!this.ctx.tsConfigJson.compilerOptions) {
|
||||||
|
this.ctx.tsConfigJson.compilerOptions = { allowJs: true };
|
||||||
|
} else {
|
||||||
|
this.ctx.tsConfigJson.compilerOptions.allowJs = true;
|
||||||
|
}
|
||||||
|
fs.writeFileSync(this.destinationPath('tsconfig.json'), JSON.stringify(this.ctx.tsConfigJson, undefined, 4));
|
||||||
|
}
|
||||||
|
|
||||||
|
// update package.json
|
||||||
|
if (this.answers.acquireTypes) {
|
||||||
|
fs.writeFileSync(this.destinationPath('package.json'), JSON.stringify(this.ctx.newPackageJson, undefined, 4));
|
||||||
|
// this.fs.writeJSON(this.destinationPath('package.json'), this.ctx.newPackageJson, undefined, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add .eslintrc file
|
||||||
|
if (this.answers.installEsLint) {
|
||||||
|
this.fs.copy(this.templatePath('eslintrc.json'), this.destinationPath('.eslintrc'));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
install() {
|
||||||
|
|
||||||
|
if (this.answers.acquireTypes) {
|
||||||
|
this.installDependencies({ bower: false });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.answers.installNpmScriptRunner) {
|
||||||
|
this.spawnCommand(this.codeExec, ['--install-extension', 'eg2.vscode-npm-script']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.answers.installEsLint) {
|
||||||
|
this.spawnCommand(this.codeExec, ['--install-extension', 'dbaeumer.vscode-eslint']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"env": {
|
||||||
|
"browser": true,
|
||||||
|
"commonjs": true,
|
||||||
|
"es6": true,
|
||||||
|
"node": true
|
||||||
|
},
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaFeatures": {
|
||||||
|
"jsx": true
|
||||||
|
},
|
||||||
|
"sourceType": "module"
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
"no-const-assign": "warn",
|
||||||
|
"no-this-before-super": "warn",
|
||||||
|
"no-undef": "warn",
|
||||||
|
"no-unreachable": "warn",
|
||||||
|
"no-unused-vars": "warn",
|
||||||
|
"constructor-super": "warn",
|
||||||
|
"valid-typeof": "warn"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "es6",
|
||||||
|
"module": "commonjs",
|
||||||
|
"allowSyntheticDefaultImports": true
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
{
|
||||||
|
"name": "generator-code-javascript",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"description": "Generator for JavaScript projects",
|
||||||
|
"files": [
|
||||||
|
"generators/app"
|
||||||
|
],
|
||||||
|
"keywords": [
|
||||||
|
"yeoman-generator",
|
||||||
|
"javascript",
|
||||||
|
"vscode"
|
||||||
|
],
|
||||||
|
"dependencies": {
|
||||||
|
"yeoman-generator": "^0.24.1",
|
||||||
|
"yosay": "^1.2.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"typescript": "^2.1.0-dev.20160912"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@types/yeoman-generator": "*",
|
||||||
|
"@types/yosay": "*",
|
||||||
|
"@types/typescript": "*"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "es6",
|
||||||
|
"module": "commonjs",
|
||||||
|
"allowJs": true,
|
||||||
|
"lib": [
|
||||||
|
"es2015",
|
||||||
|
"es2015.collection"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
Загрузка…
Ссылка в новой задаче