innetjs 1.12.1 → 2.0.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.
Files changed (36) hide show
  1. package/bin/innet +114 -34
  2. package/extract.d.ts +1 -0
  3. package/index.d.ts +6 -2
  4. package/index.es6.js +136 -57
  5. package/index.js +113 -33
  6. package/package.json +17 -14
  7. package/templates/be/.env +0 -1
  8. package/templates/be/README.md +0 -15
  9. package/templates/be/package.json +0 -13
  10. package/templates/be/src/controller/index.tsx +0 -7
  11. package/templates/be/src/declaration.d.ts +0 -4
  12. package/templates/be/src/index.tsx +0 -6
  13. package/templates/be/src/view/App/App.css +0 -12
  14. package/templates/be/src/view/App/App.tsx +0 -15
  15. package/templates/be/src/view/App/index.ts +0 -1
  16. package/templates/be/src/view/Page/Page.css +0 -7
  17. package/templates/be/src/view/Page/Page.tsx +0 -24
  18. package/templates/be/src/view/Page/index.ts +0 -1
  19. package/templates/be/src/view/index.ts +0 -2
  20. package/templates/be/tsconfig.json +0 -31
  21. package/templates/fe/.env +0 -1
  22. package/templates/fe/README.md +0 -84
  23. package/templates/fe/package.json +0 -16
  24. package/templates/fe/public/favicon.ico +0 -0
  25. package/templates/fe/public/index.html +0 -14
  26. package/templates/fe/src/App.scss +0 -48
  27. package/templates/fe/src/App.tsx +0 -36
  28. package/templates/fe/src/componenst/Page/Page.scss +0 -22
  29. package/templates/fe/src/componenst/Page/Page.tsx +0 -18
  30. package/templates/fe/src/componenst/Page/index.ts +0 -1
  31. package/templates/fe/src/declaration.d.ts +0 -9
  32. package/templates/fe/src/index.tsx +0 -6
  33. package/templates/fe/src/pages/HomePage/HomePage.scss +0 -25
  34. package/templates/fe/src/pages/HomePage/HomePage.tsx +0 -24
  35. package/templates/fe/src/pages/HomePage/index.ts +0 -1
  36. package/templates/fe/tsconfig.json +0 -30
package/bin/innet CHANGED
@@ -1,19 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
- var path = require('path');
4
+ var path$1 = require('path');
5
5
  var fs = require('fs-extra');
6
6
  var http = require('http');
7
7
  var https = require('https');
8
+ var util = require('util');
9
+ var axios = require('axios');
8
10
  var logger = require('@cantinc/logger');
9
11
  var chalk = require('chalk');
10
- var util = require('util');
11
12
  var rollup = require('rollup');
12
13
  var commonjs = require('@rollup/plugin-commonjs');
13
14
  var pluginNodeResolve = require('@rollup/plugin-node-resolve');
14
15
  var rollupPluginTerser = require('rollup-plugin-terser');
15
16
  var typescript = require('rollup-plugin-typescript2');
16
- var postcss = require('rollup-plugin-postcss');
17
+ var styles = require('rollup-plugin-styles');
17
18
  var autoprefixer = require('autoprefixer');
18
19
  var express = require('express');
19
20
  var json = require('@rollup/plugin-json');
@@ -22,20 +23,22 @@ var proxy = require('express-http-proxy');
22
23
  var selector = require('cli-select');
23
24
  var jsx = require('rollup-plugin-innet-jsx');
24
25
  var filesize = require('rollup-plugin-filesize');
26
+ var unzipper = require('unzipper');
25
27
  var commander = require('commander');
26
28
 
27
29
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
28
30
 
29
- var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
31
+ var path__default = /*#__PURE__*/_interopDefaultLegacy(path$1);
30
32
  var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
31
33
  var http__default = /*#__PURE__*/_interopDefaultLegacy(http);
32
34
  var https__default = /*#__PURE__*/_interopDefaultLegacy(https);
35
+ var axios__default = /*#__PURE__*/_interopDefaultLegacy(axios);
33
36
  var logger__default = /*#__PURE__*/_interopDefaultLegacy(logger);
