@mikeyt23/node-cli-utils 2.0.0-beta.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.
Files changed (51) hide show
  1. package/dist/cjs/GitUtility.d.ts +7 -0
  2. package/dist/cjs/GitUtility.d.ts.map +1 -0
  3. package/dist/cjs/GitUtility.js +49 -0
  4. package/dist/cjs/TarballUtility.d.ts +17 -7
  5. package/dist/cjs/TarballUtility.d.ts.map +1 -1
  6. package/dist/cjs/TarballUtility.js +18 -24
  7. package/dist/cjs/certUtils.d.ts +53 -17
  8. package/dist/cjs/certUtils.d.ts.map +1 -1
  9. package/dist/cjs/certUtils.js +175 -111
  10. package/dist/cjs/dbMigrationUtils.js +44 -54
  11. package/dist/cjs/dotnetUtils.d.ts.map +1 -1
  12. package/dist/cjs/dotnetUtils.js +4 -2
  13. package/dist/cjs/esmSpecific.d.mts +5 -0
  14. package/dist/cjs/esmSpecific.d.mts.map +1 -1
  15. package/dist/cjs/esmSpecific.mjs +6 -1
  16. package/dist/cjs/generalUtils.d.ts +268 -26
  17. package/dist/cjs/generalUtils.d.ts.map +1 -1
  18. package/dist/cjs/generalUtils.js +522 -106
  19. package/dist/cjs/generalUtilsInternal.d.ts +9 -3
  20. package/dist/cjs/generalUtilsInternal.d.ts.map +1 -1
  21. package/dist/cjs/generalUtilsInternal.js +159 -59
  22. package/dist/cjs/hostsUtils.d.ts +16 -0
  23. package/dist/cjs/hostsUtils.d.ts.map +1 -0
  24. package/dist/cjs/hostsUtils.js +82 -0
  25. package/dist/cjs/runWhileParentAlive.js +7 -9
  26. package/dist/esm/GitUtility.d.ts +7 -0
  27. package/dist/esm/GitUtility.d.ts.map +1 -0
  28. package/dist/esm/GitUtility.js +43 -0
  29. package/dist/esm/TarballUtility.d.ts +17 -7
  30. package/dist/esm/TarballUtility.d.ts.map +1 -1
  31. package/dist/esm/TarballUtility.js +21 -25
  32. package/dist/esm/certUtils.d.ts +53 -17
  33. package/dist/esm/certUtils.d.ts.map +1 -1
  34. package/dist/esm/certUtils.js +172 -86
  35. package/dist/esm/dbMigrationUtils.js +45 -55
  36. package/dist/esm/dotnetUtils.d.ts.map +1 -1
  37. package/dist/esm/dotnetUtils.js +4 -2
  38. package/dist/esm/esmSpecific.d.mts +5 -0
  39. package/dist/esm/esmSpecific.d.mts.map +1 -1
  40. package/dist/esm/esmSpecific.mjs +6 -1
  41. package/dist/esm/generalUtils.d.ts +268 -26
  42. package/dist/esm/generalUtils.d.ts.map +1 -1
  43. package/dist/esm/generalUtils.js +490 -105
  44. package/dist/esm/generalUtilsInternal.d.ts +9 -3
  45. package/dist/esm/generalUtilsInternal.d.ts.map +1 -1
  46. package/dist/esm/generalUtilsInternal.js +150 -57
  47. package/dist/esm/hostsUtils.d.ts +16 -0
  48. package/dist/esm/hostsUtils.d.ts.map +1 -0
  49. package/dist/esm/hostsUtils.js +69 -0
  50. package/dist/esm/runWhileParentAlive.js +8 -10
  51. package/package.json +4 -2
@@ -1,28 +1,33 @@
1
1
  import fs from 'node:fs';
2
2
  import fsp from 'node:fs/promises';
3
3
  import path from 'node:path';
4
- import * as nodeCliUtils from './generalUtils.js';
5
- import { log } from './generalUtils.js';
6
- const requiresAdminMessage = `➡️ Important: Requires admin permissions`;
7
- const powershellHackPrefix = `$env:PSModulePath = [Environment]::GetEnvironmentVariable('PSModulePath', 'Machine'); `;
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
+ };
8
11
  /**
9
12
  * Wrapper function for calling openssl to generate a self-signed cert to be used for developing a local website with trusted https.
10
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.
11
- * @param outputDirectory The directory to write the generated cert files to. Defaults to './cert'.
14
+ * @param options Options for generating the cert.
15
+ * @returns The path to the generated pfx file.
12
16
  */
