@mikeyt23/node-cli-utils 1.4.1 → 2.0.0-beta.2
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/GitUtility.d.ts +7 -0
- package/dist/cjs/GitUtility.d.ts.map +1 -0
- package/dist/cjs/GitUtility.js +49 -0
- 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 +63 -0
- package/dist/cjs/TarballUtility.d.ts.map +1 -0
- package/dist/cjs/TarballUtility.js +143 -0
- package/dist/cjs/certUtils.d.ts +66 -0
- package/dist/cjs/certUtils.d.ts.map +1 -0
- package/dist/cjs/certUtils.js +283 -0
- package/dist/cjs/dbMigrationUtils.d.ts +39 -0
- package/dist/cjs/dbMigrationUtils.d.ts.map +1 -0
- package/dist/cjs/dbMigrationUtils.js +195 -0
- package/dist/cjs/dotnetUtils.d.ts +25 -0
- package/dist/cjs/dotnetUtils.d.ts.map +1 -0
- package/dist/cjs/dotnetUtils.js +61 -0
- package/dist/cjs/esmSpecific.d.mts +7 -0
- package/dist/cjs/esmSpecific.d.mts.map +1 -0
- package/dist/cjs/esmSpecific.mjs +15 -0
- package/dist/cjs/generalUtils.d.ts +565 -0
- package/dist/cjs/generalUtils.d.ts.map +1 -0
- package/dist/cjs/generalUtils.js +1068 -0
- package/dist/cjs/generalUtilsInternal.d.ts +15 -0
- package/dist/cjs/generalUtilsInternal.d.ts.map +1 -0
- package/dist/cjs/generalUtilsInternal.js +317 -0
- package/dist/cjs/hostsUtils.d.ts +16 -0
- package/dist/cjs/hostsUtils.d.ts.map +1 -0
- package/dist/cjs/hostsUtils.js +82 -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 +159 -0
- package/dist/esm/GitUtility.d.ts +7 -0
- package/dist/esm/GitUtility.d.ts.map +1 -0
- package/dist/esm/GitUtility.js +43 -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 +63 -0
- package/dist/esm/TarballUtility.d.ts.map +1 -0
- package/dist/esm/TarballUtility.js +139 -0
- package/dist/esm/certUtils.d.ts +66 -0
- package/dist/esm/certUtils.d.ts.map +1 -0
- package/dist/esm/certUtils.js +271 -0
- package/dist/esm/dbMigrationUtils.d.ts +39 -0
- package/dist/esm/dbMigrationUtils.d.ts.map +1 -0
- package/dist/esm/dbMigrationUtils.js +184 -0
- package/dist/esm/dotnetUtils.d.ts +25 -0
- package/dist/esm/dotnetUtils.d.ts.map +1 -0
- package/dist/esm/dotnetUtils.js +54 -0
- package/dist/esm/esmSpecific.d.mts +7 -0
- package/dist/esm/esmSpecific.d.mts.map +1 -0
- package/dist/esm/esmSpecific.mjs +11 -0
- package/dist/esm/generalUtils.d.ts +565 -0
- package/dist/esm/generalUtils.d.ts.map +1 -0
- package/dist/esm/generalUtils.js +976 -0
- package/dist/esm/generalUtilsInternal.d.ts +15 -0
- package/dist/esm/generalUtilsInternal.d.ts.map +1 -0
- package/dist/esm/generalUtilsInternal.js +278 -0
- package/dist/esm/hostsUtils.d.ts +16 -0
- package/dist/esm/hostsUtils.d.ts.map +1 -0
- package/dist/esm/hostsUtils.js +69 -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 +151 -0
- package/package.json +69 -10
- package/index.js +0 -627
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import fsp from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { Emoji, ensureDirectory, getPowershellHackArgs, isPlatformMac, isPlatformWindows, logIf, red, requireString, requireValidPath, simpleSpawnSync, spawnAsync, stringToNonEmptyLines, whichSync } from './generalUtils.js';
|
|
5
|
+
const defaultCertLogOptions = {
|
|
6
|
+
logSpawnOutput: false,
|
|
7
|
+
logTraceMessages: false,
|
|
8
|
+
logElevatedPermissionsMessage: true,
|
|
9
|
+
logSuccess: true
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Wrapper function for calling openssl to generate a self-signed cert to be used for developing a local website with trusted https.
|
|
13
|
+
* @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.
|
|
14
|
+
* @param options Options for generating the cert.
|
|
15
|
+
* @returns The path to the generated pfx file.
|
|
16
|
+
*/
|
|
17
|
+
export async function generateCertWithOpenSsl(url, options) {
|
|
18
|
+
requireString('url', url);
|
|
19
|
+
throwIfMaybeBadUrlChars(url);
|
|
20
|
+
const isMac = isPlatformMac();
|
|
21
|
+
const mergedOptions = { ...defaultCertLogOptions, outputDirectory: './cert', ...options };
|
|
22
|
+
const spawnArgs = { cwd: mergedOptions.outputDirectory, stdio: mergedOptions.logSpawnOutput ? 'inherit' : 'pipe' };
|
|
23
|
+
logIf(mergedOptions.logTraceMessages, 'checking if openssl is installed');
|
|
24
|
+
let brewOpenSslPath = '';
|
|
25
|
+
if (!isMac) {
|
|
26
|
+
const openSslPath = whichSync('openssl').location;
|
|
27
|
+
if (!openSslPath) {
|
|
28
|
+
throw Error('openssl is required but was not found');
|
|
29
|
+
}
|
|
30
|
+
logIf(mergedOptions.logTraceMessages, `using openssl at: ${openSslPath}`);
|
|
31
|
+
}
|
|
32
|
+
else if (isMac) {
|
|
33
|
+
const brewOpenSslDirectory = getBrewOpensslPath();
|
|
34
|
+
if (!brewOpenSslDirectory) {
|
|
35
|
+
throw Error('openssl (brew version) is required but was not found');
|
|
36
|
+
}
|
|
37
|
+
brewOpenSslPath = `${getBrewOpensslPath()}/bin/openssl`;
|
|
38
|
+
if (!fs.existsSync(brewOpenSslPath)) {
|
|
39
|
+
throw Error(`openssl (brew version) is required but was not found at: ${brewOpenSslPath}`);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
logIf(mergedOptions.logTraceMessages, `using openssl at: ${brewOpenSslPath}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
ensureDirectory(mergedOptions.outputDirectory);
|
|
46
|
+
const crtName = url + '.crt';
|
|
47
|
+
const keyName = url + '.key';
|
|
48
|
+
const pfxName = url + '.pfx';
|
|
49
|
+
const sanCnfName = url + '.cnf';
|
|
50
|
+
const filesToCheck = [crtName, keyName, pfxName, sanCnfName];
|
|
51
|
+
for (const file of filesToCheck) {
|
|
52
|
+
const filePath = path.join(mergedOptions.outputDirectory, file);
|
|
53
|
+
if (fs.existsSync(filePath)) {
|
|
54
|
+
throw Error(`${Emoji.Stop} File ${filePath} already exists. Delete or rename all of the following files from '${mergedOptions.outputDirectory}' if you want to generate a new cert: ${filesToCheck.join(', ')}.`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
logIf(mergedOptions.logTraceMessages, `writing ${sanCnfName} file for use with openssl command`);
|
|
58
|
+
const sanCnfContents = getSanCnfFileContents(url);
|
|
59
|
+
const sanCnfPath = path.join(mergedOptions.outputDirectory, sanCnfName);
|
|
60
|
+
await fsp.writeFile(sanCnfPath, sanCnfContents);
|
|
61
|
+
logIf(mergedOptions.logTraceMessages, `attempting to generate cert ${pfxName}`);
|
|
62
|
+
const genKeyAndCrtArgs = `req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout ${keyName} -out ${crtName} -subj /CN=${url} -config ${sanCnfName}`.split(' ');
|
|
63
|
+
const command = isMac ? brewOpenSslPath : 'openssl';
|
|
64
|
+
let result = await spawnAsync(command, genKeyAndCrtArgs, spawnArgs);
|
|
65
|
+
throwIfSpawnResultError(result);
|
|
66
|
+
logIf(mergedOptions.logTraceMessages, 'converting key and crt to pfx');
|
|
67
|
+
const convertToPfxArgs = `pkcs12 -certpbe AES-256-CBC -export -out ${pfxName} -aes256 -inkey ${keyName} -in ${crtName} -password pass:`.split(' ');
|
|
68
|
+
result = await spawnAsync(command, convertToPfxArgs, spawnArgs);
|
|
69
|
+
throwIfSpawnResultError(result);
|
|
70
|
+
const pfxPath = path.join(mergedOptions.outputDirectory, pfxName);
|
|
71
|
+
logIf(mergedOptions.logSuccess, `${Emoji.GreenCheck} Successfully generated cert: ${pfxPath}`);
|
|
72
|
+
return pfxPath;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Uses Powershell to install a cert to the local machine's trusted root store. Must have elevated permissions.
|
|
76
|
+
* If the cert is already installed, this function will do nothing.
|
|
77
|
+
* @param pfxPath The path to the pfx file to install.
|
|
78
|
+
*/
|
|
79
|
+
export async function winInstallCert(pfxPath, options) {
|
|
80
|
+
if (!isPlatformWindows()) {
|
|
81
|
+
throw Error('winInstallCert is only supported on Windows');
|
|
82
|
+
}
|
|
83
|
+
validatePfxPath(pfxPath);
|
|
84
|
+
const mergedOptions = { ...defaultCertLogOptions, ...options };
|
|
85
|
+
logIf(mergedOptions.logElevatedPermissionsMessage, getRequiresElevatedPermissionsMessage(true));
|
|
86
|
+
if (await winCertIsInstalled({ pfxPath }, mergedOptions)) {
|
|
87
|
+
const certInfo = await winGetPfxInfo(pfxPath);
|
|
88
|
+
logIf(mergedOptions.logTraceMessages, `${Emoji.Warning} certificate '${pfxPath}' with subject '${certInfo.subject}' is already installed - to install it again, first uninstall it manually or with the winUninstallCert function`);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
logIf(mergedOptions.logTraceMessages, `installing cert '${pfxPath}'`);
|
|
92
|
+
const psCommandArgs = getPowershellHackArgs(`Import-PfxCertificate -FilePath '${pfxPath}' -CertStoreLocation Cert:\\LocalMachine\\Root`);
|
|
93
|
+
const result = await spawnAsync('powershell', psCommandArgs, { stdio: mergedOptions.logSpawnOutput ? 'inherit' : 'pipe' });
|
|
94
|
+
throwIfSpawnResultError(result);
|
|
95
|
+
logIf(mergedOptions.logSuccess, `${Emoji.GreenCheck} Successfully installed cert: ${pfxPath}`);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Uses Powershell to check if a cert is already installed to the local machine's trusted root store.
|
|
99
|
+
* Uses the subject of the cert in order to avoid false negatives from regenerating the same self-signed cert
|
|
100
|
+
* with the same subject but different thumbprint. Note that this method is geared towards use with certs generated
|
|
101
|
+
* with the {@link generateCertWithOpenSsl} function, so this may not work using subject if your subject is not precisely "`CN=<url>`".
|
|
102
|
+
* @param identifier The subject or path to the pfx file of the cert to check.
|
|
103
|
+
* @returns `true` if the cert is already installed, `false` otherwise.
|
|
104
|
+
*/
|
|
105
|
+
export async function winCertIsInstalled(identifier, options) {
|
|
106
|
+
if (!isPlatformWindows()) {
|
|
107
|
+
throw new Error('winCertIsInstalled is only supported on Windows');
|
|
108
|
+
}
|
|
109
|
+
const mergedOptions = { ...defaultCertLogOptions, ...options };
|
|
110
|
+
let psCommandArgs;
|
|
111
|
+
// Get the count of certs installed with the same subject as the one we're trying to install
|
|
112
|
+
if (typeof identifier === 'string') {
|
|
113
|
+
requireString('subject', identifier);
|
|
114
|
+
validateSubject(identifier);
|
|
115
|
+
const subject = identifier.startsWith('CN=') ? identifier : `CN=${identifier}`;
|
|
116
|
+
psCommandArgs = getPowershellHackArgs(`Write-Host (Get-ChildItem Cert:\\LocalMachine\\Root | Where-Object { $_.Subject -eq '${subject}' } | Measure-Object).Count`);
|
|
117
|
+
}
|
|
118
|
+
else if ('pfxPath' in identifier) {
|
|
119
|
+
validatePfxPath(identifier.pfxPath);
|
|
120
|
+
psCommandArgs = getPowershellHackArgs(`Write-Host (Get-ChildItem Cert:\\LocalMachine\\Root | Where-Object { $_.Subject -eq (Get-PfxCertificate -FilePath '${identifier.pfxPath}').Subject } | Measure-Object).Count`);
|
|
121
|
+
}
|
|
122
|
+
const tracePart = (typeof identifier === 'string') ? `subject ${identifier}` : `pfxPath ${identifier.pfxPath}`;
|
|
123
|
+
logIf(mergedOptions.logTraceMessages, `checking if cert with ${tracePart} is already installed`);
|
|
124
|
+
const result = await spawnAsync('powershell', psCommandArgs, { stdio: 'pipe' });
|
|
125
|
+
throwIfSpawnResultError(result);
|
|
126
|
+
const lines = stringToNonEmptyLines(result.stdout);
|
|
127
|
+
if (lines.length !== 1) {
|
|
128
|
+
throw new Error(`Unexpected output from powershell command to check if the cert is already installed: ${result.stdout}`);
|
|
129
|
+
}
|
|
130
|
+
return lines[0].trim() !== '0';
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Uses Powershell to uninstall a cert from the local machine's trusted root store. Must have elevated permissions.
|
|
134
|
+
* @param identifier The subject, thumbprint or path to the pfx file of the cert to uninstall.
|
|
135
|
+
* @param options Options for uninstalling the cert.
|
|
136
|
+
*/
|
|
137
|
+
export async function winUninstallCert(identifier, options) {
|
|
138
|
+
if (!isPlatformWindows()) {
|
|
139
|
+
throw new Error('winUninstallCert is only supported on Windows');
|
|
140
|
+
}
|
|
141
|
+
const mergedOptions = { ...defaultCertLogOptions, ...options };
|
|
142
|
+
logIf(mergedOptions.logElevatedPermissionsMessage, getRequiresElevatedPermissionsMessage(false));
|
|
143
|
+
let psCommandArgs;
|
|
144
|
+
if (typeof identifier === 'string') {
|
|
145
|
+
requireString('subject', identifier);
|
|
146
|
+
validateSubject(identifier);
|
|
147
|
+
psCommandArgs = getPowershellHackArgs(`Get-ChildItem Cert:\\LocalMachine\\Root | Where-Object { $_.Subject -match '${identifier}' } | Remove-Item`);
|
|
148
|
+
}
|
|
149
|
+
else if ('thumbprint' in identifier) {
|
|
150
|
+
validateNoQuotes('thumbprint', identifier.thumbprint);
|
|
151
|
+
psCommandArgs = getPowershellHackArgs(`Get-ChildItem Cert:\\LocalMachine\\Root | Where-Object { $_.Thumbprint -eq '${identifier.thumbprint}' } | Remove-Item`);
|
|
152
|
+
}
|
|
153
|
+
else if ('pfxPath' in identifier) {
|
|
154
|
+
validatePfxPath(identifier.pfxPath);
|
|
155
|
+
psCommandArgs = getPowershellHackArgs(`$thumbprint = (Get-PfxCertificate -FilePath '${identifier.pfxPath}').Thumbprint; Get-ChildItem Cert:\\LocalMachine\\Root | Where-Object { $_.Thumbprint -eq $thumbprint } | Remove-Item`);
|
|
156
|
+
}
|
|
157
|
+
const tracePart = typeof identifier === 'string' ? `'${identifier}'` : JSON.stringify(identifier);
|
|
158
|
+
logIf(mergedOptions.logTraceMessages, `uninstalling cert ${tracePart}`);
|
|
159
|
+
const result = await spawnAsync('powershell', psCommandArgs, { stdio: mergedOptions.logSpawnOutput ? 'inherit' : 'pipe' });
|
|
160
|
+
throwIfSpawnResultError(result);
|
|
161
|
+
logIf(mergedOptions.logSuccess, `${Emoji.GreenCheck} Successfully uninstalled cert`);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Uses Powershell to get info about a cert.
|
|
165
|
+
* @param pfxPath The path to the pfx file to get info for.
|
|
166
|
+
* @returns The subject, thumbprint and pfxPath of the cert.
|
|
167
|
+
*/
|
|
168
|
+
export async function winGetPfxInfo(pfxPath) {
|
|
169
|
+
if (!isPlatformWindows()) {
|
|
170
|
+
throw new Error('winGetPfxInfo is only supported on Windows');
|
|
171
|
+
}
|
|
172
|
+
validatePfxPath(pfxPath);
|
|
173
|
+
const psCommandArgs = getPowershellHackArgs(`Get-PfxCertificate -FilePath '${pfxPath}' | Select-Object -Property Subject, Thumbprint, @{Name='PfxPath';Expression={'${pfxPath}'}} | ConvertTo-Json`);
|
|
174
|
+
const result = await spawnAsync('powershell', psCommandArgs, { stdio: 'pipe' });
|
|
175
|
+
throwIfSpawnResultError(result);
|
|
176
|
+
const json = result.stdout.trim();
|
|
177
|
+
const parsedJson = JSON.parse(json);
|
|
178
|
+
const certInfo = {
|
|
179
|
+
subject: parsedJson.Subject,
|
|
180
|
+
thumbprint: parsedJson.Thumbprint,
|
|
181
|
+
pfxPath: parsedJson.PfxPath
|
|
182
|
+
};
|
|
183
|
+
return certInfo;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Does not actually do anything - just outputs the manual instructions for installing a cert for use by chrome on linux.
|
|
187
|
+
*/
|
|
188
|
+
export function linuxInstallCert() {
|
|
189
|
+
const instructions = `Automated linux cert install not supported (chrome does not use system certs without significant extra configuration).
|
|
190
|
+
Manual Instructions:
|
|
191
|
+
- In Chrome, go to chrome://settings/certificates
|
|
192
|
+
- Select Authorities -> import
|
|
193
|
+
- Select your generated .crt file (in the ./cert/ directory by default - if you haven't generated it, see the generateCertWithOpenSsl function)
|
|
194
|
+
- Check box for "Trust certificate for identifying websites"
|
|
195
|
+
- Click OK
|
|
196
|
+
- Reload site`;
|
|
197
|
+
console.log(instructions);
|
|
198
|
+
}
|
|
199
|
+
function throwIfMaybeBadUrlChars(url, varName = 'url') {
|
|
200
|
+
if (url.includes(' ')) {
|
|
201
|
+
throw Error(`${varName} should not contain spaces`);
|
|
202
|
+
}
|
|
203
|
+
if (url.includes('/')) {
|
|
204
|
+
throw Error(`${varName} should not contain forward slashes`);
|
|
205
|
+
}
|
|
206
|
+
if (url.includes('\\')) {
|
|
207
|
+
throw Error(`${varName} should not contain backslashes`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function getBrewOpensslPath() {
|
|
211
|
+
const brewResult = simpleSpawnSync('brew', ['--prefix', 'openssl']);
|
|
212
|
+
if (brewResult.error) {
|
|
213
|
+
throw Error('error attempting to find openssl installed by brew');
|
|
214
|
+
}
|
|
215
|
+
if (brewResult.stdoutLines.length === 0 || brewResult.stdoutLines.length > 1) {
|
|
216
|
+
throw new Error(`unexpected output from brew command 'brew --prefix openssl': ${brewResult.stdout}`);
|
|
217
|
+
}
|
|
218
|
+
return brewResult.stdoutLines[0];
|
|
219
|
+
}
|
|
220
|
+
function getSanCnfFileContents(url) {
|
|
221
|
+
return sanCnfTemplate.replace(/{{url}}/g, url);
|
|
222
|
+
}
|
|
223
|
+
function validateSubject(subject) {
|
|
224
|
+
if (subject.includes('\\') || subject.includes('/') || subject.endsWith('.pfx')) {
|
|
225
|
+
throw new Error(`The subject appears to be a file path, which is not allowed. Did you mean to pass something like this instead: { pfxPath: '${subject}' } ?`);
|
|
226
|
+
}
|
|
227
|
+
validateNoQuotes('subject', subject);
|
|
228
|
+
}
|
|
229
|
+
function validateNoQuotes(name, value) {
|
|
230
|
+
if (value.includes("'") || value.includes('"')) {
|
|
231
|
+
throw new Error(`The value passed for '${name}' contains a single or double quote, which is not allowed.`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
function throwIfSpawnResultError(result) {
|
|
235
|
+
if (result.code !== 0) {
|
|
236
|
+
// There won't be any stderr if stdio was set to 'inherit', so we're checking first
|
|
237
|
+
if (result.stderr) {
|
|
238
|
+
console.error(red('Error:'), result.stderr);
|
|
239
|
+
}
|
|
240
|
+
throw Error(`Spawned command failed with exit code ${result.code}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
function validatePfxPath(pfxPath) {
|
|
244
|
+
if (!pfxPath.endsWith('.pfx')) {
|
|
245
|
+
throw new Error('pfxPath must end with .pfx');
|
|
246
|
+
}
|
|
247
|
+
requireValidPath('pfxPath', pfxPath);
|
|
248
|
+
validateNoQuotes('pfxPath', pfxPath);
|
|
249
|
+
}
|
|
250
|
+
function getRequiresElevatedPermissionsMessage(isInstall = true) {
|
|
251
|
+
return `${Emoji.Info} Important: ${isInstall ? '' : 'un'}installing a certificate requires elevated permissions`;
|
|
252
|
+
}
|
|
253
|
+
// Newer cert requirements force the need for "extension info" with DNS and IP info, but openssl v1.x doesn't support that with the
|
|
254
|
+
// CLI option -addext, so we're using a san.cnf file instead and passing this into the CLI command with the -config option.
|
|
255
|
+
const sanCnfTemplate = `[req]
|
|
256
|
+
distinguished_name=req
|
|
257
|
+
x509_extensions = v3_req
|
|
258
|
+
prompt = no
|
|
259
|
+
|
|
260
|
+
[req_distinguished_name]
|
|
261
|
+
CN = {{url}}
|
|
262
|
+
|
|
263
|
+
[v3_req]
|
|
264
|
+
subjectAltName = @alt_names
|
|
265
|
+
|
|
266
|
+
[alt_names]
|
|
267
|
+
DNS.1 = {{url}}
|
|
268
|
+
IP.1 = 127.0.0.1
|
|
269
|
+
|
|
270
|
+
`;
|
|
271
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydFV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NlcnRVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDeEIsT0FBTyxHQUFHLE1BQU0sa0JBQWtCLENBQUE7QUFDbEMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFDTCxLQUFLLEVBR0wsZUFBZSxFQUNmLHFCQUFxQixFQUNyQixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLEtBQUssRUFDTCxHQUFHLEVBQ0gsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsVUFBVSxFQUNWLHFCQUFxQixFQUNyQixTQUFTLEVBQ1YsTUFBTSxtQkFBbUIsQ0FBQTtBQWUxQixNQUFNLHFCQUFxQixHQUFtQjtJQUM1QyxjQUFjLEVBQUUsS0FBSztJQUNyQixnQkFBZ0IsRUFBRSxLQUFLO0lBQ3ZCLDZCQUE2QixFQUFFLElBQUk7SUFDbkMsVUFBVSxFQUFFLElBQUk7Q0FDakIsQ0FBQTtBQVdEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx1QkFBdUIsQ0FBQyxHQUFXLEVBQUUsT0FBc0M7SUFDL0YsYUFBYSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUN6Qix1QkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUM1QixNQUFNLEtBQUssR0FBRyxhQUFhLEVBQUUsQ0FBQTtJQUU3QixNQUFNLGFBQWEsR0FBd0IsRUFBRSxHQUFHLHFCQUFxQixFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQTtJQUU5RyxNQUFNLFNBQVMsR0FBbUMsRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUVs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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,184 @@
|
|
|
1
|
+
import { Emoji, getConfirmation, log, requireString, requireValidPath, spawnAsync } from './generalUtils.js';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import fsp from 'node:fs/promises';
|
|
5
|
+
/**
|
|
6
|
+
* 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.
|
|
7
|
+
*
|
|
8
|
+
* Docs for "dotnet ef" CLI: https://learn.microsoft.com/en-us/ef/core/cli/dotnet.
|
|
9
|
+
* @param projectPath Path to project that has the DbContext and Migration files used for the `--project` argument
|
|
10
|
+
* @param dbContextName The name of the DbContext class used for the `--context` argument
|
|
11
|
+
* @param args Arguments to pass to the `dotnet ef` CLI
|
|
12
|
+
* @param noBuild If true, the `--no-build` argument will be passed to the `dotnet ef` CLI (default: true)
|
|
13
|
+
*/
|
|
14
|
+
export async function dotnetEfCommand(projectPath, dbContextName, args, noBuild = true) {
|
|
15
|
+
requireValidPath('projectPath', projectPath);
|
|
16
|
+
requireString('dbContextName', dbContextName);
|
|
17
|
+
const result = await spawnAsync('dotnet', ['ef', '--project', projectPath, ...args, '--context', dbContextName, ...(noBuild ? ['--no-build'] : [])]);
|
|
18
|
+
return result.code;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Wrapper function for `dotnet ef migrations list`.
|
|
22
|
+
* @param projectPath The path to the project that contains the DbContext and Migration files
|
|
23
|
+
* @param dbContextName The name of the DbContext class
|
|
24
|
+
*/
|
|
25
|
+
export async function efMigrationsList(projectPath, dbContextName) {
|
|
26
|
+
await dotnetEfCommand(projectPath, dbContextName, ['migrations', 'list']);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Wrapper function for `dotnet ef database update <migration_name>`.
|
|
30
|
+
* @param projectPath The path to the project that contains the DbContext and Migration files
|
|
31
|
+
* @param dbContextName The name of the DbContext class
|
|
32
|
+
* @param migrationName The name of the migration to update to (optional). If not provided, all migrations will be applied.
|
|
33
|
+
*/
|
|
34
|
+
export async function efMigrationsUpdate(projectPath, dbContextName, migrationName) {
|
|
35
|
+
await dotnetEfCommand(projectPath, dbContextName, ['database', 'update', ...(migrationName ? [migrationName] : [])]);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
*
|
|
39
|
+
* @param projectPath The path to the project that contains the DbContext and Migration files
|
|
40
|
+
* @param dbContextName The name of the DbContext class
|
|
41
|
+
* @param migrationName The name of the migration to add
|
|
42
|
+
* @param withBoilerplate If true, boilerplate will be added to the migration C# file and empty Up and Down SQL files will be created
|
|
43
|
+
*/
|
|
44
|
+
export async function efAddMigration(projectPath, dbContextName, migrationName, withBoilerplate = false) {
|
|
45
|
+
const projectDirectory = projectPath.endsWith('.csproj') ? projectPath.substring(0, projectPath.lastIndexOf('/')) : projectPath;
|
|
46
|
+
const migrationsOutputDir = getMigrationsProjectRelativePath(dbContextName);
|
|
47
|
+
await dotnetEfCommand(projectPath, dbContextName, ['migrations', 'add', migrationName, '-o', migrationsOutputDir]);
|
|
48
|
+
if (withBoilerplate) {
|
|
49
|
+
try {
|
|
50
|
+
await addDbMigrationBoilerplate(projectDirectory, dbContextName, migrationName);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error(error);
|
|
54
|
+
await efRemoveLastMigration(projectPath, dbContextName, true);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
*
|
|
60
|
+
* @param projectPath The path to the project that contains the DbContext and Migration files
|
|
61
|
+
* @param dbContextName The name of the DbContext class
|
|
62
|
+
* @param skipConfirm If `true`, the user will not be prompted to confirm the removal of the last migration
|
|
63
|
+
*/
|
|
64
|
+
export async function efRemoveLastMigration(projectPath, dbContextName, skipConfirm = false) {
|
|
65
|
+
const lastMigrationName = await getLastMigrationName(projectPath, dbContextName);
|
|
66
|
+
if (!skipConfirm && !await getConfirmation(`Are you sure you want to remove the last migration: ➡️${lastMigrationName}?`)) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const returnCode = await dotnetEfCommand(projectPath, dbContextName, ['migrations', 'remove']);
|
|
70
|
+
if (returnCode !== 0) {
|
|
71
|
+
throw new Error(`dotnet ef migrations remove returned non-zero exit code: ${returnCode}`);
|
|
72
|
+
}
|
|
73
|
+
log(`Removing migration SQL script files for migration if they're empty`);
|
|
74
|
+
await deleteScriptFileIfEmpty(getScriptPath(projectPath, lastMigrationName, true));
|
|
75
|
+
await deleteScriptFileIfEmpty(getScriptPath(projectPath, lastMigrationName, false));
|
|
76
|
+
}
|
|
77
|
+
async function deleteScriptFileIfEmpty(scriptPath) {
|
|
78
|
+
if (fs.existsSync(scriptPath)) {
|
|
79
|
+
const scriptContents = fs.readFileSync(scriptPath, { encoding: 'utf8' });
|
|
80
|
+
if (scriptContents.trim().length === 0) {
|
|
81
|
+
await fsp.unlink(scriptPath);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
log(`${Emoji.Warning} Skipping deletion of non-empty script file: ${scriptPath}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async function getLastMigrationName(projectPath, dbContextName) {
|
|
89
|
+
const migrationsDirectory = getMigrationsDirectory(projectPath, dbContextName);
|
|
90
|
+
const filenames = fs.readdirSync(migrationsDirectory);
|
|
91
|
+
const migrationNames = filenames.filter(filename => filename.endsWith('.cs') &&
|
|
92
|
+
!filename.endsWith('.Designer.cs') &&
|
|
93
|
+
!filename.endsWith('.ModelSnapshot.cs') &&
|
|
94
|
+
filename.includes('_')).map(filename => filename.substring(0, filename.length - 3));
|
|
95
|
+
const migrationNamesWithTimestamps = migrationNames.map(migrationName => {
|
|
96
|
+
const timestamp = migrationName.substring(0, 14);
|
|
97
|
+
const name = migrationName.substring(15);
|
|
98
|
+
return { timestamp, name };
|
|
99
|
+
});
|
|
100
|
+
log(`Found migrations: ${migrationNamesWithTimestamps.map(m => m.name).join(', ')}`);
|
|
101
|
+
log(`Found timestamps: ${migrationNamesWithTimestamps.map(m => m.timestamp).join(', ')}`);
|
|
102
|
+
const sortedMigrationNames = [...migrationNamesWithTimestamps].sort((a, b) => a.timestamp.localeCompare(b.timestamp));
|
|
103
|
+
const lastMigrationName = sortedMigrationNames[sortedMigrationNames.length - 1].name;
|
|
104
|
+
return lastMigrationName;
|
|
105
|
+
}
|
|
106
|
+
function getMigrationsProjectRelativePath(dbContextName) {
|
|
107
|
+
return `Migrations/${dbContextName}Migrations`;
|
|
108
|
+
}
|
|
109
|
+
function getMigrationsDirectory(projectDirectory, dbContextName) {
|
|
110
|
+
return path.join(projectDirectory, `Migrations/${dbContextName}Migrations`);
|
|
111
|
+
}
|
|
112
|
+
function getScriptPath(projectDirectory, migrationName, isUp) {
|
|
113
|
+
return path.join(projectDirectory, `Scripts/${migrationName}${isUp ? '' : '_Down'}.sql`);
|
|
114
|
+
}
|
|
115
|
+
async function getCSharpMigrationFilePath(projectDirectory, dbContextName, migrationName) {
|
|
116
|
+
const migrationsOutputDir = getMigrationsDirectory(projectDirectory, dbContextName);
|
|
117
|
+
if (!fs.existsSync(migrationsOutputDir)) {
|
|
118
|
+
throw new Error(`Unable to add migration C# boilerplate - could not find migrations output directory: ${migrationsOutputDir}`);
|
|
119
|
+
}
|
|
120
|
+
log(`Checking for generated C# file 📄XXXX_${migrationName}.cs in directory 📁${migrationsOutputDir}`);
|
|
121
|
+
const filenamePattern = `_${migrationName}.cs`;
|
|
122
|
+
const filenames = fs.readdirSync(migrationsOutputDir).filter(filename => filename.endsWith(filenamePattern));
|
|
123
|
+
if (!filenames || filenames.length === 0) {
|
|
124
|
+
throw new Error(`Auto-generated migration file not found - migrations output directory has no C# files ending with : ${filenamePattern}`);
|
|
125
|
+
}
|
|
126
|
+
if (filenames.length > 1) {
|
|
127
|
+
throw new Error(`Auto-generated migration file not found - migrations output directory has multiple C# files with the same migration name: ${filenames.join(', ')}`);
|
|
128
|
+
}
|
|
129
|
+
const filename = filenames[0];
|
|
130
|
+
const filePath = path.join(migrationsOutputDir, filename);
|
|
131
|
+
if (!fs.existsSync(filePath)) {
|
|
132
|
+
throw new Error(`Issue generating file path for migration (bad file path): ${filePath}`);
|
|
133
|
+
}
|
|
134
|
+
return filePath;
|
|
135
|
+
}
|
|
136
|
+
async function addDbMigrationBoilerplate(projectDirectory, dbContextName, migrationName) {
|
|
137
|
+
const filePath = await getCSharpMigrationFilePath(projectDirectory, dbContextName, migrationName);
|
|
138
|
+
log(`Replacing file contents with boilerplate for file 📄${filePath}`);
|
|
139
|
+
const newFileContents = cSharpMigrationFileTemplate
|
|
140
|
+
.replaceAll(contextNamePlaceholder, dbContextName)
|
|
141
|
+
.replaceAll(migrationNamePlaceholder, migrationName);
|
|
142
|
+
await fsp.writeFile(filePath, newFileContents, { encoding: 'utf8' });
|
|
143
|
+
log(`Updated file with boilerplate - please ensure it is correct: 📄${filePath}`);
|
|
144
|
+
const upScriptPath = path.join(projectDirectory, `Scripts/${migrationName}.sql`);
|
|
145
|
+
const downScriptPath = path.join(projectDirectory, `Scripts/${migrationName}_Down.sql`);
|
|
146
|
+
log('\nCreating corresponding empty sql files (no action will be taken if they already exist):');
|
|
147
|
+
log(` - 📄${upScriptPath}`);
|
|
148
|
+
log(` - 📄${downScriptPath}\n`);
|
|
149
|
+
await writeEmptySqlFileIfNotExists(upScriptPath, 'Up');
|
|
150
|
+
await writeEmptySqlFileIfNotExists(downScriptPath, 'Down');
|
|
151
|
+
}
|
|
152
|
+
async function writeEmptySqlFileIfNotExists(scriptPath, scriptType) {
|
|
153
|
+
if (!fs.existsSync(scriptPath)) {
|
|
154
|
+
await fsp.writeFile(scriptPath, '', { encoding: 'utf8' });
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
log(`Skipping ${scriptType} sql script (already exists)`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
const contextNamePlaceholder = '{{context_name}}';
|
|
161
|
+
const migrationNamePlaceholder = '{{migration_name}}';
|
|
162
|
+
const cSharpMigrationFileTemplate = `using Microsoft.EntityFrameworkCore.Migrations;
|
|
163
|
+
using MikeyT.DbMigrations;
|
|
164
|
+
|
|
165
|
+
#nullable disable
|
|
166
|
+
|
|
167
|
+
namespace DbMigrator.Migrations.${contextNamePlaceholder}Migrations
|
|
168
|
+
{
|
|
169
|
+
public partial class ${migrationNamePlaceholder} : Migration
|
|
170
|
+
{
|
|
171
|
+
protected override void Up(MigrationBuilder migrationBuilder)
|
|
172
|
+
{
|
|
173
|
+
MigrationScriptRunner.RunScript(migrationBuilder, "${migrationNamePlaceholder}.sql");
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
protected override void Down(MigrationBuilder migrationBuilder)
|
|
177
|
+
{
|
|
178
|
+
MigrationScriptRunner.RunScript(migrationBuilder, "${migrationNamePlaceholder}_Down.sql");
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
`;
|
|
184
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGJNaWdyYXRpb25VdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYk1pZ3JhdGlvblV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDNUcsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN4QixPQUFPLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQTtBQUVsQzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUFDLFdBQW1CLEVBQUUsYUFBcUIsRUFBRSxJQUFjLEVBQUUsT0FBTyxHQUFHLElBQUk7SUFDOUcsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQzVDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUE7SUFDN0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDcEosT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFBO0FBQ3BCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxXQUFtQixFQUFFLGFBQXFCO0lBQy9FLE1BQU0sZUFBZSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUUsQ0FBQTtBQUM1RSxDQUFDO0FBRUQ7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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":"AAMA;;;;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,iBAY7I;AAED;;GAEG;AACH,wBAAsB,2BAA2B,kBAShD;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,kBAG5C"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { log, requireString, requireValidPath, spawnAsync, trace, whichSync } from './generalUtils.js';
|
|
2
|
+
/**
|
|
3
|
+
* Runs dotnet build on the specified project.
|
|
4
|
+
* @param projectPath Path to project file (like .csproj) or directory of project to build
|
|
5
|
+
* @throws A {@link SpawnError} if the spawned process exits with a non-zero exit code
|
|
6
|
+
*/
|
|
7
|
+
export async function dotnetBuild(projectPath) {
|
|
8
|
+
requireValidPath('projectPath', projectPath);
|
|
9
|
+
await spawnAsync('dotnet', ['build', projectPath], { throwOnNonZero: true });
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Helper method to spawn a process and run 'dotnet publish'.
|
|
13
|
+
* @param projectPath Path to project file (like .csproj) or directory of project to build
|
|
14
|
+
* @param configuration Build configuration, such as 'Release'
|
|
15
|
+
* @param outputDir The relative or absolute path for the build output
|
|
16
|
+
* @param cwd Optionally run the command from another current working directory
|
|
17
|
+
*/
|
|
18
|
+
export async function dotnetPublish(projectPath = './', configuration = 'Release', outputDir = 'publish', cwd) {
|
|
19
|
+
requireValidPath('projectPath', projectPath);
|
|
20
|
+
requireString('outputDir', outputDir);
|
|
21
|
+
requireString('configuration', configuration);
|
|
22
|
+
if (cwd) {
|
|
23
|
+
requireValidPath('cwd', cwd);
|
|
24
|
+
}
|
|
25
|
+
const args = ['publish', projectPath, '-c', configuration, '-o', outputDir];
|
|
26
|
+
const traceMessage = `running dotnet ${args.join(' ')}`;
|
|
27
|
+
const traceAdditional = cwd ? ` in cwd ${cwd}` : '';
|
|
28
|
+
trace(`${traceMessage}${traceAdditional}`);
|
|
29
|
+
await spawnAsync('dotnet', args, { cwd: cwd });
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Spawns a process that runs the necessary commands to install or update the dotnet-ef tool globally on the system.
|
|
33
|
+
*/
|
|
34
|
+
export async function installOrUpdateDotnetEfTool() {
|
|
35
|
+
const installed = whichSync('dotnet-ef').location;
|
|
36
|
+
if (installed) {
|
|
37
|
+
log('dotnet-ef tool already installed, updating...');
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
log('dotnet-ef tool not installed, installing...');
|
|
41
|
+
}
|
|
42
|
+
const args = ['tool', installed ? 'update' : 'install', '--global', 'dotnet-ef'];
|
|
43
|
+
await spawnAsync('dotnet', args);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Spawns a process that runs the following commands to clean and re-install the dotnet dev certs:
|
|
47
|
+
* - dotnet dev-certs https --clean
|
|
48
|
+
* - dotnet dev-certs https -t
|
|
49
|
+
*/
|
|
50
|
+
export async function configureDotnetDevCerts() {
|
|
51
|
+
await spawnAsync('dotnet', ['dev-certs', 'https', '--clean']);
|
|
52
|
+
await spawnAsync('dotnet', ['dev-certs', 'https', '-t']);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90bmV0VXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZG90bmV0VXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQU10Rzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQUMsV0FBbUI7SUFDbkQsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQzVDLE1BQU0sVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQzlFLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FBQyxjQUFzQixJQUFJLEVBQUUsZ0JBQXdCLFNBQVMsRUFBRSxZQUFvQixTQUFTLEVBQUUsR0FBWTtJQUM1SSxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDNUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUNyQyxhQUFhLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQzdDLElBQUksR0FBRyxFQUFFO1FBQ1AsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0tBQzdCO0lBQ0QsTUFBTSxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQzNFLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUE7SUFDdkQsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDbkQsS0FBSyxDQUFDLEdBQUcsWUFBWSxHQUFHLGVBQWUsRUFBRSxDQUFDLENBQUE7SUFDMUMsTUFBTSxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO0FBQ2hELENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsMkJBQTJCO0lBQy9DLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUE7SUFDakQsSUFBSSxTQUFTLEVBQUU7UUFDYixHQUFHLENBQUMsK0NBQStDLENBQUMsQ0FBQTtLQUNyRDtTQUFNO1FBQ0wsR0FBRyxDQUFDLDZDQUE2QyxDQUFDLENBQUE7S0FDbkQ7SUFDRCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUNoRixNQUFNLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDbEMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHVCQUF1QjtJQUMzQyxNQUFNLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUE7SUFDN0QsTUFBTSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQzFELENBQUMifQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Only dynamically import this if ESM is detected. This allows a CJS-specific build to avoid
|
|
3
|
+
* an error it would otherwise encounter when parsing import.meta.url.
|
|
4
|
+
* @returns the file path of the currently executing script
|
|
5
|
+
*/
|
|
6
|
+
export declare const getImportMetaUrlFilePath: () => string;
|
|
7
|
+
//# sourceMappingURL=esmSpecific.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"esmSpecific.d.mts","sourceRoot":"","sources":["../../src/esmSpecific.mts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,cAGpC,CAAA"}
|