34
37
  var chalk__default = /*#__PURE__*/_interopDefaultLegacy(chalk);
35
38
  var rollup__default = /*#__PURE__*/_interopDefaultLegacy(rollup);
36
39
  var commonjs__default = /*#__PURE__*/_interopDefaultLegacy(commonjs);
37
40
  var typescript__default = /*#__PURE__*/_interopDefaultLegacy(typescript);
38
- var postcss__default = /*#__PURE__*/_interopDefaultLegacy(postcss);
41
+ var styles__default = /*#__PURE__*/_interopDefaultLegacy(styles);
39
42
  var autoprefixer__default = /*#__PURE__*/_interopDefaultLegacy(autoprefixer);
40
43
  var express__default = /*#__PURE__*/_interopDefaultLegacy(express);
41
44
  var json__default = /*#__PURE__*/_interopDefaultLegacy(json);
@@ -45,7 +48,7 @@ var selector__default = /*#__PURE__*/_interopDefaultLegacy(selector);
45
48
  var jsx__default = /*#__PURE__*/_interopDefaultLegacy(jsx);
46
49
  var filesize__default = /*#__PURE__*/_interopDefaultLegacy(filesize);
47
50
 
48
- /*! *****************************************************************************
51
+ /******************************************************************************
49
52
  Copyright (c) Microsoft Corporation.
50
53
 
51
54
  Permission to use, copy, modify, and/or distribute this software for any
@@ -70,11 +73,54 @@ function __awaiter(thisArg, _arguments, P, generator) {
70
73
  });
71
74
  }
72
75
 
76
+ const Writer = require('fstream').Writer;
77
+ const path = require('path');
78
+ const stream = require('stream');
79
+ const duplexer2 = require('duplexer2');
80
+ const Promise$1 = require('bluebird');
81
+ function Extract(opts, template) {
82
+ const reduceCount = 19 + template.length;
83
+ // make sure path is normalized before using it
84
+ opts.path = path.resolve(path.normalize(opts.path));
85
+ // @ts-ignore
86
+ const parser = new unzipper.Parse(opts);
87
+ const outStream = new stream.Writable({ objectMode: true });
88
+ outStream._write = function (entry, encoding, cb) {
89
+ if (entry.type === 'Directory')
90
+ return cb();
91
+ const extractPath = path.join(opts.path, entry.path.slice(reduceCount));
92
+ if (extractPath.indexOf(opts.path) !== 0) {
93
+ return cb();
94
+ }
95
+ const writer = opts.getWriter ? opts.getWriter({ path: extractPath }) : Writer({ path: extractPath });
96
+ entry.pipe(writer)
97
+ .on('error', cb)
98
+ .on('close', cb);
99
+ };
100
+ const extract = duplexer2(parser, outStream);
101
+ parser.once('crx-header', function (crxHeader) {
102
+ extract.crxHeader = crxHeader;
103
+ });
104
+ parser
105
+ .pipe(outStream)
106
+ .on('finish', function () {
107
+ extract.emit('close');
108
+ });
109
+ extract.promise = function () {
110
+ return new Promise$1(function (resolve, reject) {
111
+ extract.on('close', resolve);
112
+ extract.on('error', reject);
113
+ });
114
+ };
115
+ return extract;
116
+ }
117
+
73
118
  const livereload = require('rollup-plugin-livereload');
74
119
  const { string } = require('rollup-plugin-string');
75
120
  const { exec, spawn } = require('child_process');
76
121
  const readline = require('readline');
77
122
  const execAsync = util.promisify(exec);
123
+ const copyFiles = util.promisify(fs__default["default"].copy);
78
124
  require('dotenv').config();
79
125
  function getFile(file) {
80
126
  file = path__default["default"].resolve(file);
@@ -98,16 +144,27 @@ function getFile(file) {
98
144
  }
99
145
  return file;
100
146
  }
147
+ function convertIndexFile(data, version) {
148
+ return __awaiter(this, void 0, void 0, function* () {
149
+ return data
150
+ .toString()
151
+ .replace('</head>', `<script type="module" defer src="index.js${version ? `?v=${version}` : ''}"></script></head>`);
152
+ });
153
+ }
101
154
  const reporter = (options, outputOptions, info) => {
102
155
  logger__default["default"].log(`${chalk__default["default"].yellow(info.fileName)} ${chalk__default["default"].green(info.bundleSize)} [ gzip: ${chalk__default["default"].green(info.gzipSize)} ]`);
103
156
  return '';
104
157
  };
105
158
  class InnetJS {
106
- constructor({ projectFolder = process.env.PROJECT_FOLDER || '', publicFolder = process.env.PUBLIC_FOLDER || 'public', buildFolder = process.env.BUILD_FOLDER || path__default["default"].join('public', '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' : false, cssInJs = process.env.CSS_IN_JS ? process.env.CSS_IN_JS === 'true' : false, 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 || '*', } = {}) {
159
+ constructor({ projectFolder = process.env.PROJECT_FOLDER || '', 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 || '*', } = {}) {
107
160
  this.projectFolder = path__default["default"].resolve(projectFolder);
108
161
  this.publicFolder = path__default["default"].resolve(publicFolder);
109
162
  this.buildFolder = path__default["default"].resolve(buildFolder);
110
163
  this.srcFolder = path__default["default"].resolve(srcFolder);
164
+ this.publicIndexFile = path__default["default"].join(publicFolder, 'index.html');
165
+ this.buildIndexFile = path__default["default"].join(buildFolder, 'index.html');
166
+ this.devBuildFolder = path__default["default"].resolve(projectFolder, 'node_modules', '.cache', 'innetjs', 'build');
167
+ this.devBuildIndexFile = path__default["default"].join(this.devBuildFolder, 'index.html');
111
168
  this.sourcemap = sourcemap;
112
169
  this.cssModules = cssModules;
113
170
  this.cssInJs = cssInJs;
@@ -121,14 +178,18 @@ class InnetJS {
121
178
  init(appName, { template, force = false } = {}) {
122
179
  return __awaiter(this, void 0, void 0, function* () {
123
180
  const appPath = path__default["default"].resolve(appName);
124
- if (!template) {
181
+ 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'); }));
182
+ const templates = data.map(({ name }) => name).filter(name => name !== 'main');
183
+ if (!template || !templates.includes(template)) {
125
184
  logger__default["default"].log(chalk__default["default"].green(`Select one of those templates`));
126
185
  const { value } = yield selector__default["default"]({
127
- values: ['fe', 'be']
186
+ values: templates
128
187
  });
129
188
  template = value;
130
189
  readline.moveCursor(process.stdout, 0, -1);
131
- logger__default["default"].log(`Selected ${value} template`);
190
+ const text = `Selected template: ${chalk__default["default"].white(value)}`;
191
+ logger__default["default"].start(text);
192
+ logger__default["default"].end(text);
132
193
  }
133
194
  if (!force) {
134
195
  yield logger__default["default"].start('Check if app folder is available', () => __awaiter(this, void 0, void 0, function* () {
@@ -148,14 +209,16 @@ class InnetJS {
148
209
  }
149
210
  }));
150
211
  }
151
- const libPath = path__default["default"].resolve(__dirname, '..');
152
- const templatePath = path__default["default"].resolve(libPath, 'templates', template);
153
- yield logger__default["default"].start('Check if the template exists', () => __awaiter(this, void 0, void 0, function* () {
154
- if (!fs__default["default"].existsSync(templatePath)) {
155
- throw Error(`The template '${template}' is not exist`);
156
- }
212
+ yield logger__default["default"].start('Download template', () => __awaiter(this, void 0, void 0, function* () {
213
+ const { data } = yield axios__default["default"].get(`https://github.com/d8corp/innetjs-templates/archive/refs/heads/${template}.zip`, {
214
+ responseType: 'stream'
215
+ });
216
+ yield new Promise((resolve, reject) => {
217
+ data.pipe(Extract({
218
+ path: appPath,
219
+ }, template)).on('finish', resolve).on('error', reject);
220
+ });
157
221
  }));
158
- yield logger__default["default"].start('Copy files', () => fs__default["default"].copy(templatePath, appPath));
159
222
  yield logger__default["default"].start('Install packages', () => execAsync(`cd ${appPath} && npm i`));
160
223
  });
161
224
  }
@@ -166,6 +229,7 @@ class InnetJS {
166
229
  const pkg = node && (yield this.getPackage());
167
230
  const inputOptions = {
168
231
  input: path__default["default"].resolve(this.srcFolder, `index.${indexExtension}`),
232
+ preserveEntrySignatures: 'strict',
169
233
  plugins: [
170
234
  commonjs__default["default"](),
171
235
  json__default["default"](),
@@ -205,12 +269,13 @@ class InnetJS {
205
269
  '**/*.css',
