innetjs 2.1.6 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/innet CHANGED
@@ -1,65 +1,70 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
- var path$1 = require('path');
5
- var fs = require('fs-extra');
6
- var http = require('http');
7
- var address = require('address');
8
- var https = require('https');
9
- var util = require('util');
10
- var axios = require('axios');
4
+ var commander = require('commander');
11
5
  var logger = require('@cantinc/logger');
12
- var chalk = require('chalk');
13
- var rollup = require('rollup');
14
6
  var commonjs = require('@rollup/plugin-commonjs');
7
+ var eslint = require('@rollup/plugin-eslint');
8
+ var image = require('@rollup/plugin-image');
9
+ var json = require('@rollup/plugin-json');
15
10
  var pluginNodeResolve = require('@rollup/plugin-node-resolve');
16
- var rollupPluginTerser = require('rollup-plugin-terser');
17
- var typescript = require('rollup-plugin-typescript2');
18
- var styles = require('rollup-plugin-styles');
11
+ var address = require('address');
19
12
  var autoprefixer = require('autoprefixer');
13
+ var axios = require('axios');
14
+ var chalk = require('chalk');
15
+ var selector = require('cli-select');
20
16
  var express = require('express');
21
- var json = require('@rollup/plugin-json');
22
- var tmp = require('tmp');
23
17
  var proxy = require('express-http-proxy');
24
- var selector = require('cli-select');
18
+ var fs = require('fs-extra');
19
+ var glob = require('glob');
20
+ var http = require('http');
21
+ var https = require('https');
22
+ var linesAndColumns = require('lines-and-columns');
23
+ var path$1 = require('path');
25
24
  var prompt = require('prompts');
26
- var jsx = require('rollup-plugin-innet-jsx');
25
+ var rollup = require('rollup');
27
26
  var filesize = require('rollup-plugin-filesize');
28
- var image = require('@rollup/plugin-image');
29
- var eslint = require('@rollup/plugin-eslint');
30
- var polyfill = require('rollup-plugin-polyfill-node');
31
27
  var injectEnv = require('rollup-plugin-inject-process-env');
32
- var linesAndColumns = require('lines-and-columns');
28
+ var jsx = require('rollup-plugin-innet-jsx');
29
+ var externals = require('rollup-plugin-node-externals');
30
+ var polyfill = require('rollup-plugin-polyfill-node');
31
+ var rollupPluginPreserveShebangs = require('rollup-plugin-preserve-shebangs');
32
+ var styles = require('rollup-plugin-styles');
33
+ var rollupPluginTerser = require('rollup-plugin-terser');
34
+ var typescript = require('rollup-plugin-typescript2');
35
+ var tmp = require('tmp');
36
+ var util = require('util');
33
37
  var unzipper = require('unzipper');
34
- var commander = require('commander');
35
38
 
36
39
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
37
40
 
38
- var path__default = /*#__PURE__*/_interopDefaultLegacy(path$1);
39
- var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
40
- var http__default = /*#__PURE__*/_interopDefaultLegacy(http);
41
- var address__default = /*#__PURE__*/_interopDefaultLegacy(address);
42
- var https__default = /*#__PURE__*/_interopDefaultLegacy(https);
43
- var axios__default = /*#__PURE__*/_interopDefaultLegacy(axios);
44
41
  var logger__default = /*#__PURE__*/_interopDefaultLegacy(logger);
45
- var chalk__default = /*#__PURE__*/_interopDefaultLegacy(chalk);
46
- var rollup__default = /*#__PURE__*/_interopDefaultLegacy(rollup);
47
42
  var commonjs__default = /*#__PURE__*/_interopDefaultLegacy(commonjs);
48
- var typescript__default = /*#__PURE__*/_interopDefaultLegacy(typescript);
49
- var styles__default = /*#__PURE__*/_interopDefaultLegacy(styles);
43
+ var eslint__default = /*#__PURE__*/_interopDefaultLegacy(eslint);
44
+ var image__default = /*#__PURE__*/_interopDefaultLegacy(image);
45
+ var json__default = /*#__PURE__*/_interopDefaultLegacy(json);
46
+ var address__default = /*#__PURE__*/_interopDefaultLegacy(address);
50
47
  var autoprefixer__default = /*#__PURE__*/_interopDefaultLegacy(autoprefixer);
48
+ var axios__default = /*#__PURE__*/_interopDefaultLegacy(axios);
49
+ var chalk__default = /*#__PURE__*/_interopDefaultLegacy(chalk);
50
+ var selector__default = /*#__PURE__*/_interopDefaultLegacy(selector);
51
51
  var express__default = /*#__PURE__*/_interopDefaultLegacy(express);