13
- export async function generateCertWithOpenSsl(url, outputDirectory = './cert') {
14
- nodeCliUtils.requireString('url', url);
17
+ export async function generateCertWithOpenSsl(url, options) {
18
+ requireString('url', url);
15
19
  throwIfMaybeBadUrlChars(url);
16
- const isMac = nodeCliUtils.isPlatformMac();
17
- const spawnArgs = { cwd: outputDirectory };
18
- log('- checking if openssl is installed');
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');
19
24
  let brewOpenSslPath = '';
20
25
  if (!isMac) {
21
- const openSslPath = nodeCliUtils.whichSync('openssl').location;
26
+ const openSslPath = whichSync('openssl').location;
22
27
  if (!openSslPath) {
23
28
  throw Error('openssl is required but was not found');
24
29
  }
25
- log(`- using openssl at: ${openSslPath}`);
30
+ logIf(mergedOptions.logTraceMessages, `using openssl at: ${openSslPath}`);
26
31
  }
27
32
  else if (isMac) {
28
33
  const brewOpenSslDirectory = getBrewOpensslPath();
@@ -34,77 +39,148 @@ export async function generateCertWithOpenSsl(url, outputDirectory = './cert') {
34
39
  throw Error(`openssl (brew version) is required but was not found at: ${brewOpenSslPath}`);
35
40
  }
36
41
  else {
37
- log(`- using openssl at: ${brewOpenSslPath}`);
42
+ logIf(mergedOptions.logTraceMessages, `using openssl at: ${brewOpenSslPath}`);
38
43
  }
39
44
  }
40
- nodeCliUtils.ensureDirectory(outputDirectory);
41
- const keyName = url + '.key';
45
+ ensureDirectory(mergedOptions.outputDirectory);
42
46
  const crtName = url + '.crt';
47
+ const keyName = url + '.key';
43
48
  const pfxName = url + '.pfx';
44
- const pfxPath = path.join(outputDirectory, pfxName);
45
- if (fs.existsSync(pfxPath)) {
46
- throw Error(`File ${pfxPath} already exists. Delete or rename this file if you want to generate a new cert.`);
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
+ }
47
56
  }
48
- log('- writing san.cnf file for use with openssl command');
57
+ logIf(mergedOptions.logTraceMessages, `writing ${sanCnfName} file for use with openssl command`);
49
58
  const sanCnfContents = getSanCnfFileContents(url);
50
- const sanCnfPath = path.join(outputDirectory, 'san.cnf');
59
+ const sanCnfPath = path.join(mergedOptions.outputDirectory, sanCnfName);
51
60
  await fsp.writeFile(sanCnfPath, sanCnfContents);
52
- log(`- attempting to generate cert ${pfxName}`);
53
- const genKeyAndCrtArgs = `req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout ${keyName} -out ${crtName} -subj /CN=${url} -config san.cnf`.split(' ');
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(' ');
54
63
  const command = isMac ? brewOpenSslPath : 'openssl';
55
- let result = await nodeCliUtils.spawnAsync(command, genKeyAndCrtArgs, spawnArgs);
56
- if (result.code !== 0) {
57
- throw Error(`openssl command to generate key and crt files failed with exit code ${result.code}`);
58
- }
59
- log('- converting key and crt to pfx');
64
+ let result = await spawnAsync(command, genKeyAndCrtArgs, spawnArgs);
65
+ throwIfSpawnResultError(result);
66
+ logIf(mergedOptions.logTraceMessages, 'converting key and crt to pfx');
60
67
  const convertToPfxArgs = `pkcs12 -certpbe AES-256-CBC -export -out ${pfxName} -aes256 -inkey ${keyName} -in ${crtName} -password pass:`.split(' ');
61
- result = await nodeCliUtils.spawnAsync(command, convertToPfxArgs, spawnArgs);
62
- if (result.code !== 0) {
63
- throw Error(`openssl command to convert key and crt files to a pfx failed with exit code ${result.code}`);
64
- }
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;
65
73
  }
