innetjs 2.6.0-alpha.1 → 2.6.0-alpha.10

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/index.js CHANGED
@@ -35,11 +35,11 @@ var rollupPluginPreserveShebangs = require('rollup-plugin-preserve-shebangs');
35
35
  var env = require('rollup-plugin-process-env');
36
36
  var styles = require('rollup-plugin-styles');
37
37
  var rollupPluginTerser = require('rollup-plugin-terser');
38
+ var stream = require('node:stream');
38
39
  var tmp = require('tmp');
39
- var typescript = require('typescript');
40
+ var unzipper = require('unzipper');
40
41
  var node_util = require('node:util');
41
42
  var constants = require('./constants.js');
42
- var extract = require('./extract.js');
43
43
  var helpers = require('./helpers.js');
44
44
  var updateDotenv = require('./updateDotenv.js');
45
45
 
@@ -72,633 +72,633 @@ var externals__default = /*#__PURE__*/_interopDefaultLegacy(externals);
72
72
  var polyfill__default = /*#__PURE__*/_interopDefaultLegacy(polyfill);
73
73
  var env__default = /*#__PURE__*/_interopDefaultLegacy(env);
74
74
  var styles__default = /*#__PURE__*/_interopDefaultLegacy(styles);
75
+ var stream__default = /*#__PURE__*/_interopDefaultLegacy(stream);
75
76
  var tmp__default = /*#__PURE__*/_interopDefaultLegacy(tmp);
76
- var typescript__default = /*#__PURE__*/_interopDefaultLegacy(typescript);
77
77
 
