innetjs 2.1.5 → 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)) {
@@ -197,6 +202,8 @@ const { exec, spawn } = require('child_process');
197
202
  const readline = require('readline');
198
203
  const execAsync = util.promisify(exec);
199
204
  const copyFiles = util.promisify(fs__default["default"].copy);
205
+ const dotenvConfigOutput$1 = require('dotenv').config();
206
+ require('dotenv-expand').expand(dotenvConfigOutput$1);
200
207
  const REG_CLEAR_TEXT = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
201
208
  function normalizeEnv(value) {
202
209
  if (value) {
@@ -209,12 +216,21 @@ const innetEnv = Object.keys(process.env).reduce((result, key) => {
209
216
  }
210
217
  return result;
211
218
  }, {});
219
+ const scriptExtensions = ['ts', 'js', 'tsx', 'jsx'];
220
+ const indexExt = scriptExtensions.join(',');
212
221
  class InnetJS {
213
- 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/?*', } = {}) {
214
223
  this.projectFolder = path__default["default"].resolve(projectFolder);
215
224
  this.publicFolder = path__default["default"].resolve(publicFolder);
225
+ this.releaseFolder = path__default["default"].resolve(releaseFolder);
216
226
  this.buildFolder = path__default["default"].resolve(buildFolder);
217
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');
218
234
  this.publicIndexFile = path__default["default"].join(publicFolder, 'index.html');
219
235
  this.buildIndexFile = path__default["default"].join(buildFolder, 'index.html');
220
236
  this.devBuildFolder = path__default["default"].resolve(projectFolder, 'node_modules', '.cache', 'innetjs', 'build');
@@ -236,9 +252,9 @@ class InnetJS {
236
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'); }));
237
253
  const templates = data.map(({ name }) => name).filter(name => name !== 'main');
238
254
  if (!template || !templates.includes(template)) {
239
- 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'));
240
256
  const { value } = yield selector__default["default"]({
241
- values: templates
257
+ values: templates,
242
258
  });
243
259
  template = value;
244
260
  readline.moveCursor(process.stdout, 0, -1);
@@ -251,7 +267,7 @@ class InnetJS {
251
267
  if (fs__default["default"].existsSync(appPath)) {
252
268
  logger__default["default"].log(chalk__default["default"].red(`'${appPath}' already exist, what do you want?`));
253
269
  const { id: result, value } = yield selector__default["default"]({
254
- values: ['Stop the process', 'Remove the folder', 'Merge with template']
270
+ values: ['Stop the process', 'Remove the folder', 'Merge with template'],
255
271
  });
256
272
  readline.moveCursor(process.stdout, 0, -1);
257
273
  logger__default["default"].log(`Already exist, selected: ${value}`);
@@ -266,7 +282,7 @@ class InnetJS {
266
282
  }
267
283
  yield logger__default["default"].start('Download template', () => __awaiter(this, void 0, void 0, function* () {
268
284
  const { data } = yield axios__default["default"].get(`https://github.com/d8corp/innetjs-templates/archive/refs/heads/${template}.zip`, {
269
- responseType: 'stream'
285
+ responseType: 'stream',
270
286
  });
271
287
  yield new Promise((resolve, reject) => {
272
288
  data.pipe(Extract({
@@ -277,60 +293,55 @@ class InnetJS {
277
293
  yield logger__default["default"].start('Install packages', () => execAsync(`cd ${appPath} && npm i`));
278
294
  });
279
295
  }
280
- build({ node = false } = {}) {
296
+ build({ node = false, index = 'index' } = {}) {
281
297
  return __awaiter(this, void 0, void 0, function* () {
282
- 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
+ }
283
302
  yield logger__default["default"].start('Remove build', () => fs__default["default"].remove(this.buildFolder));
284
303
  const pkg = node && (yield this.getPackage());
285
304
  const inputOptions = {
286
- input: path__default["default"].resolve(this.srcFolder, `index.${indexExtension}`),
305
+ input,
287
306
  preserveEntrySignatures: 'strict',
288
307
  plugins: [
289
308
  commonjs__default["default"](),
290
309
  json__default["default"](),
291
310
  typescript__default["default"](),
292
311
  jsx__default["default"](),
293
- ]
312
+ eslint__default["default"]({
313
+ include: lintInclude,
314
+ }),
315
+ ],
294
316
  };
295
317
  const outputOptions = {
296
318
  dir: this.buildFolder,
297
- sourcemap: this.sourcemap
319
+ sourcemap: this.sourcemap,
298
320
  };
299
321
  if (node) {
300
322
  outputOptions.format = 'cjs';
301
323
  inputOptions.external = Object.keys((pkg === null || pkg === void 0 ? void 0 : pkg.dependencies) || {});
302
324
  inputOptions.plugins.push(pluginNodeResolve.nodeResolve({
303
- moduleDirectories: [path__default["default"].resolve(this.buildFolder, 'node_modules')]
325
+ moduleDirectories: [path__default["default"].resolve(this.buildFolder, 'node_modules')],
304
326
  }), string({
305
327
  include: '**/*.*',
306
328
  exclude: stringExcludeNode,
307
329
  }));
308
330
  }
309
331
  else {
310
- inputOptions.plugins = [
311
- eslint__default["default"]({
312
- include: lintIncludeDom,
313
- }),
314
- ...inputOptions.plugins,
315
- pluginNodeResolve.nodeResolve({
316
- browser: true,
317
- }),
318
- polyfill__default["default"](),
319
- image__default["default"](),
320
- styles__default["default"]({
321
- mode: this.cssInJs ? 'inject' : 'extract',
322
- url: true,
323
- plugins: [autoprefixer__default["default"]()],
324
- modules: this.cssModules,
325
- sourceMap: this.sourcemap,
326
- minimize: true,
327
- }),
328
- string({
329
- include: '**/*.*',
330
- exclude: stringExcludeDom,
331
- }),
332
- injectEnv__default["default"](innetEnv),
333
- ];
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));
334
345
  outputOptions.format = 'es';
335
346
  outputOptions.plugins = [
336
347
  rollupPluginTerser.terser(),
@@ -366,13 +377,16 @@ class InnetJS {
366
377
  }
367
378
  });
368
379
  }
369
- start({ node = false, error = false } = {}) {
380
+ start({ node = false, error = false, index = 'index' } = {}) {
370
381
  return __awaiter(this, void 0, void 0, function* () {
371
- const indexExtension = yield this.getProjectExtension();
372
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
+ }
373
387
  yield logger__default["default"].start('Remove build', () => fs__default["default"].remove(this.devBuildFolder));
374
388
  const options = {
375
- input: path__default["default"].resolve(this.srcFolder, `index.${indexExtension}`),
389
+ input,
376
390
  preserveEntrySignatures: 'strict',
377
391
  output: {
378
392
  dir: this.devBuildFolder,
@@ -384,14 +398,18 @@ class InnetJS {
384
398
  typescript__default["default"]({
385
399
  tsconfigOverride: {
386
400
  compilerOptions: {
387
- sourceMap: true
388
- }
401
+ sourceMap: true,
402
+ },
389
403
  },
390
404
  }),
391
405
  jsx__default["default"](),
406
+ eslint__default["default"]({
407
+ include: lintInclude,
408
+ }),
392
409
  ],
393
410
  };
394
411
  if (node) {
412
+ // @ts-expect-error
395
413
  options.output.format = 'cjs';
396
414
  options.external = Object.keys((pkg === null || pkg === void 0 ? void 0 : pkg.dependencies) || {});
397
415
  options.plugins.push(pluginNodeResolve.nodeResolve({
@@ -412,36 +430,24 @@ class InnetJS {
412
430
  : fs__default["default"].existsSync(this.sslCrt)
413
431
  ? fs__default["default"].readFileSync(this.sslCrt)
414
432
  : undefined;
433
+ // @ts-expect-error
415
434
  options.output.format = 'es';
416
- options.plugins = [
417
- eslint__default["default"]({
418
- include: lintIncludeDom,
419
- }),
420
- ...options.plugins,
421
- pluginNodeResolve.nodeResolve({
422
- browser: true,
423
- }),
424
- polyfill__default["default"](),
425
- image__default["default"](),
426
- styles__default["default"]({
427
- mode: this.cssInJs ? 'inject' : 'extract',
428
- url: true,
429
- plugins: [autoprefixer__default["default"]()],
430
- modules: this.cssModules,
431
- sourceMap: true,
432
- }),
433
- string({
434
- include: '**/*.*',
435
- exclude: stringExcludeDom,
436
- }),
437
- this.createClient(key, cert, pkg),
438
- 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 } } : {}))),
439
- injectEnv__default["default"](innetEnv),
440
- ];
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));
441
447
  }
442
448
  const watcher = rollup__default["default"].watch(options);
443
449
  watcher.on('event', (e) => __awaiter(this, void 0, void 0, function* () {
444
- if (e.code == 'ERROR') {
450
+ if (e.code === 'ERROR') {
445
451
  if (e.error.code === 'UNRESOLVED_IMPORT') {
446
452
  const [, importer, file] = e.error.message.match(/^Could not resolve '(.+)' from (.+)$/) || [];
447
453
  const text = (yield fs__default["default"].readFile(file)).toString();
@@ -496,16 +502,16 @@ class InnetJS {
496
502
  typescript__default["default"]({
497
503
  tsconfigOverride: {
498
504
  compilerOptions: {
499
- sourceMap: true
500
- }
501
- }
502
- })
503
- ]
505
+ sourceMap: true,
506
+ },
507
+ },
508
+ }),
509
+ ],
504
510
  };
505
511
  const outputOptions = {
506
512
  format: 'cjs',
507
513
  file: jsFilePath,
508
- sourcemap: true
514
+ sourcemap: true,
509
515
  };
510
516
  const bundle = yield rollup__default["default"].rollup(inputOptions);
511
517
  yield bundle.write(outputOptions);
@@ -516,35 +522,164 @@ class InnetJS {
516
522
  }));
517
523
  });
518
524
  }
519
- // Utils
520
- getProjectExtension() {
525
+ release({ node = false, index = 'index', release, } = {}) {
521
526
  return __awaiter(this, void 0, void 0, function* () {
522
- if (this.projectExtension) {
523
- return this.projectExtension;
524
- }
525
- yield logger__default["default"].start('Check src', () => {
526
- if (!fs__default["default"].existsSync(this.srcFolder)) {
527
- throw Error('src folder is missing');
528
- }
529
- });
530
- yield logger__default["default"].start('Detection of index file', () => {
531
- if (fs__default["default"].existsSync(path__default["default"].join(this.srcFolder, 'index.js'))) {
532
- this.projectExtension = 'js';
533
- }
534
- else if (fs__default["default"].existsSync(path__default["default"].join(this.srcFolder, 'index.ts'))) {
535
- this.projectExtension = 'ts';
536
- }
537
- else if (fs__default["default"].existsSync(path__default["default"].join(this.srcFolder, 'index.tsx'))) {
538
- this.projectExtension = 'tsx';
539
- }
540
- else if (fs__default["default"].existsSync(path__default["default"].join(this.srcFolder, 'index.jsx'))) {
541
- this.projectExtension = 'jsx';
542
- }
543
- else {
544
- 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;
545
549
  }
546
- });
547
- 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
+ }
548
683
  });
549
684
  }
550
685
  getPackage() {
@@ -564,6 +699,7 @@ class InnetJS {
564
699
  createClient(key, cert, pkg) {
565
700
  let app;
566
701
  return {
702
+ name: 'client',
567
703
  writeBundle: () => __awaiter(this, void 0, void 0, function* () {
568
704
  var _a;
569
705
  if (!app) {
@@ -580,7 +716,7 @@ class InnetJS {
580
716
  if ((_a = this.proxy) === null || _a === void 0 ? void 0 : _a.startsWith('http')) {
581
717
  app.use(this.api, proxy__default["default"](this.proxy, {
582
718
  https: httpsUsing,
583
- proxyReqPathResolver: req => req.originalUrl
719
+ proxyReqPathResolver: req => req.originalUrl,
584
720
  }));
585
721
  }
586
722
  app.use(/^([^.]*|.*\.[^.]{5,})$/, (req, res) => {
@@ -598,7 +734,7 @@ class InnetJS {
598
734
  const { userPort } = yield prompt__default["default"]({
599
735
  name: 'userPort',
600
736
  type: 'number',
601
- message: `Port ${e.port} is reserved, please enter another one [${port}]:`
737
+ message: `Port ${e.port} is reserved, please enter another one [${port}]:`,
602
738
  });
603
739
  if (userPort) {
604
740
  port = userPort;
@@ -610,35 +746,37 @@ class InnetJS {
610
746
  }
611
747
  }));
612
748
  }
613
- })
749
+ }),
614
750
  };
615
751
  }
616
752
  createServer() {
617
753
  let app;
618
754
  return {
755
+ name: 'server',
619
756
  writeBundle: () => __awaiter(this, void 0, void 0, function* () {
620
757
  app === null || app === void 0 ? void 0 : app.kill();
621
758
  const filePath = path__default["default"].resolve(this.devBuildFolder, 'index.js');
622
759
  app = spawn('node', ['-r', 'source-map-support/register', filePath], { stdio: 'inherit' });
623
- })
760
+ }),
624
761
  };
625
762
  }
626
763
  }
627
764
 
628
- var version = "2.1.5";
765
+ var version = "2.2.0";
629
766
 
630
- const dotenvConfigOutput = require('dotenv').config({
631
- override: true
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);