66
74
  /**
67
- * Uses Powershell to install a cert to the local machine's trusted root store. Must have admin permissions.
68
- *
69
- * If the cert is already installed, this method will do nothing.
70
- * @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.
71
- * @param certDirectory The directory to look for the cert file in. Defaults to './cert'.
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.
72
78
  */
73
- export async function winInstallCert(urlOrCertFilename, certDirectory = './cert') {
74
- nodeCliUtils.requireString('urlOrCertFilename', urlOrCertFilename);
75
- nodeCliUtils.requireValidPath('certDirectory', certDirectory);
76
- throwIfMaybeBadUrlChars(urlOrCertFilename, 'urlOrCertFilename');
77
- if (!nodeCliUtils.isPlatformWindows()) {
78
- throw Error('This method is only supported on Windows');
79
- }
80
- log(requiresAdminMessage);
81
- if (await winCertAlreadyInstalled(urlOrCertFilename)) {
82
- log(`certificate for ${urlOrCertFilename} is already installed - to install it again, first uninstall it manually or with the winUninstallCert method`);
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`);
83
89
  return;
84
90
  }
85
- const certName = urlOrCertFilename.endsWith('.pfx') ? urlOrCertFilename : urlOrCertFilename + '.pfx';
86
- const certPath = path.join(certDirectory, certName);
87
- if (!fs.existsSync(certPath)) {
88
- throw Error(`File ${certPath} does not exist. Generate this first if you want to install it.`);
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`);
89
117
  }
90
- const psCommand = `${powershellHackPrefix}Import-PfxCertificate -FilePath '${certPath}' -CertStoreLocation Cert:\\LocalMachine\\Root`;
91
- const result = await nodeCliUtils.spawnAsync('powershell', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-Command', psCommand]);
92
- if (result.code !== 0) {
93
- throw Error(`powershell command to install cert failed with exit code ${result.code}`);
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}`);
94
129
  }
130
+ return lines[0].trim() !== '0';
95
131
  }
96
132
  /**
97
- * Uses Powershell to uninstall a cert from the local machine's trusted root store. Must have admin permissions.
98
- * @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.
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.
99
136
  */
100
- export async function winUninstallCert(urlOrSubject) {
101
- nodeCliUtils.requireString('urlOrSubject', urlOrSubject);
102
- log(requiresAdminMessage);
103
- const psCommand = `${powershellHackPrefix}Get-ChildItem Cert:\\LocalMachine\\Root | Where-Object { $_.Subject -match '${urlOrSubject}' } | Remove-Item`;
104
- const result = await nodeCliUtils.spawnAsync('powershell', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-Command', psCommand]);
105
- if (result.code !== 0) {
106
- throw Error(`powershell command to uninstall cert failed with exit code ${result.code}`);
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');
107
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;
108
184
  }
109
185
  /**
110
186
  * Does not actually do anything - just outputs the manual instructions for installing a cert for use by chrome on linux.
@@ -114,32 +190,12 @@ export function linuxInstallCert() {
114
190
  Manual Instructions:
115
191
  - In Chrome, go to chrome://settings/certificates
116
192
  - Select Authorities -> import
117
- - Select your generated .crt file (in the ./cert/ directory by default - if you haven't generated it, see the generateCertWithOpenSsl method)
193
+ - Select your generated .crt file (in the ./cert/ directory by default - if you haven't generated it, see the generateCertWithOpenSsl function)
118
194
  - Check box for "Trust certificate for identifying websites"
119
195
  - Click OK
120
196
  - Reload site`;
121
197
  console.log(instructions);
122
198
  }