78
- const livereload = require('rollup-plugin-livereload');
79
- const { string } = require('rollup-plugin-string');
80
- const { exec, spawn } = require('child_process');
81
- const readline = require('readline');
82
- const importAssets = require('rollup-plugin-import-assets');
83
- const execAsync = node_util.promisify(exec);
84
- const copyFiles = node_util.promisify(fs__default["default"].copy);
85
- updateDotenv.updateDotenv();
86
- const REG_CLEAR_TEXT = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
87
- const REG_RPT_ERROR_FILE = /(src[^:]+):(\d+):(\d+)/;
88
- const REG_TJSX = /\.[tj]sx?$/;
89
- const REG_EXT = /\.([^.]+)$/;
90
- const scriptExtensions = ['ts', 'js', 'tsx', 'jsx'];
91
- const indexExt = scriptExtensions.join(',');
92
- class InnetJS {
93
- constructor({ envPrefix = process.env.INNETJS_ENV_PREFIX || 'INNETJS_', 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 || '', simulateIP = process.env.IP, port = process.env.PORT ? +process.env.PORT : 3000, api = process.env.API || '/api/?*', } = {}) {
94
- this.projectFolder = path__default["default"].resolve(projectFolder);
95
- this.publicFolder = path__default["default"].resolve(publicFolder);
96
- this.releaseFolder = path__default["default"].resolve(releaseFolder);
97
- this.buildFolder = path__default["default"].resolve(buildFolder);
98
- this.srcFolder = path__default["default"].resolve(srcFolder);
99
- this.licenseFile = path__default["default"].join(projectFolder, 'LICENSE');
100
- this.licenseReleaseFile = path__default["default"].join(releaseFolder, 'LICENSE');
101
- this.readmeFile = path__default["default"].join(projectFolder, 'README.md');
102
- this.readmeReleaseFile = path__default["default"].join(releaseFolder, 'README.md');
103
- this.declarationFile = path__default["default"].join(srcFolder, 'declaration.d.ts');
104
- this.declarationReleaseFile = path__default["default"].join(releaseFolder, 'declaration.d.ts');
105
- this.publicIndexFile = path__default["default"].join(publicFolder, 'index.html');
106
- this.buildIndexFile = path__default["default"].join(buildFolder, 'index.html');
107
- this.devBuildFolder = path__default["default"].resolve(projectFolder, 'node_modules', '.cache', 'innetjs', 'build');
108
- this.devBuildIndexFile = path__default["default"].join(this.devBuildFolder, 'index.html');
109
- this.sourcemap = sourcemap;
110
- this.cssModules = cssModules;
111
- this.cssInJs = cssInJs;
112
- this.sslKey = sslKey;
113
- this.sslCrt = sslCrt;
114
- this.port = port;
115
- this.proxy = proxy;
116
- this.api = api;
117
- this.baseUrl = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;
118
- this.envPrefix = envPrefix;
119
- this.simulateIP = simulateIP;
120
- }
121
- // Methods
122
- init(appName, { template, force = false } = {}) {
123
- return tslib.__awaiter(this, void 0, void 0, function* () {
124
- const appPath = path__default["default"].resolve(appName);
125
- const { data } = yield logger__default["default"].start('Get templates list', () => tslib.__awaiter(this, void 0, void 0, function* () { return yield axios__default["default"].get('https://api.github.com/repos/d8corp/innetjs-templates/branches'); }));
126
- const templates = data.map(({ name }) => name).filter(name => name !== 'main');
127
- if (!template || !templates.includes(template)) {
128
- logger__default["default"].log(chalk__default["default"].green('Select one of those templates'));
129
- const { value } = yield selector__default["default"]({
130
- values: templates,
131
- });
132
- template = value;
133
- readline.moveCursor(process.stdout, 0, -1);
134
- const text = `Selected template: ${chalk__default["default"].white(value)}`;
135
- logger__default["default"].start(text);
136
- logger__default["default"].end(text);
137
- }
138
- if (!force) {
139
- yield logger__default["default"].start('Check if app folder is available', () => tslib.__awaiter(this, void 0, void 0, function* () {
140
- if (fs__default["default"].existsSync(appPath)) {
141
- logger__default["default"].log(chalk__default["default"].red(`'${appPath}' already exist, what do you want?`));
142
- const { id: result, value } = yield selector__default["default"]({
143
- values: ['Stop the process', 'Remove the folder', 'Merge with template'],
144
- });
145
- readline.moveCursor(process.stdout, 0, -1);
146
- logger__default["default"].log(`Already exist, selected: ${value}`);
147
- if (!result) {
148
- throw Error(`'${appPath}' already exist`);
149
- }
150
- if (result === 1) {
151
- yield fs__default["default"].remove(appPath);
152
- }
153
- }
154
- }));
155
- }
156
- yield logger__default["default"].start('Download template', () => tslib.__awaiter(this, void 0, void 0, function* () {
157
- const { data } = yield axios__default["default"].get(`https://github.com/d8corp/innetjs-templates/archive/refs/heads/${template}.zip`, {
158
- responseType: 'stream',
159
- });
160
- yield new Promise((resolve, reject) => {
161
- data.pipe(extract.Extract({
162
- path: appPath,
163
- }, template)).on('finish', resolve).on('error', reject);
164
- });
165
- }));
166
- yield logger__default["default"].start('Install packages', () => execAsync(`cd ${appPath} && npm i`));
167
- });
168
- }
169
- build({ node = false, inject = false, index = 'index' } = {}) {
170
- return tslib.__awaiter(this, void 0, void 0, function* () {
171
- const input = glob__default["default"].sync(`src/${index}.{${indexExt}}`);
172
- if (!input.length) {
173
- throw Error('index file is not detected');
174
- }
175
- yield logger__default["default"].start('Remove build', () => fs__default["default"].remove(this.buildFolder));
176
- const pkg = node && (yield this.getPackage());
177
- const options = {
178
- input,
179
- preserveEntrySignatures: 'strict',
180
- plugins: [
181
- commonjs__default["default"](),
182
- json__default["default"](),
183
- ts__default["default"]({
184
- typescript: typescript__default["default"],
185
- noEmitOnError: true,
186
- compilerOptions: {
187
- declaration: false,
188
- },
189
- }),
190
- jsx__default["default"](),
191
- ],
192
- onwarn(warning, warn) {
193
- if (warning.code === 'THIS_IS_UNDEFINED' || warning.code === 'SOURCEMAP_ERROR')
194
- return;
195
- warn(warning);
196
- },
197
- };
198
- this.withLint(options, true);
199
- const outputOptions = {
200
- dir: this.buildFolder,
201
- sourcemap: this.sourcemap,
202
- };
203
- if (node) {
204
- outputOptions.format = 'cjs';
205
- options.external = Object.keys((pkg === null || pkg === void 0 ? void 0 : pkg.dependencies) || {});
206
- options.plugins.push(pluginNodeResolve.nodeResolve(), string({
207
- include: '**/*.*',
208
- exclude: constants.stringExcludeNode,
209
- }));
210
- }
211
- else {
212
- options.plugins.push(pluginNodeResolve.nodeResolve({
213
- browser: true,
214
- }), polyfill__default["default"](), importAssets({
215
- include: constants.imageInclude.map(img => `src/${img}`),
216
- publicPath: this.baseUrl,
217
- }), styles__default["default"]({
218
- mode: this.cssInJs ? 'inject' : 'extract',
219
- url: {
220
- inline: false,
221
- publicPath: `${this.baseUrl}assets`,
222
- },
223
- plugins: [autoprefixer__default["default"]()],
224
- autoModules: this.cssModules ? (id) => !id.includes('.global.') : true,
225
- sourceMap: this.sourcemap,
226
- minimize: true,
227
- }), string({
228
- include: '**/*.*',
229
- exclude: constants.stringExcludeDom,
230
- }));
231
- outputOptions.format = 'es';
232
- outputOptions.plugins = [
233
- rollupPluginTerser.terser(),
234
- filesize__default["default"]({
235
- reporter: helpers.reporter,
236
- }),
237
- ];
238
- }
239
- this.withEnv(options, true);
240
- yield logger__default["default"].start('Build production bundle', () => tslib.__awaiter(this, void 0, void 0, function* () {
241
- const bundle = yield rollup__default["default"].rollup(options);
242
- yield bundle.write(outputOptions);
243
- yield bundle.close();
244
- if (!node) {
245
- yield copyFiles(this.publicFolder, this.buildFolder);
246
- const data = yield fs.promises.readFile(this.publicIndexFile);
247
- const pkg = yield this.getPackage();
248
- yield fs.promises.writeFile(this.buildIndexFile, yield helpers.convertIndexFile(data, pkg.version, this.baseUrl, path__default["default"].parse(input[0]).name, inject));
249
- }
250
- }));
251
- if (pkg) {
252
- yield logger__default["default"].start('Copy package.json', () => tslib.__awaiter(this, void 0, void 0, function* () {
253
- const data = Object.assign({}, pkg);
254
- delete data.private;
255
- delete data.devDependencies;
256
- yield fs__default["default"].writeFile(path__default["default"].resolve(this.buildFolder, 'package.json'), JSON.stringify(data, undefined, 2), 'UTF-8');
257
- }));
258
- const pkgLockPath = path__default["default"].resolve(this.projectFolder, 'package-lock.json');
259
- if (fs__default["default"].existsSync(pkgLockPath)) {
260
- yield logger__default["default"].start('Copy package-lock.json', () => {
261
- return fs__default["default"].copy(pkgLockPath, path__default["default"].resolve(this.buildFolder, 'package-lock.json'));
262
- });
263
- }
264
- }
265
- });
266
- }
267
- start({ node = false, inject = false, error = false, index = 'index' } = {}) {
268
- return tslib.__awaiter(this, void 0, void 0, function* () {
269
- const pkg = yield this.getPackage();
270
- const input = glob__default["default"].sync(`src/${index}.{${indexExt}}`);
271
- if (!input.length) {
272
- throw Error('index file is not detected');
273
- }
274
- yield logger__default["default"].start('Remove build', () => fs__default["default"].remove(this.devBuildFolder));
275
- const options = {
276
- input,
277
- preserveEntrySignatures: 'strict',
278
- output: {
279
- dir: this.devBuildFolder,
280
- sourcemap: true,
281
- },
282
- plugins: [
283
- commonjs__default["default"](),
284
- json__default["default"](),
285
- ts__default["default"]({
286
- typescript: typescript__default["default"],
287
- compilerOptions: {
288
- declaration: false,
289
- sourceMap: true,
290
- },
291
- }),
292
- jsx__default["default"](),
293
- ],
294
- onwarn(warning, warn) {
295
- if (warning.code === 'THIS_IS_UNDEFINED' || warning.code === 'SOURCEMAP_ERROR')
296
- return;
297
- if (warning.plugin === 'typescript') {
298
- const { loc: { line, column, file }, frame, message } = warning;
299
- console.log(`ERROR in ${file}:${line}:${column}`);
300
- console.log(message);
301
- console.log(frame);
302
- return;
303
- }
304
- warn(warning);
305
- },
306
- };
307
- this.withLint(options);
308
- if (node) {
309
- // @ts-expect-error
310
- options.output.format = 'cjs';
311
- options.external = Object.keys((pkg === null || pkg === void 0 ? void 0 : pkg.dependencies) || {});
312
- options.plugins.push(pluginNodeResolve.nodeResolve(), string({
313
- include: '**/*.*',
314
- exclude: constants.stringExcludeNode,
315
- }), this.createServer());
316
- }
317
- else {
318
- const key = path__default["default"].basename(this.sslKey) !== this.sslKey
319
- ? this.sslKey
320
- : fs__default["default"].existsSync(this.sslKey)
321
- ? fs__default["default"].readFileSync(this.sslKey)
322
- : undefined;
323
- const cert = path__default["default"].basename(this.sslCrt) !== this.sslCrt
324
- ? this.sslCrt
325
- : fs__default["default"].existsSync(this.sslCrt)
326
- ? fs__default["default"].readFileSync(this.sslCrt)
327
- : undefined;
328
- // @ts-expect-error
329
- options.output.format = 'es';
330
- options.plugins.push(pluginNodeResolve.nodeResolve({
331
- browser: true,
332
- }), polyfill__default["default"](), importAssets({
333
- include: constants.imageInclude.map(img => `src/${img}`),
334
- publicPath: this.baseUrl,
335
- }), styles__default["default"]({
336
- mode: this.cssInJs ? 'inject' : 'extract',
337
- url: {
338
- inline: false,
339
- publicPath: `${this.baseUrl}assets`,
340
- },
341
- plugins: [autoprefixer__default["default"]()],
342
- autoModules: this.cssModules ? (id) => !id.includes('.global.') : true,
343
- sourceMap: true,
344
- }), string({
345
- include: '**/*.*',
346
- exclude: constants.stringExcludeDom,
347
- }), this.createClient(key, cert, pkg, path__default["default"].parse(input[0]).name, inject), 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 } } : {}))));
348
- }
349
- this.withEnv(options, true);
350
- const watcher = rollup__default["default"].watch(options);
351
- watcher.on('event', (e) => tslib.__awaiter(this, void 0, void 0, function* () {
352
- if (e.code === 'ERROR') {
353
- if (e.error.code === 'UNRESOLVED_IMPORT') {
354
- const [, importer, file] = e.error.message.match(/^Could not resolve '(.+)' from (.+)$/) || [];
355
- const text = (yield fs__default["default"].readFile(file)).toString();
356
- const lines = new linesAndColumns.LinesAndColumns(text);
357
- const { line, column } = lines.locationForIndex(text.indexOf(importer));
358
- logger__default["default"].end('Bundling', e.error.message);
359
- console.log(`ERROR in ${file}:${line + 1}:${column + 1}`);
360
- }
361
- else if (e.error.code === 'PLUGIN_ERROR' && ['rpt2', 'commonjs', 'typescript'].includes(e.error.plugin)) {
362
- const [, file, line, column] = e.error.message
363
- .replace(REG_CLEAR_TEXT, '')
364
- .match(REG_RPT_ERROR_FILE) || [];
365
- logger__default["default"].end('Bundling', e.error.message);
366
- if (file) {
367
- console.log(`ERROR in ${file}:${line}:${column}`);
368
- }
369
- else if (e.error.loc) {
370
- console.log(`ERROR in ${e.error.loc.file}:${e.error.loc.line}:${e.error.loc.column}`);
371
- console.log(e.error.frame);
372
- }
373
- }
374
- else {
375
- logger__default["default"].end('Bundling', error ? e.error.stack : e.error.message);
376
- }
377
- }
378
- else if (e.code === 'BUNDLE_START') {
379
- logger__default["default"].start('Bundling');
380
- }
381
- else if (e.code === 'BUNDLE_END') {
382
- logger__default["default"].end('Bundling');
383
- }
384
- }));
385
- });
386
- }
387
- run(file) {
388
- return tslib.__awaiter(this, void 0, void 0, function* () {
389
- const input = yield logger__default["default"].start('Check file', () => helpers.getFile(file));
390
- const folder = yield new Promise((resolve, reject) => {
391
- tmp__default["default"].dir((err, folder) => {
392
- if (err) {
393
- reject(err);
394
- }
395
- else {
396
- resolve(folder);
397
- }
398
- });
399
- });
400
- const jsFilePath = `${folder}/index.js`;
401
- yield logger__default["default"].start('Build bundle', () => tslib.__awaiter(this, void 0, void 0, function* () {
402
- const inputOptions = {
403
- input,
404
- plugins: [
405
- commonjs__default["default"](),
406
- pluginNodeResolve.nodeResolve(),
407
- json__default["default"](),
408
- ts__default["default"]({
409
- typescript: typescript__default["default"],
410
- tsconfigOverride: {
411
- compilerOptions: {
412
- sourceMap: true,
413
- },
414
- },
415
- }),
416
- ],
417
- };
418
- const outputOptions = {
419
- format: 'cjs',
420
- file: jsFilePath,
421
- sourcemap: true,
422
- };
423
- const bundle = yield rollup__default["default"].rollup(inputOptions);
424
- yield bundle.write(outputOptions);
425
- yield bundle.close();
426
- }));
427
- yield logger__default["default"].start('Running of the script', () => tslib.__awaiter(this, void 0, void 0, function* () {
428
- spawn('node', ['-r', 'source-map-support/register', jsFilePath], { stdio: 'inherit' });
429
- }));
430
- });
431
- }
432
- release({ index = 'index', pub } = {}) {
433
- return tslib.__awaiter(this, void 0, void 0, function* () {
434
- const { releaseFolder, cssModules } = this;
435
- yield logger__default["default"].start('Remove previous release', () => fs__default["default"].remove(releaseFolder));
436
- const pkg = yield this.getPackage();
437
- const build = (format) => tslib.__awaiter(this, void 0, void 0, function* () {
438
- var _a, _b;
439
- const ext = format === 'es'
440
- ? ((_a = (pkg.module || pkg.esnext || pkg['jsnext:main'])) === null || _a === void 0 ? void 0 : _a.replace('index', '')) || '.mjs'
441
- : ((_b = pkg.main) === null || _b === void 0 ? void 0 : _b.replace('index', '')) || '.js';
442
- const input = glob__default["default"].sync(`src/${index}.{${indexExt}}`);
443
- if (!input.length) {
444
- throw Error('index file is not detected');
445
- }
446
- const options = {
447
- input,
448
- external: ['tslib'],
449
- treeshake: false,
450
- output: {
451
- dir: releaseFolder,
452
- entryFileNames: ({ name, facadeModuleId }) => {
453
- if (REG_TJSX.test(facadeModuleId)) {
454
- return `${name}${ext}`;
455
- }
456
- const match = facadeModuleId.match(REG_EXT);
457
- return match ? `${name}${match[0]}${ext}` : `${name}${ext}`;
458
- },
459
- format,
460
- preserveModules: true,
461
- exports: 'named',
462
- },
463
- plugins: [
464
- json__default["default"](),
465
- ts__default["default"]({
466
- typescript: typescript__default["default"],
467
- clean: true,
468
- tsconfigOverride: {
469
- compilerOptions: {
470
- sourceMap: false,
471
- },
472
- include: [...input, 'src/declaration.d.ts'],
473
- },
474
- }),
475
- jsx__default["default"](),
476
- externals__default["default"](),
477
- string({
478
- include: '**/*.*',
479
- exclude: constants.stringExcludeDom,
480
- }),
481
- image__default["default"](),
482
- styles__default["default"]({
483
- mode: this.cssInJs ? 'inject' : 'extract',
484
- plugins: [autoprefixer__default["default"]()],
485
- autoModules: cssModules ? (id) => !id.includes('.global.') : true,
486
- minimize: true,
487
- }),
488
- pluginNodeResolve.nodeResolve(),
489
- external__default["default"](),
490
- ],
491
- };
492
- this.withLint(options);
493
- this.withEnv(options, true);
494
- const bundle = yield rollup__default["default"].rollup(options);
495
- yield bundle.write(options.output);
496
- yield bundle.close();
497
- });
498
- yield logger__default["default"].start('Build cjs bundle', () => tslib.__awaiter(this, void 0, void 0, function* () {
499
- yield build('cjs');
500
- }));
501
- yield logger__default["default"].start('Build es6 bundle', () => tslib.__awaiter(this, void 0, void 0, function* () {
502
- yield build('es');
503
- }));
504
- yield logger__default["default"].start('Copy package.json', () => tslib.__awaiter(this, void 0, void 0, function* () {
505
- const data = Object.assign({}, pkg);
506
- delete data.private;
507
- delete data.devDependencies;
508
- yield fs__default["default"].writeFile(path__default["default"].resolve(this.releaseFolder, 'package.json'), JSON.stringify(data, undefined, 2), 'UTF-8');
509
- }));
510
- if (pkg.bin) {
511
- yield logger__default["default"].start('Build bin', () => tslib.__awaiter(this, void 0, void 0, function* () {
512
- const { bin } = pkg;
513
- for (const name in bin) {
514
- const value = bin[name];
515
- const input = glob__default["default"].sync(`src/${value}.{${indexExt}}`);
516
- const file = path__default["default"].join(this.releaseFolder, value);
517
- const options = {
518
- input,
519
- external: [...Object.keys(pkg.dependencies), 'tslib'],
520
- output: {
521
- file,
522
- format: 'cjs',
523
- },
524
- plugins: [
525
- rollupPluginPreserveShebangs.preserveShebangs(),
526
- json__default["default"](),
527
- ts__default["default"]({
528
- typescript: typescript__default["default"],
529
- clean: true,
530
- tsconfigOverride: {
531
- compilerOptions: {
532
- declaration: false,
533
- },
534
- },
535
- }),
536
- externals__default["default"](),
537
- jsx__default["default"](),
538
- ],
539
- };
540
- this.withLint(options);
541
- this.withEnv(options);
542
- const bundle = yield rollup__default["default"].rollup(options);
543
- yield bundle.write(options.output);
544
- yield bundle.close();
545
- }
546
- }));
547
- }
548
- if (fs__default["default"].existsSync(this.licenseFile)) {
549
- yield logger__default["default"].start('Copy license', () => tslib.__awaiter(this, void 0, void 0, function* () {
550
- yield fs.promises.copyFile(this.licenseFile, this.licenseReleaseFile);
551
- }));
552
- }
553
- if (fs__default["default"].existsSync(this.readmeFile)) {
554
- yield logger__default["default"].start('Copy readme', () => tslib.__awaiter(this, void 0, void 0, function* () {
555
- yield fs.promises.copyFile(this.readmeFile, this.readmeReleaseFile);
556
- }));
557
- }
558
- if (fs__default["default"].existsSync(this.declarationFile)) {
559
- yield logger__default["default"].start('Copy declaration', () => tslib.__awaiter(this, void 0, void 0, function* () {
560
- yield fs.promises.copyFile(this.declarationFile, this.declarationReleaseFile);
561
- }));
562
- }
563
- if (pub) {
564
- const date = (Date.now() / 1000) | 0;
565
- yield logger__default["default"].start(`publishing v${pkg.version} ${date}`, () => tslib.__awaiter(this, void 0, void 0, function* () {
566
- yield execAsync(`npm publish ${this.releaseFolder}`);
567
- }));
568
- }
569
- });
570
- }
571
- withLint(options, prod = false) {
572
- if (this._lintUsage === undefined) {
573
- this._lintUsage = fs__default["default"].existsSync(path__default["default"].join(this.projectFolder, '.eslintrc'));
574
- }
575
- if (this._lintUsage) {
576
- options.plugins.push(eslint__default["default"]({
577
- include: constants.lintInclude,
578
- throwOnError: prod,
579
- }));
580
- }
581
- }
582
- withEnv(options, virtual) {
583
- options.plugins.push(env__default["default"](this.envPrefix, {
584
- include: options.input,
585
- virtual,
586
- }));
587
- }
588
- increaseVersion(release) {
589
- return tslib.__awaiter(this, void 0, void 0, function* () {
590
- const pkg = yield this.getPackage();
591
- yield logger__default["default"].start('Prepare package.json', () => tslib.__awaiter(this, void 0, void 0, function* () {
592
- const version = pkg.version.split('.');
593
- switch (release) {
594
- case 'patch': {
595
- version[2]++;
596
- break;
597
- }
598
- case 'minor': {
599
- version[1]++;
600
- version[2] = 0;
601
- break;
602
- }
603
- case 'major': {
604
- version[1] = 0;
605
- version[2] = 0;
606
- version[0]++;
607
- break;
608
- }
609
- default: return;
610
- }
611
- pkg.version = version.join('.');
612
- yield fs__default["default"].writeFile(path__default["default"].resolve(this.projectFolder, 'package.json'), JSON.stringify(pkg, undefined, 2), 'UTF-8');
613
- }));
614
- });
615
- }
616
- getPackage() {
617
- return tslib.__awaiter(this, void 0, void 0, function* () {
618
- if (this.package) {
619
- return this.package;
620
- }
621
- const packageFolder = path__default["default"].resolve(this.projectFolder, 'package.json');
622
- yield logger__default["default"].start('Check package.json', () => tslib.__awaiter(this, void 0, void 0, function* () {
623
- if (fs__default["default"].existsSync(packageFolder)) {
624
- this.package = yield fs__default["default"].readJson(packageFolder);
625
- }
626
- }));
627
- return this.package;
628
- });
629
- }
630
- createClient(key, cert, pkg, index, inject) {
631
- let app;
632
- return {
633
- name: 'client',
634
- writeBundle: () => tslib.__awaiter(this, void 0, void 0, function* () {
635
- var _a;
636
- if (!app) {
637
- app = express__default["default"]();
638
- const update = () => tslib.__awaiter(this, void 0, void 0, function* () {
639
- const data = yield fs.promises.readFile(this.publicIndexFile);
640
- yield fs.promises.writeFile(this.devBuildIndexFile, yield helpers.convertIndexFile(data, pkg.version, this.baseUrl, index, inject));
641
- });
642
- fs__default["default"].watch(this.publicIndexFile, update);
643
- yield update();
644
- const httpsUsing = !!(cert && key);
645
- app.use(this.baseUrl, express__default["default"].static(this.devBuildFolder));
646
- app.use(this.baseUrl, express__default["default"].static(this.publicFolder));
647
- if ((_a = this.proxy) === null || _a === void 0 ? void 0 : _a.startsWith('http')) {
648
- if (this.simulateIP) {
649
- app.use((req, res, next) => {
650
- req.headers['X-Real-IP'] = this.simulateIP;
651
- next();
652
- });
653
- }
654
- app.use(this.api, proxy__default["default"](this.proxy, {
655
- https: httpsUsing,
656
- limit: '1000mb',
657
- proxyReqPathResolver: req => req.originalUrl,
658
- }));
659
- }
660
- app.use(/^([^.]*|.*\.[^.]{5,})$/, (req, res) => {
661
- res.sendFile(this.devBuildFolder + '/index.html');
662
- });
663
- const server = httpsUsing ? https__default["default"].createServer({ key, cert }, app) : http__default["default"].createServer(app);
664
- let port = this.port;
665
- const listener = () => {
666
- const baseUrl = this.baseUrl === '/' ? '' : this.baseUrl;
667
- console.log(`${chalk__default["default"].green('➤')} Started on http${httpsUsing ? 's' : ''}://localhost:${port}${baseUrl} and http${httpsUsing ? 's' : ''}://${address__default["default"].ip()}:${port}${baseUrl}`);
668
- };
669
- server.listen(port, listener);
670
- server.on('error', (e) => tslib.__awaiter(this, void 0, void 0, function* () {
671
- if (e.code === 'EADDRINUSE') {
672
- port++;
673
- const { userPort } = yield prompt__default["default"]({
674
- name: 'userPort',
675
- type: 'number',
676
- message: `Port ${e.port} is reserved, please enter another one [${port}]:`,
677
- });
678
- if (userPort) {
679
- port = userPort;
680
- }
681
- server.listen(port);
682
- }
683
- else {
684
- throw e;
685
- }
686
- }));
687
- }
688
- }),
689
- };
690
- }
691
- createServer() {
692
- let app;
693
- return {
694
- name: 'server',
695
- writeBundle: () => tslib.__awaiter(this, void 0, void 0, function* () {
696
- app === null || app === void 0 ? void 0 : app.kill();
697
- const filePath = path__default["default"].resolve(this.devBuildFolder, 'index.js');
698
- app = spawn('node', ['-r', 'source-map-support/register', filePath], { stdio: 'inherit' });
699
- }),
700
- };
701
- }
78
+ const livereload = require('rollup-plugin-livereload');
79
+ const { string } = require('rollup-plugin-string');
80
+ const { exec, spawn } = require('child_process');
81
+ const readline = require('readline');
82
+ const importAssets = require('rollup-plugin-import-assets');
83
+ const execAsync = node_util.promisify(exec);
84
+ const copyFiles = node_util.promisify(fs__default["default"].copy);
85
+ const pipeline = node_util.promisify(stream__default["default"].pipeline);
86
+ updateDotenv.updateDotenv();
87
+ const REG_CLEAR_TEXT = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
88
+ const REG_RPT_ERROR_FILE = /(src[^:]+):(\d+):(\d+)/;
89
+ const REG_TJSX = /\.[tj]sx?$/;
90
+ const REG_EXT = /\.([^.]+)$/;
91
+ const scriptExtensions = ['ts', 'js', 'tsx', 'jsx'];
92
+ const indexExt = scriptExtensions.join(',');
93
+ class InnetJS {
94
+ constructor({ envPrefix = process.env.INNETJS_ENV_PREFIX || 'INNETJS_', 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 || '', simulateIP = process.env.IP, port = process.env.PORT ? +process.env.PORT : 3000, api = process.env.API || '/api/?*', } = {}) {
95
+ this.projectFolder = path__default["default"].resolve(projectFolder);
96
+ this.publicFolder = path__default["default"].resolve(publicFolder);
97
+ this.releaseFolder = path__default["default"].resolve(releaseFolder);
98
+ this.buildFolder = path__default["default"].resolve(buildFolder);
99
+ this.srcFolder = path__default["default"].resolve(srcFolder);
100
+ this.licenseFile = path__default["default"].join(projectFolder, 'LICENSE');
101
+ this.licenseReleaseFile = path__default["default"].join(releaseFolder, 'LICENSE');
102
+ this.readmeFile = path__default["default"].join(projectFolder, 'README.md');
103
+ this.readmeReleaseFile = path__default["default"].join(releaseFolder, 'README.md');
104
+ this.declarationFile = path__default["default"].join(srcFolder, 'declaration.d.ts');
105
+ this.declarationReleaseFile = path__default["default"].join(releaseFolder, 'declaration.d.ts');
106
+ this.publicIndexFile = path__default["default"].join(publicFolder, 'index.html');
107
+ this.buildIndexFile = path__default["default"].join(buildFolder, 'index.html');
108
+ this.devBuildFolder = path__default["default"].resolve(projectFolder, 'node_modules', '.cache', 'innetjs', 'build');
109
+ this.devBuildIndexFile = path__default["default"].join(this.devBuildFolder, 'index.html');
110
+ this.sourcemap = sourcemap;
111
+ this.cssModules = cssModules;
112
+ this.cssInJs = cssInJs;
113
+ this.sslKey = sslKey;
114
+ this.sslCrt = sslCrt;
115
+ this.port = port;
116
+ this.proxy = proxy;
117
+ this.api = api;
118
+ this.baseUrl = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;
119
+ this.envPrefix = envPrefix;
120
+ this.simulateIP = simulateIP;
121
+ }
122
+ // Methods
123
+ init(appName, { template, force = false } = {}) {
124
+ return tslib.__awaiter(this, void 0, void 0, function* () {
125
+ const appPath = path__default["default"].resolve(appName);
126
+ const { data } = yield logger__default["default"].start('Get templates list', () => tslib.__awaiter(this, void 0, void 0, function* () { return yield axios__default["default"].get('https://api.github.com/repos/d8corp/innetjs-templates/branches'); }));
127
+ const templates = data.map(({ name }) => name).filter(name => name !== 'main');
128
+ if (!template || !templates.includes(template)) {
129
+ logger__default["default"].log(chalk__default["default"].green('Select one of those templates'));
130
+ const { value } = yield selector__default["default"]({
131
+ values: templates,
132
+ });
133
+ template = value;
134
+ readline.moveCursor(process.stdout, 0, -1);
135
+ const text = `Selected template: ${chalk__default["default"].white(value)}`;
136
+ logger__default["default"].start(text);
137
+ logger__default["default"].end(text);
138
+ }
139
+ if (!force) {
140
+ yield logger__default["default"].start('Check if app folder is available', () => tslib.__awaiter(this, void 0, void 0, function* () {
141
+ if (fs__default["default"].existsSync(appPath)) {
142
+ logger__default["default"].log(chalk__default["default"].red(`'${appPath}' already exist, what do you want?`));
143
+ const { id: result, value } = yield selector__default["default"]({
144
+ values: ['Stop the process', 'Remove the folder', 'Merge with template'],
145
+ });
146
+ readline.moveCursor(process.stdout, 0, -1);
147
+ logger__default["default"].log(`Already exist, selected: ${value}`);
148
+ if (!result) {
149
+ throw Error(`'${appPath}' already exist`);
150
+ }
151
+ if (result === 1) {
152
+ yield fs__default["default"].remove(appPath);
153
+ }
154
+ }
155
+ }));
156
+ }
157
+ yield logger__default["default"].start('Download template', () => tslib.__awaiter(this, void 0, void 0, function* () {
158
+ if (!fs__default["default"].existsSync(appPath)) {
159
+ fs__default["default"].mkdirSync(appPath);
160
+ }
161
+ const zipPath = path__default["default"].join(appPath, 'template.zip');
162
+ const unzipPath = path__default["default"].join(appPath, `innetjs-templates-${template}`);
163
+ const { data } = yield axios__default["default"].get(`https://github.com/d8corp/innetjs-templates/archive/refs/heads/${template}.zip`, {
164
+ responseType: 'stream',
165
+ });
166
+ yield pipeline(data, fs__default["default"].createWriteStream(zipPath));
167
+ yield new Promise((resolve, reject) => {
168
+ fs__default["default"].createReadStream(zipPath)
169
+ .pipe(unzipper.Extract({ path: appPath }))
170
+ .on('finish', resolve).on('error', reject);
171
+ });
172
+ yield fs__default["default"].remove(zipPath);
173
+ yield fs__default["default"].move(unzipPath, appPath);
174
+ }));
175
+ yield logger__default["default"].start('Install packages', () => execAsync(`cd ${appPath} && npm i`));
176
+ });
177
+ }
178
+ build({ node = false, inject = false, index = 'index' } = {}) {
179
+ return tslib.__awaiter(this, void 0, void 0, function* () {
180
+ const input = glob__default["default"].sync(`src/${index}.{${indexExt}}`);
181
+ if (!input.length) {
182
+ throw Error('index file is not detected');
183
+ }
184
+ yield logger__default["default"].start('Remove build', () => fs__default["default"].remove(this.buildFolder));
185
+ const pkg = node && (yield this.getPackage());
186
+ const options = {
187
+ input,
188
+ preserveEntrySignatures: 'strict',
189
+ plugins: [
190
+ commonjs__default["default"](),
191
+ json__default["default"](),
192
+ ts__default["default"]({
193
+ noEmitOnError: true,
194
+ compilerOptions: {
195
+ declaration: false,
196
+ },
197
+ }),
198
+ jsx__default["default"](),
199
+ ],
200
+ onwarn(warning, warn) {
201
+ if (warning.code === 'THIS_IS_UNDEFINED' || warning.code === 'SOURCEMAP_ERROR')
202
+ return;
203
+ warn(warning);
204
+ },
205
+ };
206
+ this.withLint(options, true);
207
+ const outputOptions = {
208
+ dir: this.buildFolder,
209
+ sourcemap: this.sourcemap,
210
+ };
211
+ if (node) {
212
+ outputOptions.format = 'cjs';
213
+ options.external = Object.keys((pkg === null || pkg === void 0 ? void 0 : pkg.dependencies) || {});
214
+ options.plugins.push(pluginNodeResolve.nodeResolve(), string({
215
+ include: '**/*.*',
216
+ exclude: constants.stringExcludeNode,
217
+ }));
218
+ }
219
+ else {
220
+ options.plugins.push(pluginNodeResolve.nodeResolve({
221
+ browser: true,
222
+ }), polyfill__default["default"](), importAssets({
223
+ include: constants.imageInclude.map(img => `src/${img}`),
224
+ publicPath: this.baseUrl,
225
+ }), styles__default["default"]({
226
+ mode: this.cssInJs ? 'inject' : 'extract',
227
+ url: {
228
+ inline: false,
229
+ publicPath: `${this.baseUrl}assets`,
230
+ },
231
+ plugins: [autoprefixer__default["default"]()],
232
+ autoModules: this.cssModules ? (id) => !id.includes('.global.') : true,
233
+ sourceMap: this.sourcemap,
234
+ minimize: true,
235
+ }), string({
236
+ include: '**/*.*',
237
+ exclude: constants.stringExcludeDom,
238
+ }));
239
+ outputOptions.format = 'es';
240
+ outputOptions.plugins = [
241
+ rollupPluginTerser.terser(),
242
+ filesize__default["default"]({
243
+ reporter: helpers.reporter,
244
+ }),
245
+ ];
246
+ }
247
+ this.withEnv(options, true);
248
+ yield logger__default["default"].start('Build production bundle', () => tslib.__awaiter(this, void 0, void 0, function* () {
249
+ const bundle = yield rollup__default["default"].rollup(options);
250
+ yield bundle.write(outputOptions);
251
+ yield bundle.close();
252
+ if (!node) {
253
+ yield copyFiles(this.publicFolder, this.buildFolder);
254
+ const data = yield fs.promises.readFile(this.publicIndexFile);
255
+ const pkg = yield this.getPackage();
256
+ yield fs.promises.writeFile(this.buildIndexFile, yield helpers.convertIndexFile(data, pkg.version, this.baseUrl, path__default["default"].parse(input[0]).name, inject));
257
+ }
258
+ }));
259
+ if (pkg) {
260
+ yield logger__default["default"].start('Copy package.json', () => tslib.__awaiter(this, void 0, void 0, function* () {
261
+ const data = Object.assign({}, pkg);
262
+ delete data.private;
263
+ delete data.devDependencies;
264
+ yield fs__default["default"].writeFile(path__default["default"].resolve(this.buildFolder, 'package.json'), JSON.stringify(data, undefined, 2), 'UTF-8');
265
+ }));
266
+ const pkgLockPath = path__default["default"].resolve(this.projectFolder, 'package-lock.json');
267
+ if (fs__default["default"].existsSync(pkgLockPath)) {
268
+ yield logger__default["default"].start('Copy package-lock.json', () => {
269
+ return fs__default["default"].copy(pkgLockPath, path__default["default"].resolve(this.buildFolder, 'package-lock.json'));
270
+ });
271
+ }
272
+ }
273
+ });
274
+ }
275
+ start({ node = false, inject = false, error = false, index = 'index' } = {}) {
276
+ return tslib.__awaiter(this, void 0, void 0, function* () {
277
+ const pkg = yield this.getPackage();
278
+ const input = glob__default["default"].sync(`src/${index}.{${indexExt}}`);
279
+ if (!input.length) {
280
+ throw Error('index file is not detected');
281
+ }
282
+ yield logger__default["default"].start('Remove build', () => fs__default["default"].remove(this.devBuildFolder));
283
+ const options = {
284
+ input,
285
+ preserveEntrySignatures: 'strict',
286
+ output: {
287
+ dir: this.devBuildFolder,
288
+ sourcemap: true,
289
+ },
290
+ plugins: [
291
+ commonjs__default["default"](),
292
+ json__default["default"](),
293
+ ts__default["default"]({
294
+ compilerOptions: {
295
+ declaration: false,
296
+ sourceMap: true,
297
+ },
298
+ }),
299
+ jsx__default["default"](),
300
+ ],
301
+ onwarn(warning, warn) {
302
+ if (warning.code === 'THIS_IS_UNDEFINED' || warning.code === 'SOURCEMAP_ERROR')
303
+ return;
304
+ if (warning.plugin === 'typescript') {
305
+ const { loc: { line, column, file }, frame, message } = warning;
306
+ console.log(`ERROR in ${file}:${line}:${column}`);
307
+ console.log(message);
308
+ console.log(frame);
309
+ return;
310
+ }
311
+ warn(warning);
312
+ },
313
+ };
314
+ this.withLint(options);
315
+ if (node) {
316
+ // @ts-expect-error
317
+ options.output.format = 'cjs';
318
+ options.external = Object.keys((pkg === null || pkg === void 0 ? void 0 : pkg.dependencies) || {});
319
+ options.plugins.push(pluginNodeResolve.nodeResolve(), string({
320
+ include: '**/*.*',
321
+ exclude: constants.stringExcludeNode,
322
+ }), this.createServer(input));
323
+ }
324
+ else {
325
+ const key = path__default["default"].basename(this.sslKey) !== this.sslKey
326
+ ? this.sslKey
327
+ : fs__default["default"].existsSync(this.sslKey)
328
+ ? fs__default["default"].readFileSync(this.sslKey)
329
+ : undefined;
330
+ const cert = path__default["default"].basename(this.sslCrt) !== this.sslCrt
331
+ ? this.sslCrt
332
+ : fs__default["default"].existsSync(this.sslCrt)
333
+ ? fs__default["default"].readFileSync(this.sslCrt)
334
+ : undefined;
335
+ // @ts-expect-error
336
+ options.output.format = 'es';
337
+ options.plugins.push(pluginNodeResolve.nodeResolve({
338
+ browser: true,
339
+ }), polyfill__default["default"](), importAssets({
340
+ include: constants.imageInclude.map(img => `src/${img}`),
341
+ publicPath: this.baseUrl,
342
+ }), styles__default["default"]({
343
+ mode: this.cssInJs ? 'inject' : 'extract',
344
+ url: {
345
+ inline: false,
346
+ publicPath: `${this.baseUrl}assets`,
347
+ },
348
+ plugins: [autoprefixer__default["default"]()],
349
+ autoModules: this.cssModules ? (id) => !id.includes('.global.') : true,
350
+ sourceMap: true,
351
+ }), string({
352
+ include: '**/*.*',
353
+ exclude: constants.stringExcludeDom,
354
+ }), this.createClient(key, cert, pkg, path__default["default"].parse(input[0]).name, inject), 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 } } : {}))));
355
+ }
356
+ this.withEnv(options, true);
357
+ const watcher = rollup__default["default"].watch(options);
358
+ watcher.on('event', (e) => tslib.__awaiter(this, void 0, void 0, function* () {
359
+ if (e.code === 'ERROR') {
360
+ if (e.error.code === 'UNRESOLVED_IMPORT') {
361
+ const [, importer, file] = e.error.message.match(/^Could not resolve '(.+)' from (.+)$/) || [];
362
+ const text = (yield fs__default["default"].readFile(file)).toString();
363
+ const lines = new linesAndColumns.LinesAndColumns(text);
364
+ const { line, column } = lines.locationForIndex(text.indexOf(importer));
365
+ logger__default["default"].end('Bundling', e.error.message);
366
+ console.log(`ERROR in ${file}:${line + 1}:${column + 1}`);
367
+ }
368
+ else if (e.error.code === 'PLUGIN_ERROR' && ['rpt2', 'commonjs', 'typescript'].includes(e.error.plugin)) {
369
+ const [, file, line, column] = e.error.message
370
+ .replace(REG_CLEAR_TEXT, '')
371
+ .match(REG_RPT_ERROR_FILE) || [];
372
+ logger__default["default"].end('Bundling', e.error.message);
373
+ if (file) {
374
+ console.log(`ERROR in ${file}:${line}:${column}`);
375
+ }
376
+ else if (e.error.loc) {
377
+ console.log(`ERROR in ${e.error.loc.file}:${e.error.loc.line}:${e.error.loc.column}`);
378
+ console.log(e.error.frame);
379
+ }
380
+ }
381
+ else {
382
+ logger__default["default"].end('Bundling', error ? e.error.stack : e.error.message);
383
+ }
384
+ }
385
+ else if (e.code === 'BUNDLE_START') {
386
+ logger__default["default"].start('Bundling');
387
+ }
388
+ else if (e.code === 'BUNDLE_END') {
389
+ logger__default["default"].end('Bundling');
390
+ }
391
+ }));
392
+ });
393
+ }
394
+ run(file) {
395
+ return tslib.__awaiter(this, void 0, void 0, function* () {
396
+ const input = yield logger__default["default"].start('Check file', () => helpers.getFile(file));
397
+ const folder = yield new Promise((resolve, reject) => {
398
+ tmp__default["default"].dir((err, folder) => {
399
+ if (err) {
400
+ reject(err);
401
+ }
402
+ else {
403
+ resolve(folder);
404
+ }
405
+ });
406
+ });
407
+ const jsFilePath = `${folder}/index.js`;
408
+ yield logger__default["default"].start('Build bundle', () => tslib.__awaiter(this, void 0, void 0, function* () {
409
+ const inputOptions = {
410
+ input,
411
+ plugins: [
412
+ commonjs__default["default"](),
413
+ pluginNodeResolve.nodeResolve(),
414
+ json__default["default"](),
415
+ ts__default["default"]({
416
+ compilerOptions: {
417
+ sourceMap: true,
418
+ },
419
+ }),
420
+ ],
421
+ };
422
+ const outputOptions = {
423
+ format: 'cjs',
424
+ file: jsFilePath,
425
+ sourcemap: true,
426
+ };
427
+ const bundle = yield rollup__default["default"].rollup(inputOptions);
428
+ yield bundle.write(outputOptions);
429
+ yield bundle.close();
430
+ }));
431
+ yield logger__default["default"].start('Running of the script', () => tslib.__awaiter(this, void 0, void 0, function* () {
432
+ spawn('node', ['-r', 'source-map-support/register', jsFilePath], { stdio: 'inherit' });
433
+ }));
434
+ });
435
+ }
436
+ release({ index = 'index', pub } = {}) {
437
+ return tslib.__awaiter(this, void 0, void 0, function* () {
438
+ const { releaseFolder, cssModules } = this;
439
+ yield logger__default["default"].start('Remove previous release', () => fs__default["default"].remove(releaseFolder));
440
+ const pkg = yield this.getPackage();
441
+ const build = (format) => tslib.__awaiter(this, void 0, void 0, function* () {
442
+ var _a, _b;
443
+ const ext = format === 'es'
444
+ ? ((_a = (pkg.module || pkg.esnext || pkg['jsnext:main'])) === null || _a === void 0 ? void 0 : _a.replace('index', '')) || '.mjs'
445
+ : ((_b = pkg.main) === null || _b === void 0 ? void 0 : _b.replace('index', '')) || '.js';
446
+ const input = glob__default["default"].sync(`src/${index}.{${indexExt}}`);
447
+ if (!input.length) {
448
+ throw Error('index file is not detected');
449
+ }
450
+ const options = {
451
+ input,
452
+ external: ['tslib'],
453
+ treeshake: false,
454
+ output: {
455
+ dir: releaseFolder,
456
+ entryFileNames: ({ name, facadeModuleId }) => {
457
+ if (REG_TJSX.test(facadeModuleId)) {
458
+ return `${name}${ext}`;
459
+ }
460
+ const match = facadeModuleId.match(REG_EXT);
461
+ return match ? `${name}${match[0]}${ext}` : `${name}${ext}`;
462
+ },
463
+ format,
464
+ preserveModules: true,
465
+ exports: 'named',
466
+ },
467
+ plugins: [
468
+ json__default["default"](),
469
+ ts__default["default"]({
470
+ compilerOptions: {
471
+ sourceMap: false,
472
+ outDir: releaseFolder,
473
+ },
474
+ }),
475
+ jsx__default["default"](),
476
+ externals__default["default"](),
477
+ string({
478
+ include: '**/*.*',
479
+ exclude: constants.stringExcludeDom,
480
+ }),
481
+ image__default["default"](),
482
+ styles__default["default"]({
483
+ mode: this.cssInJs ? 'inject' : 'extract',
484
+ plugins: [autoprefixer__default["default"]()],
485
+ autoModules: cssModules ? (id) => !id.includes('.global.') : true,
486
+ minimize: true,
487
+ }),
488
+ pluginNodeResolve.nodeResolve(),
489
+ external__default["default"](),
490
+ ],
491
+ };
492
+ this.withLint(options);
493
+ this.withEnv(options, true);
494
+ const bundle = yield rollup__default["default"].rollup(options);
495
+ yield bundle.write(options.output);
496
+ yield bundle.close();
497
+ });
498
+ yield logger__default["default"].start('Build cjs bundle', () => tslib.__awaiter(this, void 0, void 0, function* () {
499
+ yield build('cjs');
500
+ }));
501
+ yield logger__default["default"].start('Build es6 bundle', () => tslib.__awaiter(this, void 0, void 0, function* () {
502
+ yield build('es');
503
+ }));
504
+ yield logger__default["default"].start('Copy package.json', () => tslib.__awaiter(this, void 0, void 0, function* () {
505
+ const data = Object.assign({}, pkg);
506
+ delete data.private;
507
+ delete data.devDependencies;
508
+ yield fs__default["default"].writeFile(path__default["default"].resolve(this.releaseFolder, 'package.json'), JSON.stringify(data, undefined, 2), 'UTF-8');
509
+ }));
510
+ if (pkg.bin) {
511
+ yield logger__default["default"].start('Build bin', () => tslib.__awaiter(this, void 0, void 0, function* () {
512
+ const { bin } = pkg;
513
+ for (const name in bin) {
514
+ const value = bin[name];
515
+ const input = glob__default["default"].sync(`src/${value}.{${indexExt}}`);
516
+ const file = path__default["default"].join(this.releaseFolder, value);
517
+ const options = {
518
+ input,
519
+ external: [...Object.keys(pkg.dependencies), 'tslib'],
520
+ output: {
521
+ file,
522
+ format: 'cjs',
523
+ },
524
+ plugins: [
525
+ rollupPluginPreserveShebangs.preserveShebangs(),
526
+ json__default["default"](),
527
+ ts__default["default"]({
528
+ compilerOptions: {
529
+ declaration: false,
530
+ },
531
+ }),
532
+ externals__default["default"](),
533
+ jsx__default["default"](),
534
+ ],
535
+ };
536
+ this.withLint(options);
537
+ this.withEnv(options);
538
+ const bundle = yield rollup__default["default"].rollup(options);
539
+ yield bundle.write(options.output);
540
+ yield bundle.close();
541
+ }
542
+ }));
543
+ }
544
+ if (fs__default["default"].existsSync(this.licenseFile)) {
545
+ yield logger__default["default"].start('Copy license', () => tslib.__awaiter(this, void 0, void 0, function* () {
546
+ yield fs.promises.copyFile(this.licenseFile, this.licenseReleaseFile);
547
+ }));
548
+ }
549
+ if (fs__default["default"].existsSync(this.readmeFile)) {
550
+ yield logger__default["default"].start('Copy readme', () => tslib.__awaiter(this, void 0, void 0, function* () {
551
+ yield fs.promises.copyFile(this.readmeFile, this.readmeReleaseFile);
552
+ }));
553
+ }
554
+ if (fs__default["default"].existsSync(this.declarationFile)) {
555
+ yield logger__default["default"].start('Copy declaration', () => tslib.__awaiter(this, void 0, void 0, function* () {
556
+ yield fs.promises.copyFile(this.declarationFile, this.declarationReleaseFile);
557
+ }));
558
+ }
559
+ if (pub) {
560
+ const date = (Date.now() / 1000) | 0;
561
+ yield logger__default["default"].start(`publishing v${pkg.version} ${date}`, () => tslib.__awaiter(this, void 0, void 0, function* () {
562
+ yield execAsync(`npm publish ${this.releaseFolder}`);
563
+ }));
564
+ }
565
+ });
566
+ }
567
+ withLint(options, prod = false) {
568
+ if (this._lintUsage === undefined) {
569
+ this._lintUsage = fs__default["default"].existsSync(path__default["default"].join(this.projectFolder, '.eslintrc'));
570
+ }
571
+ if (this._lintUsage) {
572
+ options.plugins.push(eslint__default["default"]({
573
+ include: constants.lintInclude,
574
+ throwOnError: prod,
575
+ }));
576
+ }
577
+ }
578
+ withEnv(options, virtual) {
579
+ options.plugins.push(env__default["default"](this.envPrefix, {
580
+ include: options.input,
581
+ virtual,
582
+ }));
583
+ }
584
+ increaseVersion(release) {
585
+ return tslib.__awaiter(this, void 0, void 0, function* () {
586
+ const pkg = yield this.getPackage();
587
+ yield logger__default["default"].start('Prepare package.json', () => tslib.__awaiter(this, void 0, void 0, function* () {
588
+ const version = pkg.version.split('.');
589
+ switch (release) {
590
+ case 'patch': {
591
+ version[2]++;
592
+ break;
593
+ }
594
+ case 'minor': {
595
+ version[1]++;
596
+ version[2] = 0;
597
+ break;
598
+ }
599
+ case 'major': {
600
+ version[1] = 0;
601
+ version[2] = 0;
602
+ version[0]++;
603
+ break;
604
+ }
605
+ default: return;
606
+ }
607
+ pkg.version = version.join('.');
608
+ yield fs__default["default"].writeFile(path__default["default"].resolve(this.projectFolder, 'package.json'), JSON.stringify(pkg, undefined, 2), 'UTF-8');
609
+ }));
610
+ });
611
+ }
612
+ getPackage() {
613
+ return tslib.__awaiter(this, void 0, void 0, function* () {
614
+ if (this.package) {
615
+ return this.package;
616
+ }
617
+ const packageFolder = path__default["default"].resolve(this.projectFolder, 'package.json');
618
+ yield logger__default["default"].start('Check package.json', () => tslib.__awaiter(this, void 0, void 0, function* () {
619
+ if (fs__default["default"].existsSync(packageFolder)) {
620
+ this.package = yield fs__default["default"].readJson(packageFolder);
621
+ }
622
+ }));
623
+ return this.package;
624
+ });
625
+ }
626
+ createClient(key, cert, pkg, index, inject) {
627
+ let app;
628
+ return {
629
+ name: 'client',
630
+ writeBundle: () => tslib.__awaiter(this, void 0, void 0, function* () {
631
+ var _a;
632
+ if (!app) {
633
+ app = express__default["default"]();
634
+ const update = () => tslib.__awaiter(this, void 0, void 0, function* () {
635
+ const data = yield fs.promises.readFile(this.publicIndexFile);
636
+ yield fs.promises.writeFile(this.devBuildIndexFile, yield helpers.convertIndexFile(data, pkg.version, this.baseUrl, index, inject));
637
+ });
638
+ fs__default["default"].watch(this.publicIndexFile, update);
639
+ yield update();
640
+ const httpsUsing = !!(cert && key);
641
+ app.use(this.baseUrl, express__default["default"].static(this.devBuildFolder));
642
+ app.use(this.baseUrl, express__default["default"].static(this.publicFolder));
643
+ if ((_a = this.proxy) === null || _a === void 0 ? void 0 : _a.startsWith('http')) {
644
+ if (this.simulateIP) {
645
+ app.use((req, res, next) => {
646
+ req.headers['X-Real-IP'] = this.simulateIP;
647
+ next();
648
+ });
649
+ }
650
+ app.use(this.api, proxy__default["default"](this.proxy, {
651
+ https: httpsUsing,
652
+ limit: '1000mb',
653
+ proxyReqPathResolver: req => req.originalUrl,
654
+ }));
655
+ }
656
+ app.use(/^([^.]*|.*\.[^.]{5,})$/, (req, res) => {
657
+ res.sendFile(this.devBuildFolder + '/index.html');
658
+ });
659
+ const server = httpsUsing ? https__default["default"].createServer({ key, cert }, app) : http__default["default"].createServer(app);
660
+ let port = this.port;
661
+ const listener = () => {
662
+ const baseUrl = this.baseUrl === '/' ? '' : this.baseUrl;
663
+ console.log(`${chalk__default["default"].green('➤')} Started on http${httpsUsing ? 's' : ''}://localhost:${port}${baseUrl} and http${httpsUsing ? 's' : ''}://${address__default["default"].ip()}:${port}${baseUrl}`);
664
+ };
665
+ server.listen(port, listener);
666
+ server.on('error', (e) => tslib.__awaiter(this, void 0, void 0, function* () {
667
+ if (e.code === 'EADDRINUSE') {
668
+ port++;
669
+ const { userPort } = yield prompt__default["default"]({
670
+ name: 'userPort',
671
+ type: 'number',
672
+ message: `Port ${e.port} is reserved, please enter another one [${port}]:`,
673
+ });
674
+ if (userPort) {
675
+ port = userPort;
676
+ }
677
+ server.listen(port);
678
+ }
679
+ else {
680
+ throw e;
681
+ }
682
+ }));
683
+ }
684
+ }),
685
+ };
686
+ }
687
+ createServer(input) {
688
+ const apps = {};
689
+ return {
690
+ name: 'server',
691
+ writeBundle: () => tslib.__awaiter(this, void 0, void 0, function* () {
692
+ var _a;
693
+ for (const file of input) {
694
+ const { name } = path__default["default"].parse(file);
695
+ (_a = apps[name]) === null || _a === void 0 ? void 0 : _a.kill();
696
+ const filePath = path__default["default"].resolve(this.devBuildFolder, `${name}.js`);
697
+ apps[name] = spawn('node', ['-r', 'source-map-support/register', filePath], { stdio: 'inherit' });
698
+ }
699
+ }),
700
+ };
701
+ }
702
702
  }
703
703
 
704
704
  exports.InnetJS = InnetJS;