52
- var json__default = /*#__PURE__*/_interopDefaultLegacy(json);
53
- var tmp__default = /*#__PURE__*/_interopDefaultLegacy(tmp);
54
52
  var proxy__default = /*#__PURE__*/_interopDefaultLegacy(proxy);
55
- var selector__default = /*#__PURE__*/_interopDefaultLegacy(selector);
53
+ var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
54
+ var glob__default = /*#__PURE__*/_interopDefaultLegacy(glob);
55
+ var http__default = /*#__PURE__*/_interopDefaultLegacy(http);
56
+ var https__default = /*#__PURE__*/_interopDefaultLegacy(https);
57
+ var path__default = /*#__PURE__*/_interopDefaultLegacy(path$1);
56
58
  var prompt__default = /*#__PURE__*/_interopDefaultLegacy(prompt);
57
- var jsx__default = /*#__PURE__*/_interopDefaultLegacy(jsx);
59
+ var rollup__default = /*#__PURE__*/_interopDefaultLegacy(rollup);
58
60
  var filesize__default = /*#__PURE__*/_interopDefaultLegacy(filesize);
59
- var image__default = /*#__PURE__*/_interopDefaultLegacy(image);
60
- var eslint__default = /*#__PURE__*/_interopDefaultLegacy(eslint);
61
- var polyfill__default = /*#__PURE__*/_interopDefaultLegacy(polyfill);
62
61
  var injectEnv__default = /*#__PURE__*/_interopDefaultLegacy(injectEnv);
62
+ var jsx__default = /*#__PURE__*/_interopDefaultLegacy(jsx);
63
+ var externals__default = /*#__PURE__*/_interopDefaultLegacy(externals);
64
+ var polyfill__default = /*#__PURE__*/_interopDefaultLegacy(polyfill);
65
+ var styles__default = /*#__PURE__*/_interopDefaultLegacy(styles);
66
+ var typescript__default = /*#__PURE__*/_interopDefaultLegacy(typescript);
67
+ var tmp__default = /*#__PURE__*/_interopDefaultLegacy(tmp);
63
68
 
64
69
  /******************************************************************************
65
70
  Copyright (c) Microsoft Corporation.
@@ -86,6 +91,35 @@ function __awaiter(thisArg, _arguments, P, generator) {
86
91
  });
87
92
  }
88
93
 
94
+ const lintInclude = [
95
+ '**/*.ts',
96
+ '**/*.tsx',
97
+ '**/*.js',
98
+ '**/*.jsx',
99
+ ];
100
+ const stringExcludeDom = [
101
+ '**/*.ts',
102
+ '**/*.tsx',
103
+ '**/*.js',
104
+ '**/*.jsx',
105
+ '**/*.json',
106
+ '**/*.css',
107
+ '**/*.scss',
108
+ '**/*.webp',
109
+ '**/*.gif',
110
+ '**/*.png',
111
+ '**/*.jpeg',
112
+ '**/*.jpg',
113
+ '**/*.svg',
114
+ ];
115
+ const stringExcludeNode = [
116
+ '**/*.ts',
117
+ '**/*.tsx',
118
+ '**/*.js',
119
+ '**/*.jsx',
120
+ '**/*.json',
121
+ ];
122
+
89
123
  const Writer = require('fstream').Writer;
90
124
  const path = require('path');
91
125
  const stream = require('stream');