123
- /**
124
- * Uses Powershell to check if a cert is already installed to the local machine's trusted root store.
125
- * @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.
126
- * @returns `true` if the cert is already installed, `false` otherwise.
127
- */
128
- export async function winCertAlreadyInstalled(urlOrSubject) {
129
- const psCommand = `${powershellHackPrefix}Get-ChildItem Cert:\\LocalMachine\\Root | Where-Object { $_.Subject -match '${urlOrSubject}' }`;
130
- // The stdio option of 'pipe' is important here - if left to default of spawnAsync ('inherit'), stdout will be empty
131
- const result = await nodeCliUtils.spawnAsync('powershell', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-Command', psCommand], { stdio: ['inherit', 'pipe', 'pipe'] });
132
- if (result.code !== 0) {
133
- throw Error(`powershell command to find installed cert failed with exit code ${result.code}`);
134
- }
135
- const lines = nodeCliUtils.stringToNonEmptyLines(result.stdout);
136
- for (const line of lines) {
137
- if (line.includes(urlOrSubject)) {
138
- return true;
139
- }
140
- }
141
- return false;
142
- }
143
199
  function throwIfMaybeBadUrlChars(url, varName = 'url') {
144
200
  if (url.includes(' ')) {
145
201
  throw Error(`${varName} should not contain spaces`);
@@ -152,7 +208,7 @@ function throwIfMaybeBadUrlChars(url, varName = 'url') {
152
208
  }
153
209
  }
154
210
  function getBrewOpensslPath() {
155
- const brewResult = nodeCliUtils.simpleSpawnSync('brew', ['--prefix', 'openssl']);
211
+ const brewResult = simpleSpawnSync('brew', ['--prefix', 'openssl']);
156
212
  if (brewResult.error) {
157
213
  throw Error('error attempting to find openssl installed by brew');
158
214
  }
@@ -164,6 +220,36 @@ function getBrewOpensslPath() {
164
220
  function getSanCnfFileContents(url) {
165
221
  return sanCnfTemplate.replace(/{{url}}/g, url);
166
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
+ }
167
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
168
254
  // CLI option -addext, so we're using a san.cnf file instead and passing this into the CLI command with the -config option.
169
255
  const sanCnfTemplate = `[req]
@@ -182,4 +268,4 @@ DNS.1 = {{url}}
182
268
  IP.1 = 127.0.0.1
183
269
 
184
270
  `;
185
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydFV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NlcnRVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDeEIsT0FBTyxHQUFHLE1BQU0sa0JBQWtCLENBQUE7QUFDbEMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sS0FBSyxZQUFZLE1BQU0sbUJBQW1CLENBQUE7QUFDakQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRXZDLE1BQU0sb0JBQW9CLEdBQUcsMENBQTBDLENBQUE7QUFDdkUsTUFBTSxvQkFBb0IsR0FBRyx3RkFBd0YsQ0FBQTtBQUVySDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx1QkFBdUIsQ0FBQyxHQUFXLEVBQUUsa0JBQTBCLFFBQVE7SUFDM0YsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUE7SUFDdEMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDNUIsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQzFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxDQUFBO0lBRTFDLEdBQUcsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFBO0lBQ3pDLElBQUksZUFBZSxHQUFXLEVBQUUsQ0FBQTtJQUNoQyxJQUFJLENBQUMsS0FBSyxFQUFFO1FBQ1YsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUE7UUFDOUQsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixNQUFNLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFBO1NBQ3JEO1FBQ0QsR0FBRyxDQUFDLHVCQUF1QixXQUFXLEVBQUUsQ0FBQyxDQUFBO0tBQzFDO1NBQU0sSUFBSSxLQUFLLEVB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
271
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydFV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NlcnRVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDeEIsT0FBTyxHQUFHLE1BQU0sa0JBQWtCLENBQUE7QUFDbEMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFDTCxLQUFLLEVBR0wsZUFBZSxFQUNmLHFCQUFxQixFQUNyQixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLEtBQUssRUFDTCxHQUFHLEVBQ0gsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsVUFBVSxFQUNWLHFCQUFxQixFQUNyQixTQUFTLEVBQ1YsTUFBTSxtQkFBbUIsQ0FBQTtBQWUxQixNQUFNLHFCQUFxQixHQUFtQjtJQUM1QyxjQUFjLEVBQUUsS0FBSztJQUNyQixnQkFBZ0IsRUFBRSxLQUFLO0lBQ3ZCLDZCQUE2QixFQUFFLElBQUk7SUFDbkMsVUFBVSxFQUFFLElBQUk7Q0FDakIsQ0FBQTtBQVdEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx1QkFBdUIsQ0FBQyxHQUFXLEVBQUUsT0FBc0M7SUFDL0YsYUFBYSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQTtJQUN6Qix1QkFBdUIsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUM1QixNQUFNLEtBQUssR0FBRyxhQUFhLEVBQUUsQ0FBQTtJQUU3QixNQUFNLGFBQWEsR0FBd0IsRUFBRSxHQUFHLHFCQUFxQixFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQTtJQUU5RyxNQUFNLFNBQVMsR0FBbUMsRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUVs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
@@ -1,4 +1,4 @@
1
- import { getConfirmation, log, requireString, requireValidPath, spawnAsync } from './generalUtils.js';
1
+ import { Emoji, getConfirmation, log, requireString, requireValidPath, spawnAsync } from './generalUtils.js';
2
2
  import path from 'node:path';
3
3
  import fs from 'node:fs';
4
4
  import fsp from 'node:fs/promises';
@@ -81,7 +81,7 @@ async function deleteScriptFileIfEmpty(scriptPath) {
81
81
  await fsp.unlink(scriptPath);
82
82
  }
83
83
  else {
84
- log(`⚠️ Skipping deletion of non-empty script file: ${scriptPath}`);
84
+ log(`${Emoji.Warning} Skipping deletion of non-empty script file: ${scriptPath}`);
85
85
  }
86
86
  }
87
87
  }
@@ -99,7 +99,7 @@ async function getLastMigrationName(projectPath, dbContextName) {
99
99
  });
100
100
  log(`Found migrations: ${migrationNamesWithTimestamps.map(m => m.name).join(', ')}`);
101
101
  log(`Found timestamps: ${migrationNamesWithTimestamps.map(m => m.timestamp).join(', ')}`);
102
- const sortedMigrationNames = migrationNamesWithTimestamps.sort((a, b) => a.timestamp.localeCompare(b.timestamp));
102
+ const sortedMigrationNames = [...migrationNamesWithTimestamps].sort((a, b) => a.timestamp.localeCompare(b.timestamp));
103
103
  const lastMigrationName = sortedMigrationNames[sortedMigrationNames.length - 1].name;
104
104
  return lastMigrationName;
105
105
  }