206
270
  '**/*.scss',
207
271
  ]
208
- }), postcss__default["default"]({
272
+ }), styles__default["default"]({
273
+ mode: this.cssInJs ? 'inject' : 'extract',
274
+ url: true,
209
275
  plugins: [autoprefixer__default["default"]()],
210
- extract: !this.cssInJs,
211
276
  modules: this.cssModules,
212
277
  sourceMap: this.sourcemap,
213
- minimize: true
278
+ minimize: true,
214
279
  }));
215
280
  outputOptions.format = 'es';
216
281
  outputOptions.plugins = [
@@ -224,6 +289,12 @@ class InnetJS {
224
289
  const bundle = yield rollup__default["default"].rollup(inputOptions);
225
290
  yield bundle.write(outputOptions);
226
291
  yield bundle.close();
292
+ if (!node) {
293
+ yield copyFiles(this.publicFolder, this.buildFolder);
294
+ const data = yield fs.promises.readFile(this.publicIndexFile);
295
+ const pkg = yield this.getPackage();
296
+ yield fs.promises.writeFile(this.buildIndexFile, yield convertIndexFile(data, pkg.version));
297
+ }
227
298
  }));
228
299
  if (pkg) {
229
300
  yield logger__default["default"].start('Copy package.json', () => __awaiter(this, void 0, void 0, function* () {
@@ -244,12 +315,13 @@ class InnetJS {
244
315
  start({ node = false, error = false } = {}) {
245
316
  return __awaiter(this, void 0, void 0, function* () {
246
317
  const indexExtension = yield this.getProjectExtension();
247
- const pkg = node && (yield this.getPackage());
248
- yield logger__default["default"].start('Remove build', () => fs__default["default"].remove(this.buildFolder));
318
+ const pkg = yield this.getPackage();
319
+ yield logger__default["default"].start('Remove build', () => fs__default["default"].remove(this.devBuildFolder));
249
320
  const options = {
250
321
  input: path__default["default"].resolve(this.srcFolder, `index.${indexExtension}`),
322
+ preserveEntrySignatures: 'strict',
251
323
  output: {
252
- dir: this.buildFolder,
324
+ dir: this.devBuildFolder,
253
325
  sourcemap: true
254
326
  },
255
327
  plugins: [
@@ -304,15 +376,16 @@ class InnetJS {
304
376
  '**/*.css',
305
377
  '**/*.scss',
306
378
  ]
307
- }), postcss__default["default"]({
379
+ }), styles__default["default"]({
380
+ mode: this.cssInJs ? 'inject' : 'extract',
381
+ url: true,
308
382
  plugins: [autoprefixer__default["default"]()],
309
383
  modules: this.cssModules,
310
384
  sourceMap: true,
311
- extract: !this.cssInJs,
312
- }), this.createClient(key, cert), livereload(Object.assign({ watch: this.publicFolder, verbose: false }, (key && cert ? { https: { key, cert } } : {}))));
385
+ }), this.createClient(key, cert, pkg), livereload(Object.assign({ watch: this.publicFolder, verbose: false }, (key && cert ? { https: { key, cert } } : {}))));
313
386
  }
314
387
  const watcher = rollup__default["default"].watch(options);
315
- watcher.on('event', e => {
388
+ watcher.on('event', (e) => __awaiter(this, void 0, void 0, function* () {
316
389
  if (e.code == 'ERROR') {
317
390
  logger__default["default"].end('Bundling', error ? e.error.stack : e.error.message);
318
391
  }
@@ -322,7 +395,7 @@ class InnetJS {
322
395
  else if (e.code === 'BUNDLE_END') {
323
396
  logger__default["default"].end('Bundling');
324
397
  }
325
- });
398
+ }));
326
399
  });
327
400
  }
328
401
  run(file) {
@@ -414,14 +487,21 @@ class InnetJS {
414
487
  return this.package;
415
488
  });
416
489
  }
