@vamship/build-utils 1.0.4 → 1.4.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vamship/build-utils",
3
- "version": "1.0.4",
3
+ "version": "1.4.0",
4
4
  "description": "Utility library for build tooling",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -41,26 +41,26 @@
41
41
  },
42
42
  "homepage": "https://github.com/vamship/build-utils#readme",
43
43
  "devDependencies": {
44
- "chai": "^4.3.4",
44
+ "chai": "^4.3.6",
45
45
  "chai-as-promised": "^7.1.1",
46
- "eslint": "^7.32.0",
47
- "jsdoc": "^3.6.7",
48
- "mocha": "^9.1.2",
49
- "nodemon": "^2.0.13",
46
+ "eslint": "^8.10.0",
47
+ "jsdoc": "^3.6.10",
48
+ "mocha": "^9.2.2",
49
+ "nodemon": "^2.0.15",
50
50
  "nyc": "^15.1.0",
51
- "prettier": "^2.4.1",
52
- "rewire": "^5.0.0",
53
- "sinon": "^11.1.2",
51
+ "prettier": "^2.5.1",
52
+ "rewire": "^6.0.0",
53
+ "sinon": "^13.0.1",
54
54
  "sinon-chai": "^3.7.0"
55
55
  },
56
56
  "dependencies": {
57
- "camelcase": "^6.2.0",
57
+ "camelcase": "^6.3.0",
58
58
  "delete": "^1.1.0",
59
59
  "docdash": "^1.2.0",
60
- "dotenv": "^10.0.0",
61
- "dotenv-expand": "^5.1.0",
60
+ "dotenv": "^16.0.0",
61
+ "dotenv-expand": "^8.0.2",
62
62
  "execa": "^5.1.1",
63
- "fancy-log": "^1.3.3",
63
+ "fancy-log": "^2.0.0",
64
64
  "mkdirp": "^1.0.4",
65
65
  "semver": "^7.3.5"
66
66
  },
@@ -82,8 +82,8 @@
82
82
  },
83
83
  "optionalDependencies": {
84
84
  "gulp-jsdoc3": "= 3.0.0",
85
- "typedoc": ">= 0.22.5",
86
- "typescript": ">= 4.4.4"
85
+ "typedoc": ">=0.22.13",
86
+ "typescript": ">=4.6.2"
87
87
  },
