@mikeyt23/node-cli-utils 1.4.1 → 2.0.0-beta.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/README.md +45 -87
- package/dist/cjs/NodeCliUtilsConfig.d.ts +21 -0
- package/dist/cjs/NodeCliUtilsConfig.d.ts.map +1 -0
- package/dist/cjs/NodeCliUtilsConfig.js +41 -0
- package/dist/cjs/TarballUtility.d.ts +53 -0
- package/dist/cjs/TarballUtility.d.ts.map +1 -0
- package/dist/cjs/TarballUtility.js +149 -0
- package/dist/cjs/certUtils.d.ts +30 -0
- package/dist/cjs/certUtils.d.ts.map +1 -0
- package/dist/cjs/certUtils.js +219 -0
- package/dist/cjs/dbMigrationUtils.d.ts +39 -0
- package/dist/cjs/dbMigrationUtils.d.ts.map +1 -0
- package/dist/cjs/dbMigrationUtils.js +205 -0
- package/dist/cjs/dotnetUtils.d.ts +25 -0
- package/dist/cjs/dotnetUtils.d.ts.map +1 -0
- package/dist/cjs/dotnetUtils.js +59 -0
- package/dist/cjs/esmSpecific.d.mts +2 -0
- package/dist/cjs/esmSpecific.d.mts.map +1 -0
- package/dist/cjs/esmSpecific.mjs +10 -0
- package/dist/cjs/generalUtils.d.ts +323 -0
- package/dist/cjs/generalUtils.d.ts.map +1 -0
- package/dist/cjs/generalUtils.js +652 -0
- package/dist/cjs/generalUtilsInternal.d.ts +9 -0
- package/dist/cjs/generalUtilsInternal.d.ts.map +1 -0
- package/dist/cjs/generalUtilsInternal.js +217 -0
- package/dist/cjs/index.d.ts +4 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +25 -0
- package/dist/cjs/package.json +5 -0
- package/dist/cjs/runWhileParentAlive.d.ts +2 -0
- package/dist/cjs/runWhileParentAlive.d.ts.map +1 -0
- package/dist/cjs/runWhileParentAlive.js +161 -0
- package/dist/esm/NodeCliUtilsConfig.d.ts +21 -0
- package/dist/esm/NodeCliUtilsConfig.d.ts.map +1 -0
- package/dist/esm/NodeCliUtilsConfig.js +35 -0
- package/dist/esm/TarballUtility.d.ts +53 -0
- package/dist/esm/TarballUtility.d.ts.map +1 -0
- package/dist/esm/TarballUtility.js +143 -0
- package/dist/esm/certUtils.d.ts +30 -0
- package/dist/esm/certUtils.d.ts.map +1 -0
- package/dist/esm/certUtils.js +185 -0
- package/dist/esm/dbMigrationUtils.d.ts +39 -0
- package/dist/esm/dbMigrationUtils.d.ts.map +1 -0
- package/dist/esm/dbMigrationUtils.js +194 -0
- package/dist/esm/dotnetUtils.d.ts +25 -0
- package/dist/esm/dotnetUtils.d.ts.map +1 -0
- package/dist/esm/dotnetUtils.js +52 -0
- package/dist/esm/esmSpecific.d.mts +2 -0
- package/dist/esm/esmSpecific.d.mts.map +1 -0
- package/dist/esm/esmSpecific.mjs +6 -0
- package/dist/esm/generalUtils.d.ts +323 -0
- package/dist/esm/generalUtils.d.ts.map +1 -0
- package/dist/esm/generalUtils.js +591 -0
- package/dist/esm/generalUtilsInternal.d.ts +9 -0
- package/dist/esm/generalUtilsInternal.d.ts.map +1 -0
- package/dist/esm/generalUtilsInternal.js +185 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/runWhileParentAlive.d.ts +2 -0
- package/dist/esm/runWhileParentAlive.d.ts.map +1 -0
- package/dist/esm/runWhileParentAlive.js +153 -0
- package/package.json +67 -10
- package/index.js +0 -627
|
@@ -0,0 +1,219 @@
|
|
|
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 __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.winCertAlreadyInstalled = exports.linuxInstallCert = exports.winUninstallCert = exports.winInstallCert = exports.generateCertWithOpenSsl = void 0;
|
|
30
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
31
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
32
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
33
|
+
const nodeCliUtils = __importStar(require("./generalUtils.js"));
|
|
34
|
+
const generalUtils_js_1 = require("./generalUtils.js");
|
|
35
|
+
const requiresAdminMessage = `➡️ Important: Requires admin permissions`;
|
|
36
|
+
const powershellHackPrefix = `$env:PSModulePath = [Environment]::GetEnvironmentVariable('PSModulePath', 'Machine'); `;
|
|
37
|
+
/**
|
|
38
|
+
* Wrapper function for calling openssl to generate a self-signed cert to be used for developing a local website with trusted https.
|
|
39
|
+
* @param url The url to generate a cert for. This will be used as the common name (CN) in the cert as well as the filename for the generated cert files.
|
|
40
|
+
* @param outputDirectory The directory to write the generated cert files to. Defaults to './cert'.
|
|
41
|
+
*/
|
|
42
|
+
async function generateCertWithOpenSsl(url, outputDirectory = './cert') {
|
|
43
|
+
nodeCliUtils.requireString('url', url);
|
|
44
|
+
throwIfMaybeBadUrlChars(url);
|
|
45
|
+
const isMac = nodeCliUtils.isPlatformMac();
|
|
46
|
+
const spawnArgs = { cwd: outputDirectory };
|
|
47
|
+
(0, generalUtils_js_1.log)('- checking if openssl is installed');
|
|
48
|
+
let brewOpenSslPath = '';
|
|
49
|
+
if (!isMac) {
|
|
50
|
+
const openSslPath = nodeCliUtils.whichSync('openssl').location;
|
|
51
|
+
if (!openSslPath) {
|
|
52
|
+
throw Error('openssl is required but was not found');
|
|
53
|
+
}
|
|
54
|
+
(0, generalUtils_js_1.log)(`- using openssl at: ${openSslPath}`);
|
|
55
|
+
}
|
|
56
|
+
else if (isMac) {
|
|
57
|
+
const brewOpenSslDirectory = getBrewOpensslPath();
|
|
58
|
+
if (!brewOpenSslDirectory) {
|
|
59
|
+
throw Error('openssl (brew version) is required but was not found');
|
|
60
|
+
}
|
|
61
|
+
brewOpenSslPath = `${getBrewOpensslPath()}/bin/openssl`;
|
|
62
|
+
if (!node_fs_1.default.existsSync(brewOpenSslPath)) {
|
|
63
|
+
throw Error(`openssl (brew version) is required but was not found at: ${brewOpenSslPath}`);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
(0, generalUtils_js_1.log)(`- using openssl at: ${brewOpenSslPath}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
nodeCliUtils.ensureDirectory(outputDirectory);
|
|
70
|
+
const keyName = url + '.key';
|
|
71
|
+
const crtName = url + '.crt';
|
|
72
|
+
const pfxName = url + '.pfx';
|
|
73
|
+
const pfxPath = node_path_1.default.join(outputDirectory, pfxName);
|
|
74
|
+
if (node_fs_1.default.existsSync(pfxPath)) {
|
|
75
|
+
throw Error(`File ${pfxPath} already exists. Delete or rename this file if you want to generate a new cert.`);
|
|
76
|
+
}
|
|
77
|
+
(0, generalUtils_js_1.log)('- writing san.cnf file for use with openssl command');
|
|
78
|
+
const sanCnfContents = getSanCnfFileContents(url);
|
|
79
|
+
const sanCnfPath = node_path_1.default.join(outputDirectory, 'san.cnf');
|
|
80
|
+
await promises_1.default.writeFile(sanCnfPath, sanCnfContents);
|
|
81
|
+
(0, generalUtils_js_1.log)(`- attempting to generate cert ${pfxName}`);
|
|
82
|
+
const genKeyAndCrtArgs = `req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout ${keyName} -out ${crtName} -subj /CN=${url} -config san.cnf`.split(' ');
|
|
83
|
+
const command = isMac ? brewOpenSslPath : 'openssl';
|
|
84
|
+
let result = await nodeCliUtils.spawnAsync(command, genKeyAndCrtArgs, spawnArgs);
|
|
85
|
+
if (result.code !== 0) {
|
|
86
|
+
throw Error(`openssl command to generate key and crt files failed with exit code ${result.code}`);
|
|
87
|
+
}
|
|
88
|
+
(0, generalUtils_js_1.log)('- converting key and crt to pfx');
|
|
89
|
+
const convertToPfxArgs = `pkcs12 -certpbe AES-256-CBC -export -out ${pfxName} -aes256 -inkey ${keyName} -in ${crtName} -password pass:`.split(' ');
|
|
90
|
+
result = await nodeCliUtils.spawnAsync(command, convertToPfxArgs, spawnArgs);
|
|
91
|
+
if (result.code !== 0) {
|
|
92
|
+
throw Error(`openssl command to convert key and crt files to a pfx failed with exit code ${result.code}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.generateCertWithOpenSsl = generateCertWithOpenSsl;
|
|
96
|
+
/**
|
|
97
|
+
* Uses Powershell to install a cert to the local machine's trusted root store. Must have admin permissions.
|
|
98
|
+
*
|
|
99
|
+
* If the cert is already installed, this method will do nothing.
|
|
100
|
+
* @param urlOrCertFilename The url or cert filename to install. The url + '.pfx' or the cert filename passed must match a file that exists in the certDirectory.
|
|
101
|
+
* @param certDirectory The directory to look for the cert file in. Defaults to './cert'.
|
|
102
|
+
*/
|
|
103
|
+
async function winInstallCert(urlOrCertFilename, certDirectory = './cert') {
|
|
104
|
+
nodeCliUtils.requireString('urlOrCertFilename', urlOrCertFilename);
|
|
105
|
+
nodeCliUtils.requireValidPath('certDirectory', certDirectory);
|
|
106
|
+
throwIfMaybeBadUrlChars(urlOrCertFilename, 'urlOrCertFilename');
|
|
107
|
+
if (!nodeCliUtils.isPlatformWindows()) {
|
|
108
|
+
throw Error('This method is only supported on Windows');
|
|
109
|
+
}
|
|
110
|
+
(0, generalUtils_js_1.log)(requiresAdminMessage);
|
|
111
|
+
if (await winCertAlreadyInstalled(urlOrCertFilename)) {
|
|
112
|
+
(0, generalUtils_js_1.log)(`certificate for ${urlOrCertFilename} is already installed - to install it again, first uninstall it manually or with the winUninstallCert method`);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const certName = urlOrCertFilename.endsWith('.pfx') ? urlOrCertFilename : urlOrCertFilename + '.pfx';
|
|
116
|
+
const certPath = node_path_1.default.join(certDirectory, certName);
|
|
117
|
+
if (!node_fs_1.default.existsSync(certPath)) {
|
|
118
|
+
throw Error(`File ${certPath} does not exist. Generate this first if you want to install it.`);
|
|
119
|
+
}
|
|
120
|
+
const psCommand = `${powershellHackPrefix}Import-PfxCertificate -FilePath '${certPath}' -CertStoreLocation Cert:\\LocalMachine\\Root`;
|
|
121
|
+
const result = await nodeCliUtils.spawnAsync('powershell', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-Command', psCommand]);
|
|
122
|
+
if (result.code !== 0) {
|
|
123
|
+
throw Error(`powershell command to install cert failed with exit code ${result.code}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.winInstallCert = winInstallCert;
|
|
127
|
+
/**
|
|
128
|
+
* Uses Powershell to uninstall a cert from the local machine's trusted root store. Must have admin permissions.
|
|
129
|
+
* @param urlOrSubject The url or subject of the cert to uninstall. If the cert was installed with the winInstallCert method, this will be the url passed to that method.
|
|
130
|
+
*/
|
|
131
|
+
async function winUninstallCert(urlOrSubject) {
|
|
132
|
+
nodeCliUtils.requireString('urlOrSubject', urlOrSubject);
|
|
133
|
+
(0, generalUtils_js_1.log)(requiresAdminMessage);
|
|
134
|
+
const psCommand = `${powershellHackPrefix}Get-ChildItem Cert:\\LocalMachine\\Root | Where-Object { $_.Subject -match '${urlOrSubject}' } | Remove-Item`;
|
|
135
|
+
const result = await nodeCliUtils.spawnAsync('powershell', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-Command', psCommand]);
|
|
136
|
+
if (result.code !== 0) {
|
|
137
|
+
throw Error(`powershell command to uninstall cert failed with exit code ${result.code}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.winUninstallCert = winUninstallCert;
|
|
141
|
+
/**
|
|
142
|
+
* Does not actually do anything - just outputs the manual instructions for installing a cert for use by chrome on linux.
|
|
143
|
+
*/
|
|
144
|
+
function linuxInstallCert() {
|
|
145
|
+
const instructions = `Automated linux cert install not supported (chrome does not use system certs without significant extra configuration).
|
|
146
|
+
Manual Instructions:
|
|
147
|
+
- In Chrome, go to chrome://settings/certificates
|
|
148
|
+
- Select Authorities -> import
|
|
149
|
+
- Select your generated .crt file (in the ./cert/ directory by default - if you haven't generated it, see the generateCertWithOpenSsl method)
|
|
150
|
+
- Check box for "Trust certificate for identifying websites"
|
|
151
|
+
- Click OK
|
|
152
|
+
- Reload site`;
|
|
153
|
+
console.log(instructions);
|
|
154
|
+
}
|
|
155
|
+
exports.linuxInstallCert = linuxInstallCert;
|
|
156
|
+
/**
|
|
157
|
+
* Uses Powershell to check if a cert is already installed to the local machine's trusted root store.
|
|
158
|
+
* @param urlOrSubject The url or subject of the cert to check. If the cert was installed with the winInstallCert method, this will be the url passed to that method.
|
|
159
|
+
* @returns `true` if the cert is already installed, `false` otherwise.
|
|
160
|
+
*/
|
|
161
|
+
async function winCertAlreadyInstalled(urlOrSubject) {
|
|
162
|
+
const psCommand = `${powershellHackPrefix}Get-ChildItem Cert:\\LocalMachine\\Root | Where-Object { $_.Subject -match '${urlOrSubject}' }`;
|
|
163
|
+
// The stdio option of 'pipe' is important here - if left to default of spawnAsync ('inherit'), stdout will be empty
|
|
164
|
+
const result = await nodeCliUtils.spawnAsync('powershell', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-Command', psCommand], { stdio: ['inherit', 'pipe', 'pipe'] });
|
|
165
|
+
if (result.code !== 0) {
|
|
166
|
+
throw Error(`powershell command to find installed cert failed with exit code ${result.code}`);
|
|
167
|
+
}
|
|
168
|
+
const lines = nodeCliUtils.stringToNonEmptyLines(result.stdout);
|
|
169
|
+
for (const line of lines) {
|
|
170
|
+
if (line.includes(urlOrSubject)) {
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
exports.winCertAlreadyInstalled = winCertAlreadyInstalled;
|
|
177
|
+
function throwIfMaybeBadUrlChars(url, varName = 'url') {
|
|
178
|
+
if (url.includes(' ')) {
|
|
179
|
+
throw Error(`${varName} should not contain spaces`);
|
|
180
|
+
}
|
|
181
|
+
if (url.includes('/')) {
|
|
182
|
+
throw Error(`${varName} should not contain forward slashes`);
|
|
183
|
+
}
|
|
184
|
+
if (url.includes('\\')) {
|
|
185
|
+
throw Error(`${varName} should not contain backslashes`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function getBrewOpensslPath() {
|
|
189
|
+
const brewResult = nodeCliUtils.simpleSpawnSync('brew', ['--prefix', 'openssl']);
|
|
190
|
+
if (brewResult.error) {
|
|
191
|
+
throw Error('error attempting to find openssl installed by brew');
|
|
192
|
+
}
|
|
193
|
+
if (brewResult.stdoutLines.length === 0 || brewResult.stdoutLines.length > 1) {
|
|
194
|
+
throw new Error(`unexpected output from brew command 'brew --prefix openssl': ${brewResult.stdout}`);
|
|
195
|
+
}
|
|
196
|
+
return brewResult.stdoutLines[0];
|
|
197
|
+
}
|
|
198
|
+
function getSanCnfFileContents(url) {
|
|
199
|
+
return sanCnfTemplate.replace(/{{url}}/g, url);
|
|
200
|
+
}
|
|
201
|
+
// Newer cert requirements force the need for "extension info" with DNS and IP info, but openssl v1.x doesn't support that with the
|
|
202
|
+
// CLI option -addext, so we're using a san.cnf file instead and passing this into the CLI command with the -config option.
|
|
203
|
+
const sanCnfTemplate = `[req]
|
|
204
|
+
distinguished_name=req
|
|
205
|
+
x509_extensions = v3_req
|
|
206
|
+
prompt = no
|
|
207
|
+
|
|
208
|
+
[req_distinguished_name]
|
|
209
|
+
CN = {{url}}
|
|
210
|
+
|
|
211
|
+
[v3_req]
|
|
212
|
+
subjectAltName = @alt_names
|
|
213
|
+
|
|
214
|
+
[alt_names]
|
|
215
|
+
DNS.1 = {{url}}
|
|
216
|
+
IP.1 = 127.0.0.1
|
|
217
|
+
|
|
218
|
+
`;
|
|
219
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydFV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NlcnRVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNEQUF3QjtBQUN4QixnRUFBa0M7QUFDbEMsMERBQTRCO0FBQzVCLGdFQUFpRDtBQUNqRCx1REFBdUM7QUFFdkMsTUFBTSxvQkFBb0IsR0FBRywwQ0FBMEMsQ0FBQTtBQUN2RSxNQUFNLG9CQUFvQixHQUFHLHdGQUF3RixDQUFBO0FBRXJIOzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsdUJBQXVCLENBQUMsR0FBVyxFQUFFLGtCQUEwQixRQUFRO0lBQzNGLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0lBQ3RDLHVCQUF1QixDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQzVCLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtJQUMxQyxNQUFNLFNBQVMsR0FBRyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsQ0FBQTtJQUUxQyxJQUFBLHFCQUFHLEVBQUMsb0NBQW9DLENBQUMsQ0FBQTtJQUN6QyxJQUFJLGVBQWUsR0FBVyxFQUFFLENBQUE7SUFDaEMsSUFBSSxDQUFDLEtBQUssRUFBRTtRQUNWLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFBO1FBQzlELElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEIsTUFBTSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQTtTQUNyRDtRQUNELElBQUEscUJBQUcsRUFBQyx1QkFBdUIsV0FBVyxFQUFFLENBQUMsQ0FBQTtLQUMxQztTQUFNLElBQUksS0FBSyxFQUFFO1FBQ2hCLE1BQU0sb0JBQW9CLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQTtRQUNqRCxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDekIsTUFB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
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wrapper function for `dotnet ef`. If you don't pass `false` for `noBuild`, be sure the project has already been built by some other means.
|
|
3
|
+
*
|
|
4
|
+
* Docs for "dotnet ef" CLI: https://learn.microsoft.com/en-us/ef/core/cli/dotnet.
|
|
5
|
+
* @param projectPath Path to project that has the DbContext and Migration files used for the `--project` argument
|
|
6
|
+
* @param dbContextName The name of the DbContext class used for the `--context` argument
|
|
7
|
+
* @param args Arguments to pass to the `dotnet ef` CLI
|
|
8
|
+
* @param noBuild If true, the `--no-build` argument will be passed to the `dotnet ef` CLI (default: true)
|
|
9
|
+
*/
|
|
10
|
+
export declare function dotnetEfCommand(projectPath: string, dbContextName: string, args: string[], noBuild?: boolean): Promise<number>;
|
|
11
|
+
/**
|
|
12
|
+
* Wrapper function for `dotnet ef migrations list`.
|
|
13
|
+
* @param projectPath The path to the project that contains the DbContext and Migration files
|
|
14
|
+
* @param dbContextName The name of the DbContext class
|
|
15
|
+
*/
|
|
16
|
+
export declare function efMigrationsList(projectPath: string, dbContextName: string): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Wrapper function for `dotnet ef database update <migration_name>`.
|
|
19
|
+
* @param projectPath The path to the project that contains the DbContext and Migration files
|
|
20
|
+
* @param dbContextName The name of the DbContext class
|
|
21
|
+
* @param migrationName The name of the migration to update to (optional). If not provided, all migrations will be applied.
|
|
22
|
+
*/
|
|
23
|
+
export declare function efMigrationsUpdate(projectPath: string, dbContextName: string, migrationName?: string): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
*
|
|
26
|
+
* @param projectPath The path to the project that contains the DbContext and Migration files
|
|
27
|
+
* @param dbContextName The name of the DbContext class
|
|
28
|
+
* @param migrationName The name of the migration to add
|
|
29
|
+
* @param withBoilerplate If true, boilerplate will be added to the migration C# file and empty Up and Down SQL files will be created
|
|
30
|
+
*/
|
|
31
|
+
export declare function efAddMigration(projectPath: string, dbContextName: string, migrationName: string, withBoilerplate?: boolean): Promise<void>;
|
|
32
|
+
/**
|
|
33
|
+
*
|
|
34
|
+
* @param projectPath The path to the project that contains the DbContext and Migration files
|
|
35
|
+
* @param dbContextName The name of the DbContext class
|
|
36
|
+
* @param skipConfirm If `true`, the user will not be prompted to confirm the removal of the last migration
|
|
37
|
+
*/
|
|
38
|
+
export declare function efRemoveLastMigration(projectPath: string, dbContextName: string, skipConfirm?: boolean): Promise<void>;
|
|
39
|
+
//# sourceMappingURL=dbMigrationUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dbMigrationUtils.d.ts","sourceRoot":"","sources":["../../src/dbMigrationUtils.ts"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,UAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAKjI;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,iBAEhF;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,iBAE1G;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,UAAQ,iBAY9H;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,UAAQ,iBAe1G"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.efRemoveLastMigration = exports.efAddMigration = exports.efMigrationsUpdate = exports.efMigrationsList = exports.dotnetEfCommand = void 0;
|
|
7
|
+
const generalUtils_js_1 = require("./generalUtils.js");
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
10
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
11
|
+
/**
|
|
12
|
+
* Wrapper function for `dotnet ef`. If you don't pass `false` for `noBuild`, be sure the project has already been built by some other means.
|
|
13
|
+
*
|
|
14
|
+
* Docs for "dotnet ef" CLI: https://learn.microsoft.com/en-us/ef/core/cli/dotnet.
|
|
15
|
+
* @param projectPath Path to project that has the DbContext and Migration files used for the `--project` argument
|
|
16
|
+
* @param dbContextName The name of the DbContext class used for the `--context` argument
|
|
17
|
+
* @param args Arguments to pass to the `dotnet ef` CLI
|
|
18
|
+
* @param noBuild If true, the `--no-build` argument will be passed to the `dotnet ef` CLI (default: true)
|
|
19
|
+
*/
|
|
20
|
+
async function dotnetEfCommand(projectPath, dbContextName, args, noBuild = true) {
|
|
21
|
+
(0, generalUtils_js_1.requireValidPath)('projectPath', projectPath);
|
|
22
|
+
(0, generalUtils_js_1.requireString)('dbContextName', dbContextName);
|
|
23
|
+
const result = await (0, generalUtils_js_1.spawnAsync)('dotnet', ['ef', '--project', projectPath, ...args, '--context', dbContextName, ...(noBuild ? ['--no-build'] : [])]);
|
|
24
|
+
return result.code;
|
|
25
|
+
}
|
|
26
|
+
exports.dotnetEfCommand = dotnetEfCommand;
|
|
27
|
+
/**
|
|
28
|
+
* Wrapper function for `dotnet ef migrations list`.
|
|
29
|
+
* @param projectPath The path to the project that contains the DbContext and Migration files
|
|
30
|
+
* @param dbContextName The name of the DbContext class
|
|
31
|
+
*/
|
|
32
|
+
async function efMigrationsList(projectPath, dbContextName) {
|
|
33
|
+
await dotnetEfCommand(projectPath, dbContextName, ['migrations', 'list']);
|
|
34
|
+
}
|
|
35
|
+
exports.efMigrationsList = efMigrationsList;
|
|
36
|
+
/**
|
|
37
|
+
* Wrapper function for `dotnet ef database update <migration_name>`.
|
|
38
|
+
* @param projectPath The path to the project that contains the DbContext and Migration files
|
|
39
|
+
* @param dbContextName The name of the DbContext class
|
|
40
|
+
* @param migrationName The name of the migration to update to (optional). If not provided, all migrations will be applied.
|
|
41
|
+
*/
|
|
42
|
+
async function efMigrationsUpdate(projectPath, dbContextName, migrationName) {
|
|
43
|
+
await dotnetEfCommand(projectPath, dbContextName, ['database', 'update', ...(migrationName ? [migrationName] : [])]);
|
|
44
|
+
}
|
|
45
|
+
exports.efMigrationsUpdate = efMigrationsUpdate;
|
|
46
|
+
/**
|
|
47
|
+
*
|
|
48
|
+
* @param projectPath The path to the project that contains the DbContext and Migration files
|
|
49
|
+
* @param dbContextName The name of the DbContext class
|
|
50
|
+
* @param migrationName The name of the migration to add
|
|
51
|
+
* @param withBoilerplate If true, boilerplate will be added to the migration C# file and empty Up and Down SQL files will be created
|
|
52
|
+
*/
|
|
53
|
+
async function efAddMigration(projectPath, dbContextName, migrationName, withBoilerplate = false) {
|
|
54
|
+
const projectDirectory = projectPath.endsWith('.csproj') ? projectPath.substring(0, projectPath.lastIndexOf('/')) : projectPath;
|
|
55
|
+
const migrationsOutputDir = getMigrationsProjectRelativePath(dbContextName);
|
|
56
|
+
await dotnetEfCommand(projectPath, dbContextName, ['migrations', 'add', migrationName, '-o', migrationsOutputDir]);
|
|
57
|
+
if (withBoilerplate) {
|
|
58
|
+
try {
|
|
59
|
+
await addDbMigrationBoilerplate(projectDirectory, dbContextName, migrationName);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.error(error);
|
|
63
|
+
await efRemoveLastMigration(projectPath, dbContextName, true);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.efAddMigration = efAddMigration;
|
|
68
|
+
/**
|
|
69
|
+
*
|
|
70
|
+
* @param projectPath The path to the project that contains the DbContext and Migration files
|
|
71
|
+
* @param dbContextName The name of the DbContext class
|
|
72
|
+
* @param skipConfirm If `true`, the user will not be prompted to confirm the removal of the last migration
|
|
73
|
+
*/
|
|
74
|
+
async function efRemoveLastMigration(projectPath, dbContextName, skipConfirm = false) {
|
|
75
|
+
const lastMigrationName = await getLastMigrationName(projectPath, dbContextName);
|
|
76
|
+
if (!skipConfirm && !await (0, generalUtils_js_1.getConfirmation)(`Are you sure you want to remove the last migration: ➡️${lastMigrationName}?`)) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const returnCode = await dotnetEfCommand(projectPath, dbContextName, ['migrations', 'remove']);
|
|
80
|
+
if (returnCode !== 0) {
|
|
81
|
+
throw new Error(`dotnet ef migrations remove returned non-zero exit code: ${returnCode}`);
|
|
82
|
+
}
|
|
83
|
+
(0, generalUtils_js_1.log)(`Removing migration SQL script files for migration if they're empty`);
|
|
84
|
+
await deleteScriptFileIfEmpty(getScriptPath(projectPath, lastMigrationName, true));
|
|
85
|
+
await deleteScriptFileIfEmpty(getScriptPath(projectPath, lastMigrationName, false));
|
|
86
|
+
}
|
|
87
|
+
exports.efRemoveLastMigration = efRemoveLastMigration;
|
|
88
|
+
async function deleteScriptFileIfEmpty(scriptPath) {
|
|
89
|
+
if (node_fs_1.default.existsSync(scriptPath)) {
|
|
90
|
+
const scriptContents = node_fs_1.default.readFileSync(scriptPath, { encoding: 'utf8' });
|
|
91
|
+
if (scriptContents.trim().length === 0) {
|
|
92
|
+
await promises_1.default.unlink(scriptPath);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
(0, generalUtils_js_1.log)(`⚠️ Skipping deletion of non-empty script file: ${scriptPath}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async function getLastMigrationName(projectPath, dbContextName) {
|
|
100
|
+
const migrationsDirectory = getMigrationsDirectory(projectPath, dbContextName);
|
|
101
|
+
const filenames = node_fs_1.default.readdirSync(migrationsDirectory);
|
|
102
|
+
const migrationNames = filenames.filter(filename => filename.endsWith('.cs') &&
|
|
103
|
+
!filename.endsWith('.Designer.cs') &&
|
|
104
|
+
!filename.endsWith('.ModelSnapshot.cs') &&
|
|
105
|
+
filename.includes('_')).map(filename => filename.substring(0, filename.length - 3));
|
|
106
|
+
const migrationNamesWithTimestamps = migrationNames.map(migrationName => {
|
|
107
|
+
const timestamp = migrationName.substring(0, 14);
|
|
108
|
+
const name = migrationName.substring(15);
|
|
109
|
+
return { timestamp, name };
|
|
110
|
+
});
|
|
111
|
+
(0, generalUtils_js_1.log)(`Found migrations: ${migrationNamesWithTimestamps.map(m => m.name).join(', ')}`);
|
|
112
|
+
(0, generalUtils_js_1.log)(`Found timestamps: ${migrationNamesWithTimestamps.map(m => m.timestamp).join(', ')}`);
|
|
113
|
+
const sortedMigrationNames = migrationNamesWithTimestamps.sort((a, b) => a.timestamp.localeCompare(b.timestamp));
|
|
114
|
+
const lastMigrationName = sortedMigrationNames[sortedMigrationNames.length - 1].name;
|
|
115
|
+
return lastMigrationName;
|
|
116
|
+
}
|
|
117
|
+
function getMigrationsProjectRelativePath(dbContextName) {
|
|
118
|
+
return `Migrations/${dbContextName}Migrations`;
|
|
119
|
+
}
|
|
120
|
+
function getMigrationsDirectory(projectDirectory, dbContextName) {
|
|
121
|
+
return node_path_1.default.join(projectDirectory, `Migrations/${dbContextName}Migrations`);
|
|
122
|
+
}
|
|
123
|
+
function getScriptPath(projectDirectory, migrationName, isUp) {
|
|
124
|
+
return node_path_1.default.join(projectDirectory, `Scripts/${migrationName}${isUp ? '' : '_Down'}.sql`);
|
|
125
|
+
}
|
|
126
|
+
async function addDbMigrationBoilerplate(projectDirectory, dbContextName, migrationName) {
|
|
127
|
+
const migrationsOutputDir = getMigrationsDirectory(projectDirectory, dbContextName);
|
|
128
|
+
if (!node_fs_1.default.existsSync(migrationsOutputDir)) {
|
|
129
|
+
throw new Error(`Unable to add migration C# boilerplate - could not find migrations output directory: ${migrationsOutputDir}`);
|
|
130
|
+
}
|
|
131
|
+
(0, generalUtils_js_1.log)(`Checking for generated C# file 📄XXXX_${migrationName}.cs in directory 📁${migrationsOutputDir}`);
|
|
132
|
+
const filenamePattern = `_${migrationName}.cs`;
|
|
133
|
+
const filenames = node_fs_1.default.readdirSync(migrationsOutputDir).filter(filename => filename.endsWith(filenamePattern));
|
|
134
|
+
if (!filenames || filenames.length === 0) {
|
|
135
|
+
throw new Error(`Auto-generated migration file not found - migrations output directory has no C# files ending with : ${filenamePattern}`);
|
|
136
|
+
}
|
|
137
|
+
if (filenames.length > 1) {
|
|
138
|
+
throw new Error(`Auto-generated migration file not found - migrations output directory has multiple C# files with the same migration name: ${filenames.join(', ')}`);
|
|
139
|
+
}
|
|
140
|
+
const filename = filenames[0];
|
|
141
|
+
const filePath = node_path_1.default.join(migrationsOutputDir, filename);
|
|
142
|
+
if (!node_fs_1.default.existsSync(filePath)) {
|
|
143
|
+
throw new Error(`Issue generating file path for migration (not found): ${filePath}`);
|
|
144
|
+
}
|
|
145
|
+
(0, generalUtils_js_1.log)(`Adding boilerplate to file 📄${filePath}`);
|
|
146
|
+
const usingLine = 'using MikeyT.DbMigrations;';
|
|
147
|
+
const upLine = `MigrationScriptRunner.RunScript(migrationBuilder, "${migrationName}.sql");`;
|
|
148
|
+
const downLine = `MigrationScriptRunner.RunScript(migrationBuilder, "${migrationName}_Down.sql");`;
|
|
149
|
+
const fileContents = await promises_1.default.readFile(filePath, { encoding: 'utf8' });
|
|
150
|
+
const lines = fileContents.replaceAll('\r', '').split('\n');
|
|
151
|
+
const newLines = [];
|
|
152
|
+
newLines.push(lines[0].trim());
|
|
153
|
+
newLines.push(usingLine);
|
|
154
|
+
let addUpLine = false;
|
|
155
|
+
let addDownLine = false;
|
|
156
|
+
let skipNextLineIfBlank = false;
|
|
157
|
+
for (let i = 1; i < lines.length; i++) {
|
|
158
|
+
if (skipNextLineIfBlank && lines[i].trim().length === 0) {
|
|
159
|
+
skipNextLineIfBlank = false;
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
if (addUpLine) {
|
|
163
|
+
const newLine = lines[i].replace('{', `{\n\t\t\t${upLine}`);
|
|
164
|
+
newLines.push(newLine);
|
|
165
|
+
addUpLine = false;
|
|
166
|
+
skipNextLineIfBlank = true;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (addDownLine) {
|
|
170
|
+
const newLine = lines[i].replace('{', `{\n\t\t\t${downLine}`);
|
|
171
|
+
newLines.push(newLine);
|
|
172
|
+
addDownLine = false;
|
|
173
|
+
skipNextLineIfBlank = true;
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
newLines.push(lines[i]);
|
|
177
|
+
if (lines[i].includes('void Up')) {
|
|
178
|
+
addUpLine = true;
|
|
179
|
+
}
|
|
180
|
+
if (lines[i].includes('void Down')) {
|
|
181
|
+
addDownLine = true;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const newFileContents = newLines.join('\n');
|
|
185
|
+
await promises_1.default.writeFile(filePath, newFileContents, { encoding: 'utf8' });
|
|
186
|
+
(0, generalUtils_js_1.log)(`Updated file with boilerplate - please ensure it is correct: ${filePath}`);
|
|
187
|
+
const upScriptPath = node_path_1.default.join(projectDirectory, `Scripts/${migrationName}.sql`);
|
|
188
|
+
const downScriptPath = node_path_1.default.join(projectDirectory, `Scripts/${migrationName}_Down.sql`);
|
|
189
|
+
(0, generalUtils_js_1.log)('\nCreating corresponding empty sql files (no action will be taken if they already exist):');
|
|
190
|
+
(0, generalUtils_js_1.log)(` - 📄${upScriptPath}`);
|
|
191
|
+
(0, generalUtils_js_1.log)(` - 📄${downScriptPath}\n`);
|
|
192
|
+
if (!node_fs_1.default.existsSync(upScriptPath)) {
|
|
193
|
+
await promises_1.default.writeFile(upScriptPath, '', { encoding: 'utf8' });
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
(0, generalUtils_js_1.log)('Skipping Up sql script (already exists)');
|
|
197
|
+
}
|
|
198
|
+
if (!node_fs_1.default.existsSync(downScriptPath)) {
|
|
199
|
+
await promises_1.default.writeFile(downScriptPath, '', { encoding: 'utf8' });
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
(0, generalUtils_js_1.log)('Skipping Down sql script (already exists)');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGJNaWdyYXRpb25VdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYk1pZ3JhdGlvblV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHVEQUFxRztBQUNyRywwREFBNEI7QUFDNUIsc0RBQXdCO0FBQ3hCLGdFQUFrQztBQUVsQzs7Ozs7Ozs7R0FRRztBQUNJLEtBQUssVUFBVSxlQUFlLENBQUMsV0FBbUIsRUFBRSxhQUFxQixFQUFFLElBQWMsRUFBRSxPQUFPLEdBQUcsSUFBSTtJQUM5RyxJQUFBLGtDQUFnQixFQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUM1QyxJQUFBLCtCQUFhLEVBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQzdDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBQSw0QkFBVSxFQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLEdBQUcsSUFBSSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ3BKLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQTtBQUNwQixDQUFDO0FBTEQsMENBS0M7QUFFRDs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLGdCQUFnQixDQUFDLFdBQW1CLEVBQUUsYUFBcUI7SUFDL0UsTUFBTSxlQUFlLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBRSxDQUFBO0FBQzVFLENBQUM7QUFGRCw0Q0FFQztBQUVEOzs7OztHQUtHO0FBQ0ksS0FBSyxVQUFVLGtCQUFrQixDQUFDLFdBQW1CLEVBQUUsYUFBcUIsRUFBRSxhQUFzQjtJQUN6RyxNQUFNLGVBQWUsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLENBQUMsVUFB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
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs dotnet build on the specified project.
|
|
3
|
+
* @param projectPath Path to project file (like .csproj) or directory of project to build
|
|
4
|
+
* @throws A {@link SpawnError} if the spawned process exits with a non-zero exit code
|
|
5
|
+
*/
|
|
6
|
+
export declare function dotnetBuild(projectPath: string): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Helper method to spawn a process and run 'dotnet publish'.
|
|
9
|
+
* @param projectPath Path to project file (like .csproj) or directory of project to build
|
|
10
|
+
* @param configuration Build configuration, such as 'Release'
|
|
11
|
+
* @param outputDir The relative or absolute path for the build output
|
|
12
|
+
* @param cwd Optionally run the command from another current working directory
|
|
13
|
+
*/
|
|
14
|
+
export declare function dotnetPublish(projectPath?: string, configuration?: string, outputDir?: string, cwd?: string): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Spawns a process that runs the necessary commands to install or update the dotnet-ef tool globally on the system.
|
|
17
|
+
*/
|
|
18
|
+
export declare function installOrUpdateDotnetEfTool(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Spawns a process that runs the following commands to clean and re-install the dotnet dev certs:
|
|
21
|
+
* - dotnet dev-certs https --clean
|
|
22
|
+
* - dotnet dev-certs https -t
|
|
23
|
+
*/
|
|
24
|
+
export declare function configureDotnetDevCerts(): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=dotnetUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dotnetUtils.d.ts","sourceRoot":"","sources":["../../src/dotnetUtils.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,iBAGpD;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,WAAW,GAAE,MAAa,EAAE,aAAa,GAAE,MAAkB,EAAE,SAAS,GAAE,MAAkB,EAAE,GAAG,CAAC,EAAE,MAAM,iBAU7I;AAED;;GAEG;AACH,wBAAsB,2BAA2B,kBAShD;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,kBAG5C"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.configureDotnetDevCerts = exports.installOrUpdateDotnetEfTool = exports.dotnetPublish = exports.dotnetBuild = void 0;
|
|
4
|
+
const generalUtils_js_1 = require("./generalUtils.js");
|
|
5
|
+
/**
|
|
6
|
+
* Runs dotnet build on the specified project.
|
|
7
|
+
* @param projectPath Path to project file (like .csproj) or directory of project to build
|
|
8
|
+
* @throws A {@link SpawnError} if the spawned process exits with a non-zero exit code
|
|
9
|
+
*/
|
|
10
|
+
async function dotnetBuild(projectPath) {
|
|
11
|
+
(0, generalUtils_js_1.requireValidPath)('projectPath', projectPath);
|
|
12
|
+
await (0, generalUtils_js_1.spawnAsync)('dotnet', ['build', projectPath], { throwOnNonZero: true });
|
|
13
|
+
}
|
|
14
|
+
exports.dotnetBuild = dotnetBuild;
|
|
15
|
+
/**
|
|
16
|
+
* Helper method to spawn a process and run 'dotnet publish'.
|
|
17
|
+
* @param projectPath Path to project file (like .csproj) or directory of project to build
|
|
18
|
+
* @param configuration Build configuration, such as 'Release'
|
|
19
|
+
* @param outputDir The relative or absolute path for the build output
|
|
20
|
+
* @param cwd Optionally run the command from another current working directory
|
|
21
|
+
*/
|
|
22
|
+
async function dotnetPublish(projectPath = './', configuration = 'Release', outputDir = 'publish', cwd) {
|
|
23
|
+
(0, generalUtils_js_1.requireValidPath)('projectPath', projectPath);
|
|
24
|
+
(0, generalUtils_js_1.requireString)('outputDir', outputDir);
|
|
25
|
+
(0, generalUtils_js_1.requireString)('configuration', configuration);
|
|
26
|
+
if (cwd) {
|
|
27
|
+
(0, generalUtils_js_1.requireValidPath)('cwd', cwd);
|
|
28
|
+
}
|
|
29
|
+
const args = ['publish', projectPath, '-c', configuration, '-o', outputDir];
|
|
30
|
+
(0, generalUtils_js_1.trace)(`running dotnet ${args.join(' ')}${cwd ? ` in cwd ${cwd}` : ''}`);
|
|
31
|
+
await (0, generalUtils_js_1.spawnAsync)('dotnet', args, { cwd: cwd });
|
|
32
|
+
}
|
|
33
|
+
exports.dotnetPublish = dotnetPublish;
|
|
34
|
+
/**
|
|
35
|
+
* Spawns a process that runs the necessary commands to install or update the dotnet-ef tool globally on the system.
|
|
36
|
+
*/
|
|
37
|
+
async function installOrUpdateDotnetEfTool() {
|
|
38
|
+
const installed = (0, generalUtils_js_1.whichSync)('dotnet-ef').location;
|
|
39
|
+
if (installed) {
|
|
40
|
+
(0, generalUtils_js_1.log)('dotnet-ef tool already installed, updating...');
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
(0, generalUtils_js_1.log)('dotnet-ef tool not installed, installing...');
|
|
44
|
+
}
|
|
45
|
+
const args = ['tool', installed ? 'update' : 'install', '--global', 'dotnet-ef'];
|
|
46
|
+
await (0, generalUtils_js_1.spawnAsync)('dotnet', args);
|
|
47
|
+
}
|
|
48
|
+
exports.installOrUpdateDotnetEfTool = installOrUpdateDotnetEfTool;
|
|
49
|
+
/**
|
|
50
|
+
* Spawns a process that runs the following commands to clean and re-install the dotnet dev certs:
|
|
51
|
+
* - dotnet dev-certs https --clean
|
|
52
|
+
* - dotnet dev-certs https -t
|
|
53
|
+
*/
|
|
54
|
+
async function configureDotnetDevCerts() {
|
|
55
|
+
await (0, generalUtils_js_1.spawnAsync)('dotnet', ['dev-certs', 'https', '--clean']);
|
|
56
|
+
await (0, generalUtils_js_1.spawnAsync)('dotnet', ['dev-certs', 'https', '-t']);
|
|
57
|
+
}
|
|
58
|
+
exports.configureDotnetDevCerts = configureDotnetDevCerts;
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90bmV0VXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZG90bmV0VXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdURBQWtIO0FBRWxIOzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsV0FBVyxDQUFDLFdBQW1CO0lBQ25ELElBQUEsa0NBQWdCLEVBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQzVDLE1BQU0sSUFBQSw0QkFBVSxFQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQzlFLENBQUM7QUFIRCxrQ0FHQztBQUVEOzs7Ozs7R0FNRztBQUNJLEtBQUssVUFBVSxhQUFhLENBQUMsY0FBc0IsSUFBSSxFQUFFLGdCQUF3QixTQUFTLEVBQUUsWUFBb0IsU0FBUyxFQUFFLEdBQVk7SUFDNUksSUFBQSxrQ0FBZ0IsRUFBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDNUMsSUFBQSwrQkFBYSxFQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUNyQyxJQUFBLCtCQUFhLEVBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQzdDLElBQUksR0FBRyxFQUFFO1FBQ1AsSUFBQSxrQ0FBZ0IsRUFBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUE7S0FDN0I7SUFDRCxNQUFNLElBQUksR0FBRyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFDM0UsSUFBQSx1QkFBSyxFQUFDLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUN2RSxNQUFNLElBQUEsNEJBQVUsRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUE7QUFDaEQsQ0FBQztBQVZELHNDQVVDO0FBRUQ7O0dBRUc7QUFDSSxLQUFLLFVBQVUsMkJBQTJCO0lBQy9DLE1BQU0sU0FBUyxHQUFHLElBQUEsMkJBQVMsRUFBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUE7SUFDakQsSUFBSSxTQUFTLEVBQUU7UUFDYixJQUFBLHFCQUFHLEVBQUMsK0NBQStDLENBQUMsQ0FBQTtLQUNyRDtTQUFNO1FBQ0wsSUFBQSxxQkFBRyxFQUFDLDZDQUE2QyxDQUFDLENBQUE7S0FDbkQ7SUFDRCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUNoRixNQUFNLElBQUEsNEJBQVUsRUFBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDbEMsQ0FBQztBQVRELGtFQVNDO0FBRUQ7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSx1QkFBdUI7SUFDM0MsTUFBTSxJQUFBLDRCQUFVLEVBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFBO0lBQzdELE1BQU0sSUFBQSw0QkFBVSxFQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQTtBQUMxRCxDQUFDO0FBSEQsMERBR0MifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"esmSpecific.d.mts","sourceRoot":"","sources":["../../src/esmSpecific.mts"],"names":[],"mappings":"AAEA,eAAO,MAAM,wBAAwB,cAGpC,CAAA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getImportMetaUrlFilePath = void 0;
|
|
4
|
+
const node_url_1 = require("node:url");
|
|
5
|
+
const getImportMetaUrlFilePath = () => {
|
|
6
|
+
// @ts-ignore
|
|
7
|
+
return (0, node_url_1.fileURLToPath)(import.meta.url);
|
|
8
|
+
};
|
|
9
|
+
exports.getImportMetaUrlFilePath = getImportMetaUrlFilePath;
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNtU3BlY2lmaWMubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VzbVNwZWNpZmljLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1Q0FBd0M7QUFFakMsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLEVBQUU7SUFDM0MsYUFBYTtJQUNiLE9BQU8sSUFBQSx3QkFBYSxFQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDdkMsQ0FBQyxDQUFBO0FBSFksUUFBQSx3QkFBd0IsNEJBR3BDIn0=
|