build-strap 3.0.0-dev.40 → 4.0.0-dev.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.
Files changed (108) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -34
  3. package/ant.d.ts +19 -0
  4. package/ant.js +12 -37
  5. package/cert.d.ts +12 -0
  6. package/cert.js +89 -151
  7. package/clean.d.ts +4 -0
  8. package/clean.js +7 -16
  9. package/copy.d.ts +7 -0
  10. package/copy.js +49 -76
  11. package/cp.d.ts +17 -0
  12. package/cp.js +85 -170
  13. package/docker.container.d.ts +73 -0
  14. package/docker.container.js +219 -362
  15. package/docker.d.ts +68 -0
  16. package/docker.js +167 -347
  17. package/docker.network.d.ts +42 -0
  18. package/docker.network.js +69 -144
  19. package/docker.volume.d.ts +26 -0
  20. package/docker.volume.js +52 -126
  21. package/dockerCleanup.d.ts +38 -0
  22. package/dockerCleanup.js +66 -141
  23. package/dockerCompose.d.ts +154 -0
  24. package/dockerCompose.js +400 -727
  25. package/fs.d.ts +5 -0
  26. package/fs.js +38 -95
  27. package/git.d.ts +9 -0
  28. package/git.js +19 -30
  29. package/index.d.ts +20 -0
  30. package/index.js +20 -27
  31. package/maps.d.ts +33 -0
  32. package/maps.js +16 -87
  33. package/npm.d.ts +35 -0
  34. package/npm.js +97 -138
  35. package/package.json +23 -19
  36. package/pkg.d.ts +39 -0
  37. package/pkg.js +26 -74
  38. package/publish.d.ts +27 -0
  39. package/publish.js +52 -140
  40. package/run.d.ts +13 -0
  41. package/run.js +39 -85
  42. package/tgz.d.ts +13 -0
  43. package/tgz.js +61 -96
  44. package/version.d.ts +34 -0
  45. package/version.js +86 -127
  46. package/yarn.d.ts +26 -0
  47. package/yarn.js +70 -119
  48. package/ant.js.flow +0 -42
  49. package/artifactory.js +0 -617
  50. package/artifactory.js.flow +0 -616
  51. package/cert.conf +0 -20
  52. package/cert.js.flow +0 -152
  53. package/clean.js.flow +0 -19
  54. package/copy.js.flow +0 -79
  55. package/cp.js.flow +0 -172
  56. package/docker.container.js.flow +0 -389
  57. package/docker.js.flow +0 -367
  58. package/docker.network.js.flow +0 -159
  59. package/docker.volume.js.flow +0 -136
  60. package/dockerCleanup.js.flow +0 -151
  61. package/dockerCompose.js.flow +0 -765
  62. package/flow.js +0 -21
  63. package/flow.js.flow +0 -20
  64. package/fs.js.flow +0 -96
  65. package/git.js.flow +0 -34
  66. package/hg.js +0 -35
  67. package/hg.js.flow +0 -34
  68. package/index.js.flow +0 -26
  69. package/inline-resources.js +0 -158
  70. package/inline-resources.js.flow +0 -157
  71. package/maps.js.flow +0 -111
  72. package/npm.js.flow +0 -144
  73. package/pkg.js.flow +0 -80
  74. package/publish.js.flow +0 -144
  75. package/run.js.flow +0 -89
  76. package/src/ant.js +0 -42
  77. package/src/artifactory.js +0 -616
  78. package/src/cert.conf +0 -20
  79. package/src/cert.js +0 -152
  80. package/src/clean.js +0 -19
  81. package/src/copy.js +0 -79
  82. package/src/cp.js +0 -172
  83. package/src/docker.container.js +0 -389
  84. package/src/docker.js +0 -367
  85. package/src/docker.network.js +0 -159
  86. package/src/docker.volume.js +0 -136
  87. package/src/dockerCleanup.js +0 -151
  88. package/src/dockerCompose.js +0 -765
  89. package/src/flow.js +0 -20
  90. package/src/fs.js +0 -96
  91. package/src/git.js +0 -34
  92. package/src/hg.js +0 -34
  93. package/src/index.js +0 -26
  94. package/src/inline-resources.js +0 -157
  95. package/src/maps.js +0 -111
  96. package/src/npm.js +0 -144
  97. package/src/pkg.js +0 -80
  98. package/src/publish.js +0 -144
  99. package/src/run.js +0 -89
  100. package/src/test.js +0 -55
  101. package/src/tgz.js +0 -101
  102. package/src/version.js +0 -141
  103. package/src/yarn.js +0 -123
  104. package/test.js +0 -56
  105. package/test.js.flow +0 -55
  106. package/tgz.js.flow +0 -101
  107. package/version.js.flow +0 -141
  108. package/yarn.js.flow +0 -123
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2019 Justin Murray
3
+ Copyright (c) 2021 Justin Murray
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # build-strap
2
- A suite of functions to help with writing build scripts using javascript code (which run on node).
2
+ A suite of functions to help with writing build scripts using TypeScript (or javascript) code (which run on node).
3
3
 
4
- This project builds itself, so take a look in the `tools/` folder for an example project. Run `./bs` to build.
4
+ This project builds itself, so take a look in the `targets/` folder for an example. Run `./bs` to build.
5
5
 