@@ -112,7 +112,7 @@ function getMigrationsDirectory(projectDirectory, dbContextName) {
112
112
  function getScriptPath(projectDirectory, migrationName, isUp) {
113
113
  return path.join(projectDirectory, `Scripts/${migrationName}${isUp ? '' : '_Down'}.sql`);
114
114
  }
115
- async function addDbMigrationBoilerplate(projectDirectory, dbContextName, migrationName) {
115
+ async function getCSharpMigrationFilePath(projectDirectory, dbContextName, migrationName) {
116
116
  const migrationsOutputDir = getMigrationsDirectory(projectDirectory, dbContextName);
117
117
  if (!fs.existsSync(migrationsOutputDir)) {
118
118
  throw new Error(`Unable to add migration C# boilerplate - could not find migrations output directory: ${migrationsOutputDir}`);
@@ -129,66 +129,56 @@ async function addDbMigrationBoilerplate(projectDirectory, dbContextName, migrat
129
129
  const filename = filenames[0];
130
130
  const filePath = path.join(migrationsOutputDir, filename);
131
131
  if (!fs.existsSync(filePath)) {
132
- throw new Error(`Issue generating file path for migration (not found): ${filePath}`);
133
- }
134
- log(`Adding boilerplate to file 📄${filePath}`);
135
- const usingLine = 'using MikeyT.DbMigrations;';
136
- const upLine = `MigrationScriptRunner.RunScript(migrationBuilder, "${migrationName}.sql");`;
137
- const downLine = `MigrationScriptRunner.RunScript(migrationBuilder, "${migrationName}_Down.sql");`;
138
- const fileContents = await fsp.readFile(filePath, { encoding: 'utf8' });
139
- const lines = fileContents.replaceAll('\r', '').split('\n');
140
- const newLines = [];
141
- newLines.push(lines[0].trim());
142
- newLines.push(usingLine);
143
- let addUpLine = false;
144
- let addDownLine = false;
145
- let skipNextLineIfBlank = false;
146
- for (let i = 1; i < lines.length; i++) {
147
- if (skipNextLineIfBlank && lines[i].trim().length === 0) {
148
- skipNextLineIfBlank = false;
149
- continue;
150
- }
151
- if (addUpLine) {
152
- const newLine = lines[i].replace('{', `{\n\t\t\t${upLine}`);
153
- newLines.push(newLine);
154
- addUpLine = false;
155
- skipNextLineIfBlank = true;
156
- continue;
157
- }
158
- if (addDownLine) {
159
- const newLine = lines[i].replace('{', `{\n\t\t\t${downLine}`);
160
- newLines.push(newLine);
161
- addDownLine = false;
162
- skipNextLineIfBlank = true;
163
- continue;
164
- }
165
- newLines.push(lines[i]);
166
- if (lines[i].includes('void Up')) {
167
- addUpLine = true;
168
- }
169
- if (lines[i].includes('void Down')) {
170
- addDownLine = true;
171
- }
132
+ throw new Error(`Issue generating file path for migration (bad file path): ${filePath}`);
172
133
  }
173
- const newFileContents = newLines.join('\n');
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);
174
142
  await fsp.writeFile(filePath, newFileContents, { encoding: 'utf8' });
175
- log(`Updated file with boilerplate - please ensure it is correct: ${filePath}`);
143
+ log(`Updated file with boilerplate - please ensure it is correct: 📄${filePath}`);
176
144
  const upScriptPath = path.join(projectDirectory, `Scripts/${migrationName}.sql`);
177
145
  const downScriptPath = path.join(projectDirectory, `Scripts/${migrationName}_Down.sql`);
178
146
  log('\nCreating corresponding empty sql files (no action will be taken if they already exist):');
179
147
  log(` - 📄${upScriptPath}`);
180
148
  log(` - 📄${downScriptPath}\n`);
181
- if (!fs.existsSync(upScriptPath)) {
182
- await fsp.writeFile(upScriptPath, '', { encoding: 'utf8' });
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' });
183
155
  }
184
156
  else {
185
- log('Skipping Up sql script (already exists)');
157
+ log(`Skipping ${scriptType} sql script (already exists)`);
186
158
  }
187
- if (!fs.existsSync(downScriptPath)) {
188
- await fsp.writeFile(downScriptPath, '', { encoding: 'utf8' });
189
- }
190
- else {
191
- log('Skipping Down sql script (already exists)');
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
+ }
192
180
  }
193
181
  }
194
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGJNaWdyYXRpb25VdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYk1pZ3JhdGlvblV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNyRyxPQUFPLElBQUksTUFBTSxXQUFXLENBQUE7QUFDNUIsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3hCLE9BQU8sR0FBRyxNQUFNLGtCQUFrQixDQUFBO0FBRWxDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlLENBQUMsV0FBbUIsRUFBRSxhQUFxQixFQUFFLElBQWMsRUFBRSxPQUFPLEdBQUcsSUFBSTtJQUM5RyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDNUMsYUFBYSxDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUM3QyxNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNwSixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUE7QUFDcEIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUFDLFdBQW1CLEVBQUUsYUFBcUI7SUFDL0UsTUFBTSxlQUFlLENBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBRSxDQUFBO0FBQzVFLENBQUM7QUFFRDs7Ozs7R0FLRztB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
182
+
183
+ `;
184
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGJNaWdyYXRpb25VdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYk1pZ3JhdGlvblV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDNUcsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBQzVCLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUN4QixPQUFPLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQTtBQUVsQzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUFDLFdBQW1CLEVBQUUsYUFBcUIsRUFBRSxJQUFjLEVBQUUsT0FBTyxHQUFHLElBQUk7SUFDOUcsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQzVDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUE7SUFDN0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDcEosT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFBO0FBQ3BCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxXQUFtQixFQUFFLGFBQXFCO0lBQy9FLE1BQU0sZUFBZSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUUsQ0FBQTtBQUM1RSxDQUFDO0FBRUQ7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
@@ -1 +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"}
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"}
@@ -23,7 +23,9 @@ export async function dotnetPublish(projectPath = './', configuration = 'Release
23
23
  requireValidPath('cwd', cwd);
24
24
  }
25
25
  const args = ['publish', projectPath, '-c', configuration, '-o', outputDir];
26
- trace(`running dotnet ${args.join(' ')}${cwd ? ` in cwd ${cwd}` : ''}`);
26
+ const traceMessage = `running dotnet ${args.join(' ')}`;
27
+ const traceAdditional = cwd ? ` in cwd ${cwd}` : '';
28
+ trace(`${traceMessage}${traceAdditional}`);
27
29
  await spawnAsync('dotnet', args, { cwd: cwd });
28
30
  }
29
31
  /**
@@ -49,4 +51,4 @@ export async function configureDotnetDevCerts() {
49
51
  await spawnAsync('dotnet', ['dev-certs', 'https', '--clean']);
50
52
  await spawnAsync('dotnet', ['dev-certs', 'https', '-t']);
51
53
  }
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90bmV0VXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZG90bmV0VXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQWMsTUFBTSxtQkFBbUIsQ0FBQTtBQUVsSDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQUMsV0FBbUI7SUFDbkQsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQzVDLE1BQU0sVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQzlFLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FBQyxjQUFzQixJQUFJLEVBQUUsZ0JBQXdCLFNBQVMsRUFBRSxZQUFvQixTQUFTLEVBQUUsR0FBWTtJQUM1SSxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDNUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUNyQyxhQUFhLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQzdDLElBQUksR0FBRyxFQUFFO1FBQ1AsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0tBQzdCO0lBQ0QsTUFBTSxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQzNFLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDdkUsTUFBTSxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO0FBQ2hELENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsMkJBQTJCO0lBQy9DLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUE7SUFDakQsSUFBSSxTQUFTLEVBQUU7UUFDYixHQUFHLENBQUMsK0NBQStDLENBQUMsQ0FBQTtLQUNyRDtTQUFNO1FBQ0wsR0FBRyxDQUFDLDZDQUE2QyxDQUFDLENBQUE7S0FDbkQ7SUFDRCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUNoRixNQUFNLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDbEMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHVCQUF1QjtJQUMzQyxNQUFNLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUE7SUFDN0QsTUFBTSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQzFELENBQUMifQ==
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90bmV0VXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZG90bmV0VXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQU10Rzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQUMsV0FBbUI7SUFDbkQsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQzVDLE1BQU0sVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFBO0FBQzlFLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FBQyxjQUFzQixJQUFJLEVBQUUsZ0JBQXdCLFNBQVMsRUFBRSxZQUFvQixTQUFTLEVBQUUsR0FBWTtJQUM1SSxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDNUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUNyQyxhQUFhLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQzdDLElBQUksR0FBRyxFQUFFO1FBQ1AsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0tBQzdCO0lBQ0QsTUFBTSxJQUFJLEdBQUcsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQzNFLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUE7SUFDdkQsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDbkQsS0FBSyxDQUFDLEdBQUcsWUFBWSxHQUFHLGVBQWUsRUFBRSxDQUFDLENBQUE7SUFDMUMsTUFBTSxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO0FBQ2hELENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsMkJBQTJCO0lBQy9DLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLENBQUE7SUFDakQsSUFBSSxTQUFTLEVBQUU7UUFDYixHQUFHLENBQUMsK0NBQStDLENBQUMsQ0FBQTtLQUNyRDtTQUFNO1FBQ0wsR0FBRyxDQUFDLDZDQUE2QyxDQUFDLENBQUE7S0FDbkQ7SUFDRCxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUNoRixNQUFNLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUE7QUFDbEMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHVCQUF1QjtJQUMzQyxNQUFNLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUE7SUFDN0QsTUFBTSxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQzFELENBQUMifQ==
@@ -1,2 +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
+ */
1
6
  export declare const getImportMetaUrlFilePath: () => string;
2
7
  //# sourceMappingURL=esmSpecific.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"esmSpecific.d.mts","sourceRoot":"","sources":["../../src/esmSpecific.mts"],"names":[],"mappings":"AAEA,eAAO,MAAM,wBAAwB,cAGpC,CAAA"}
1
+ {"version":3,"file":"esmSpecific.d.mts","sourceRoot":"","sources":["../../src/esmSpecific.mts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,cAGpC,CAAA"}
@@ -1,6 +1,11 @@
1
1
  import { fileURLToPath } from 'node:url';
2
+ /**
3
+ * Only dynamically import this if ESM is detected. This allows a CJS-specific build to avoid
4
+ * an error it would otherwise encounter when parsing import.meta.url.
5
+ * @returns the file path of the currently executing script
6
+ */
2
7
  export const getImportMetaUrlFilePath = () => {
3
8
  // @ts-ignore
4
9
  return fileURLToPath(import.meta.url);
5
10
  };
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNtU3BlY2lmaWMubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VzbVNwZWNpZmljLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRXhDLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEdBQUcsRUFBRTtJQUMzQyxhQUFhO0lBQ2IsT0FBTyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUN2QyxDQUFDLENBQUEifQ==
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNtU3BlY2lmaWMubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VzbVNwZWNpZmljLm10cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRXhDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLEVBQUU7SUFDM0MsYUFBYTtJQUNiLE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7QUFDdkMsQ0FBQyxDQUFBIn0=