@@ -95,7 +129,7 @@ function Extract(opts, template) {
95
129
  const reduceCount = 19 + template.length;
96
130
  // make sure path is normalized before using it
97
131
  opts.path = path.resolve(path.normalize(opts.path));
98
- // @ts-ignore
132
+ // @ts-expect-error
99
133
  const parser = new unzipper.Parse(opts);
100
134
  const outStream = new stream.Writable({ objectMode: true });
101
135
  outStream._write = function (entry, encoding, cb) {
@@ -128,35 +162,6 @@ function Extract(opts, template) {
128
162
  return extract;
129
163
  }
130
164
 
131
- const lintIncludeDom = [
132
- '**/*.ts',
133
- '**/*.tsx',
134
- '**/*.js',
135
- '**/*.jsx',
136
- ];
137
- const stringExcludeDom = [
138
- '**/*.ts',
139
- '**/*.tsx',
140
- '**/*.js',
141
- '**/*.jsx',
142
- '**/*.json',
143
- '**/*.css',
144
- '**/*.scss',
145
- '**/*.webp',
146
- '**/*.gif',
147
- '**/*.png',
148
- '**/*.jpeg',
149
- '**/*.jpg',
150
- '**/*.svg',
151
- ];
152
- const stringExcludeNode = [
153
- '**/*.ts',
154
- '**/*.tsx',
155
- '**/*.js',
156
- '**/*.jsx',
157
- '**/*.json',
158
- ];
159
-
160
165
  function getFile(file) {
161
166
  file = path__default["default"].resolve(file);
162
167
  if (!fs__default["default"].existsSync(file)) {
@@ -211,12 +216,21 @@ const innetEnv = Object.keys(process.env).reduce((result, key) => {
211
216
  }
212
217
  return result;
213
218
  }, {});
219
+ const scriptExtensions = ['ts', 'js', 'tsx', 'jsx'];
220
+ const indexExt = scriptExtensions.join(',');
214
221
  class InnetJS {
215
- constructor({ projectFolder = process.env.PROJECT_FOLDER || '', baseUrl = process.env.BASE_URL || '/', publicFolder = process.env.PUBLIC_FOLDER || 'public', buildFolder = process.env.BUILD_FOLDER || 'build', srcFolder = process.env.SRC_FOLDER || 'src', sourcemap = process.env.SOURCEMAP ? process.env.SOURCEMAP === 'true' : false, cssModules = process.env.CSS_MODULES ? process.env.CSS_MODULES === 'true' : true, cssInJs = process.env.CSS_IN_JS ? process.env.CSS_IN_JS === 'true' : true, sslKey = process.env.SSL_KEY || 'localhost.key', sslCrt = process.env.SSL_CRT || 'localhost.crt', proxy = process.env.PROXY || '', port = process.env.PORT ? +process.env.PORT : 3000, api = process.env.API || '/api/?*', } = {}) {
222
+ constructor({ projectFolder = process.env.PROJECT_FOLDER || '', baseUrl = process.env.BASE_URL || '/', publicFolder = process.env.PUBLIC_FOLDER || 'public', releaseFolder = process.env.RELEASE_FOLDER || 'release', buildFolder = process.env.BUILD_FOLDER || 'build', srcFolder = process.env.SRC_FOLDER || 'src', sourcemap = process.env.SOURCEMAP ? process.env.SOURCEMAP === 'true' : false, cssModules = process.env.CSS_MODULES ? process.env.CSS_MODULES === 'true' : true, cssInJs = process.env.CSS_IN_JS ? process.env.CSS_IN_JS === 'true' : true, sslKey = process.env.SSL_KEY || 'localhost.key', sslCrt = process.env.SSL_CRT || 'localhost.crt', proxy = process.env.PROXY || '', port = process.env.PORT ? +process.env.PORT : 3000, api = process.env.API || '/api/?*', } = {}) {
216
223
  this.projectFolder = path__default["default"].resolve(projectFolder);
217
224
  this.publicFolder = path__default["default"].resolve(publicFolder);
225
+ this.releaseFolder = path__default["default"].resolve(releaseFolder);
218
226
  this.buildFolder = path__default["default"].resolve(buildFolder);
219
227
  this.srcFolder = path__default["default"].resolve(srcFolder);
228
+ this.licenseFile = path__default["default"].join(projectFolder, 'LICENSE');
229
+ this.licenseReleaseFile = path__default["default"].join(releaseFolder, 'LICENSE');
230
+ this.readmeFile = path__default["default"].join(projectFolder, 'README.md');
231
+ this.readmeReleaseFile = path__default["default"].join(releaseFolder, 'README.md');
232
+ this.declarationFile = path__default["default"].join(srcFolder, 'declaration.d.ts');
233
+ this.declarationReleaseFile = path__default["default"].join(releaseFolder, 'declaration.d.ts');
220
234
  this.publicIndexFile = path__default["default"].join(publicFolder, 'index.html');
221
235
  this.buildIndexFile = path__default["default"].join(buildFolder, 'index.html');
222
236
  this.devBuildFolder = path__default["default"].resolve(projectFolder, 'node_modules', '.cache', 'innetjs', 'build');
@@ -238,9 +252,9 @@ class InnetJS {
238
252
  const { data } = yield logger__default["default"].start('Get templates list', () => __awaiter(this, void 0, void 0, function* () { return yield axios__default["default"].get('https://api.github.com/repos/d8corp/innetjs-templates/branches'); }));
239
253
  const templates = data.map(({ name }) => name).filter(name => name !== 'main');
240
254
  if (!template || !templates.includes(template)) {
241
- logger__default["default"].log(chalk__default["default"].green(`Select one of those templates`));
255
+ logger__default["default"].log(chalk__default["default"].green('Select one of those templates'));
242
256
  const { value } = yield selector__default["default"]({
243
- values: templates
257
+ values: templates,
244
258
  });
245
259
  template = value;
246
260
  readline.moveCursor(process.stdout, 0, -1);
@@ -253,7 +267,7 @@ class InnetJS {
253
267
  if (fs__default["default"].existsSync(appPath)) {
254
268
  logger__default["default"].log(chalk__default["default"].red(`'${appPath}' already exist, what do you want?`));
255
269
  const { id: result, value } = yield selector__default["default"]({
256
- values: ['Stop the process', 'Remove the folder', 'Merge with template']
270
+ values: ['Stop the process', 'Remove the folder', 'Merge with template'],
257
271
  });
258
272
  readline.moveCursor(process.stdout, 0, -1);
259
273
  logger__default["default"].log(`Already exist, selected: ${value}`);
@@ -268,7 +282,7 @@ class InnetJS {
268
282
  }
269
283
  yield logger__default["default"].start('Download template', () => __awaiter(this, void 0, void 0, function* () {
270
284
  const { data } = yield axios__default["default"].get(`https://github.com/d8corp/innetjs-templates/archive/refs/heads/${template}.zip`, {
271
- responseType: 'stream'
285
+ responseType: 'stream',
272
286
  });
273
287
  yield new Promise((resolve, reject) => {
274
288
  data.pipe(Extract({
@@ -279,60 +293,55 @@ class InnetJS {
279
293
  yield logger__default["default"].start('Install packages', () => execAsync(`cd ${appPath} && npm i`));
280
294
  });
281
295
  }
282
- build({ node = false } = {}) {
296
+ build({ node = false, index = 'index' } = {}) {
283
297
  return __awaiter(this, void 0, void 0, function* () {
284
- const indexExtension = yield this.getProjectExtension();
298
+ const input = glob__default["default"].sync(`src/${index}.{${indexExt}}`);
299
+ if (!input.length) {
300
+ throw Error('index file is not detected');
301
+ }
285
302
  yield logger__default["default"].start('Remove build', () => fs__default["default"].remove(this.buildFolder));
286
303
  const pkg = node && (yield this.getPackage());
287
304
  const inputOptions = {
288
- input: path__default["default"].resolve(this.srcFolder, `index.${indexExtension}`),
305
+ input,
289
306
  preserveEntrySignatures: 'strict',
290
307
  plugins: [
291
308
  commonjs__default["default"](),
292
309
  json__default["default"](),
293
310
  typescript__default["default"](),
294
311
  jsx__default["default"](),
295
- ]
312
+ eslint__default["default"]({
313
+ include: lintInclude,
314
+ }),
315
+ ],
296
316
  };
297
317
  const outputOptions = {
298
318
  dir: this.buildFolder,
299
- sourcemap: this.sourcemap
319
+ sourcemap: this.sourcemap,
300
320
  };
301
321
  if (node) {
302
322
  outputOptions.format = 'cjs';
303
323
  inputOptions.external = Object.keys((pkg === null || pkg === void 0 ? void 0 : pkg.dependencies) || {});
304
324
  inputOptions.plugins.push(pluginNodeResolve.nodeResolve({
305
- moduleDirectories: [path__default["default"].resolve(this.buildFolder, 'node_modules')]
325
+ moduleDirectories: [path__default["default"].resolve(this.buildFolder, 'node_modules')],
306
326
  }), string({
307
327
  include: '**/*.*',
308
328
  exclude: stringExcludeNode,
309
329
  }));
310
330
  }
311
331
  else {
312
- inputOptions.plugins = [
313
- eslint__default["default"]({
314
- include: lintIncludeDom,
315
- }),
316
- ...inputOptions.plugins,
317
- pluginNodeResolve.nodeResolve({
318
- browser: true,
319
- }),
320
- polyfill__default["default"](),
321
- image__default["default"](),
322
- styles__default["default"]({
323
- mode: this.cssInJs ? 'inject' : 'extract',
324
- url: true,
325
- plugins: [autoprefixer__default["default"]()],
326
- modules: this.cssModules,
327
- sourceMap: this.sourcemap,
328
- minimize: true,
329
- }),
330
- string({
331
- include: '**/*.*',
332
- exclude: stringExcludeDom,
333
- }),
334
- injectEnv__default["default"](innetEnv),
335
- ];
332
+ inputOptions.plugins.push(pluginNodeResolve.nodeResolve({
333
+ browser: true,
334
+ }), polyfill__default["default"](), image__default["default"](), styles__default["default"]({
335
+ mode: this.cssInJs ? 'inject' : 'extract',
336
+ url: true,
337
+ plugins: [autoprefixer__default["default"]()],
338
+ modules: this.cssModules,
339
+ sourceMap: this.sourcemap,
340
+ minimize: true,
341
+ }), string({
342
+ include: '**/*.*',
343
+ exclude: stringExcludeDom,
344
+ }), injectEnv__default["default"](innetEnv));
336
345
  outputOptions.format = 'es';
337
346
  outputOptions.plugins = [
338
347
  rollupPluginTerser.terser(),
@@ -368,13 +377,16 @@ class InnetJS {
368
377
  }
369
378
  });
370
379
  }
371
- start({ node = false, error = false } = {}) {
380
+ start({ node = false, error = false, index = 'index' } = {}) {
372
381
  return __awaiter(this, void 0, void 0, function* () {
373
- const indexExtension = yield this.getProjectExtension();
374
382
  const pkg = yield this.getPackage();
383
+ const input = glob__default["default"].sync(`src/${index}.{${indexExt}}`);
384
+ if (!input.length) {
385
+ throw Error('index file is not detected');
386
+ }
375
387
  yield logger__default["default"].start('Remove build', () => fs__default["default"].remove(this.devBuildFolder));
376
388
  const options = {
377
- input: path__default["default"].resolve(this.srcFolder, `index.${indexExtension}`),
389
+ input,
378
390
  preserveEntrySignatures: 'strict',
379
391
  output: {
380
392
  dir: this.devBuildFolder,
@@ -386,14 +398,18 @@ class InnetJS {
386
398
  typescript__default["default"]({
387
399
  tsconfigOverride: {
388
400
  compilerOptions: {
389
- sourceMap: true
390
- }
401
+ sourceMap: true,
402
+ },
391
403
  },
392
404
  }),
393
405
  jsx__default["default"](),
406
+ eslint__default["default"]({
407
+ include: lintInclude,
408
+ }),
394
409
  ],
395
410
  };
396
411
  if (node) {
412
+ // @ts-expect-error
397
413
  options.output.format = 'cjs';
398
414
  options.external = Object.keys((pkg === null || pkg === void 0 ? void 0 : pkg.dependencies) || {});
399
415
  options.plugins.push(pluginNodeResolve.nodeResolve({
@@ -414,36 +430,24 @@ class InnetJS {
414
430
  : fs__default["default"].existsSync(this.sslCrt)
415
431
  ? fs__default["default"].readFileSync(this.sslCrt)
416
432
  : undefined;
433
+ // @ts-expect-error
417
434
  options.output.format = 'es';
418
- options.plugins = [
419
- eslint__default["default"]({
420
- include: lintIncludeDom,
421
- }),
422
- ...options.plugins,
423
- pluginNodeResolve.nodeResolve({
424
- browser: true,
425
- }),
426
- polyfill__default["default"](),
427
- image__default["default"](),
428
- styles__default["default"]({
429
- mode: this.cssInJs ? 'inject' : 'extract',
430
- url: true,
431
- plugins: [autoprefixer__default["default"]()],
432
- modules: this.cssModules,
433
- sourceMap: true,
434
- }),
435
- string({
436
- include: '**/*.*',
437
- exclude: stringExcludeDom,
438
- }),
439
- this.createClient(key, cert, pkg),
440
- livereload(Object.assign({ exts: ['html', 'css', 'js', 'png', 'svg', 'webp', 'gif', 'jpg', 'json'], watch: [this.devBuildFolder, this.publicFolder], verbose: false }, (key && cert ? { https: { key, cert } } : {}))),
441
- injectEnv__default["default"](innetEnv),
442
- ];
435
+ options.plugins.push(pluginNodeResolve.nodeResolve({
436
+ browser: true,
437
+ }), polyfill__default["default"](), image__default["default"](), styles__default["default"]({
438
+ mode: this.cssInJs ? 'inject' : 'extract',
439
+ url: true,
440
+ plugins: [autoprefixer__default["default"]()],
441
+ modules: this.cssModules,
442
+ sourceMap: true,
443
+ }), string({
444
+ include: '**/*.*',
445
+ exclude: stringExcludeDom,
446
+ }), this.createClient(key, cert, pkg), livereload(Object.assign({ exts: ['html', 'css', 'js', 'png', 'svg', 'webp', 'gif', 'jpg', 'json'], watch: [this.devBuildFolder, this.publicFolder], verbose: false }, (key && cert ? { https: { key, cert } } : {}))), injectEnv__default["default"](innetEnv));
443
447
  }
444
448
  const watcher = rollup__default["default"].watch(options);
445
449
  watcher.on('event', (e) => __awaiter(this, void 0, void 0, function* () {
446
- if (e.code == 'ERROR') {
450
+ if (e.code === 'ERROR') {
447
451
  if (e.error.code === 'UNRESOLVED_IMPORT') {
448
452
  const [, importer, file] = e.error.message.match(/^Could not resolve '(.+)' from (.+)$/) || [];
449
453
  const text = (yield fs__default["default"].readFile(file)).toString();
@@ -498,16 +502,16 @@ class InnetJS {
498
502
  typescript__default["default"]({
499
503
  tsconfigOverride: {
500
504
  compilerOptions: {
501
- sourceMap: true
502
- }
503
- }
504
- })
505
- ]
505
+ sourceMap: true,
506
+ },
507
+ },
508
+ }),
509
+ ],
506
510
  };
507
511
  const outputOptions = {
508
512
  format: 'cjs',
509
513
  file: jsFilePath,
510
- sourcemap: true
514
+ sourcemap: true,
511
515
  };
512
516
  const bundle = yield rollup__default["default"].rollup(inputOptions);
513
517
  yield bundle.write(outputOptions);
@@ -518,35 +522,164 @@ class InnetJS {
518
522
  }));
519
523
  });
520
524
  }
521
- // Utils
522
- getProjectExtension() {
525
+ release({ node = false, index = 'index', release, } = {}) {
523
526
  return __awaiter(this, void 0, void 0, function* () {
524
- if (this.projectExtension) {
525
- return this.projectExtension;
526
- }
527
- yield logger__default["default"].start('Check src', () => {
528
- if (!fs__default["default"].existsSync(this.srcFolder)) {
529
- throw Error('src folder is missing');
530
- }
531
- });
532
- yield logger__default["default"].start('Detection of index file', () => {
533
- if (fs__default["default"].existsSync(path__default["default"].join(this.srcFolder, 'index.js'))) {
534
- this.projectExtension = 'js';
535
- }
536
- else if (fs__default["default"].existsSync(path__default["default"].join(this.srcFolder, 'index.ts'))) {
537
- this.projectExtension = 'ts';
538
- }
539
- else if (fs__default["default"].existsSync(path__default["default"].join(this.srcFolder, 'index.tsx'))) {
540
- this.projectExtension = 'tsx';
541
- }
542
- else if (fs__default["default"].existsSync(path__default["default"].join(this.srcFolder, 'index.jsx'))) {
543
- this.projectExtension = 'jsx';
544
- }
545
- else {
546
- throw Error('index file is not detected');
527
+ const { releaseFolder, cssModules } = this;
528
+ yield logger__default["default"].start('Remove previous release', () => fs__default["default"].remove(releaseFolder));
529
+ const pkg = yield this.getPackage();
530
+ yield logger__default["default"].start('Prepare package.json', () => __awaiter(this, void 0, void 0, function* () {
531
+ const version = pkg.version.split('.');
532
+ switch (release) {
533
+ case 'patch': {
534
+ version[2]++;
535
+ break;
536
+ }
537
+ case 'minor': {
538
+ version[1]++;
539
+ version[2] = 0;
540
+ break;
541
+ }
542
+ case 'major': {
543
+ version[1] = 0;
544
+ version[2] = 0;
545
+ version[0]++;
546
+ break;
547
+ }
548
+ default: return;
547
549
  }
548
- });
549
- return this.projectExtension;
550
+ pkg.version = version.join('.');
551
+ yield fs__default["default"].writeFile(path__default["default"].resolve(this.projectFolder, 'package.json'), JSON.stringify(pkg, undefined, 2), 'UTF-8');
552
+ }));
553
+ function build(format) {
554
+ var _a, _b;
555
+ return __awaiter(this, void 0, void 0, function* () {
556
+ const ext = format === 'es'
557
+ ? ((_a = (pkg.module || pkg.esnext || pkg['jsnext:main'])) === null || _a === void 0 ? void 0 : _a.replace('index', '')) || '.mjs'
558
+ : ((_b = pkg.main) === null || _b === void 0 ? void 0 : _b.replace('index', '')) || '.js';
559
+ const indexFiles = scriptExtensions.map(ext => `src/${index}.${ext}`).join(',');
560
+ const otherFiles = scriptExtensions.map(ext => `src/**/index.${ext}`).join(',');
561
+ const input = glob__default["default"].sync(`{${indexFiles},${otherFiles}}`);
562
+ if (!input.length) {
563
+ throw Error('index file is not detected');
564
+ }
565
+ const options = {
566
+ input,
567
+ preserveEntrySignatures: 'strict',
568
+ output: {
569
+ dir: releaseFolder,
570
+ entryFileNames: `[name]${ext}`,
571
+ format,
572
+ preserveModules: true,
573
+ },
574
+ plugins: [
575
+ json__default["default"](),
576
+ typescript__default["default"]({
577
+ rollupCommonJSResolveHack: false,
578
+ clean: true,
579
+ }),
580
+ jsx__default["default"](),
581
+ eslint__default["default"]({
582
+ include: lintInclude,
583
+ }),
584
+ ],
585
+ };
586
+ if (node) {
587
+ options.external = [...Object.keys(pkg.dependencies), 'tslib'];
588
+ options.plugins = [
589
+ ...options.plugins,
590
+ externals__default["default"](),
591
+ string({
592
+ include: '**/*.*',
593
+ exclude: stringExcludeNode,
594
+ }),
595
+ ];
596
+ }
597
+ else {
598
+ options.plugins = [
599
+ ...options.plugins,
600
+ string({
601
+ include: '**/*.*',
602
+ exclude: stringExcludeDom,
603
+ }),
604
+ polyfill__default["default"](),
605
+ image__default["default"](),
606
+ styles__default["default"]({
607
+ mode: 'inject',
608
+ url: true,
609
+ plugins: [autoprefixer__default["default"]()],
610
+ modules: cssModules,
611
+ minimize: true,
612
+ }),
613
+ injectEnv__default["default"](innetEnv),
614
+ ];
615
+ }
616
+ const bundle = yield rollup__default["default"].rollup(options);
617
+ yield bundle.write(options.output);
618
+ yield bundle.close();
619
+ });
620
+ }
621
+ yield logger__default["default"].start('Build cjs bundle', () => __awaiter(this, void 0, void 0, function* () {
622
+ yield build('cjs');
623
+ }));
624
+ yield logger__default["default"].start('Build es6 bundle', () => __awaiter(this, void 0, void 0, function* () {
625
+ yield build('es');
626
+ }));
627
+ yield logger__default["default"].start('Copy package.json', () => __awaiter(this, void 0, void 0, function* () {
628
+ const data = Object.assign({}, pkg);
629
+ delete data.private;
630
+ delete data.devDependencies;
631
+ yield fs__default["default"].writeFile(path__default["default"].resolve(this.releaseFolder, 'package.json'), JSON.stringify(data, undefined, 2), 'UTF-8');
632
+ }));
633
+ if (pkg.bin) {
634
+ yield logger__default["default"].start('Build bin', () => __awaiter(this, void 0, void 0, function* () {
635
+ const { bin } = pkg;
636
+ for (const name in bin) {
637
+ const value = bin[name];
638
+ const input = glob__default["default"].sync(`src/${value}.{${scriptExtensions.join(',')}}`);
639
+ const file = path__default["default"].join(this.releaseFolder, value);
640
+ const options = {
641
+ input,
642
+ external: [...Object.keys(pkg.dependencies), 'tslib'],
643
+ output: {
644
+ file,
645
+ format: 'cjs',
646
+ },
647
+ plugins: [
648
+ rollupPluginPreserveShebangs.preserveShebangs(),
649
+ json__default["default"](),
650
+ typescript__default["default"]({
651
+ clean: true,
652
+ tsconfigOverride: {
653
+ compilerOptions: {
654
+ declaration: false,
655
+ },
656
+ },
657
+ }),
658
+ externals__default["default"](),
659
+ jsx__default["default"](),
660
+ ],
661
+ };
662
+ const bundle = yield rollup__default["default"].rollup(options);
663
+ yield bundle.write(options.output);
664
+ yield bundle.close();
665
+ }
666
+ }));
667
+ }
668
+ if (fs__default["default"].existsSync(this.licenseFile)) {
669
+ yield logger__default["default"].start('Copy license', () => __awaiter(this, void 0, void 0, function* () {
670
+ yield fs.promises.copyFile(this.licenseFile, this.licenseReleaseFile);
671
+ }));
672
+ }
673
+ if (fs__default["default"].existsSync(this.readmeFile)) {
674
+ yield logger__default["default"].start('Copy readme', () => __awaiter(this, void 0, void 0, function* () {
675
+ yield fs.promises.copyFile(this.readmeFile, this.readmeReleaseFile);
676
+ }));
677
+ }
678
+ if (fs__default["default"].existsSync(this.declarationFile)) {
679
+ yield logger__default["default"].start('Copy declaration', () => __awaiter(this, void 0, void 0, function* () {
680
+ yield fs.promises.copyFile(this.declarationFile, this.declarationReleaseFile);
681
+ }));
682
+ }
550
683
  });
551
684
  }
552
685
  getPackage() {
@@ -566,6 +699,7 @@ class InnetJS {
566
699
  createClient(key, cert, pkg) {
567
700
  let app;
568
701
  return {
702
+ name: 'client',
569
703
  writeBundle: () => __awaiter(this, void 0, void 0, function* () {
570
704
  var _a;
571
705
  if (!app) {
@@ -582,7 +716,7 @@ class InnetJS {
582
716
  if ((_a = this.proxy) === null || _a === void 0 ? void 0 : _a.startsWith('http')) {
583
717
  app.use(this.api, proxy__default["default"](this.proxy, {
584
718
  https: httpsUsing,
585
- proxyReqPathResolver: req => req.originalUrl
719
+ proxyReqPathResolver: req => req.originalUrl,
586
720
  }));
587
721
  }
588
722
  app.use(/^([^.]*|.*\.[^.]{5,})$/, (req, res) => {
@@ -600,7 +734,7 @@ class InnetJS {
600
734
  const { userPort } = yield prompt__default["default"]({
601
735
  name: 'userPort',
602
736
  type: 'number',
603
- message: `Port ${e.port} is reserved, please enter another one [${port}]:`
737
+ message: `Port ${e.port} is reserved, please enter another one [${port}]:`,
604
738
  });
605
739
  if (userPort) {
606
740
  port = userPort;
@@ -612,33 +746,37 @@ class InnetJS {
612
746
  }
613
747
  }));
614
748
  }
615
- })
749
+ }),
616
750
  };
617
751
  }
618
752
  createServer() {
619
753
  let app;
620
754
  return {
755
+ name: 'server',
621
756
  writeBundle: () => __awaiter(this, void 0, void 0, function* () {
622
757
  app === null || app === void 0 ? void 0 : app.kill();
623
758
  const filePath = path__default["default"].resolve(this.devBuildFolder, 'index.js');
624
759
  app = spawn('node', ['-r', 'source-map-support/register', filePath], { stdio: 'inherit' });
625
- })
760
+ }),
626
761
  };
627
762
  }
628
763
  }
629
764
 
630
- var version = "2.1.6";
765
+ var version = "2.2.0";
631
766
 
632
767
  const dotenvConfigOutput = require('dotenv').config();
633
768
  require('dotenv-expand').expand(dotenvConfigOutput);
634
769
  const innetJS = new InnetJS();
770
+ const errorOption = new commander.Option('-e, --error', 'Show error details');
771
+ const releaseOption = new commander.Option('-r, --release <release>', 'Select release type')
772
+ .choices(['patch', 'minor', 'major']);
635
773
  commander.program
636
774
  .version(version, '-v, --version');
637
775
  commander.program
638
776
  .command('init <app-name>')
639
777
  .description('Create innet boilerplate')
640
- .option('-e, --error', 'Show error details')
641
778
  .option('-t, --template <template>', 'Select template fe or be')
779
+ .addOption(errorOption)
642
780
  .action((appName, { error, template }) => {
643
781
  innetJS.init(appName, { template }).catch(e => {
644
782
  if (error) {
@@ -650,7 +788,7 @@ commander.program
650
788
  commander.program
651
789
  .command('run <file-path>')
652
790
  .description('Run js, ts or tsx file')
653
- .option('-e, --error', 'Show error details')
791
+ .addOption(errorOption)
654
792
  .action((filePath, { error }) => {
655
793
  innetJS.run(filePath).catch(e => {
656
794
  if (error) {
@@ -662,10 +800,11 @@ commander.program
662
800
  commander.program
663
801
  .command('start')
664
802
  .description('Start development with innet boilerplate')
665
- .option('-e, --error', 'Show error details')
666
803
  .option('-n, --node', 'Start development for Node.js')
667
- .action(({ error, node }) => {
668
- innetJS.start({ node, error }).catch(e => {
804
+ .option('-i, --index <index>', 'Root index file name', 'index')
805
+ .addOption(errorOption)
806
+ .action(({ error, node, index }) => {
807
+ innetJS.start({ node, error, index }).catch(e => {
669
808
  if (error) {
670
809
  console.error(e);
671
810
  process.exit(1);
@@ -675,10 +814,26 @@ commander.program
675
814
  commander.program
676
815
  .command('build')
677
816
  .description('Build production bundle')
678
- .option('-e, --error', 'Show error details')
817
+ .addOption(errorOption)
679
818
  .option('-n, --node', 'Build for node.js')
680
- .action(({ error, node }) => {
681
- innetJS.build({ node }).catch(e => {
819
+ .option('-i, --index <index>', 'Root index file name', 'index')
820
+ .action(({ error, node, index }) => {
821
+ innetJS.build({ node, index }).catch(e => {
822
+ if (error) {
823
+ console.error(e);
824
+ process.exit(1);
825
+ }
826
+ });
827
+ });
828
+ commander.program
829
+ .command('release')
830
+ .description('Release new version of a library')
831
+ .option('-n, --node', 'Release for node.js')
832
+ .option('-i, --index <index>', 'Root index file name', 'index')
833
+ .addOption(releaseOption)
834
+ .addOption(errorOption)
835
+ .action(({ error, node, index, release }) => {
836
+ innetJS.release({ node, index, release }).catch(e => {
682
837
  if (error) {
683
838
  console.error(e);
684
839
  process.exit(1);