6
6
  [![CI Build](https://github.com/murrayju/build-strap/workflows/CI%20Build/badge.svg?branch=master)](https://github.com/murrayju/build-strap/actions?query=workflow%3A%22CI+Build%22)
7
7
  [![version](https://img.shields.io/github/v/tag/murrayju/build-strap.svg?label=version&sort=semver)](https://github.com/murrayju/build-strap/releases/latest)
@@ -41,39 +41,14 @@ By default, the build tools read project-specific configuration from your `packa
41
41
  "npm": {
42
42
  "publish": true,
43
43
  },
44
- "artifactory": {
45
- "root": "https://artifactory.your-company.com/artifactory/",
46
- "path": "com/your-company/your-project-name",
47
- "version-folders": false,
48
- "integration": "integration-repo",
49
- "integration-branch-folders": true,
50
- "integration-days-to-keep": 14,
51
- "integration-max-to-keep": 10,
52
- "release": "releases-repo",
53
- "release-branch": "master",
54
- "npm": "npm-repo",
55
- "npm-clean": "internal-npm-repo"
56
- },
57
44
  "docker": {
58
- "registry": "artifactory.your-company.com",
45
+ "registry": "ghcr.io",
59
46
  "repository": "your-company",
60
47
  "name": "your-project-name"
61
48
  }
62
49
  }
63
50
  }
64
51
  ```
65
- ### artifactory
66
- * **root**: base URL for the artifactory server
67
- * **path**: path to project root in the artifactory tree.
68
- * **version-folders**: if `true`, artifacts will be organized into subfolders for each version number
69
- * **integration**: name of the artifactory repo in which to place integration (not official release) artifacts.
70
- * **integration-branch-folders**: if `true`, artifacts will be organized into subfolders for each branch.
71
- * **integration-days-to-keep**: for artifact cleanup, specifies the max age in days before an artifact will be deleted.
72
- * **integration-max-to-keep**: for artifact cleanup, specifies the maximum number of artifacts to keep, regardless of age. Only the newest N artifacts will be kept.
73
- * **release**: name of the artifactory repo in which to place release artifacts.
74
- * **release-branch**: name of the mercurial branch from which official releases are built/published. Defaults to `master`.
75
- * **npm**: name of the artifactory repo in which to publish npm artifacts.
76
- * **npm-clean**: for artifact cleanup, the name of the artifactory repo used to find and delete old npm artifacts.
77
52
 
78
53
  ### docker
79
54
  * **registry**: base URL for the docker registry, as needed by `docker push`.
@@ -135,9 +110,3 @@ In order to publish to NPM, proper credentials must be provided to the script. B
135
110
  ```
136
111
  { "email": "builder@your-company.com", "username":"builder", "password":"abc123" }
137
112
  ```
138
-
139
- ## Artifactory Credentials
140
- In order to publish and/or delete things from Artifactory, proper credentials must be provided to the script. By default, these are read from the `ARTIFACTORY_CREDS` environment variable, but it is also possible to pass them as an argument to most functions. This is expected to be a JSON encoded string in the following format:
141
- ```
142
- { "email": "builder@your-company.com", "username":"builder", "password":"abc123" }
143
- ```
package/ant.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ import { SpawnOptions } from './cp.js';
2
+ /**
3
+ * Named value pair to use when configuring an Ant build property
4
+ */
5
+ export interface AntPropertyConfiguration {
6
+ name: string;
7
+ value: string;
8
+ }
9
+ export interface AntSpawnOptions {
10
+ args?: string[];
11
+ properties?: AntPropertyConfiguration[];
12
+ spawnOptions?: SpawnOptions;
13
+ }
14
+ /**
15
+ * Executes the given ant command
16
+ * @param {string} target the ant target to invoke
17
+ * @param {AntSpawnOptions} options
18
+ */
19
+ export declare function ant(target: string, opts?: AntSpawnOptions): Promise<void>;
package/ant.js CHANGED
@@ -1,43 +1,18 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.ant = ant;
2
- var _cp = require("./cp");
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
1
+ import { spawn } from './cp.js';
19
2
  /**
20
3
  * Executes the given ant command
21
4
  * @param {string} target the ant target to invoke
22
5
  * @param {AntSpawnOptions} options
23
6
  */
24
- async function ant(target, opts) {
25
- const { properties = [], args = [], spawnOptions } = opts || {};
26
-
27
- const execOptions = {
28
- stdio: 'inherit',
29
- pipeOutput: true,
30
- ...spawnOptions };
31
-
32
-
33
- await (0, _cp.spawn)(
34
- 'ant',
35
- [
36
- target,
37
- ...args,
38
- ...properties.map(({ name, value }) => `-D${name}=${value}`)],
39
-
40
- execOptions);
41
-
7
+ export async function ant(target, opts) {
8
+ const { properties = [], args = [], spawnOptions } = opts || {};
9
+ await spawn('ant', [
10
+ target,
11
+ ...args,
12
+ ...properties.map(({ name, value }) => `-D${name}=${value}`),
13
+ ], {
14
+ pipeOutput: true,
15
+ stdio: 'inherit',
16
+ ...spawnOptions,
17
+ });
42
18
  }
43
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hbnQuanMiXSwibmFtZXMiOlsiYW50IiwidGFyZ2V0Iiwib3B0cyIsInByb3BlcnRpZXMiLCJhcmdzIiwic3Bhd25PcHRpb25zIiwiZXhlY09wdGlvbnMiLCJzdGRpbyIsInBpcGVPdXRwdXQiLCJtYXAiLCJuYW1lIiwidmFsdWUiXSwibWFwcGluZ3MiOiI7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLGVBQWVBLEdBQWYsQ0FBbUJDLE1BQW5CLEVBQW1DQyxJQUFuQyxFQUEyRDtBQUNoRSxRQUFNLEVBQUVDLFVBQVUsR0FBRyxFQUFmLEVBQW1CQyxJQUFJLEdBQUcsRUFBMUIsRUFBOEJDLFlBQTlCLEtBQStDSCxJQUFJLElBQUksRUFBN0Q7O0FBRUEsUUFBTUksV0FBVyxHQUFHO0FBQ2xCQyxJQUFBQSxLQUFLLEVBQUUsU0FEVztBQUVsQkMsSUFBQUEsVUFBVSxFQUFFLElBRk07QUFHbEIsT0FBR0gsWUFIZSxFQUFwQjs7O0FBTUEsUUFBTTtBQUNKLE9BREk7QUFFSjtBQUNFSixFQUFBQSxNQURGO0FBRUUsS0FBR0csSUFGTDtBQUdFLEtBQUdELFVBQVUsQ0FBQ00sR0FBWCxDQUFlLENBQUMsRUFBRUMsSUFBRixFQUFRQyxLQUFSLEVBQUQsS0FBc0IsS0FBSUQsSUFBSyxJQUFHQyxLQUFNLEVBQXZELENBSEwsQ0FGSTs7QUFPSkwsRUFBQUEsV0FQSSxDQUFOOztBQVNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnLi9jcCc7XG5pbXBvcnQgdHlwZSB7IFNwYXduT3B0aW9ucyB9IGZyb20gJy4vY3AnO1xuXG4vKipcbiAqIE5hbWVkIHZhbHVlIHBhaXIgdG8gdXNlIHdoZW4gY29uZmlndXJpbmcgYW4gQW50IGJ1aWxkIHByb3BlcnR5XG4gKi9cbmV4cG9ydCB0eXBlIEFudFByb3BlcnR5Q29uZmlndXJhdGlvbiA9IHt8XG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyxcbnx9O1xuXG5leHBvcnQgdHlwZSBBbnRTcGF3bk9wdGlvbnMgPSB7fFxuICBwcm9wZXJ0aWVzPzogQW50UHJvcGVydHlDb25maWd1cmF0aW9uW10sIC8vIEFudCBwcm9wZXJ0eSB2YWx1ZXMgdG8gY29uZmlndXJlXG4gIGFyZ3M/OiBzdHJpbmdbXSwgLy8gQW55IGFkZGl0aW9uYWwgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBwYXNzXG4gIHNwYXduT3B0aW9ucz86IFNwYXduT3B0aW9ucywgLy8gT3B0aW9uYWwgc3Bhd24gY29uZmlndXJhdGlvbi4gRGVmYXVsdHMgdG8gcnVuIHRoZSBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5XG58fTtcblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gYW50IGNvbW1hbmRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgdGhlIGFudCB0YXJnZXQgdG8gaW52b2tlXG4gKiBAcGFyYW0ge0FudFNwYXduT3B0aW9uc30gb3B0aW9uc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYW50KHRhcmdldDogc3RyaW5nLCBvcHRzPzogQW50U3Bhd25PcHRpb25zKSB7XG4gIGNvbnN0IHsgcHJvcGVydGllcyA9IFtdLCBhcmdzID0gW10sIHNwYXduT3B0aW9ucyB9ID0gb3B0cyB8fCB7fTtcblxuICBjb25zdCBleGVjT3B0aW9ucyA9IHtcbiAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgIHBpcGVPdXRwdXQ6IHRydWUsXG4gICAgLi4uc3Bhd25PcHRpb25zLFxuICB9O1xuXG4gIGF3YWl0IHNwYXduKFxuICAgICdhbnQnLFxuICAgIFtcbiAgICAgIHRhcmdldCxcbiAgICAgIC4uLmFyZ3MsXG4gICAgICAuLi5wcm9wZXJ0aWVzLm1hcCgoeyBuYW1lLCB2YWx1ZSB9KSA9PiBgLUQke25hbWV9PSR7dmFsdWV9YCksXG4gICAgXSxcbiAgICBleGVjT3B0aW9ucyxcbiAgKTtcbn1cbiJdfQ==
package/cert.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ export interface CertConfig {
2
+ commonName?: string;
3
+ countryName?: string;
4
+ emailAddress?: string;
5
+ localityName?: string;
6
+ organizationName?: string;
7
+ organizationalUnitName?: string;
8
+ stateOrProvinceName?: string;
9
+ }
10
+ export declare const getCertConfig: () => CertConfig;
11
+ export declare const getIpAddresses: () => string[];
12
+ export declare function generateCert(targetDir: string, force?: boolean): Promise<void>;
package/cert.js CHANGED
@@ -1,153 +1,91 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.getCertConfig = getCertConfig;exports.getIpAddresses = getIpAddresses;exports.generateCert = generateCert;
2
- var _os = _interopRequireDefault(require("os"));
3
- var _requestPromiseNative = _interopRequireDefault(require("request-promise-native"));
4
- var _path = _interopRequireDefault(require("path"));
5
- var _fsExtra = _interopRequireDefault(require("fs-extra"));
6
- var _run = require("./run");
7
- var _fs = require("./fs");
8
- var _cp = require("./cp");
9
- var _pkg = require("./pkg");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
- function getCertConfig() {
22
- return (0, _pkg.getCfg)().cert || {};
23
- }
24
-
25
- function getIpAddresses() {
26
- const iFaces = _os.default.networkInterfaces();
27
- return Object.keys(iFaces).reduce(
28
- (prev, ifName) => [
29
- ...prev,
30
- ...iFaces[ifName].map((iFace) => iFace.address)],
31
-
32
- []);
33
-
34
- }
35
-
1
+ import fs from 'fs-extra';
2
+ import fetch from 'node-fetch';
3
+ import os from 'os';
4
+ import path from 'path';
5
+ import { spawn } from './cp.js';
6
+ import { readDir } from './fs.js';
7
+ import { getCfg } from './pkg.js';
8
+ import { buildLog } from './run.js';
9
+ export const getCertConfig = () => getCfg().cert ?? {};
10
+ export const getIpAddresses = () => Object.values(os.networkInterfaces()).flatMap((iFaces) => iFaces?.map((iFace) => iFace.address) ?? []);
36
11
  // Generate a self-signed certificate (if it doesn't exist)
37
- async function generateCert(
38
- targetDir,
39
- force = process.argv.includes('--force-generateCert'))
40
- {
41
- if (process.argv.includes('--no-generateCert')) {
42
- (0, _run.buildLog)('Skipping due to --no-generateCert');
43
- return;
44
- }
45
- (0, _run.buildLog)(`scanning ${targetDir} for certificates...`);
46
- if (
47
- !force &&
48
- (await (0, _fs.readDir)(`${targetDir}/server.@(crt|key)`)).length === 2)
49
- {
50
- (0, _run.buildLog)('Skipping certificate generation: certificate already exists');
51
- return;
52
- }
53
- (0, _run.buildLog)('Generating self-signed certificate...');
54
- const {
55
- countryName = 'US',
56
- stateOrProvinceName = 'Pennsylvania',
57
- localityName = 'SomeCity',
58
- organizationName = 'Company',
59
- organizationalUnitName = 'Product',
60
- commonName = 'app.company.com',
61
- emailAddress = 'contact@company.com' } =
62
- getCertConfig();
63
- const hostname = _os.default.hostname();
64
- (0, _run.buildLog)(`hostname: ${hostname}`);
65
- const ipAddresses = getIpAddresses();
66
- (0, _run.buildLog)(`ip addresses: ${JSON.stringify(ipAddresses)}`);
67
- const ifconfig = await _requestPromiseNative.default.get('https://ifconfig.co', { json: true });
68
- const externalIp4 = ifconfig.ip;
69
- (0, _run.buildLog)(`external ipv4: ${externalIp4}`);
70
- const dnsName = ifconfig.hostname;
71
- (0, _run.buildLog)(`dnsName: ${dnsName}`);
72
-
73
- await _fsExtra.default.ensureDir(targetDir);
74
- const keyFile = _path.default.resolve(targetDir, 'server.key');
75
- const csrFile = _path.default.resolve(targetDir, 'server.csr');
76
- const crtFile = _path.default.resolve(targetDir, 'server.crt');
77
- const confTemplateFile = _path.default.resolve(__dirname, 'cert.conf');
78
- const confFile = _path.default.resolve(targetDir, 'cert.conf.generated');
79
- const confTemplate = await _fsExtra.default.readFile(confTemplateFile, 'utf8');
80
- await _fsExtra.default.writeFile(
81
- confFile,
82
- confTemplate.
83
- replace('{{countryName}}', countryName).
84
- replace('{{stateOrProvinceName}}', stateOrProvinceName).
85
- replace('{{localityName}}', localityName).
86
- replace('{{organizationName}}', organizationName).
87
- replace('{{organizationalUnitName}}', organizationalUnitName).
88
- replace('{{commonName}}', commonName).
89
- replace('{{emailAddress}}', emailAddress).
90
- replace(
91
- '{{SAN_IP}}',
92
- ipAddresses.reduce((acc, next) => `${acc},IP:${next}`, '')).
93
-
94
- replace('{{SAN_DNS}}', `,DNS:${hostname},DNS:${dnsName}`),
95
- 'utf8');
96
-
97
-
98
- (0, _run.buildLog)('generating key file...');
99
- await (0, _cp.spawn)(
100
- 'openssl',
101
- [
102
- 'genpkey',
103
- '-algorithm',
104
- 'RSA',
105
- '-pkeyopt',
106
- 'rsa_keygen_bits:2048',
107
- '-out',
108
- keyFile],
109
-
110
- { pipeOutput: true });
111
-
112
- (0, _run.buildLog)('generating csr file...');
113
- await (0, _cp.spawn)(
114
- 'openssl',
115
- [
116
- 'req',
117
- '-new',
118
- '-key',
119
- keyFile,
120
- '-out',
121
- csrFile,
122
- '-subj',
123
- `/C=${countryName}/ST=${stateOrProvinceName}/L=${localityName}/O=${organizationName}/OU=${organizationalUnitName}/CN=${commonName}/CN=${externalIp4}/CN=${hostname}/CN=${dnsName}${ipAddresses.reduce(
124
- (acc, next) => `${acc}/CN=${next}`)
125
- }/CN=localhost`,
126
- '-config',
127
- confFile],
128
-
129
- { pipeOutput: true });
130
-
131
- (0, _run.buildLog)('generating cert...');
132
- await (0, _cp.spawn)(
133
- 'openssl',
134
- [
135
- 'x509',
136
- '-req',
137
- '-days',
138
- '365',
139
- '-in',
140
- csrFile,
141
- '-signkey',
142
- keyFile,
143
- '-out',
144
- crtFile,
145
- '-extfile',
146
- confFile,
147
- '-extensions',
148
- 'v3_req'],
149
-
150
- { pipeOutput: true });
151
-
12
+ export async function generateCert(targetDir, force = process.argv.includes('--force-generateCert')) {
13
+ if (process.argv.includes('--no-generateCert')) {
14
+ buildLog('Skipping due to --no-generateCert');
15
+ return;
16
+ }
17
+ buildLog(`scanning ${targetDir} for certificates...`);
18
+ if (!force &&
19
+ (await readDir(`${targetDir}/server.@(crt|key)`)).length === 2) {
20
+ buildLog('Skipping certificate generation: certificate already exists');
21
+ return;
22
+ }
23
+ buildLog('Generating self-signed certificate...');
24
+ const { commonName = 'app.company.com', countryName = 'US', emailAddress = 'contact@company.com', localityName = 'SomeCity', organizationName = 'Company', organizationalUnitName = 'Product', stateOrProvinceName = 'Pennsylvania', } = getCertConfig();
25
+ const hostname = os.hostname();
26
+ buildLog(`hostname: ${hostname}`);
27
+ const ipAddresses = getIpAddresses();
28
+ buildLog(`ip addresses: ${JSON.stringify(ipAddresses)}`);
29
+ const ifconfig = await fetch('https://ifconfig.co').then((r) => r.json());
30
+ const externalIp4 = ifconfig.ip;
31
+ buildLog(`external ipv4: ${externalIp4}`);
32
+ const dnsName = ifconfig.hostname;
33
+ buildLog(`dnsName: ${dnsName}`);
34
+ await fs.ensureDir(targetDir);
35
+ const keyFile = path.resolve(targetDir, 'server.key');
36
+ const csrFile = path.resolve(targetDir, 'server.csr');
37
+ const crtFile = path.resolve(targetDir, 'server.crt');
38
+ const confTemplateFile = path.resolve(__dirname, 'cert.conf');
39
+ const confFile = path.resolve(targetDir, 'cert.conf.generated');
40
+ const confTemplate = await fs.readFile(confTemplateFile, 'utf8');
41
+ await fs.writeFile(confFile, confTemplate
42
+ .replace('{{countryName}}', countryName)
43
+ .replace('{{stateOrProvinceName}}', stateOrProvinceName)
44
+ .replace('{{localityName}}', localityName)
45
+ .replace('{{organizationName}}', organizationName)
46
+ .replace('{{organizationalUnitName}}', organizationalUnitName)
47
+ .replace('{{commonName}}', commonName)
48
+ .replace('{{emailAddress}}', emailAddress)
49
+ .replace('{{SAN_IP}}', ipAddresses.reduce((acc, next) => `${acc},IP:${next}`, ''))
50
+ .replace('{{SAN_DNS}}', `,DNS:${hostname},DNS:${dnsName}`), 'utf8');
51
+ buildLog('generating key file...');
52
+ await spawn('openssl', [
53
+ 'genpkey',
54
+ '-algorithm',
55
+ 'RSA',
56
+ '-pkeyopt',
57
+ 'rsa_keygen_bits:2048',
58
+ '-out',
59
+ keyFile,
60
+ ], { pipeOutput: true });
61
+ buildLog('generating csr file...');
62
+ await spawn('openssl', [
63
+ 'req',
64
+ '-new',
65
+ '-key',
66
+ keyFile,
67
+ '-out',
68
+ csrFile,
69
+ '-subj',
70
+ `/C=${countryName}/ST=${stateOrProvinceName}/L=${localityName}/O=${organizationName}/OU=${organizationalUnitName}/CN=${commonName}/CN=${externalIp4}/CN=${hostname}/CN=${dnsName}${ipAddresses.reduce((acc, next) => `${acc}/CN=${next}`)}/CN=localhost`,
71
+ '-config',
72
+ confFile,
73
+ ], { pipeOutput: true });
74
+ buildLog('generating cert...');
75
+ await spawn('openssl', [
76
+ 'x509',
77
+ '-req',
78
+ '-days',
79
+ '365',
80
+ '-in',
81
+ csrFile,
82
+ '-signkey',
83
+ keyFile,
84
+ '-out',
85
+ crtFile,
86
+ '-extfile',
87
+ confFile,
88
+ '-extensions',
89
+ 'v3_req',
90
+ ], { pipeOutput: true });
152
91
  }
153
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jZXJ0LmpzIl0sIm5hbWVzIjpbImdldENlcnRDb25maWciLCJjZXJ0IiwiZ2V0SXBBZGRyZXNzZXMiLCJpRmFjZXMiLCJvcyIsIm5ldHdvcmtJbnRlcmZhY2VzIiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsInByZXYiLCJpZk5hbWUiLCJtYXAiLCJpRmFjZSIsImFkZHJlc3MiLCJnZW5lcmF0ZUNlcnQiLCJ0YXJnZXREaXIiLCJmb3JjZSIsInByb2Nlc3MiLCJhcmd2IiwiaW5jbHVkZXMiLCJsZW5ndGgiLCJjb3VudHJ5TmFtZSIsInN0YXRlT3JQcm92aW5jZU5hbWUiLCJsb2NhbGl0eU5hbWUiLCJvcmdhbml6YXRpb25OYW1lIiwib3JnYW5pemF0aW9uYWxVbml0TmFtZSIsImNvbW1vbk5hbWUiLCJlbWFpbEFkZHJlc3MiLCJob3N0bmFtZSIsImlwQWRkcmVzc2VzIiwiSlNPTiIsInN0cmluZ2lmeSIsImlmY29uZmlnIiwicnAiLCJnZXQiLCJqc29uIiwiZXh0ZXJuYWxJcDQiLCJpcCIsImRuc05hbWUiLCJmcyIsImVuc3VyZURpciIsImtleUZpbGUiLCJwYXRoIiwicmVzb2x2ZSIsImNzckZpbGUiLCJjcnRGaWxlIiwiY29uZlRlbXBsYXRlRmlsZSIsIl9fZGlybmFtZSIsImNvbmZGaWxlIiwiY29uZlRlbXBsYXRlIiwicmVhZEZpbGUiLCJ3cml0ZUZpbGUiLCJyZXBsYWNlIiwiYWNjIiwibmV4dCIsInBpcGVPdXRwdXQiXSwibWFwcGluZ3MiOiI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCOzs7Ozs7Ozs7Ozs7QUFZTyxTQUFTQSxhQUFULEdBQXFDO0FBQzFDLFNBQU8sbUJBQVNDLElBQVQsSUFBaUIsRUFBeEI7QUFDRDs7QUFFTSxTQUFTQyxjQUFULEdBQW9DO0FBQ3pDLFFBQU1DLE1BQU0sR0FBR0MsWUFBR0MsaUJBQUgsRUFBZjtBQUNBLFNBQU9DLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZSixNQUFaLEVB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STs7QUFnQkosSUFBRU8sVUFBVSxFQUFFLElBQWQsRUFoQkksQ0FBTjs7QUFrQkEscUJBQVMsb0JBQVQ7QUFDQSxRQUFNO0FBQ0osV0FESTtBQUVKO0FBQ0UsUUFERjtBQUVFLFFBRkY7QUFHRSxTQUhGO0FBSUUsT0FKRjtBQUtFLE9BTEY7QUFNRVgsRUFBQUEsT0FORjtBQU9FLFlBUEY7QUFRRUgsRUFBQUEsT0FSRjtBQVNFLFFBVEY7QUFVRUksRUFBQUEsT0FWRjtBQVdFLFlBWEY7QUFZRUcsRUFBQUEsUUFaRjtBQWFFLGVBYkY7QUFjRSxVQWRGLENBRkk7O0FBa0JKLElBQUVPLFVBQVUsRUFBRSxJQUFkLEVBbEJJLENBQU47O0FBb0JEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgcnAgZnJvbSAncmVxdWVzdC1wcm9taXNlLW5hdGl2ZSc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgeyBidWlsZExvZyB9IGZyb20gJy4vcnVuJztcbmltcG9ydCB7IHJlYWREaXIgfSBmcm9tICcuL2ZzJztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnLi9jcCc7XG5pbXBvcnQgeyBnZXRDZmcgfSBmcm9tICcuL3BrZyc7XG5cbmV4cG9ydCB0eXBlIENlcnRDb25maWcgPSB7XG4gIGNvdW50cnlOYW1lPzogc3RyaW5nLFxuICBzdGF0ZU9yUHJvdmluY2VOYW1lPzogc3RyaW5nLFxuICBsb2NhbGl0eU5hbWU/OiBzdHJpbmcsXG4gIG9yZ2FuaXphdGlvbk5hbWU/OiBzdHJpbmcsXG4gIG9yZ2FuaXphdGlvbmFsVW5pdE5hbWU/OiBzdHJpbmcsXG4gIGNvbW1vbk5hbWU/OiBzdHJpbmcsXG4gIGVtYWlsQWRkcmVzcz86IHN0cmluZyxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDZXJ0Q29uZmlnKCk6IENlcnRDb25maWcge1xuICByZXR1cm4gZ2V0Q2ZnKCkuY2VydCB8fCB7fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldElwQWRkcmVzc2VzKCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgaUZhY2VzID0gb3MubmV0d29ya0ludGVyZmFjZXMoKTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGlGYWNlcykucmVkdWNlKFxuICAgIChwcmV2LCBpZk5hbWUpID0+IFtcbiAgICAgIC4uLnByZXYsXG4gICAgICAuLi5pRmFjZXNbaWZOYW1lXS5tYXAoKGlGYWNlKSA9PiBpRmFjZS5hZGRyZXNzKSxcbiAgICBdLFxuICAgIFtdLFxuICApO1xufVxuXG4vLyBHZW5lcmF0ZSBhIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIChpZiBpdCBkb2Vzbid0IGV4aXN0KVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQ2VydChcbiAgdGFyZ2V0RGlyOiBzdHJpbmcsXG4gIGZvcmNlOiBib29sZWFuID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWZvcmNlLWdlbmVyYXRlQ2VydCcpLFxuKSB7XG4gIGlmIChwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tbm8tZ2VuZXJhdGVDZXJ0JykpIHtcbiAgICBidWlsZExvZygnU2tpcHBpbmcgZHVlIHRvIC0tbm8tZ2VuZXJhdGVDZXJ0Jyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGJ1aWxkTG9nKGBzY2FubmluZyAke3RhcmdldERpcn0gZm9yIGNlcnRpZmljYXRlcy4uLmApO1xuICBpZiAoXG4gICAgIWZvcmNlICYmXG4gICAgKGF3YWl0IHJlYWREaXIoYCR7dGFyZ2V0RGlyfS9zZXJ2ZXIuQChjcnR8a2V5KWApKS5sZW5ndGggPT09IDJcbiAgKSB7XG4gICAgYnVpbGRMb2coJ1NraXBwaW5nIGNlcnRpZmljYXRlIGdlbmVyYXRpb246IGNlcnRpZmljYXRlIGFscmVhZHkgZXhpc3RzJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGJ1aWxkTG9nKCdHZW5lcmF0aW5nIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlLi4uJyk7XG4gIGNvbnN0IHtcbiAgICBjb3VudHJ5TmFtZSA9ICdVUycsXG4gICAgc3RhdGVPclByb3ZpbmNlTmFtZSA9ICdQZW5uc3lsdmFuaWEnLFxuICAgIGxvY2FsaXR5TmFtZSA9ICdTb21lQ2l0eScsXG4gICAgb3JnYW5pemF0aW9uTmFtZSA9ICdDb21wYW55JyxcbiAgICBvcmdhbml6YXRpb25hbFVuaXROYW1lID0gJ1Byb2R1Y3QnLFxuICAgIGNvbW1vbk5hbWUgPSAnYXBwLmNvbXBhbnkuY29tJyxcbiAgICBlbWFpbEFkZHJlc3MgPSAnY29udGFjdEBjb21wYW55LmNvbScsXG4gIH0gPSBnZXRDZXJ0Q29uZmlnKCk7XG4gIGNvbnN0IGhvc3RuYW1lID0gb3MuaG9zdG5hbWUoKTtcbiAgYnVpbGRMb2coYGhvc3RuYW1lOiAke2hvc3RuYW1lfWApO1xuICBjb25zdCBpcEFkZHJlc3NlcyA9IGdldElwQWRkcmVzc2VzKCk7XG4gIGJ1aWxkTG9nKGBpcCBhZGRyZXNzZXM6ICR7SlNPTi5zdHJpbmdpZnkoaXBBZGRyZXNzZXMpfWApO1xuICBjb25zdCBpZmNvbmZpZyA9IGF3YWl0IHJwLmdldCgnaHR0cHM6Ly9pZmNvbmZpZy5jbycsIHsganNvbjogdHJ1ZSB9KTtcbiAgY29uc3QgZXh0ZXJuYWxJcDQgPSBpZmNvbmZpZy5pcDtcbiAgYnVpbGRMb2coYGV4dGVybmFsIGlwdjQ6ICR7ZXh0ZXJuYWxJcDR9YCk7XG4gIGNvbnN0IGRuc05hbWUgPSBpZmNvbmZpZy5ob3N0bmFtZTtcbiAgYnVpbGRMb2coYGRuc05hbWU6ICR7ZG5zTmFtZX1gKTtcblxuICBhd2FpdCBmcy5lbnN1cmVEaXIodGFyZ2V0RGlyKTtcbiAgY29uc3Qga2V5RmlsZSA9IHBhdGgucmVzb2x2ZSh0YXJnZXREaXIsICdzZXJ2ZXIua2V5Jyk7XG4gIGNvbnN0IGNzckZpbGUgPSBwYXRoLnJlc29sdmUodGFyZ2V0RGlyLCAnc2VydmVyLmNzcicpO1xuICBjb25zdCBjcnRGaWxlID0gcGF0aC5yZXNvbHZlKHRhcmdldERpciwgJ3NlcnZlci5jcnQnKTtcbiAgY29uc3QgY29uZlRlbXBsYXRlRmlsZSA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICdjZXJ0LmNvbmYnKTtcbiAgY29uc3QgY29uZkZpbGUgPSBwYXRoLnJlc29sdmUodGFyZ2V0RGlyLCAnY2VydC5jb25mLmdlbmVyYXRlZCcpO1xuICBjb25zdCBjb25mVGVtcGxhdGUgPSBhd2FpdCBmcy5yZWFkRmlsZShjb25mVGVtcGxhdGVGaWxlLCAndXRmOCcpO1xuICBhd2FpdCBmcy53cml0ZUZpbGUoXG4gICAgY29uZkZpbGUsXG4gICAgY29uZlRlbXBsYXRlXG4gICAgICAucmVwbGFjZSgne3tjb3VudHJ5TmFtZX19JywgY291bnRyeU5hbWUpXG4gICAgICAucmVwbGFjZSgne3tzdGF0ZU9yUHJvdmluY2VOYW1lfX0nLCBzdGF0ZU9yUHJvdmluY2VOYW1lKVxuICAgICAgLnJlcGxhY2UoJ3t7bG9jYWxpdHlOYW1lfX0nLCBsb2NhbGl0eU5hbWUpXG4gICAgICAucmVwbGFjZSgne3tvcmdhbml6YXRpb25OYW1lfX0nLCBvcmdhbml6YXRpb25OYW1lKVxuICAgICAgLnJlcGxhY2UoJ3t7b3JnYW5pemF0aW9uYWxVbml0TmFtZX19Jywgb3JnYW5pemF0aW9uYWxVbml0TmFtZSlcbiAgICAgIC5yZXBsYWNlKCd7e2NvbW1vbk5hbWV9fScsIGNvbW1vbk5hbWUpXG4gICAgICAucmVwbGFjZSgne3tlbWFpbEFkZHJlc3N9fScsIGVtYWlsQWRkcmVzcylcbiAgICAgIC5yZXBsYWNlKFxuICAgICAgICAne3tTQU5fSVB9fScsXG4gICAgICAgIGlwQWRkcmVzc2VzLnJlZHVjZSgoYWNjLCBuZXh0KSA9PiBgJHthY2N9LElQOiR7bmV4dH1gLCAnJyksXG4gICAgICApXG4gICAgICAucmVwbGFjZSgne3tTQU5fRE5TfX0nLCBgLEROUzoke2hvc3RuYW1lfSxETlM6JHtkbnNOYW1lfWApLFxuICAgICd1dGY4JyxcbiAgKTtcblxuICBidWlsZExvZygnZ2VuZXJhdGluZyBrZXkgZmlsZS4uLicpO1xuICBhd2FpdCBzcGF3bihcbiAgICAnb3BlbnNzbCcsXG4gICAgW1xuICAgICAgJ2dlbnBrZXknLFxuICAgICAgJy1hbGdvcml0aG0nLFxuICAgICAgJ1JTQScsXG4gICAgICAnLXBrZXlvcHQnLFxuICAgICAgJ3JzYV9rZXlnZW5fYml0czoyMDQ4JyxcbiAgICAgICctb3V0JyxcbiAgICAgIGtleUZpbGUsXG4gICAgXSxcbiAgICB7IHBpcGVPdXRwdXQ6IHRydWUgfSxcbiAgKTtcbiAgYnVpbGRMb2coJ2dlbmVyYXRpbmcgY3NyIGZpbGUuLi4nKTtcbiAgYXdhaXQgc3Bhd24oXG4gICAgJ29wZW5zc2wnLFxuICAgIFtcbiAgICAgICdyZXEnLFxuICAgICAgJy1uZXcnLFxuICAgICAgJy1rZXknLFxuICAgICAga2V5RmlsZSxcbiAgICAgICctb3V0JyxcbiAgICAgIGNzckZpbGUsXG4gICAgICAnLXN1YmonLFxuICAgICAgYC9DPSR7Y291bnRyeU5hbWV9L1NUPSR7c3RhdGVPclByb3ZpbmNlTmFtZX0vTD0ke2xvY2FsaXR5TmFtZX0vTz0ke29yZ2FuaXphdGlvbk5hbWV9L09VPSR7b3JnYW5pemF0aW9uYWxVbml0TmFtZX0vQ049JHtjb21tb25OYW1lfS9DTj0ke2V4dGVybmFsSXA0fS9DTj0ke2hvc3RuYW1lfS9DTj0ke2Ruc05hbWV9JHtpcEFkZHJlc3Nlcy5yZWR1Y2UoXG4gICAgICAgIChhY2MsIG5leHQpID0+IGAke2FjY30vQ049JHtuZXh0fWAsXG4gICAgICApfS9DTj1sb2NhbGhvc3RgLFxuICAgICAgJy1jb25maWcnLFxuICAgICAgY29uZkZpbGUsXG4gICAgXSxcbiAgICB7IHBpcGVPdXRwdXQ6IHRydWUgfSxcbiAgKTtcbiAgYnVpbGRMb2coJ2dlbmVyYXRpbmcgY2VydC4uLicpO1xuICBhd2FpdCBzcGF3bihcbiAgICAnb3BlbnNzbCcsXG4gICAgW1xuICAgICAgJ3g1MDknLFxuICAgICAgJy1yZXEnLFxuICAgICAgJy1kYXlzJyxcbiAgICAgICczNjUnLFxuICAgICAgJy1pbicsXG4gICAgICBjc3JGaWxlLFxuICAgICAgJy1zaWdua2V5JyxcbiAgICAgIGtleUZpbGUsXG4gICAgICAnLW91dCcsXG4gICAgICBjcnRGaWxlLFxuICAgICAgJy1leHRmaWxlJyxcbiAgICAgIGNvbmZGaWxlLFxuICAgICAgJy1leHRlbnNpb25zJyxcbiAgICAgICd2M19yZXEnLFxuICAgIF0sXG4gICAgeyBwaXBlT3V0cHV0OiB0cnVlIH0sXG4gICk7XG59XG4iXX0=
package/clean.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Cleans up the build output directories.
3
+ */
4
+ export declare function clean(globs?: string[]): Promise<void>;
package/clean.js CHANGED
@@ -1,20 +1,11 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.clean = clean;
2
- var _fs = require("./fs");
3
-
1
+ import { cleanDir } from './fs.js';
4
2
  /**
5
3
  * Cleans up the build output directories.
6
4
  */
7
- async function clean(
8
- globs = ['dist/*', 'out/*', 'build/*'])
9
- {
10
- await Promise.all(
11
- globs.map((glob) =>
12
- (0, _fs.cleanDir)(glob, {
13
- nosort: true,
14
- dot: true,
15
- ignore: ['.git', '.hg'] })));
16
-
17
-
18
-
5
+ export async function clean(globs = ['dist/*', 'out/*', 'build/*']) {
6
+ await Promise.all(globs.map((glob) => cleanDir(glob, {
7
+ dot: true,
8
+ ignore: ['.git', '.hg'],
9
+ nosort: true,
10
+ })));
19
11
  }
20
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGVhbi5qcyJdLCJuYW1lcyI6WyJjbGVhbiIsImdsb2JzIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsImdsb2IiLCJub3NvcnQiLCJkb3QiLCJpZ25vcmUiXSwibWFwcGluZ3MiOiI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDTyxlQUFlQSxLQUFmO0FBQ0xDLEtBQWUsR0FBRyxDQUFDLFFBQUQsRUFBVyxPQUFYLEVBQW9CLFNBQXBCLENBRGI7QUFFVTtBQUNmLFFBQU1DLE9BQU8sQ0FBQ0MsR0FBUjtBQUNKRixFQUFBQSxLQUFLLENBQUNHLEdBQU4sQ0FBVSxDQUFDQyxJQUFEO0FBQ1Isb0JBQVNBLElBQVQsRUFBZTtBQUNiQyxJQUFBQSxNQUFNLEVBQUUsSUFESztBQUViQyxJQUFBQSxHQUFHLEVBQUUsSUFGUTtBQUdiQyxJQUFBQSxNQUFNLEVBQUUsQ0FBQyxNQUFELEVBQVMsS0FBVCxDQUhLLEVBQWYsQ0FERixDQURJLENBQU47Ozs7QUFTRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIEBmbG93XG5pbXBvcnQgeyBjbGVhbkRpciB9IGZyb20gJy4vZnMnO1xuXG4vKipcbiAqIENsZWFucyB1cCB0aGUgYnVpbGQgb3V0cHV0IGRpcmVjdG9yaWVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYW4oXG4gIGdsb2JzOiBzdHJpbmdbXSA9IFsnZGlzdC8qJywgJ291dC8qJywgJ2J1aWxkLyonXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBnbG9icy5tYXAoKGdsb2IpID0+XG4gICAgICBjbGVhbkRpcihnbG9iLCB7XG4gICAgICAgIG5vc29ydDogdHJ1ZSxcbiAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICBpZ25vcmU6IFsnLmdpdCcsICcuaGcnXSxcbiAgICAgIH0pLFxuICAgICksXG4gICk7XG59XG4iXX0=
package/copy.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export interface CopySrcOptions {
2
+ cbFn?: () => void;
3
+ from: string;
4
+ to: string;
5
+ watch?: boolean;
6
+ }
7
+ export declare function copySrc({ from, to, watch, cbFn, }: CopySrcOptions): Promise<void>;
package/copy.js CHANGED
@@ -1,80 +1,53 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.copySrc = copySrc;
2
- var _path = _interopRequireDefault(require("path"));
3
- var _chokidar = _interopRequireDefault(require("chokidar"));
4
- var _fs = require("./fs");
5
- var _cp = require("./cp");
6
- var _run = require("./run");
7
- var _inlineResources = require("./inline-resources");function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
8
-
1
+ import chokidar from 'chokidar';
2
+ import fs from 'fs-extra';
3
+ import path from 'path';
4
+ import { onKillSignal } from './cp.js';
5
+ import { cleanDir, copyDir } from './fs.js';
6
+ import { buildLog } from './run.js';
9
7
  let timer = null;
10
8
  async function throttledCallback(cbFn) {
11
- if (!cbFn || typeof cbFn !== 'function') {
12
- return;
13
- }
14
- if (timer) {
15
- clearTimeout(timer);
16
- timer = null;
17
- }
18
- timer = setTimeout(() => {
19
- timer = null;
20
- cbFn();
21
- }, 200);
9
+ if (!cbFn || typeof cbFn !== 'function') {
10
+ return;
11
+ }
12
+ if (timer) {
13
+ clearTimeout(timer);
14
+ timer = null;
15
+ }
16
+ timer = setTimeout(() => {
17
+ timer = null;
18
+ cbFn();
19
+ }, 200);
22
20
  }
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
- async function copySrc({
32
- from,
33
- to,
34
- watch = process.argv.includes('--watch'),
35
- cbFn } =
36
- {}) {
37
- await (0, _fs.copyDir)(from, to);
38
- if (cbFn) await cbFn();
39
- if (watch) {
40
- const watcher = _chokidar.default.watch([_path.default.join(from, '/**/*')], {
41
- ignoreInitial: true });
42
-
43
-
44
- watcher.on('all', async (event, filePath) => {
45
- const start = new Date();
46
- const src = _path.default.relative(from, filePath);
47
- const dest = _path.default.join(to, src);
48
- switch (event) {
49
- case 'add':
50
- case 'change':
51
- await (0, _fs.makeDir)(_path.default.dirname(dest));
52
- await (0, _fs.copyFile)(filePath, dest);
53
- break;
54
- case 'unlink':
55
- case 'unlinkDir':
56
- (0, _fs.cleanDir)(dest, { nosort: true, dot: true });
57
- break;
58
- default:
59
- return;}
60
-
61
- // Check dependencies
62
- if (_inlineResources.dependencies[dest]) {
63
- await Promise.all(
64
- _inlineResources.dependencies[dest].map(async (dep) => {
65
- const toCopy = _path.default.join(from, _path.default.relative(to, dep));
66
- await (0, _fs.copyFile)(toCopy, dep);
67
- (0, _run.buildLog)(`copied '${dep}' due to changed dependency`);
68
- }));
69
-
70
- }
71
- const end = new Date();
72
- const time = end.getTime() - start.getTime();
73
- (0, _run.buildLog)(`${event} '${dest}' after ${time} ms`, end);
74
- throttledCallback(cbFn);
75
- });
76
-
77
- (0, _cp.onKillSignal)(() => watcher.close());
78
- }
21
+ export async function copySrc({ from, to, watch = process.argv.includes('--watch'), cbFn, }) {
22
+ await copyDir(from, to);
23
+ if (cbFn)
24
+ await cbFn();
25
+ if (watch) {
26
+ const watcher = chokidar.watch([path.join(from, '/**/*')], {
27
+ ignoreInitial: true,
28
+ });
29
+ watcher.on('all', async (event, filePath) => {
30
+ const start = new Date();
31
+ const src = path.relative(from, filePath);
32
+ const dest = path.join(to, src);
33
+ switch (event) {
34
+ case 'add':
35
+ case 'change':
36
+ await fs.ensureDir(path.dirname(dest));
37
+ await fs.copyFile(filePath, dest);
38
+ break;
39
+ case 'unlink':
40
+ case 'unlinkDir':
41
+ cleanDir(dest, { dot: true, nosort: true });
42
+ break;
43
+ default:
44
+ return;
45
+ }
46
+ const end = new Date();
47
+ const time = end.getTime() - start.getTime();
48
+ buildLog(`${event} '${dest}' after ${time} ms`, end);
49
+ throttledCallback(cbFn);
50
+ });
51
+ onKillSignal(() => watcher.close());
52
+ }
79
53
  }
80
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jb3B5LmpzIl0sIm5hbWVzIjpbInRpbWVyIiwidGhyb3R0bGVkQ2FsbGJhY2siLCJjYkZuIiwiY2xlYXJUaW1lb3V0Iiwic2V0VGltZW91dCIsImNvcHlTcmMiLCJmcm9tIiwidG8iLCJ3YXRjaCIsInByb2Nlc3MiLCJhcmd2IiwiaW5jbHVkZXMiLCJ3YXRjaGVyIiwiY2hva2lkYXIiLCJwYXRoIiwiam9pbiIsImlnbm9yZUluaXRpYWwiLCJvbiIsImV2ZW50IiwiZmlsZVBhdGgiLCJzdGFydCIsIkRhdGUiLCJzcmMiLCJyZWxhdGl2ZSIsImRlc3QiLCJkaXJuYW1lIiwibm9zb3J0IiwiZG90IiwiZGVwZW5kZW5jaWVzIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsImRlcCIsInRvQ29weSIsImVuZCIsInRpbWUiLCJnZXRUaW1lIiwiY2xvc2UiXSwibWFwcGluZ3MiOiI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUQ7O0FBRUEsSUFBSUEsS0FBSyxHQUFHLElBQVo7QUFDQSxlQUFlQyxpQkFBZixDQUFpQ0MsSUFBakMsRUFBdUM7QUFDckMsTUFBSSxDQUFDQSxJQUFELElBQVMsT0FBT0EsSUFBUCxLQUFnQixVQUE3QixFQUF5QztBQUN2QztBQUNEO0FBQ0QsTUFBSUYsS0FBSixFQUFXO0FBQ1RHLElBQUFBLFlBQVksQ0FBQ0gsS0FBRCxDQUFaO0FBQ0FBLElBQUFBLEtBQUssR0FBRyxJQUFSO0FBQ0Q7QUFDREEsRUFBQUEsS0FBSyxHQUFHSSxVQUFVLENBQUMsTUFBTTtBQUN2QkosSUFBQUEsS0FBSyxHQUFHLElBQVI7QUFDQUUsSUFBQUEsSUFBSTtBQUNMLEdBSGlCLEVBR2YsR0FIZSxDQUFsQjtBQUlEOzs7Ozs7Ozs7QUFTTSxlQUFlRyxPQUFmLENBQXVCO0FBQzVCQyxFQUFBQSxJQUQ0QjtBQUU1QkMsRUFBQUEsRUFGNEI7QUFHNUJDLEVBQUFBLEtBQUssR0FBR0MsT0FBTyxDQUFDQyxJQUFSLENBQWFDLFFBQWIsQ0FBc0IsU0FBdEIsQ0FIb0I7QUFJNUJULEVBQUFBLElBSjRCO0FBS1YsRUFMYixFQUtpQjtBQUN0QixRQUFNLGlCQUFRSSxJQUFSLEVBQWNDLEVBQWQsQ0FBTjtBQUNBLE1BQUlMLElBQUosRUFBVSxNQUFNQSxJQUFJLEVBQVY7QUFDVixNQUFJTSxLQUFKLEVBQVc7QUFDVCxVQUFNSSxPQUFPLEdBQUdDLGtCQUFTTCxLQUFULENBQWUsQ0FBQ00sY0FBS0MsSUFBTCxDQUFVVCxJQUFWLEVBQWdCLE9BQWhCLENBQUQsQ0FBZixFQUEyQztBQUN6RFUsTUFBQUEsYUFBYSxFQUFFLElBRDBDLEVBQTNDLENBQWhCOzs7QUFJQUosSUFBQUEsT0FBTyxDQUFDSyxFQUFSLENBQVcsS0FBWCxFQUFrQixPQUFPQyxLQUFQLEVBQWNDLFFBQWQsS0FBMkI7QUFDM0MsWUFBTUMsS0FBSyxHQUFHLElBQUlDLElBQUosRUFBZDtBQUNBLFlBQU1DLEdBQUcsR0FBR1IsY0FBS1MsUUFBTCxDQUFjakIsSUFBZCxFQUFvQmEsUUFBcEIsQ0FBWjtBQUNBLFlBQU1LLElBQUksR0FBR1YsY0FBS0MsSUFBTCxDQUFVUixFQUFWLEVBQWNlLEdBQWQsQ0FBYjtBQUNBLGNBQVFKLEtBQVI7QUFDRSxhQUFLLEtBQUw7QUFDQSxhQUFLLFFBQUw7QUFDRSxnQkFBTSxpQkFBUUosY0FBS1csT0FBTCxDQUFhRCxJQUFiLENBQVIsQ0FBTjtBQUNBLGdCQUFNLGtCQUFTTCxRQUFULEVBQW1CSyxJQUFuQixDQUFOO0FBQ0E7QUFDRixhQUFLLFFBQUw7QUFDQSxhQUFLLFdBQUw7QUFDRSw0QkFBU0EsSUFBVCxFQUFlLEVBQUVFLE1BQU0sRUFBRSxJQUFWLEVBQWdCQyxHQUFHLEVBQUUsSUFBckIsRUFBZjtBQUNBO0FBQ0Y7QUFDRSxpQkFYSjs7QUFhQTtBQUNBLFVBQUlDLDhCQUFhSixJQUFiLENBQUosRUFBd0I7QUFDdEIsY0FBTUssT0FBTyxDQUFDQyxHQUFSO0FBQ0pGLHNDQUFhSixJQUFiLEVBQW1CTyxHQUFuQixDQUF1QixPQUFPQyxHQUFQLEtBQWU7QUFDcEMsZ0JBQU1DLE1BQU0sR0FBR25CLGNBQUtDLElBQUwsQ0FBVVQsSUFBVixFQUFnQlEsY0FBS1MsUUFBTCxDQUFjaEIsRUFBZCxFQUFrQnlCLEdBQWxCLENBQWhCLENBQWY7QUFDQSxnQkFBTSxrQkFBU0MsTUFBVCxFQUFpQkQsR0FBakIsQ0FBTjtBQUNBLDZCQUFVLFdBQVVBLEdBQUksNkJBQXhCO0FBQ0QsU0FKRCxDQURJLENBQU47O0FBT0Q7QUFDRCxZQUFNRSxHQUFHLEdBQUcsSUFBSWIsSUFBSixFQUFaO0FBQ0EsWUFBTWMsSUFBSSxHQUFHRCxHQUFHLENBQUNFLE9BQUosS0FBZ0JoQixLQUFLLENBQUNnQixPQUFOLEVBQTdCO0FBQ0EseUJBQVUsR0FBRWxCLEtBQU0sS0FBSU0sSUFBSyxXQUFVVyxJQUFLLEtBQTFDLEVBQWdERCxHQUFoRDtBQUNBakMsTUFBQUEsaUJBQWlCLENBQUNDLElBQUQsQ0FBakI7QUFDRCxLQS9CRDs7QUFpQ0EsMEJBQWEsTUFBTVUsT0FBTyxDQUFDeUIsS0FBUixFQUFuQjtBQUNEO0FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAZmxvd1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgY2hva2lkYXIgZnJvbSAnY2hva2lkYXInO1xuaW1wb3J0IHsgY29weUZpbGUsIG1ha2VEaXIsIGNvcHlEaXIsIGNsZWFuRGlyIH0gZnJvbSAnLi9mcyc7XG5pbXBvcnQgeyBvbktpbGxTaWduYWwgfSBmcm9tICcuL2NwJztcbmltcG9ydCB7IGJ1aWxkTG9nIH0gZnJvbSAnLi9ydW4nO1xuaW1wb3J0IHsgZGVwZW5kZW5jaWVzIH0gZnJvbSAnLi9pbmxpbmUtcmVzb3VyY2VzJztcblxubGV0IHRpbWVyID0gbnVsbDtcbmFzeW5jIGZ1bmN0aW9uIHRocm90dGxlZENhbGxiYWNrKGNiRm4pIHtcbiAgaWYgKCFjYkZuIHx8IHR5cGVvZiBjYkZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0aW1lcikge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgdGltZXIgPSBudWxsO1xuICB9XG4gIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgdGltZXIgPSBudWxsO1xuICAgIGNiRm4oKTtcbiAgfSwgMjAwKTtcbn1cblxuZXhwb3J0IHR5cGUgQ29weVNyY09wdGlvbnMgPSB7XG4gIGZyb206IHN0cmluZyxcbiAgdG86IHN0cmluZyxcbiAgd2F0Y2g/OiBib29sZWFuLFxuICBjYkZuPzogKCkgPT4gUHJvbWlzZTxhbnk+IHwgdm9pZCxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3B5U3JjKHtcbiAgZnJvbSxcbiAgdG8sXG4gIHdhdGNoID0gcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLXdhdGNoJyksXG4gIGNiRm4sXG59OiBDb3B5U3JjT3B0aW9ucyA9IHt9KSB7XG4gIGF3YWl0IGNvcHlEaXIoZnJvbSwgdG8pO1xuICBpZiAoY2JGbikgYXdhaXQgY2JGbigpO1xuICBpZiAod2F0Y2gpIHtcbiAgICBjb25zdCB3YXRjaGVyID0gY2hva2lkYXIud2F0Y2goW3BhdGguam9pbihmcm9tLCAnLyoqLyonKV0sIHtcbiAgICAgIGlnbm9yZUluaXRpYWw6IHRydWUsXG4gICAgfSk7XG5cbiAgICB3YXRjaGVyLm9uKCdhbGwnLCBhc3luYyAoZXZlbnQsIGZpbGVQYXRoKSA9PiB7XG4gICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCk7XG4gICAgICBjb25zdCBzcmMgPSBwYXRoLnJlbGF0aXZlKGZyb20sIGZpbGVQYXRoKTtcbiAgICAgIGNvbnN0IGRlc3QgPSBwYXRoLmpvaW4odG8sIHNyYyk7XG4gICAgICBzd2l0Y2ggKGV2ZW50KSB7XG4gICAgICAgIGNhc2UgJ2FkZCc6XG4gICAgICAgIGNhc2UgJ2NoYW5nZSc6XG4gICAgICAgICAgYXdhaXQgbWFrZURpcihwYXRoLmRpcm5hbWUoZGVzdCkpO1xuICAgICAgICAgIGF3YWl0IGNvcHlGaWxlKGZpbGVQYXRoLCBkZXN0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndW5saW5rJzpcbiAgICAgICAgY2FzZSAndW5saW5rRGlyJzpcbiAgICAgICAgICBjbGVhbkRpcihkZXN0LCB7IG5vc29ydDogdHJ1ZSwgZG90OiB0cnVlIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIENoZWNrIGRlcGVuZGVuY2llc1xuICAgICAgaWYgKGRlcGVuZGVuY2llc1tkZXN0XSkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBkZXBlbmRlbmNpZXNbZGVzdF0ubWFwKGFzeW5jIChkZXApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRvQ29weSA9IHBhdGguam9pbihmcm9tLCBwYXRoLnJlbGF0aXZlKHRvLCBkZXApKTtcbiAgICAgICAgICAgIGF3YWl0IGNvcHlGaWxlKHRvQ29weSwgZGVwKTtcbiAgICAgICAgICAgIGJ1aWxkTG9nKGBjb3BpZWQgJyR7ZGVwfScgZHVlIHRvIGNoYW5nZWQgZGVwZW5kZW5jeWApO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUoKTtcbiAgICAgIGNvbnN0IHRpbWUgPSBlbmQuZ2V0VGltZSgpIC0gc3RhcnQuZ2V0VGltZSgpO1xuICAgICAgYnVpbGRMb2coYCR7ZXZlbnR9ICcke2Rlc3R9JyBhZnRlciAke3RpbWV9IG1zYCwgZW5kKTtcbiAgICAgIHRocm90dGxlZENhbGxiYWNrKGNiRm4pO1xuICAgIH0pO1xuXG4gICAgb25LaWxsU2lnbmFsKCgpID0+IHdhdGNoZXIuY2xvc2UoKSk7XG4gIH1cbn1cbiJdfQ==
package/cp.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ /// <reference types="node" />
2
+ import cp from 'child_process';
3
+ export interface SpawnOptions extends cp.SpawnOptions {
4
+ captureOutput?: boolean;
5
+ pipeOutput?: boolean;
6
+ rejectOnErrorCode?: boolean;
7
+ }
8
+ export interface SpawnResult {
9
+ code: number;
10
+ output: string;
11
+ signal: string;
12
+ stderr: string;
13
+ stdout: string;
14
+ }
15
+ export declare function spawn(command: string, args?: string[], opts?: SpawnOptions | null): Promise<SpawnResult>;
16
+ export declare const exec: typeof cp.exec.__promisify__;
17
+ export declare const onKillSignal: (cbFn: () => void) => void;