@plugjs/build 0.1.0 → 0.2.1

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/dist/index.mjs ADDED
@@ -0,0 +1,252 @@
1
+ // index.ts
2
+ import "@plugjs/cov8";
3
+ import "@plugjs/eslint";
4
+ import "@plugjs/jasmine";
5
+ import {
6
+ $gry,
7
+ $wht,
8
+ build,
9
+ find,
10
+ fixExtensions,
11
+ isDirectory,
12
+ log,
13
+ merge,
14
+ noop,
15
+ rmrf
16
+ } from "@plugjs/plug";
17
+ import "@plugjs/typescript";
18
+ export * from "@plugjs/plug";
19
+ var esbuildDefaults = {
20
+ platform: "node",
21
+ sourcemap: "linked",
22
+ sourcesContent: false,
23
+ plugins: [fixExtensions()]
24
+ };
25
+ function tasks(options = {}) {
26
+ const {
27
+ sourceDir: _sourceDir = "src",
28
+ destDir: _destDir = "dist",
29
+ testDir: _testDir = "test",
30
+ coverageDir: _coverageDir = "coverage",
31
+ coverageDataDir: _coverageDataDir = ".coverage-data",
32
+ extraTypesDir: _extraTypesDir = "types",
33
+ packageJson: _packageJson = "package.json",
34
+ outputPackageJson: _outputPackageJson = _packageJson,
35
+ cjsExtension: _cjsExtension = ".cjs",
36
+ esmExtension: _esmExtension = ".mjs",
37
+ cjsTranspile: _cjsTranspile = true,
38
+ esmTranspile: _esmTranspile = true,
39
+ parallelize: _parallelize = false,
40
+ banners: _banners = !_parallelize,
41
+ testGlob: _testGlob = "**/*.test.([cm])?ts",
42
+ exportsGlob: _exportsGlob = "index.*",
43
+ coverage: _coverage = true,
44
+ minimumCoverage: _minimumCoverage = 100,
45
+ minimumFileCoverage: _minimumFileCoverage = 100,
46
+ optimalCoverage: _optimalCoverage = void 0,
47
+ optimalFileCoverage: _optimalFileCoverage = void 0,
48
+ esbuildOptions: _esbuildOptions = {}
49
+ } = options;
50
+ const banner = _banners ? emitBanner : (...args) => void 0;
51
+ const esbuildMergedOptions = Object.assign({}, esbuildDefaults, _esbuildOptions);
52
+ return build({
53
+ /** The directory for the original sources (default: `src`) */
54
+ sourceDir: _sourceDir,
55
+ /** The destination directory of the transpiled sources (default: `dist`) */
56
+ destDir: _destDir,
57
+ /** The directory for the test files (default: `test`) */
58
+ testDir: _testDir,
59
+ /** The directory for the coverage report (default: `coverage`) */
60
+ coverageDir: _coverageDir,
61
+ /** The directory for the coverage data (default: `.coverage-data`) */
62
+ coverageDataDir: _coverageDataDir,
63
+ /** A directory containing extra types to use while transpiling (default: `types`) */
64
+ extraTypesDir: _extraTypesDir,
65
+ /** The source `package.json` file (default: `package.json`) */
66
+ packageJson: _packageJson,
67
+ /** The source `package.json` file (default: same as `packageJson` option) */
68
+ outputPackageJson: _outputPackageJson,
69
+ /** The extension used for CommonJS modules (default: `.cjs`) */
70
+ cjsExtension: _cjsExtension,
71
+ /** The extension used for EcmaScript modules (default: `.mjs`) */
72
+ esmExtension: _esmExtension,
73
+ /** A glob pattern matching all test files (default: `**∕*.test.([cm])?ts`) */
74
+ testGlob: _testGlob,
75
+ /** A glob pattern matching files to be exported (default: `index.*`) */
76
+ exportsGlob: _exportsGlob,
77
+ /* ====================================================================== *
78
+ * SOURCES STRUCTURE *
79
+ * ====================================================================== */
80
+ /** Find all CommonJS source files (`*.cts`) */
81
+ _find_sources_cts() {
82
+ return find("**/*.(c)?ts", { directory: this.sourceDir, ignore: "**/*.d.ts" });
83
+ },
84
+ /** Find all EcmaScript Module source files (`*.mts`) */
85
+ _find_sources_mts() {
86
+ return find("**/*.(m)?ts", { directory: this.sourceDir, ignore: "**/*.d.ts" });
87
+ },
88
+ /** Find all typescript source files (`*.ts`, `*.mts` and `*.cts`) */
89
+ _find_sources() {
90
+ return merge([
91
+ _cjsTranspile ? this._find_sources_cts() : noop(),
92
+ _esmTranspile ? this._find_sources_mts() : noop()
93
+ ]);
94
+ },
95
+ /** Find all types definition files within sources */
96
+ _find_types() {
97
+ return find("**/*.d.ts", { directory: this.sourceDir });
98
+ },
99
+ /** Find all types definition files within sources */
100
+ _find_extras() {
101
+ if (!isDirectory(this.extraTypesDir))
102
+ return noop();
103
+ return find("**/*.d.ts", { directory: this.extraTypesDir });
104
+ },
105
+ /** Find all resource files (non-typescript files) within sources */
106
+ _find_resources() {
107
+ return find("**/*", { directory: this.sourceDir, ignore: "**/*.([cm])?ts" });
108
+ },
109
+ /** Find all test source files */
110
+ _find_tests() {
111
+ return find(this.testGlob, { directory: this.testDir, ignore: "**/*.d.ts" });
112
+ },
113
+ /* ====================================================================== *
114
+ * TRANSPILE *
115
+ * ====================================================================== */
116
+ /** Transpile to CJS */
117
+ transpile_cjs() {
118
+ return this._find_sources_cts().esbuild({
119
+ ...esbuildMergedOptions,
120
+ format: "cjs",
121
+ outdir: this.destDir,
122
+ outExtension: { ".js": this.cjsExtension }
123
+ });
124
+ },
125
+ /** Transpile to ESM */
126
+ transpile_esm() {
127
+ return this._find_sources_mts().esbuild({
128
+ ...esbuildMergedOptions,
129
+ format: "esm",
130
+ outdir: this.destDir,
131
+ outExtension: { ".js": this.esmExtension }
132
+ });
133
+ },
134
+ /** Generate all .d.ts files */
135
+ transpile_types() {
136
+ return merge([
137
+ this._find_sources(),
138
+ this._find_types(),
139
+ this._find_extras()
140
+ ]).tsc("tsconfig.json", {
141
+ noEmit: false,
142
+ rootDir: this.sourceDir,
143
+ declaration: true,
144
+ emitDeclarationOnly: true,
145
+ outDir: this.destDir
146
+ });
147
+ },
148
+ /** Copy all resources coming alongside our sources */
149
+ transpile_resources() {
150
+ return merge([
151
+ this._find_resources(),
152
+ this._find_types()
153
+ ]).copy(this.destDir);
154
+ },
155
+ /** Transpile all source code */
156
+ async transpile() {
157
+ banner("Transpiling source files");
158
+ if (isDirectory(this.destDir))
159
+ await rmrf(this.destDir);
160
+ return merge([
161
+ _cjsTranspile ? this.transpile_cjs() : noop(),
162
+ _esmTranspile ? this.transpile_esm() : noop(),
163
+ this.transpile_types(),
164
+ this.transpile_resources()
165
+ ]);
166
+ },
167
+ /* ====================================================================== *
168
+ * TEST, COVERAGE & LINTING *
169
+ * ====================================================================== */
170
+ /** Run test and emit coverage data */
171
+ async test() {
172
+ banner("Running tests");
173
+ if (_coverage && isDirectory(this.coverageDataDir))
174
+ await rmrf(this.coverageDataDir);
175
+ await this._find_tests().jasmine({ coverageDir: _coverage ? this.coverageDataDir : void 0 });
176
+ },
177
+ /** Run tests (always) and generate a coverage report */
178
+ async coverage() {
179
+ let files;
180
+ try {
181
+ await this.test();
182
+ } finally {
183
+ banner("Preparing coverage report");
184
+ files = await this._find_sources().coverage(this.coverageDataDir, {
185
+ reportDir: this.coverageDir,
186
+ minimumCoverage: _minimumCoverage,
187
+ minimumFileCoverage: _minimumFileCoverage,
188
+ optimalCoverage: _optimalCoverage,
189
+ optimalFileCoverage: _optimalFileCoverage
190
+ });
191
+ }
192
+ return files;
193
+ },
194
+ /** Run test and emit coverage data */
195
+ async lint() {
196
+ banner("Linting sources");
197
+ await merge([
198
+ this._find_sources(),
199
+ this._find_tests(),
200
+ this._find_types(),
201
+ this._find_extras()
202
+ ]).eslint();
203
+ },
204
+ /* ====================================================================== *
205
+ * PACKAGE.JSON EXPORTS *
206
+ * ====================================================================== */
207
+ /** Inject `exports` into the `package.json` file */
208
+ async exports() {
209
+ const files = await this.transpile();
210
+ banner('Updating exports in "package.json"');
211
+ return merge([files]).filter(this.exportsGlob, { directory: this.destDir, ignore: "**/*.map" }).exports({
212
+ cjsExtension: this.cjsExtension,
213
+ esmExtension: this.esmExtension,
214
+ packageJson: this.packageJson,
215
+ outputPackageJson: this.outputPackageJson
216
+ });
217
+ },
218
+ /* ====================================================================== *
219
+ * DEFAULT: DO EVERYTHING *
220
+ * ====================================================================== */
221
+ /* coverage ignore next */
222
+ /** Build everything */
223
+ async default() {
224
+ if (_parallelize) {
225
+ await Promise.all([
226
+ this.transpile(),
227
+ this.coverage(),
228
+ // implies "test"
229
+ this.lint()
230
+ ]);
231
+ } else {
232
+ await this.transpile();
233
+ await this.coverage();
234
+ await this.lint();
235
+ }
236
+ await this.exports();
237
+ }
238
+ });
239
+ }
240
+ function emitBanner(message) {
241
+ log.notice([
242
+ "",
243
+ $gry(`\u2554${"".padStart(60, "\u2550")}\u2557`),
244
+ `${$gry("\u2551")} ${$wht(message.padEnd(58, " "))} ${$gry("\u2551")}`,
245
+ $gry(`\u255A${"".padStart(60, "\u2550")}\u255D`),
246
+ ""
247
+ ].join("\n"));
248
+ }
249
+ export {
250
+ tasks
251
+ };
252
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
package/package.json CHANGED
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "@plugjs/build",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Simple shared build using PlugJS",
5
- "main": "./dist/build.cjs",
6
- "module": "./dist/build.mjs",
7
- "types": "./dist/build.d.ts",
5
+ "main": "./dist/index.cjs",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
8
  "exports": {
9
9
  ".": {
10
- "import": {
11
- "types": "./dist/build.d.ts",
12
- "default": "./dist/build.mjs"
13
- },
14
10
  "require": {
15
- "types": "./dist/build.d.ts",
16
- "default": "./dist/build.cjs"
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.cjs"
13
+ },
14
+ "import": {
15
+ "types": "./dist/index.d.ts",
16
+ "default": "./dist/index.mjs"
17
17
  }
18
18
  }
19
19
  },