88
88
  "engines": {
89
89
  "node": ">= 14.18.1",
package/src/project.js CHANGED
@@ -12,6 +12,7 @@ const SUPPORTED_PROJECT_TYPES = [
12
12
  'api',
13
13
  'aws-microservice',
14
14
  'container',
15
+ 'ui',
15
16
  ];
16
17
  const SUPPORTED_LANGUAGES = ['js', 'ts'];
17
18
 
@@ -121,6 +122,7 @@ module.exports = class Project {
121
122
  requiredEnv,
122
123
  exportedTypes,
123
124
  aws,
125
+ staticFilePatterns,
124
126
  } = buildMetadata;
125
127
 
126
128
  if (SUPPORTED_PROJECT_TYPES.indexOf(projectType) < 0) {
@@ -143,6 +145,8 @@ module.exports = class Project {
143
145
  this._projectType = projectType;
144
146
  this._language = language;
145
147
  this._exportedTypes = exportedTypes;
148
+ this._staticFilePatterns =
149
+ staticFilePatterns instanceof Array ? staticFilePatterns : [];
146
150
 
147
151
  this._hasTypescript = this._language === 'ts';
148
152
  this._hasServer = this._projectType === 'api';
@@ -438,6 +442,16 @@ module.exports = class Project {
438
442
  return this._exportedTypes;
439
443
  }
440
444
 
445
+ /**
446
+ * Additional files to copy from the source directory to the build
447
+ * directory.
448
+ *
449
+ * @return {String}
450
+ */
451
+ get staticFilePatterns() {
452
+ return this._staticFilePatterns;
453
+ }
454
+
441
455
  /**
442
456
  * Determines whether or not the project can be packaged up as a docker
443
457
  * image.
@@ -36,9 +36,13 @@ module.exports = (project, options) => {
36
36
  extras.push('Dockerfile*');
37
37
  }
38
38
 
39
+ const staticFilePatterns = ['js', 'json'].concat(
40
+ project.staticFilePatterns
41
+ );
42
+
39
43
  const paths = dirs
40
44
  .map((dir) => rootDir.getChild(dir))
41
- .map((dir) => ['js', 'json'].map((ext) => dir.getAllFilesGlob(ext)))
45
+ .map((dir) => staticFilePatterns.map((ext) => dir.getAllFilesGlob(ext)))
42
46
  .reduce((result, arr) => result.concat(arr), [])
43
47
  .concat(extras.map((item) => rootDir.getFileGlob(item)));
44
48
 
@@ -0,0 +1,67 @@
1
+ 'use strict';
2
+
3
+ const _gulp = require('gulp');
4
+ const _typescript = require('gulp-typescript');
5
+ const _execa = require('execa');
6
+
7
+ /**
8
+ * Sub builder that creates a task that will build UI project
9
+ * using vite. This method will return a watcher if the watch option
10
+ * is set to true.
11
+ *
12
+ * @private
13
+ * @param {Object} project Reference to an object that contains project metadata
14
+ * that can be used to customize build outputs.
15
+ * @param {Object} options An options object that can be used to customize the
16
+ * task.
17
+ *
18
+ * @returns {Function} A gulp task.
19
+ */
20
+ module.exports = (project, options) => {
21
+ const { watch } = Object.assign({ watch: false }, options);
22
+ const rootDir = project.rootDir;
23
+ const workingDir = rootDir.getChild('working');
24
+
25
+ const viteBin = project.rootDir.getFilePath('node_modules/.bin/vite');
26
+
27
+ const dirs = ['src', 'test'];
28
+
29
+ const distFiles = [
30
+ rootDir.getFileGlob('_scripts/*'),
31
+ rootDir.getFileGlob('nginx.conf'),
32
+ rootDir.getFileGlob('package-lock.json'),
33
+ rootDir.getFileGlob('Dockerfile*'),
34
+ rootDir.getFileGlob('LICENSE'),
35
+ rootDir.getFileGlob('README.md'),
36
+ rootDir.getFileGlob('.env'),
37
+ rootDir.getFileGlob(project.configFileName),
38
+ ];
39
+ const copyTask = () =>
40
+ _gulp
41
+ .src(distFiles, { allowEmpty: true })
42
+ .pipe(_gulp.dest(workingDir.absolutePath));
43
+
44
+ const args = ['build'];
45
+ const buildTask = () => _execa(viteBin, args, { stdio: 'inherit' });
46
+ buildTask.displayName = 'build-ui';
47
+ buildTask.description = 'Build the UI project';
48
+
49
+ const task = _gulp.series([buildTask, copyTask]);
50
+
51
+ if (watch) {
52
+ const paths = dirs
53
+ .map((dir) => rootDir.getChild(dir))
54
+ .map((dir) => ['ts', 'tsx'].map((ext) => dir.getAllFilesGlob(ext)))
55
+ .reduce((result, arr) => result.concat(arr), []);
56
+
57
+ args.push('--watch');
58
+ const buildTask = () => _execa(viteBin, args, { stdio: 'inherit' });
59
+ const task = _gulp.series([buildTask, copyTask]);
60
+ const watchTask = () => _gulp.watch(paths, task);
61
+ watchTask.displayName = 'watch-build-ui';
62
+ watchTask.description = 'Automatically build the UI project on change';
63
+ return watchTask;
64
+ }
65
+
66
+ return task;
67
+ };
@@ -27,18 +27,26 @@ module.exports = (project, options) => {
27
27
  return;
28
28
  }
29
29
 
30
- const jsBuild = require('./build-js');
31
- const tasks = [jsBuild(project, options)];
32
-
33
- if (project.hasTypescript) {
34
- const tsBuild = require('./build-ts');
35
- tasks.push(tsBuild(project, options));
36
- } else if (project.hasExportedTypes) {
37
- const typesBuild = require('./build-types');
38
- tasks.push(typesBuild(project, options));
30
+ let task;
31
+ let tasks;
32
+
33
+ if (project.projectType !== 'ui') {
34
+ const jsBuild = require('./build-js');
35
+ tasks = [jsBuild(project, options)];
36
+
37
+ if (project.hasTypescript) {
38
+ const tsBuild = require('./build-ts');
39
+ tasks.push(tsBuild(project, options));
40
+ } else if (project.hasExportedTypes) {
41
+ const typesBuild = require('./build-types');
42
+ tasks.push(typesBuild(project, options));
43
+ }
44
+ } else {
45
+ const tsBuild = require('./build-ui');
46
+ tasks = [tsBuild(project, options)];
39
47
  }
40
48
 
41
- const task = _gulp.parallel(tasks);
49
+ task = _gulp.parallel(tasks);
42
50
  if (!watch) {
43
51
  task.displayName = 'build';
44
52
  task.description = 'Transpile/copy source files into working directory';
@@ -29,7 +29,9 @@ module.exports = (project, options) => {
29
29
  const paths = dirs
30
30
  .map((dir) => rootDir.getChild(dir))
31
31
  .map((dir) =>
32
- ['ts', 'js', 'json', 'py'].map((ext) => dir.getAllFilesGlob(ext))
32
+ ['ts', 'js', 'json', 'py', 'tsx', 'jsx'].map((ext) =>
33
+ dir.getAllFilesGlob(ext)
34
+ )
33
35
  )
34
36
  .reduce((result, arr) => result.concat(arr), [])
35
37
  .concat(extras.map((file) => rootDir.getFileGlob(file)));
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ const _gulp = require('gulp');
4
+
5
+ /**
6
+ * Builder function that can be used to generate a gulp task to execute
7
+ * instrumented unit/api tests.
8
+ *
9
+ * @param {Object} project Reference to an object that contains project metadata
10
+ * that can be used to customize build outputs.
11
+ * @param {Object} options An options object that can be used to customize the
12
+ * task.
13
+ *
14
+ * @returns {Function} A gulp task.
15
+ */
16
+ module.exports = (project, options) => {
17
+ const { testType, watch } = Object.assign(
18
+ { testType: 'unit', watch: false },
19
+ options
20
+ );
21
+ const tasks = [];
22
+ if (project.projectType !== 'ui') {
23
+ const nonUiTests = require('./test');
24
+ tasks.push(nonUiTests(project, options));
25
+ } else {
26
+ const uiTests = require('./test-ui');
27
+ tasks.push(uiTests(project, options));
28
+ }
29
+ const task = _gulp.parallel(tasks);
30
+ if (!watch) {
31
+ task.displayName = `test-${testType}`;
32
+ task.description = `Execute ${testType} tests`;
33
+ } else {
34
+ task.displayName = `watch-test-${testType}`;
35
+ task.description = `Automatically execute ${testType} tests on change`;
36
+ }
37
+
38
+ return task;
39
+ };
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ const _gulp = require('gulp');
4
+ const _execa = require('execa');
5
+
6
+ /**
7
+ * Builder function that can be used to generate a gulp task to execute
8
+ * instrumented unit/api tests.
9
+ *
10
+ * @param {Object} project Reference to an object that contains project metadata
11
+ * that can be used to customize build outputs.
12
+ * @param {Object} options An options object that can be used to customize the
13
+ * task.
14
+ *
15
+ * @returns {Function} A gulp task.
16
+ */
17
+ module.exports = (project, options) => {
18
+ const { testType, watch } = Object.assign(
19
+ { testType: 'unit', watch: false },
20
+ options
21
+ );
22
+
23
+ const rootDir = project.jsRootDir;
24
+ const jestBin = project.rootDir.getFilePath('node_modules/.bin/jest');
25
+ let args = ['--config', 'jest.config.js', '--coverage'];
26
+
27
+ if (watch) {
28
+ args.push('--watchAll');
29
+ const watchTask = () => _execa(jestBin, args, { stdio: 'inherit' });
30
+ watchTask.displayName = `watch-test-${testType}`;
31
+ watchTask.description = `Automatically execute ${testType} tests on change`;
32
+ return watchTask;
33
+ }
34
+
35
+ const task = () => _execa(jestBin, args, { stdio: 'inherit' });
36
+ task.displayName = `test-${testType}`;
37
+ task.description = `Execute ${testType} tests`;
38
+ return task;
39
+ };
File without changes