417
- createClient(key, cert) {
490
+ createClient(key, cert, pkg) {
418
491
  let app;
419
492
  return {
420
- writeBundle: () => {
493
+ writeBundle: () => __awaiter(this, void 0, void 0, function* () {
421
494
  var _a;
422
495
  if (!app) {
423
- const httpsUsing = !!(cert && key);
424
496
  app = express__default["default"]();
497
+ const update = () => __awaiter(this, void 0, void 0, function* () {
498
+ const data = yield fs.promises.readFile(this.publicIndexFile);
499
+ yield fs.promises.writeFile(this.devBuildIndexFile, yield convertIndexFile(data, pkg.version));
500
+ });
501
+ fs__default["default"].watch(this.publicIndexFile, update);
502
+ yield update();
503
+ const httpsUsing = !!(cert && key);
504
+ app.use(express__default["default"].static(this.devBuildFolder));
425
505
  app.use(express__default["default"].static(this.publicFolder));
426
506
  if ((_a = this.proxy) === null || _a === void 0 ? void 0 : _a.startsWith('http')) {
427
507
  app.use(this.api, proxy__default["default"](this.proxy, {
@@ -430,14 +510,14 @@ class InnetJS {
430
510
  }));
431
511
  }
432
512
  app.use(/^[^.]+$/, (req, res) => {
433
- res.sendFile(this.publicFolder + '/index.html');
513
+ res.sendFile(this.devBuildFolder + '/index.html');
434
514
  });
435
515
  const server = httpsUsing ? https__default["default"].createServer({ key, cert }, app) : http__default["default"].createServer(app);
436
516
  server.listen(this.port, () => {
437
517
  console.log(`${chalk__default["default"].green('➤')} Server started on http${httpsUsing ? 's' : ''}://localhost:${this.port}`);
438
518
  });
439
519
  }
440
- }
520
+ })
441
521
  };
442
522
  }
443
523
  createServer(external) {
@@ -456,7 +536,7 @@ class InnetJS {
456
536
  }
457
537
  }
458
538
 
459
- var version = "1.12.1";
539
+ var version = "2.0.0";
460
540
 
461
541
  require('dotenv').config();
462
542
  const innetJS = new InnetJS();
package/extract.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare function Extract(opts: any, template: any): any;
package/index.d.ts CHANGED
@@ -3,7 +3,11 @@ export default class InnetJS {
3
3
  projectFolder: string;
4
4
  publicFolder: string;
5
5
  buildFolder: string;
6
+ devBuildFolder: string;
6
7
  srcFolder: string;
8
+ publicIndexFile: string;
9
+ buildIndexFile: string;
10
+ devBuildIndexFile: string;
7
11
  sslKey: string;
8
12
  sslCrt: string;
9
13
  proxy: string;
@@ -39,8 +43,8 @@ export default class InnetJS {
39
43
  run(file: any): Promise<void>;
40
44
  getProjectExtension(): Promise<Extensions>;
41
45
  getPackage(): Promise<Record<string, any>>;
42
- createClient(key: any, cert: any): {
43
- writeBundle: () => void;
46
+ createClient(key: any, cert: any, pkg: any): {
47
+ writeBundle: () => Promise<void>;
44
48
  };
45
49
  createServer(external: string[]): {
46
50
  writeBundle: () => Promise<void>;