@@ -21,15 +21,20 @@
21
21
  "bootstrap-plugjs-build": "./dist/bootstrap.mjs"
22
22
  },
23
23
  "scripts": {
24
- "build": "plug"
24
+ "build": "plug",
25
+ "coverage": "plug coverage",
26
+ "dev": "plug coverage -w src -w test",
27
+ "lint": "plug lint",
28
+ "test": "plug test",
29
+ "transpile": "plug transpile"
25
30
  },
26
31
  "dependencies": {
27
- "@plugjs/cov8": "^0.1.2",
28
- "@plugjs/eslint": "^0.1.2",
29
- "@plugjs/eslint-plugin": "^0.1.1",
30
- "@plugjs/jasmine": "^0.1.2",
31
- "@plugjs/plug": "^0.1.3",
32
- "@plugjs/typescript": "^0.1.2"
32
+ "@plugjs/cov8": "^0.2.0",
33
+ "@plugjs/eslint": "^0.2.0",
34
+ "@plugjs/eslint-plugin": "^0.1.2",
35
+ "@plugjs/jasmine": "^0.2.0",
36
+ "@plugjs/plug": "^0.2.0",
37
+ "@plugjs/typescript": "^0.2.0"
33
38
  },
34
39
  "files": [
35
40
  "*.md",
@@ -0,0 +1,3 @@
1
+ {
2
+ "typescript.tsdk": "node_modules/typescript/lib"
3
+ }
package/src/bootstrap.mts CHANGED
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { build, find, invoke, log, resolve, fs, isFile } from '@plugjs/plug'
2
+
3
+ /* coverage ignore file // we don't test bootstrapping for now */
4
+ import { build, find, fs, isFile, log, resolve } from '@plugjs/plug'
3
5
  import { $p } from '@plugjs/plug/logging'
4
6
 
5
7
  const tasks = build({
@@ -7,7 +9,11 @@ const tasks = build({
7
9
  async bootstrap_resources(): Promise<void> {
8
10
  const pipe = find('**/*', '**/.*', { directory: '@../resources' })
9
11
  const sources = await pipe
10
- const targets = await pipe.copy('.', { overwrite })
12
+ const targets = await pipe.copy('.', {
13
+ // it seems NPM has _some_ problems with some dotfiles (e.g. .gitignore)
14
+ rename: (relative) => relative.replaceAll(/(^|\/)__dot_/g, '$1.'),
15
+ overwrite,
16
+ })
11
17
 
12
18
  log('Bootstrapped', targets.length, 'of', sources.length, 'files:')
13
19
  for (const file of targets.absolutePaths()) log(` ${$p(file)}`)
@@ -33,19 +39,30 @@ const tasks = build({
33
39
  // Merge package contents
34
40
  log(`Updating ${$p(targetPackage)}`)
35
41
 
36
- if (! targetJson.scripts?.build) {
37
- targetJson.scripts = Object.assign({}, targetJson.scripts, {
38
- build: 'plug',
39
- })
42
+ // Default scripts
43
+ targetJson.scripts = {
44
+ build: 'plug',
45
+ coverage: 'plug coverage',
46
+ dev: 'plug coverage -w src -w test',
47
+ lint: 'plug lint',
48
+ test: 'plug test',
49
+ transpile: 'plug transpile',
50
+ ...targetJson.scripts,
40
51
  }
41
52
 
42
- targetJson.devDependencies = Object.assign({}, targetJson.devDependencies, {
53
+ // Exported/packaged files
54
+ const targetFiles = new Set([ ...(targetJson.files || []), '*.md', 'dist/', 'src/' ])
55
+ targetJson.files = [ ...targetFiles ].sort()
56
+
57
+ // *DEV* dependency on this build
58
+ targetJson.devDependencies = {
59
+ ...targetJson.devDependencies,
43
60
  [buildJson.name]: `^${buildJson.version}`,
44
- })
61
+ }
45
62
 
46
63
  // Overwrite taget package.json file
47
64
  log(`Writing ${$p(targetPackage)}`)
48
- await fs.writeFile(targetPackage, JSON.stringify(targetJson, null, 2), 'utf-8')
65
+ await fs.writeFile(targetPackage, JSON.stringify(targetJson, null, 2) + '\n', 'utf-8')
49
66
  },
50
67
 
51
68
  /** Bootstrap the project */
@@ -57,4 +74,4 @@ const tasks = build({
57
74
  })
58
75
 
59
76
  const overwrite = process.argv[2] === '--overwrite' ? 'overwrite' : 'skip'
60
- invoke(tasks, 'bootstrap', { overwrite }).catch(log.error)
77
+ tasks.bootstrap({ overwrite }).catch(log.error)