amxxpack 1.2.0 → 1.3.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/README.md CHANGED
@@ -64,3 +64,79 @@ npm install -g amxxpack
64
64
  - `amxpack n` - alias to `new` command
65
65
  - `amxpack b` - alias to `build` command
66
66
  - `amxpack c` - alias to `compile` command
67
+
68
+ ## 🦸 Advanced configuration
69
+
70
+ ### Thir-party dependencies
71
+ In case your project requires third-party modules you can specify a link to third-party archives and these archives will be downloaded and extracted to the third-party directory.
72
+ ```json
73
+ {
74
+ "thirdparty": {
75
+ "dir": "./.thirdparty",
76
+ "dependencies": [
77
+ {
78
+ "name": "somemodule",
79
+ "url": "https://website/somemodule-v100.zip"
80
+ }
81
+ ]
82
+ }
83
+ }
84
+ ```
85
+
86
+ configuration above will download `somemodule-v100.zip` archive and extract it to the `./.thirdparty/somemodule` directory then you can use thirparty files in your project. For example add thirparty directory to include list:
87
+ ```json
88
+ {
89
+ "include": [
90
+ "./.thirdparty/somemodule/include"
91
+ ]
92
+ }
93
+ ```
94
+
95
+ ### Multiple directories as an input
96
+ You can use multiple directories as builder inputs, just specify an array of directories in the project configuration. Example:
97
+
98
+ ```json
99
+ {
100
+ "input": {
101
+ "scripts": ["./src/scripts", "./src/extra-scripts"],
102
+ "include": ["./src/include", "./src/extra-include"],
103
+ "assets": ["./assets", "./extra-assets"]
104
+ }
105
+ }
106
+ ```
107
+
108
+ ### Assets filtering and subdirectories
109
+ Using glob filters you can specify which assets should be copied.
110
+
111
+ For example, you can exclude all assets except `*.mdl`:
112
+ ```json
113
+ {
114
+ "input": {
115
+ "assets": [
116
+ { "dir": "./assets", "filter": "*.mdl" }
117
+ ]
118
+ }
119
+ }
120
+ ```
121
+
122
+ or exclude `*.tga` and `*.wav` files:
123
+ ```json
124
+ {
125
+ "input": {
126
+ "assets": [
127
+ { "dir": "./assets", "filter": "*.!(tga|wav)" }
128
+ ]
129
+ }
130
+ }
131
+ ```
132
+
133
+ You can also specify subdirectories for copying. With this configuration the builder will copy all files from `./assets/models` to `./models/myproject` of the project build directory.
134
+ ```json
135
+ {
136
+ "input": {
137
+ "assets": [
138
+ { "dir": "./assets/models", "dest": "./models/myproject" }
139
+ ]
140
+ }
141
+ }
142
+ ```
@@ -1,4 +1,4 @@
1
- import { IProjectConfig } from '../types';
1
+ import { IAssetInput, IResolvedProjectConfig } from '../types';
2
2
  export interface CompileOptions {
3
3
  ignoreErrors?: boolean;
4
4
  noCache?: boolean;
@@ -6,7 +6,7 @@ export interface CompileOptions {
6
6
  export default class AmxxBuilder {
7
7
  private projectConfig;
8
8
  private pluginCache;
9
- constructor(projectConfig: IProjectConfig);
9
+ constructor(projectConfig: IResolvedProjectConfig);
10
10
  build(compileOptions: CompileOptions): Promise<void>;
11
11
  watch(compileOptions: CompileOptions): Promise<void>;
12
12
  buildScripts(compileOptions: CompileOptions): Promise<boolean>;
@@ -17,11 +17,12 @@ export default class AmxxBuilder {
17
17
  watchAssets(): Promise<void>;
18
18
  updatePlugin(srcDir: string, srcFile: string, compileOptions: CompileOptions): Promise<boolean>;
19
19
  updateScript(srcDir: string, srcFile: string): Promise<void>;
20
- updateAsset(srcDir: string, srcFile: string): Promise<void>;
20
+ updateAsset(filePath: string, assetInput: IAssetInput): Promise<void>;
21
21
  updateInclude(filePath: string): Promise<void>;
22
22
  findPlugins(pattern: string): Promise<string[]>;
23
23
  compilePlugin(srcDir: string, srcFile: string, compileOptions?: CompileOptions): Promise<void>;
24
24
  private buildDir;
25
25
  private watchDir;
26
26
  private initPluginCache;
27
+ private execPathFilter;
27
28
  }
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -104,10 +108,10 @@ var AmxxBuilder = /** @class */ (function () {
104
108
  case 4:
105
109
  success = _a.sent();
106
110
  if (success) {
107
- logger_1.default.success('Build finished!');
111
+ logger_1.default.success('Build completed successfully!');
108
112
  }
109
113
  else {
110
- logger_1.default.error('Build finished with errors!');
114
+ logger_1.default.error('Build completed with errors!');
111
115
  }
112
116
  return [3 /*break*/, 6];
113
117
  case 5:
@@ -140,19 +144,18 @@ var AmxxBuilder = /** @class */ (function () {
140
144
  };
141
145
  AmxxBuilder.prototype.buildScripts = function (compileOptions) {
142
146
  return __awaiter(this, void 0, void 0, function () {
143
- var scriptsDirs, success, _loop_1, this_1, _i, scriptsDirs_1, scriptsDir;
147
+ var success, _loop_1, this_1, _i, _a, scriptsDir;
144
148
  var _this = this;
145
- return __generator(this, function (_a) {
146
- switch (_a.label) {
149
+ return __generator(this, function (_b) {
150
+ switch (_b.label) {
147
151
  case 0:
148
- scriptsDirs = (0, lodash_1.castArray)(this.projectConfig.input.scripts);
149
152
  success = true;
150
- _a.label = 1;
153
+ _b.label = 1;
151
154
  case 1:
152
- _a.trys.push([1, , 6, 7]);
155
+ _b.trys.push([1, , 6, 7]);
153
156
  _loop_1 = function (scriptsDir) {
154
- return __generator(this, function (_b) {
155
- switch (_b.label) {
157
+ return __generator(this, function (_c) {
158
+ switch (_c.label) {
156
159
  case 0: return [4 /*yield*/, this_1.buildDir(scriptsDir, constants_1.SCRIPTS_PATH_PATTERN,
157
160
  // eslint-disable-next-line @typescript-eslint/no-loop-func
158
161
  function (filePath) { return __awaiter(_this, void 0, void 0, function () {
@@ -170,21 +173,21 @@ var AmxxBuilder = /** @class */ (function () {
170
173
  });
171
174
  }); })];
172
175
  case 1:
173
- _b.sent();
176
+ _c.sent();
174
177
  return [2 /*return*/];
175
178
  }
176
179
  });
177
180
  };
178
181
  this_1 = this;
179
- _i = 0, scriptsDirs_1 = scriptsDirs;
180
- _a.label = 2;
182
+ _i = 0, _a = this.projectConfig.input.scripts;
183
+ _b.label = 2;
181
184
  case 2:
182
- if (!(_i < scriptsDirs_1.length)) return [3 /*break*/, 5];
183
- scriptsDir = scriptsDirs_1[_i];
185
+ if (!(_i < _a.length)) return [3 /*break*/, 5];
186
+ scriptsDir = _a[_i];
184
187
  return [5 /*yield**/, _loop_1(scriptsDir)];
185
188
  case 3:
186
- _a.sent();
187
- _a.label = 4;
189
+ _b.sent();
190
+ _b.label = 4;
188
191
  case 4:
189
192
  _i++;
190
193
  return [3 /*break*/, 2];
@@ -214,47 +217,34 @@ var AmxxBuilder = /** @class */ (function () {
214
217
  };
215
218
  AmxxBuilder.prototype.buildAssets = function () {
216
219
  return __awaiter(this, void 0, void 0, function () {
217
- var assetsDirs, _loop_2, this_2, _i, assetsDirs_1, assetsDir;
220
+ var _loop_2, this_2, _i, _a, assetInput;
218
221
  var _this = this;
219
- return __generator(this, function (_a) {
220
- switch (_a.label) {
222
+ return __generator(this, function (_b) {
223
+ switch (_b.label) {
221
224
  case 0:
222
225
  if (!this.projectConfig.input.assets) {
223
226
  return [2 /*return*/];
224
227
  }
225
- assetsDirs = (0, lodash_1.castArray)(this.projectConfig.input.assets);
226
- _loop_2 = function (assetsDir) {
227
- return __generator(this, function (_b) {
228
- switch (_b.label) {
229
- case 0: return [4 /*yield*/, this_2.buildDir(assetsDir, constants_1.ASSETS_PATH_PATTERN, function (filePath) { return __awaiter(_this, void 0, void 0, function () {
230
- var assetFile;
231
- return __generator(this, function (_a) {
232
- switch (_a.label) {
233
- case 0:
234
- assetFile = path_1.default.relative(assetsDir, filePath);
235
- return [4 /*yield*/, this.updateAsset(assetsDir, assetFile)];
236
- case 1:
237
- _a.sent();
238
- return [2 /*return*/];
239
- }
240
- });
241
- }); })];
228
+ _loop_2 = function (assetInput) {
229
+ return __generator(this, function (_c) {
230
+ switch (_c.label) {
231
+ case 0: return [4 /*yield*/, this_2.buildDir(assetInput.dir, constants_1.ASSETS_PATH_PATTERN, function (filePath) { return _this.updateAsset(filePath, assetInput); })];
242
232
  case 1:
243
- _b.sent();
233
+ _c.sent();
244
234
  return [2 /*return*/];
245
235
  }
246
236
  });
247
237
  };
248
238
  this_2 = this;
249
- _i = 0, assetsDirs_1 = assetsDirs;
250
- _a.label = 1;
239
+ _i = 0, _a = this.projectConfig.input.assets;
240
+ _b.label = 1;
251
241
  case 1:
252
- if (!(_i < assetsDirs_1.length)) return [3 /*break*/, 4];
253
- assetsDir = assetsDirs_1[_i];
254
- return [5 /*yield**/, _loop_2(assetsDir)];
242
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
243
+ assetInput = _a[_i];
244
+ return [5 /*yield**/, _loop_2(assetInput)];
255
245
  case 2:
256
- _a.sent();
257
- _a.label = 3;
246
+ _b.sent();
247
+ _b.label = 3;
258
248
  case 3:
259
249
  _i++;
260
250
  return [3 /*break*/, 1];
@@ -265,15 +255,14 @@ var AmxxBuilder = /** @class */ (function () {
265
255
  };
266
256
  AmxxBuilder.prototype.watchScripts = function (compileOptions) {
267
257
  return __awaiter(this, void 0, void 0, function () {
268
- var scriptsDirs, _loop_3, this_3, _i, scriptsDirs_2, scriptsDir;
258
+ var _loop_3, this_3, _i, _a, scriptsDir;
269
259
  var _this = this;
270
- return __generator(this, function (_a) {
271
- switch (_a.label) {
260
+ return __generator(this, function (_b) {
261
+ switch (_b.label) {
272
262
  case 0:
273
- scriptsDirs = (0, lodash_1.castArray)(this.projectConfig.input.scripts);
274
263
  _loop_3 = function (scriptsDir) {
275
- return __generator(this, function (_b) {
276
- switch (_b.label) {
264
+ return __generator(this, function (_c) {
265
+ switch (_c.label) {
277
266
  case 0: return [4 /*yield*/, this_3.watchDir(scriptsDir, constants_1.SCRIPTS_PATH_PATTERN, function (filePath) { return __awaiter(_this, void 0, void 0, function () {
278
267
  var srcFile;
279
268
  return __generator(this, function (_a) {
@@ -288,21 +277,21 @@ var AmxxBuilder = /** @class */ (function () {
288
277
  });
289
278
  }); })];
290
279
  case 1:
291
- _b.sent();
280
+ _c.sent();
292
281
  return [2 /*return*/];
293
282
  }
294
283
  });
295
284
  };
296
285
  this_3 = this;
297
- _i = 0, scriptsDirs_2 = scriptsDirs;
298
- _a.label = 1;
286
+ _i = 0, _a = this.projectConfig.input.scripts;
287
+ _b.label = 1;
299
288
  case 1:
300
- if (!(_i < scriptsDirs_2.length)) return [3 /*break*/, 4];
301
- scriptsDir = scriptsDirs_2[_i];
289
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
290
+ scriptsDir = _a[_i];
302
291
  return [5 /*yield**/, _loop_3(scriptsDir)];
303
292
  case 2:
304
- _a.sent();
305
- _a.label = 3;
293
+ _b.sent();
294
+ _b.label = 3;
306
295
  case 3:
307
296
  _i++;
308
297
  return [3 /*break*/, 1];
@@ -326,47 +315,34 @@ var AmxxBuilder = /** @class */ (function () {
326
315
  };
327
316
  AmxxBuilder.prototype.watchAssets = function () {
328
317
  return __awaiter(this, void 0, void 0, function () {
329
- var assetsDirs, _loop_4, this_4, _i, assetsDirs_2, assetsDir;
318
+ var _loop_4, this_4, _i, _a, assetInput;
330
319
  var _this = this;
331
- return __generator(this, function (_a) {
332
- switch (_a.label) {
320
+ return __generator(this, function (_b) {
321
+ switch (_b.label) {
333
322
  case 0:
334
323
  if (!this.projectConfig.input.assets) {
335
324
  return [2 /*return*/];
336
325
  }
337
- assetsDirs = (0, lodash_1.castArray)(this.projectConfig.input.assets);
338
- _loop_4 = function (assetsDir) {
339
- return __generator(this, function (_b) {
340
- switch (_b.label) {
341
- case 0: return [4 /*yield*/, this_4.watchDir(assetsDir, constants_1.ASSETS_PATH_PATTERN, function (filePath) { return __awaiter(_this, void 0, void 0, function () {
342
- var assetFile;
343
- return __generator(this, function (_a) {
344
- switch (_a.label) {
345
- case 0:
346
- assetFile = path_1.default.relative(assetsDir, filePath);
347
- return [4 /*yield*/, this.updateAsset(assetsDir, assetFile)];
348
- case 1:
349
- _a.sent();
350
- return [2 /*return*/];
351
- }
352
- });
353
- }); })];
326
+ _loop_4 = function (assetInput) {
327
+ return __generator(this, function (_c) {
328
+ switch (_c.label) {
329
+ case 0: return [4 /*yield*/, this_4.watchDir(assetInput.dir, constants_1.ASSETS_PATH_PATTERN, function (filePath) { return _this.updateAsset(filePath, assetInput); })];
354
330
  case 1:
355
- _b.sent();
331
+ _c.sent();
356
332
  return [2 /*return*/];
357
333
  }
358
334
  });
359
335
  };
360
336
  this_4 = this;
361
- _i = 0, assetsDirs_2 = assetsDirs;
362
- _a.label = 1;
337
+ _i = 0, _a = this.projectConfig.input.assets;
338
+ _b.label = 1;
363
339
  case 1:
364
- if (!(_i < assetsDirs_2.length)) return [3 /*break*/, 4];
365
- assetsDir = assetsDirs_2[_i];
366
- return [5 /*yield**/, _loop_4(assetsDir)];
340
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
341
+ assetInput = _a[_i];
342
+ return [5 /*yield**/, _loop_4(assetInput)];
367
343
  case 2:
368
- _a.sent();
369
- _a.label = 3;
344
+ _b.sent();
345
+ _b.label = 3;
370
346
  case 3:
371
347
  _i++;
372
348
  return [3 /*break*/, 1];
@@ -409,7 +385,7 @@ var AmxxBuilder = /** @class */ (function () {
409
385
  if (!this.projectConfig.output.scripts) {
410
386
  return [2 /*return*/];
411
387
  }
412
- srcPath = path_1.default.resolve(srcDir, srcFile);
388
+ srcPath = path_1.default.join(srcDir, srcFile);
413
389
  destPath = path_1.default.join(this.projectConfig.output.scripts, path_1.default.parse(srcFile).base);
414
390
  return [4 /*yield*/, (0, mkdirp_1.default)(this.projectConfig.output.scripts)];
415
391
  case 1:
@@ -423,21 +399,24 @@ var AmxxBuilder = /** @class */ (function () {
423
399
  });
424
400
  });
425
401
  };
426
- AmxxBuilder.prototype.updateAsset = function (srcDir, srcFile) {
402
+ AmxxBuilder.prototype.updateAsset = function (filePath, assetInput) {
427
403
  return __awaiter(this, void 0, void 0, function () {
428
- var srcPath, destPath;
404
+ var srcFile, destPath;
429
405
  return __generator(this, function (_a) {
430
406
  switch (_a.label) {
431
407
  case 0:
432
- srcPath = path_1.default.resolve(srcDir, srcFile);
433
- destPath = path_1.default.join(this.projectConfig.output.assets, srcFile);
408
+ srcFile = path_1.default.relative(assetInput.dir, filePath);
409
+ if (assetInput.filter && !this.execPathFilter(srcFile, assetInput.filter)) {
410
+ return [2 /*return*/];
411
+ }
412
+ destPath = path_1.default.join(this.projectConfig.output.assets, assetInput.dest || '', srcFile);
434
413
  return [4 /*yield*/, (0, mkdirp_1.default)(path_1.default.parse(destPath).dir)];
435
414
  case 1:
436
415
  _a.sent();
437
- return [4 /*yield*/, (0, copy_file_1.default)(srcPath, destPath)];
416
+ return [4 /*yield*/, (0, copy_file_1.default)(filePath, destPath)];
438
417
  case 2:
439
418
  _a.sent();
440
- logger_1.default.info('Asset updated', (0, normalize_path_1.default)(destPath));
419
+ logger_1.default.info('Asset updated:', (0, normalize_path_1.default)(destPath));
441
420
  return [2 /*return*/];
442
421
  }
443
422
  });
@@ -445,16 +424,15 @@ var AmxxBuilder = /** @class */ (function () {
445
424
  };
446
425
  AmxxBuilder.prototype.updateInclude = function (filePath) {
447
426
  return __awaiter(this, void 0, void 0, function () {
448
- var srcPath, destPath;
427
+ var destPath;
449
428
  return __generator(this, function (_a) {
450
429
  switch (_a.label) {
451
430
  case 0:
452
- srcPath = path_1.default.resolve(filePath);
453
431
  destPath = path_1.default.join(this.projectConfig.output.include, path_1.default.parse(filePath).base);
454
432
  return [4 /*yield*/, (0, mkdirp_1.default)(this.projectConfig.output.include)];
455
433
  case 1:
456
434
  _a.sent();
457
- return [4 /*yield*/, (0, copy_file_1.default)(srcPath, destPath)];
435
+ return [4 /*yield*/, (0, copy_file_1.default)(filePath, destPath)];
458
436
  case 2:
459
437
  _a.sent();
460
438
  logger_1.default.info('Include updated:', (0, normalize_path_1.default)(destPath));
@@ -469,7 +447,7 @@ var AmxxBuilder = /** @class */ (function () {
469
447
  return __generator(this, function (_a) {
470
448
  switch (_a.label) {
471
449
  case 0:
472
- pathPattern = (0, lodash_1.map)((0, lodash_1.castArray)(this.projectConfig.input.scripts), function (dir) { return path_1.default.join(dir, '**', pattern); });
450
+ pathPattern = (0, lodash_1.map)(this.projectConfig.input.scripts, function (dir) { return path_1.default.join(dir, '**', pattern); });
473
451
  return [4 /*yield*/, globule_1.default.find(pathPattern)];
474
452
  case 1:
475
453
  matches = _a.sent();
@@ -485,9 +463,9 @@ var AmxxBuilder = /** @class */ (function () {
485
463
  return __generator(this, function (_c) {
486
464
  switch (_c.label) {
487
465
  case 0:
488
- srcPath = path_1.default.resolve(srcDir, srcFile);
466
+ srcPath = path_1.default.join(srcDir, srcFile);
489
467
  _a = path_1.default.parse(srcFile), scriptName = _a.name, srcNestedDir = _a.dir;
490
- destDir = path_1.default.resolve(this.projectConfig.output.plugins, this.projectConfig.rules.flatCompilation ? '.' : srcNestedDir);
468
+ destDir = path_1.default.join(this.projectConfig.output.plugins, this.projectConfig.rules.flatCompilation ? '.' : srcNestedDir);
491
469
  pluginDest = path_1.default.join(destDir, "".concat(scriptName, ".amxx"));
492
470
  if (!compileOptions.noCache) return [3 /*break*/, 1];
493
471
  _b = false;
@@ -500,7 +478,7 @@ var AmxxBuilder = /** @class */ (function () {
500
478
  isUpdated = _b;
501
479
  relateiveSrcPath = path_1.default.relative(process.cwd(), srcPath);
502
480
  if (isUpdated) {
503
- logger_1.default.info("Script \"".concat((0, normalize_path_1.default)(relateiveSrcPath), "\" is already up to date. Skipped!"));
481
+ logger_1.default.info('Script is already up to date:', (0, normalize_path_1.default)(relateiveSrcPath), 'Skipped!');
504
482
  return [2 /*return*/];
505
483
  }
506
484
  executablePath = path_1.default.join(this.projectConfig.compiler.dir, this.projectConfig.compiler.executable);
@@ -513,7 +491,7 @@ var AmxxBuilder = /** @class */ (function () {
513
491
  compiler: executablePath,
514
492
  includeDir: __spreadArray(__spreadArray([
515
493
  path_1.default.join(this.projectConfig.compiler.dir, 'include')
516
- ], this.projectConfig.include, true), (0, lodash_1.castArray)(this.projectConfig.input.include), true)
494
+ ], this.projectConfig.include, true), this.projectConfig.input.include, true)
517
495
  })];
518
496
  case 5:
519
497
  result = _c.sent();
@@ -544,7 +522,7 @@ var AmxxBuilder = /** @class */ (function () {
544
522
  if (result.success) {
545
523
  destPath = path_1.default.join(destDir, result.plugin);
546
524
  relativeFilePath = path_1.default.relative(process.cwd(), srcPath);
547
- logger_1.default.success('Compilation success:', (0, normalize_path_1.default)(relativeFilePath));
525
+ logger_1.default.success('Script compiled successfully:', (0, normalize_path_1.default)(relativeFilePath));
548
526
  logger_1.default.info('Plugin updated:', (0, normalize_path_1.default)(destPath));
549
527
  }
550
528
  else {
@@ -565,7 +543,7 @@ var AmxxBuilder = /** @class */ (function () {
565
543
  return [4 /*yield*/, globule_1.default.find(pathPattern, { nodir: true })];
566
544
  case 1:
567
545
  matches = _a.sent();
568
- return [4 /*yield*/, matches.reduce(function (acc, match) { return acc.then(function () { return cb(match); }); }, Promise.resolve())];
546
+ return [4 /*yield*/, matches.reduce(function (acc, match) { return acc.then(function () { return cb(path_1.default.normalize(match)); }); }, Promise.resolve())];
569
547
  case 2:
570
548
  _a.sent();
571
549
  return [2 /*return*/];
@@ -579,7 +557,7 @@ var AmxxBuilder = /** @class */ (function () {
579
557
  return __generator(this, function (_a) {
580
558
  pathPattern = (0, lodash_1.map)((0, lodash_1.castArray)(baseDir), function (dir) { return path_1.default.join(dir, pattern); });
581
559
  watcher = (0, setup_watch_1.default)(pathPattern);
582
- updateFn = function (filePath) { return cb(filePath).catch(function (err) { return logger_1.default.error(err.message); }); };
560
+ updateFn = function (filePath) { return cb(path_1.default.normalize(filePath)).catch(function (err) { return logger_1.default.error(err.message); }); };
583
561
  watcher.on('add', updateFn);
584
562
  watcher.on('change', updateFn);
585
563
  return [2 /*return*/];
@@ -590,6 +568,13 @@ var AmxxBuilder = /** @class */ (function () {
590
568
  this.pluginCache = new plugins_cache_1.default();
591
569
  this.pluginCache.load(config_1.default.cacheFile);
592
570
  };
571
+ AmxxBuilder.prototype.execPathFilter = function (filePath, filter) {
572
+ return globule_1.default.isMatch(filter, filePath, {
573
+ dot: true,
574
+ nocase: true,
575
+ matchBase: true
576
+ });
577
+ };
593
578
  return AmxxBuilder;
594
579
  }());
595
580
  exports.default = AmxxBuilder;
@@ -56,7 +56,7 @@ var Controller = /** @class */ (function () {
56
56
  var projectConfig, builder;
57
57
  return __generator(this, function (_a) {
58
58
  switch (_a.label) {
59
- case 0: return [4 /*yield*/, project_config_1.default.resolve(configPath)];
59
+ case 0: return [4 /*yield*/, project_config_1.default.load(configPath)];
60
60
  case 1:
61
61
  projectConfig = _a.sent();
62
62
  builder = new builder_1.default(projectConfig);
@@ -98,7 +98,7 @@ var Controller = /** @class */ (function () {
98
98
  };
99
99
  Controller.prototype.compile = function (scriptPath, configPath, options) {
100
100
  return __awaiter(this, void 0, void 0, function () {
101
- var compileOptions, builder, matches, _i, matches_1, filePath, absFilePath, _a, srcDir, srcFile;
101
+ var compileOptions, builder, matches, _i, matches_1, filePath, _a, srcDir, srcFile;
102
102
  return __generator(this, function (_b) {
103
103
  switch (_b.label) {
104
104
  case 0:
@@ -114,8 +114,7 @@ var Controller = /** @class */ (function () {
114
114
  case 3:
115
115
  if (!(_i < matches_1.length)) return [3 /*break*/, 6];
116
116
  filePath = matches_1[_i];
117
- absFilePath = path_1.default.resolve(filePath);
118
- _a = path_1.default.parse(absFilePath), srcDir = _a.dir, srcFile = _a.base;
117
+ _a = path_1.default.parse(filePath), srcDir = _a.dir, srcFile = _a.base;
119
118
  return [4 /*yield*/, builder.compilePlugin(srcDir, srcFile, compileOptions)];
120
119
  case 4:
121
120
  _b.sent();
@@ -155,7 +154,7 @@ var Controller = /** @class */ (function () {
155
154
  var projectConfig, _i, _a, dependency;
156
155
  return __generator(this, function (_b) {
157
156
  switch (_b.label) {
158
- case 0: return [4 /*yield*/, project_config_1.default.resolve(configPath)];
157
+ case 0: return [4 /*yield*/, project_config_1.default.load(configPath)];
159
158
  case 1:
160
159
  projectConfig = _b.sent();
161
160
  return [4 /*yield*/, (0, compiler_1.default)({
@@ -192,7 +191,7 @@ var Controller = /** @class */ (function () {
192
191
  var projectConfig, includeName, templateBuilder, resolveFilePath, _a;
193
192
  return __generator(this, function (_b) {
194
193
  switch (_b.label) {
195
- case 0: return [4 /*yield*/, project_config_1.default.resolve(configPath)];
194
+ case 0: return [4 /*yield*/, project_config_1.default.load(configPath)];
196
195
  case 1:
197
196
  projectConfig = _b.sent();
198
197
  includeName = path_1.default.parse(fileName).base;
@@ -1,8 +1,8 @@
1
1
  import { IProjectOptions } from '../types';
2
- import { IProjectConfig } from '../../types';
2
+ import { IResolvedProjectConfig } from '../../types';
3
3
  declare class ProjectCreator {
4
4
  projectDir: string;
5
- projectConfig: IProjectConfig;
5
+ projectConfig: IResolvedProjectConfig;
6
6
  options: IProjectOptions;
7
7
  isCurrentDir: boolean;
8
8
  constructor(options?: IProjectOptions);
@@ -85,7 +85,7 @@ var ProjectCreator = /** @class */ (function () {
85
85
  ? cwd
86
86
  : path_1.default.join(cwd, this.options.name);
87
87
  }
88
- this.projectConfig = project_config_1.default.defaults;
88
+ this.projectConfig = project_config_1.default.resolve({}, this.projectDir);
89
89
  }
90
90
  ProjectCreator.prototype.createProject = function () {
91
91
  return __awaiter(this, void 0, void 0, function () {
@@ -207,13 +207,13 @@ var ProjectCreator = /** @class */ (function () {
207
207
  switch (_a.label) {
208
208
  case 0:
209
209
  logger_1.default.info('📁 Creating project directories...');
210
- dirs = __spreadArray(__spreadArray(__spreadArray([], (0, lodash_1.castArray)(this.projectConfig.input.assets), true), (0, lodash_1.castArray)(this.projectConfig.input.include), true), (0, lodash_1.castArray)(this.projectConfig.input.scripts), true);
210
+ dirs = __spreadArray(__spreadArray(__spreadArray([], (0, lodash_1.map)(this.projectConfig.input.assets, 'dir'), true), this.projectConfig.input.include, true), this.projectConfig.input.scripts, true);
211
211
  _i = 0, dirs_1 = dirs;
212
212
  _a.label = 1;
213
213
  case 1:
214
214
  if (!(_i < dirs_1.length)) return [3 /*break*/, 4];
215
215
  dir = dirs_1[_i];
216
- return [4 /*yield*/, (0, mkdirp_1.default)(path_1.default.join(this.projectDir, dir))];
216
+ return [4 /*yield*/, (0, mkdirp_1.default)(dir)];
217
217
  case 2:
218
218
  _a.sent();
219
219
  _a.label = 3;
@@ -43,6 +43,7 @@ var fs_1 = __importDefault(require("fs"));
43
43
  var path_1 = __importDefault(require("path"));
44
44
  var lodash_1 = require("lodash");
45
45
  var mkdirp_1 = __importDefault(require("mkdirp"));
46
+ var logger_1 = __importDefault(require("../../logger/logger"));
46
47
  var TemplateBuilder = /** @class */ (function () {
47
48
  function TemplateBuilder(projectConfig, context, contextDefaults) {
48
49
  this.projectConfig = projectConfig;
@@ -94,6 +95,7 @@ var TemplateBuilder = /** @class */ (function () {
94
95
  case 3: return [4 /*yield*/, _b.apply(_a, _c.concat([_d.sent(), { flag: overwrite ? 'w' : 'wx' }]))];
95
96
  case 4:
96
97
  _d.sent();
98
+ logger_1.default.info('New file created:', filePath);
97
99
  return [2 /*return*/];
98
100
  }
99
101
  });
@@ -1,9 +1,12 @@
1
+ export declare enum DistSource {
2
+ AmxxDrop = "amxxdrop",
3
+ Release = "release"
4
+ }
1
5
  export declare enum CompilerPlatform {
2
6
  Windows = "windows",
3
7
  Linux = "linux",
4
8
  Mac = "mac"
5
9
  }
6
- export declare enum DistSource {
7
- Dev = "amxxdrop",
8
- Release = "release"
9
- }
10
+ export declare const BASE_DIST = "base";
11
+ export declare const LATEST_RELEASE_VERSION = "1.8.2";
12
+ export declare const LATEST_RELEASE_VERSION_NUM = 182;
@@ -1,14 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DistSource = exports.CompilerPlatform = void 0;
3
+ exports.LATEST_RELEASE_VERSION_NUM = exports.LATEST_RELEASE_VERSION = exports.BASE_DIST = exports.CompilerPlatform = exports.DistSource = void 0;
4
+ var DistSource;
5
+ (function (DistSource) {
6
+ DistSource["AmxxDrop"] = "amxxdrop";
7
+ DistSource["Release"] = "release";
8
+ })(DistSource = exports.DistSource || (exports.DistSource = {}));
4
9
  var CompilerPlatform;
5
10
  (function (CompilerPlatform) {
6
11
  CompilerPlatform["Windows"] = "windows";
7
12
  CompilerPlatform["Linux"] = "linux";
8
13
  CompilerPlatform["Mac"] = "mac";
9
14
  })(CompilerPlatform = exports.CompilerPlatform || (exports.CompilerPlatform = {}));
10
- var DistSource;
11
- (function (DistSource) {
12
- DistSource["Dev"] = "amxxdrop";
13
- DistSource["Release"] = "release";
14
- })(DistSource = exports.DistSource || (exports.DistSource = {}));
15
+ exports.BASE_DIST = 'base';
16
+ exports.LATEST_RELEASE_VERSION = '1.8.2';
17
+ exports.LATEST_RELEASE_VERSION_NUM = 182;
@@ -60,24 +60,56 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
60
60
  };
61
61
  Object.defineProperty(exports, "__esModule", { value: true });
62
62
  var path_1 = __importDefault(require("path"));
63
+ var fs_1 = __importDefault(require("fs"));
63
64
  var mkdirp_1 = __importDefault(require("mkdirp"));
64
65
  var normalize_path_1 = __importDefault(require("normalize-path"));
65
66
  var decompress_1 = __importDefault(require("decompress"));
67
+ var lodash_1 = require("lodash");
66
68
  var download_1 = __importDefault(require("../../utils/download"));
67
69
  var resolvers_1 = require("./resolvers");
70
+ var constants_1 = require("./constants");
68
71
  var config_1 = __importDefault(require("../../config"));
69
- function downloadDist(dist) {
72
+ var logger_1 = __importDefault(require("../../logger/logger"));
73
+ function getDistFileName(dist) {
70
74
  return __awaiter(this, void 0, void 0, function () {
71
- var fileName, filePath, source, url, result;
75
+ var releaseVersion, releaseVersionNum, metaFileName, downloadOpts, result, fileName;
72
76
  return __generator(this, function (_a) {
73
77
  switch (_a.label) {
74
78
  case 0:
75
- fileName = (0, resolvers_1.resolveFileName)(dist);
76
- filePath = path_1.default.join(config_1.default.downloadDir, fileName);
77
- source = (0, resolvers_1.resolveSource)(dist);
78
- url = (0, resolvers_1.resolveUrl)(source, fileName);
79
- return [4 /*yield*/, (0, download_1.default)(url, filePath)];
79
+ releaseVersion = (0, resolvers_1.resolveReleaseVersion)(dist.version);
80
+ releaseVersionNum = (0, resolvers_1.resolveVersionNum)(releaseVersion);
81
+ if (dist.dev) {
82
+ return [2 /*return*/, (0, resolvers_1.resolveFileName)(dist)];
83
+ }
84
+ // Starting from latest release (version 1.8.2) all versions are stored in the amxxdrop repository
85
+ if (releaseVersionNum <= constants_1.LATEST_RELEASE_VERSION_NUM) {
86
+ // the latest release version is the only version we can download from the release repository
87
+ return [2 /*return*/, (0, resolvers_1.resolveFileName)(__assign(__assign({}, dist), { version: constants_1.LATEST_RELEASE_VERSION }))];
88
+ }
89
+ metaFileName = (0, resolvers_1.resolveMetaFileName)(dist);
90
+ downloadOpts = (0, resolvers_1.resolveDownloadDistOpts)(metaFileName, dist);
91
+ return [4 /*yield*/, (0, download_1.default)(downloadOpts.url, downloadOpts.path)];
92
+ case 1:
93
+ result = _a.sent();
94
+ return [4 /*yield*/, fs_1.default.promises.readFile(result.path, 'utf8')];
95
+ case 2:
96
+ fileName = _a.sent();
97
+ return [2 /*return*/, fileName.trim()];
98
+ }
99
+ });
100
+ });
101
+ }
102
+ function downloadDist(dist) {
103
+ return __awaiter(this, void 0, void 0, function () {
104
+ var fileName, downloadOpts, result;
105
+ return __generator(this, function (_a) {
106
+ switch (_a.label) {
107
+ case 0: return [4 /*yield*/, getDistFileName(dist)];
80
108
  case 1:
109
+ fileName = _a.sent();
110
+ downloadOpts = (0, resolvers_1.resolveDownloadDistOpts)(fileName, dist);
111
+ return [4 /*yield*/, (0, download_1.default)(downloadOpts.url, downloadOpts.path)];
112
+ case 2:
81
113
  result = _a.sent();
82
114
  return [2 /*return*/, { dist: dist, path: result.path }];
83
115
  }
@@ -88,7 +120,9 @@ function extractDist(archivePath, outDir) {
88
120
  return __awaiter(this, void 0, void 0, function () {
89
121
  return __generator(this, function (_a) {
90
122
  switch (_a.label) {
91
- case 0: return [4 /*yield*/, (0, mkdirp_1.default)(outDir)];
123
+ case 0:
124
+ logger_1.default.info("Extracting \"".concat(path_1.default.parse(archivePath).base, "\"..."));
125
+ return [4 /*yield*/, (0, mkdirp_1.default)(outDir)];
92
126
  case 1:
93
127
  _a.sent();
94
128
  return [4 /*yield*/, (0, decompress_1.default)(archivePath, outDir, {
@@ -118,31 +152,32 @@ function extractDist(archivePath, outDir) {
118
152
  }
119
153
  function downloadCompiler(options) {
120
154
  return __awaiter(this, void 0, void 0, function () {
121
- var version, dev, dists, compilerPath, platform, newDists, _i, newDists_1, dist, distArchive;
155
+ var version, dev, compilerPath, distNames, dists, distArchives, _i, distArchives_1, distArchive;
122
156
  return __generator(this, function (_a) {
123
157
  switch (_a.label) {
124
158
  case 0:
125
- version = options.version, dev = options.dev, dists = options.dists, compilerPath = options.path;
126
- platform = (0, resolvers_1.resolvePlatform)();
127
- newDists = __spreadArray([], dists, true);
128
- if (!newDists.includes('base')) {
129
- newDists.unshift('base');
159
+ version = options.version, dev = options.dev, compilerPath = options.path;
160
+ distNames = __spreadArray([], options.dists, true);
161
+ if (!distNames.includes(constants_1.BASE_DIST)) {
162
+ distNames.unshift(constants_1.BASE_DIST);
130
163
  }
131
- _i = 0, newDists_1 = newDists;
132
- _a.label = 1;
164
+ dists = (0, lodash_1.map)(distNames, function (distName) { return (0, resolvers_1.resolveDist)({ name: distName, version: version, dev: dev }); });
165
+ logger_1.default.info('Downloading compiler...');
166
+ return [4 /*yield*/, Promise.all((0, lodash_1.map)(dists, downloadDist))];
133
167
  case 1:
134
- if (!(_i < newDists_1.length)) return [3 /*break*/, 5];
135
- dist = newDists_1[_i];
136
- return [4 /*yield*/, downloadDist({ name: dist, version: version, platform: platform, dev: dev })];
168
+ distArchives = _a.sent();
169
+ _i = 0, distArchives_1 = distArchives;
170
+ _a.label = 2;
137
171
  case 2:
138
- distArchive = _a.sent();
172
+ if (!(_i < distArchives_1.length)) return [3 /*break*/, 5];
173
+ distArchive = distArchives_1[_i];
139
174
  return [4 /*yield*/, extractDist(distArchive.path, compilerPath)];
140
175
  case 3:
141
176
  _a.sent();
142
177
  _a.label = 4;
143
178
  case 4:
144
179
  _i++;
145
- return [3 /*break*/, 1];
180
+ return [3 /*break*/, 2];
146
181
  case 5: return [2 /*return*/];
147
182
  }
148
183
  });
@@ -1,6 +1,19 @@
1
1
  import { CompilerPlatform } from './constants';
2
2
  import { IDist } from './types';
3
- export declare function resolveSource({ dev, version }: IDist): string;
3
+ export declare function resolveVersionNum(version: string): number;
4
+ export declare function resolveReleaseVersion(version: string): string;
4
5
  export declare function resolveFileName({ name: dist, version, platform }: IDist): string;
6
+ export declare function resolveMetaFileName({ name: dist, platform }: IDist): string;
5
7
  export declare function resolvePlatform(): CompilerPlatform;
6
8
  export declare function resolveUrl(source: string, file: string): string;
9
+ export declare function resolveSource({ dev, version }: IDist): string;
10
+ export declare function resolveDownloadDistOpts(fileName: string, dist: IDist): {
11
+ url: string;
12
+ path: string;
13
+ };
14
+ export declare function resolveDist(options: Partial<IDist>): {
15
+ name: string;
16
+ version: string;
17
+ platform: CompilerPlatform;
18
+ dev: boolean;
19
+ };
@@ -3,27 +3,35 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.resolveUrl = exports.resolvePlatform = exports.resolveFileName = exports.resolveSource = void 0;
6
+ exports.resolveDist = exports.resolveDownloadDistOpts = exports.resolveSource = exports.resolveUrl = exports.resolvePlatform = exports.resolveMetaFileName = exports.resolveFileName = exports.resolveReleaseVersion = exports.resolveVersionNum = void 0;
7
7
  var os_1 = __importDefault(require("os"));
8
+ var path_1 = __importDefault(require("path"));
8
9
  var constants_1 = require("./constants");
9
10
  var config_1 = __importDefault(require("../../config"));
10
- function resolveSource(_a) {
11
- var dev = _a.dev, version = _a.version;
12
- var urlPath = [
13
- dev ? constants_1.DistSource.Dev : constants_1.DistSource.Release
14
- ];
15
- if (dev) {
16
- urlPath.push(version.split('.').slice(0, 2).join('.'));
11
+ var logger_1 = __importDefault(require("../../logger/logger"));
12
+ function resolveVersionNum(version) {
13
+ var versionSegments = version.split('.').slice(0, 3);
14
+ for (var i = 0; i < 3 - versionSegments.length; ++i) {
15
+ versionSegments.push('0');
17
16
  }
18
- return urlPath.join('/');
17
+ return parseInt(versionSegments.join(''), 10);
19
18
  }
20
- exports.resolveSource = resolveSource;
19
+ exports.resolveVersionNum = resolveVersionNum;
20
+ function resolveReleaseVersion(version) {
21
+ return version.split('.').slice(0, 2).join('.');
22
+ }
23
+ exports.resolveReleaseVersion = resolveReleaseVersion;
21
24
  function resolveFileName(_a) {
22
25
  var dist = _a.name, version = _a.version, platform = _a.platform;
23
26
  var ext = platform === 'linux' ? '.tar.gz' : '.zip';
24
27
  return "amxmodx-".concat(version, "-").concat(dist, "-").concat(platform).concat(ext);
25
28
  }
26
29
  exports.resolveFileName = resolveFileName;
30
+ function resolveMetaFileName(_a) {
31
+ var dist = _a.name, platform = _a.platform;
32
+ return "amxmodx-latest-".concat(dist, "-").concat(platform);
33
+ }
34
+ exports.resolveMetaFileName = resolveMetaFileName;
27
35
  function resolvePlatform() {
28
36
  var platform = os_1.default.platform();
29
37
  switch (platform) {
@@ -38,3 +46,35 @@ function resolveUrl(source, file) {
38
46
  return "".concat(config_1.default.downloadHost, "/").concat(source, "/").concat(file);
39
47
  }
40
48
  exports.resolveUrl = resolveUrl;
49
+ function resolveSource(_a) {
50
+ var dev = _a.dev, version = _a.version;
51
+ var releaseVersion = resolveReleaseVersion(version);
52
+ var releaseVersionNum = resolveVersionNum(releaseVersion);
53
+ var isNewVersion = releaseVersionNum > constants_1.LATEST_RELEASE_VERSION_NUM;
54
+ var distSource = dev || isNewVersion ? constants_1.DistSource.AmxxDrop : constants_1.DistSource.Release;
55
+ var urlPath = [distSource];
56
+ if (distSource === constants_1.DistSource.AmxxDrop) {
57
+ urlPath.push(releaseVersion);
58
+ }
59
+ return urlPath.join('/');
60
+ }
61
+ exports.resolveSource = resolveSource;
62
+ function resolveDownloadDistOpts(fileName, dist) {
63
+ var filePath = path_1.default.join(config_1.default.downloadDir, fileName);
64
+ var source = resolveSource(dist);
65
+ var url = resolveUrl(source, fileName);
66
+ return { url: url, path: filePath };
67
+ }
68
+ exports.resolveDownloadDistOpts = resolveDownloadDistOpts;
69
+ function resolveDist(options) {
70
+ var _a = options.name, name = _a === void 0 ? constants_1.BASE_DIST : _a, _b = options.dev, dev = _b === void 0 ? false : _b;
71
+ var version = dev
72
+ ? options.version
73
+ : resolveReleaseVersion(options.version || constants_1.LATEST_RELEASE_VERSION);
74
+ if (options.version !== version && name === constants_1.BASE_DIST) {
75
+ logger_1.default.warn("The \"".concat(options.version, "\" version format is redundant. Change the compiler version to \"").concat(version, "\" in the project configuration to remove this warning."));
76
+ }
77
+ var platform = resolvePlatform();
78
+ return { name: name, version: version, platform: platform, dev: dev };
79
+ }
80
+ exports.resolveDist = resolveDist;
package/lib/index.js CHANGED
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -14,7 +14,7 @@ exports.default = {
14
14
  },
15
15
  compiler: {
16
16
  dir: './.compiler',
17
- version: '1.8.2',
17
+ version: '1.8',
18
18
  dev: false,
19
19
  addons: [],
20
20
  executable: 'amxxpc'
@@ -1,6 +1,8 @@
1
+ import load from './load';
1
2
  import resolve from './resolve';
2
3
  declare const _default: {
3
4
  resolve: typeof resolve;
5
+ load: typeof load;
4
6
  defaults: import("../types").IProjectConfig;
5
7
  };
6
8
  export default _default;
@@ -4,5 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  var defaults_1 = __importDefault(require("./defaults"));
7
+ var load_1 = __importDefault(require("./load"));
7
8
  var resolve_1 = __importDefault(require("./resolve"));
8
- exports.default = { resolve: resolve_1.default, defaults: defaults_1.default };
9
+ exports.default = { resolve: resolve_1.default, load: load_1.default, defaults: defaults_1.default };
@@ -0,0 +1,3 @@
1
+ import { IResolvedProjectConfig } from '../types';
2
+ declare function load(_configPath?: string | null, projectDir?: string): Promise<IResolvedProjectConfig>;
3
+ export default load;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __generator = (this && this.__generator) || function (thisArg, body) {
35
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
36
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
37
+ function verb(n) { return function (v) { return step([n, v]); }; }
38
+ function step(op) {
39
+ if (f) throw new TypeError("Generator is already executing.");
40
+ while (_) try {
41
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
42
+ if (y = 0, t) op = [op[0] & 2, t.value];
43
+ switch (op[0]) {
44
+ case 0: case 1: t = op; break;
45
+ case 4: _.label++; return { value: op[1], done: false };
46
+ case 5: _.label++; y = op[1]; op = [0]; continue;
47
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
48
+ default:
49
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
50
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
51
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
52
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
53
+ if (t[2]) _.ops.pop();
54
+ _.trys.pop(); continue;
55
+ }
56
+ op = body.call(thisArg, _);
57
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
58
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
59
+ }
60
+ };
61
+ var __importDefault = (this && this.__importDefault) || function (mod) {
62
+ return (mod && mod.__esModule) ? mod : { "default": mod };
63
+ };
64
+ Object.defineProperty(exports, "__esModule", { value: true });
65
+ var path_1 = __importDefault(require("path"));
66
+ var fs_1 = __importDefault(require("fs"));
67
+ var logger_1 = __importDefault(require("../logger/logger"));
68
+ var resolve_1 = __importDefault(require("./resolve"));
69
+ function load(_configPath, projectDir) {
70
+ if (projectDir === void 0) { projectDir = ''; }
71
+ return __awaiter(this, void 0, void 0, function () {
72
+ var resolvePath, configPath, userConfig;
73
+ return __generator(this, function (_a) {
74
+ switch (_a.label) {
75
+ case 0:
76
+ resolvePath = function (p) { return path_1.default.resolve(projectDir, p); };
77
+ configPath = resolvePath(_configPath);
78
+ userConfig = null;
79
+ if (!fs_1.default.existsSync(configPath)) return [3 /*break*/, 2];
80
+ return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require(configPath)); })];
81
+ case 1:
82
+ userConfig = _a.sent();
83
+ return [3 /*break*/, 3];
84
+ case 2:
85
+ logger_1.default.error('Cannot read config file!');
86
+ _a.label = 3;
87
+ case 3: return [2 /*return*/, (0, resolve_1.default)(userConfig, projectDir)];
88
+ }
89
+ });
90
+ });
91
+ }
92
+ exports.default = load;
@@ -1,3 +1,4 @@
1
- import { IProjectConfig } from '../types';
2
- declare function resolve(_configPath?: string): Promise<IProjectConfig>;
1
+ import type { PartialDeep } from 'type-fest';
2
+ import { IProjectConfig, IResolvedProjectConfig } from '../types';
3
+ declare function resolve(overrides?: PartialDeep<IProjectConfig>, projectDir?: string): IResolvedProjectConfig;
3
4
  export default resolve;
@@ -1,58 +1,14 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
- Object.defineProperty(o, "default", { enumerable: true, value: v });
11
- }) : function(o, v) {
12
- o["default"] = v;
13
- });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
21
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
22
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
23
- return new (P || (P = Promise))(function (resolve, reject) {
24
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
25
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
26
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
27
- step((generator = generator.apply(thisArg, _arguments || [])).next());
28
- });
29
- };
30
- var __generator = (this && this.__generator) || function (thisArg, body) {
31
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
32
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
33
- function verb(n) { return function (v) { return step([n, v]); }; }
34
- function step(op) {
35
- if (f) throw new TypeError("Generator is already executing.");
36
- while (_) try {
37
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
38
- if (y = 0, t) op = [op[0] & 2, t.value];
39
- switch (op[0]) {
40
- case 0: case 1: t = op; break;
41
- case 4: _.label++; return { value: op[1], done: false };
42
- case 5: _.label++; y = op[1]; op = [0]; continue;
43
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
44
- default:
45
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
46
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
47
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
48
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
49
- if (t[2]) _.ops.pop();
50
- _.trys.pop(); continue;
51
- }
52
- op = body.call(thisArg, _);
53
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
54
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
55
- }
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
56
12
  };
57
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
58
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -60,52 +16,34 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
60
16
  Object.defineProperty(exports, "__esModule", { value: true });
61
17
  var lodash_1 = require("lodash");
62
18
  var path_1 = __importDefault(require("path"));
63
- var fs_1 = __importDefault(require("fs"));
64
- var logger_1 = __importDefault(require("../logger/logger"));
65
19
  var defaults_1 = __importDefault(require("./defaults"));
66
- function resolve(_configPath) {
67
- return __awaiter(this, void 0, void 0, function () {
68
- var userConfig, configPath, config;
69
- return __generator(this, function (_a) {
70
- switch (_a.label) {
71
- case 0:
72
- userConfig = null;
73
- if (!_configPath) return [3 /*break*/, 3];
74
- configPath = path_1.default.resolve(_configPath);
75
- if (!fs_1.default.existsSync(configPath)) return [3 /*break*/, 2];
76
- return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require(configPath)); })];
77
- case 1:
78
- userConfig = _a.sent();
79
- return [3 /*break*/, 3];
80
- case 2:
81
- logger_1.default.error('Cannot read config file!');
82
- _a.label = 3;
83
- case 3:
84
- config = (0, lodash_1.merge)({}, defaults_1.default, userConfig);
85
- // resolve paths
86
- (0, lodash_1.merge)(config, {
87
- input: {
88
- scripts: (0, lodash_1.map)((0, lodash_1.castArray)(config.input.scripts), function (dir) { return path_1.default.resolve(dir); }),
89
- include: (0, lodash_1.map)((0, lodash_1.castArray)(config.input.include), function (dir) { return path_1.default.resolve(dir); }),
90
- assets: (0, lodash_1.map)((0, lodash_1.castArray)(config.input.assets), function (dir) { return path_1.default.resolve(dir); }),
91
- },
92
- output: {
93
- scripts: path_1.default.resolve(config.output.scripts),
94
- plugins: path_1.default.resolve(config.output.plugins),
95
- include: path_1.default.resolve(config.output.include),
96
- assets: path_1.default.resolve(config.output.assets)
97
- },
98
- include: (0, lodash_1.map)(config.include, function (include) { return path_1.default.resolve(include); }),
99
- compiler: {
100
- dir: path_1.default.resolve(config.compiler.dir),
101
- },
102
- thirdparty: {
103
- dir: path_1.default.resolve(config.thirdparty.dir)
104
- }
105
- });
106
- return [2 /*return*/, config];
107
- }
108
- });
20
+ function resolve(overrides, projectDir) {
21
+ if (overrides === void 0) { overrides = {}; }
22
+ if (projectDir === void 0) { projectDir = ''; }
23
+ var resolvePath = function (p) { return path_1.default.resolve(projectDir || '', p); };
24
+ var config = (0, lodash_1.merge)({}, defaults_1.default, overrides);
25
+ // resolve paths
26
+ var resolvedConfig = (0, lodash_1.merge)(config, {
27
+ input: {
28
+ scripts: (0, lodash_1.map)((0, lodash_1.castArray)(config.input.scripts), function (dir) { return resolvePath(dir); }),
29
+ include: (0, lodash_1.map)((0, lodash_1.castArray)(config.input.include), function (dir) { return resolvePath(dir); }),
30
+ assets: (0, lodash_1.map)((0, lodash_1.castArray)(config.input.assets), function (input) { return (typeof input === 'object'
31
+ ? __assign(__assign({}, input), { dir: resolvePath(input.dir) }) : { dir: resolvePath(input) }); })
32
+ },
33
+ output: {
34
+ scripts: resolvePath(config.output.scripts),
35
+ plugins: resolvePath(config.output.plugins),
36
+ include: resolvePath(config.output.include),
37
+ assets: resolvePath(config.output.assets)
38
+ },
39
+ include: (0, lodash_1.map)(config.include, function (include) { return resolvePath(include); }),
40
+ compiler: {
41
+ dir: resolvePath(config.compiler.dir),
42
+ },
43
+ thirdparty: {
44
+ dir: resolvePath(config.thirdparty.dir)
45
+ }
109
46
  });
47
+ return resolvedConfig;
110
48
  }
111
49
  exports.default = resolve;
@@ -1,8 +1,13 @@
1
+ export interface IAssetInput {
2
+ dir: string;
3
+ dest?: string;
4
+ filter?: string | string[];
5
+ }
1
6
  export interface IProjectConfig {
2
7
  input: {
3
8
  scripts: string | string[];
4
9
  include: string | string[];
5
- assets: string | string[];
10
+ assets: string | string[] | IAssetInput | IAssetInput[];
6
11
  };
7
12
  output: {
8
13
  scripts: string;
@@ -43,3 +48,10 @@ export interface IProjectConfig {
43
48
  };
44
49
  };
45
50
  }
51
+ export interface IResolvedProjectConfig extends IProjectConfig {
52
+ input: {
53
+ scripts: string[];
54
+ include: string[];
55
+ assets: IAssetInput[];
56
+ };
57
+ }
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "amxxpack",
3
3
  "description": "AMXXPack",
4
4
  "author": "Hedgehog Fog",
5
- "version": "1.2.0",
5
+ "version": "1.3.0",
6
6
  "license": "MIT",
7
7
  "main": "lib/builder/index.js",
8
8
  "types": "lib/builder/index.d.ts",
@@ -69,6 +69,7 @@
69
69
  "jest": "^27.5.1",
70
70
  "rimraf": "^3.0.2",
71
71
  "ts-jest": "^27.1.3",
72
- "typescript": "^4.5.5"
72
+ "type-fest": "^3.2.0",
73
+ "typescript": "^4.8.4"
73
74
  }
74
75
  }