fork-version 1.4.56 → 1.4.63
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/CHANGELOG.md +51 -0
- package/dist/{chunk-YG7KT3IZ.js → chunk-2A2EKMWW.js} +123 -72
- package/dist/chunk-2A2EKMWW.js.map +1 -0
- package/dist/{chunk-Z6JICOU5.cjs → chunk-FVXB6C4M.cjs} +124 -72
- package/dist/chunk-FVXB6C4M.cjs.map +1 -0
- package/dist/cli.cjs +22 -13
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +14 -5
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +10 -10
- package/dist/index.d.cts +48 -23
- package/dist/index.d.ts +48 -23
- package/dist/index.js +1 -1
- package/package.json +3 -2
- package/dist/chunk-YG7KT3IZ.js.map +0 -1
- package/dist/chunk-Z6JICOU5.cjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,56 @@
|
|
|
1
1
|
# Fork Version
|
|
2
2
|
|
|
3
|
+
## 1.4.63 (2024-04-25)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
## 1.4.62 (2024-04-25)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Refactor
|
|
10
|
+
|
|
11
|
+
* output debug log to a json file instead of console logging ([ed562d8](https://github.com/eglavin/fork-version/commit/ed562d8b98a0545e70ab817a67d8ccbc917ce18b))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## 1.4.61 (2024-04-25)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Refactor
|
|
18
|
+
|
|
19
|
+
* ensure files arent ignored by git ([8a36886](https://github.com/eglavin/fork-version/commit/8a36886d23d28d9a5eca1104a939a3174c11deb3))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
## 1.4.60 (2024-04-25)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
### Refactor
|
|
26
|
+
|
|
27
|
+
* add glob support to find files ([f4e0701](https://github.com/eglavin/fork-version/commit/f4e0701301cb9169e1d4c834ef4167291ca7f347))
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
## 1.4.59 (2024-04-21)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
### Refactor
|
|
34
|
+
|
|
35
|
+
* changes to file writing signature + add completed in time debug log ([89df6df](https://github.com/eglavin/fork-version/commit/89df6df73a75f3a6d1e8469c4093f17b12d27f13))
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
## 1.4.58 (2024-04-21)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
### Refactor
|
|
42
|
+
|
|
43
|
+
* add descriptions to zod properties which will output to json schema ([1fc0302](https://github.com/eglavin/fork-version/commit/1fc03024ac5bb23c91976b5d5205d8f0f3ded7b2))
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
## 1.4.57 (2024-04-20)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
### Test
|
|
50
|
+
|
|
51
|
+
* combine test config + logger into createTestDir function ([c22def6](https://github.com/eglavin/fork-version/commit/c22def6ccb03929f56db40902fefad85d81d7f5d))
|
|
52
|
+
|
|
53
|
+
|
|
3
54
|
## 1.4.56 (2024-04-19)
|
|
4
55
|
|
|
5
56
|
|
|
@@ -3,6 +3,8 @@ import { readFileSync, writeFileSync, lstatSync } from 'fs';
|
|
|
3
3
|
import { resolve, parse } from 'path';
|
|
4
4
|
import JoyCon from 'joycon';
|
|
5
5
|
import { bundleRequire } from 'bundle-require';
|
|
6
|
+
import { glob } from 'glob';
|
|
7
|
+
import dotgitignore from 'dotgitignore';
|
|
6
8
|
import meow from 'meow';
|
|
7
9
|
import conventionalChangelogConfigSpec from 'conventional-changelog-config-spec';
|
|
8
10
|
import semver3 from 'semver';
|
|
@@ -14,50 +16,58 @@ import detectIndent from 'detect-indent';
|
|
|
14
16
|
import { detectNewline } from 'detect-newline';
|
|
15
17
|
|
|
16
18
|
// src/config/schema.ts
|
|
19
|
+
var ChangelogPresetConfigTypeSchema = z.object({
|
|
20
|
+
/**
|
|
21
|
+
* The type of commit message.
|
|
22
|
+
* @example "feat", "fix", "chore", etc..
|
|
23
|
+
*/
|
|
24
|
+
type: z.string().describe('The type of commit message, such as "feat", "fix", "chore".'),
|
|
25
|
+
/**
|
|
26
|
+
* The section of the `CHANGELOG` the commit should show up in.
|
|
27
|
+
*/
|
|
28
|
+
section: z.string().optional().describe("The section of the `CHANGELOG` the commit should show up in."),
|
|
29
|
+
/**
|
|
30
|
+
* Should show in the generated changelog message?
|
|
31
|
+
*/
|
|
32
|
+
hidden: z.boolean().optional().describe("Should show in the generated changelog message?")
|
|
33
|
+
});
|
|
17
34
|
var ChangelogPresetConfigSchema = z.object({
|
|
18
35
|
/**
|
|
19
|
-
*
|
|
20
|
-
* and whether they should show up in generated `CHANGELOG`s.
|
|
36
|
+
* List of explicitly supported commit message types.
|
|
21
37
|
*/
|
|
22
|
-
types: z.array(
|
|
23
|
-
z.object({
|
|
24
|
-
type: z.string(),
|
|
25
|
-
section: z.string().optional(),
|
|
26
|
-
hidden: z.boolean().optional()
|
|
27
|
-
})
|
|
28
|
-
),
|
|
38
|
+
types: z.array(ChangelogPresetConfigTypeSchema).describe("List of explicitly supported commit message types."),
|
|
29
39
|
/**
|
|
30
40
|
* A URL representing a specific commit at a hash.
|
|
31
41
|
* @default "{{host}}/{{owner}}/{{repository}}/commit/{{hash}}"
|
|
32
42
|
*/
|
|
33
|
-
commitUrlFormat: z.string(),
|
|
43
|
+
commitUrlFormat: z.string().describe("A URL representing a specific commit at a hash."),
|
|
34
44
|
/**
|
|
35
45
|
* A URL representing the comparison between two git SHAs.
|
|
36
46
|
* @default "{{host}}/{{owner}}/{{repository}}/compare/{{previousTag}}...{{currentTag}}"
|
|
37
47
|
*/
|
|
38
|
-
compareUrlFormat: z.string(),
|
|
48
|
+
compareUrlFormat: z.string().describe("A URL representing the comparison between two git SHAs."),
|
|
39
49
|
/**
|
|
40
50
|
* A URL representing the issue format (allowing a different URL format to be swapped in
|
|
41
51
|
* for Gitlab, Bitbucket, etc).
|
|
42
52
|
* @default "{{host}}/{{owner}}/{{repository}}/issues/{{id}}"
|
|
43
53
|
*/
|
|
44
|
-
issueUrlFormat: z.string(),
|
|
54
|
+
issueUrlFormat: z.string().describe("A URL representing the issue format."),
|
|
45
55
|
/**
|
|
46
|
-
* A URL representing
|
|
47
|
-
* for substituting @
|
|
56
|
+
* A URL representing a user's profile on GitHub, Gitlab, etc. This URL is used
|
|
57
|
+
* for substituting @eglavin with https://github.com/eglavin in commit messages.
|
|
48
58
|
* @default "{{host}}/{{user}}"
|
|
49
59
|
*/
|
|
50
|
-
userUrlFormat: z.string(),
|
|
60
|
+
userUrlFormat: z.string().describe("A URL representing a user's profile on GitHub, Gitlab, etc."),
|
|
51
61
|
/**
|
|
52
62
|
* A string to be used to format the auto-generated release commit message.
|
|
53
63
|
* @default "chore(release): {{currentTag}}"
|
|
54
64
|
*/
|
|
55
|
-
releaseCommitMessageFormat: z.string(),
|
|
65
|
+
releaseCommitMessageFormat: z.string().describe("A string to be used to format the auto-generated release commit message."),
|
|
56
66
|
/**
|
|
57
|
-
*
|
|
67
|
+
* List of prefixes used to detect references to issues.
|
|
58
68
|
* @default ["#"]
|
|
59
69
|
*/
|
|
60
|
-
issuePrefixes: z.array(z.string())
|
|
70
|
+
issuePrefixes: z.array(z.string()).describe("List of prefixes used to detect references to issues.")
|
|
61
71
|
});
|
|
62
72
|
var ForkConfigSchema = z.object({
|
|
63
73
|
/**
|
|
@@ -67,12 +77,12 @@ var ForkConfigSchema = z.object({
|
|
|
67
77
|
* process.cwd()
|
|
68
78
|
* ```
|
|
69
79
|
*/
|
|
70
|
-
path: z.string(),
|
|
80
|
+
path: z.string().describe('The path fork-version will run from. Defaults to "process.cwd()".'),
|
|
71
81
|
/**
|
|
72
82
|
* Name of the changelog file.
|
|
73
83
|
* @default "CHANGELOG.md"
|
|
74
84
|
*/
|
|
75
|
-
changelog: z.string(),
|
|
85
|
+
changelog: z.string().describe('Name of the changelog file. Defaults to "CHANGELOG.md".'),
|
|
76
86
|
/**
|
|
77
87
|
* The header to be used in the changelog.
|
|
78
88
|
* @default
|
|
@@ -82,17 +92,28 @@ var ForkConfigSchema = z.object({
|
|
|
82
92
|
* All notable changes to this project will be documented in this file. See [fork-version](https://github.com/eglavin/fork-version) for commit guidelines.
|
|
83
93
|
* ```
|
|
84
94
|
*/
|
|
85
|
-
header: z.string(),
|
|
95
|
+
header: z.string().describe("The header to be used in the changelog."),
|
|
86
96
|
/**
|
|
87
|
-
*
|
|
97
|
+
* List of the files to be updated.
|
|
88
98
|
* @default
|
|
89
99
|
* ```js
|
|
90
100
|
* ["bower.json", "manifest.json", "npm-shrinkwrap.json", "package-lock.json", "package.json"]
|
|
91
101
|
* ```
|
|
92
102
|
*/
|
|
93
|
-
files: z.array(z.string()),
|
|
103
|
+
files: z.array(z.string()).describe("List of the files to be updated."),
|
|
104
|
+
/**
|
|
105
|
+
* Glob pattern to match files to be updated.
|
|
106
|
+
*
|
|
107
|
+
* Internally we're using [glob](https://github.com/isaacs/node-glob) to match files.
|
|
108
|
+
*
|
|
109
|
+
* Read more about the pattern syntax [here](https://github.com/isaacs/node-glob/tree/v10.3.12?tab=readme-ov-file#glob-primer).
|
|
110
|
+
*
|
|
111
|
+
* @default undefined
|
|
112
|
+
* @example "*.json"
|
|
113
|
+
*/
|
|
114
|
+
glob: z.string().optional().describe("Glob pattern to match files to be updated."),
|
|
94
115
|
/**
|
|
95
|
-
* Specify a prefix for the
|
|
116
|
+
* Specify a prefix for the tag fork-version will create.
|
|
96
117
|
*
|
|
97
118
|
* For instance if your version tag is prefixed by "version/" instead of "v" you have to specify
|
|
98
119
|
* `tagPrefix: "version/"`.
|
|
@@ -101,7 +122,7 @@ var ForkConfigSchema = z.object({
|
|
|
101
122
|
* multiple package from the same repository. In this case you can specify a prefix for
|
|
102
123
|
* each package:
|
|
103
124
|
*
|
|
104
|
-
* | Value
|
|
125
|
+
* | Example Value | Tag Created |
|
|
105
126
|
* |:-------------------------|:------------------------------|
|
|
106
127
|
* | "" | `1.2.3` |
|
|
107
128
|
* | "version/" | `version/1.2.3` |
|
|
@@ -110,80 +131,83 @@ var ForkConfigSchema = z.object({
|
|
|
110
131
|
* @example "", "version/", "@eglavin/fork-version-"
|
|
111
132
|
* @default "v"
|
|
112
133
|
*/
|
|
113
|
-
tagPrefix: z.string(),
|
|
134
|
+
tagPrefix: z.string().describe('Specify a prefix for the tag fork-version will create. Defaults to "v".'),
|
|
114
135
|
/**
|
|
115
|
-
* Make a pre-release with optional label, if value is a string it will be used as the
|
|
136
|
+
* Make a pre-release with an optional label, if value is a string it will be used as the
|
|
116
137
|
* pre-release tag.
|
|
117
138
|
*
|
|
118
|
-
* | Value
|
|
119
|
-
*
|
|
120
|
-
* | true
|
|
121
|
-
* | "alpha"
|
|
122
|
-
* | "beta"
|
|
139
|
+
* | Example Value | Produced Version |
|
|
140
|
+
* |:--------------|:-----------------|
|
|
141
|
+
* | true | `1.2.3-0` |
|
|
142
|
+
* | "alpha" | `1.2.3-alpha-0` |
|
|
143
|
+
* | "beta" | `1.2.3-beta-0` |
|
|
123
144
|
*
|
|
124
145
|
* @example true, "alpha", "beta", "rc"
|
|
125
146
|
* @default undefined
|
|
126
147
|
*/
|
|
127
|
-
preReleaseTag: z.string().or(z.boolean()).optional(),
|
|
148
|
+
preReleaseTag: z.string().or(z.boolean()).optional().describe("Make a pre-release with an optional label."),
|
|
128
149
|
/**
|
|
129
|
-
*
|
|
150
|
+
* If true, we'll commit all changes, not just files updated by fork-version.
|
|
130
151
|
* @default false
|
|
131
152
|
*/
|
|
132
|
-
commitAll: z.boolean(),
|
|
153
|
+
commitAll: z.boolean().describe("If true, we'll commit all changes, not just files updated by fork-version."),
|
|
133
154
|
/**
|
|
134
|
-
* If
|
|
155
|
+
* If true, we'll log debug information.
|
|
135
156
|
* @default false
|
|
136
157
|
*/
|
|
137
|
-
debug: z.boolean(),
|
|
158
|
+
debug: z.boolean().describe("If true, we'll log debug information."),
|
|
138
159
|
/**
|
|
139
160
|
* If true, no output will be written to disk or committed.
|
|
140
161
|
* @default false
|
|
141
162
|
*/
|
|
142
|
-
dryRun: z.boolean(),
|
|
163
|
+
dryRun: z.boolean().describe("If true, no output will be written to disk or committed."),
|
|
143
164
|
/**
|
|
144
165
|
* If true and we cant find a version in the list of `files`, we'll fallback
|
|
145
166
|
* and attempt to use the latest git tag to get the current version.
|
|
146
167
|
* @default true
|
|
147
168
|
*/
|
|
148
|
-
gitTagFallback: z.boolean()
|
|
169
|
+
gitTagFallback: z.boolean().describe(
|
|
170
|
+
"Fallback and attempt to use the latest git tag as the current version. Defaults to true."
|
|
171
|
+
),
|
|
149
172
|
/**
|
|
150
|
-
* If
|
|
173
|
+
* If true, we'll log the current version and exit.
|
|
151
174
|
* @default false
|
|
152
175
|
*/
|
|
153
|
-
inspectVersion: z.boolean(),
|
|
176
|
+
inspectVersion: z.boolean().describe("If true, we'll log the current version and exit."),
|
|
154
177
|
/**
|
|
155
|
-
*
|
|
156
|
-
* @see {@link https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--Sltkeyidgt GPG Sign Commits}
|
|
178
|
+
* If true, we'll sign the git commit using GPG.
|
|
179
|
+
* @see {@link https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--Sltkeyidgt Git - GPG Sign Commits}
|
|
157
180
|
* @default false
|
|
158
181
|
*/
|
|
159
|
-
sign: z.boolean(),
|
|
182
|
+
sign: z.boolean().describe("If true, we'll sign the git commit using GPG."),
|
|
160
183
|
/**
|
|
161
184
|
* If true, no output will be written to stdout.
|
|
162
185
|
* @default false
|
|
163
186
|
*/
|
|
164
|
-
silent: z.boolean(),
|
|
187
|
+
silent: z.boolean().describe("If true, no output will be written to stdout."),
|
|
165
188
|
/**
|
|
166
|
-
* If true,
|
|
189
|
+
* If true, run git commit hooks.
|
|
167
190
|
* @default false
|
|
168
191
|
*/
|
|
169
|
-
verify: z.boolean(),
|
|
192
|
+
verify: z.boolean().describe("If true, run git commit hooks."),
|
|
170
193
|
/**
|
|
171
|
-
* If set, we'll use this
|
|
194
|
+
* If set, we'll use this as the current version.
|
|
172
195
|
* @example "1.0.0"
|
|
173
196
|
* @default undefined
|
|
174
197
|
*/
|
|
175
|
-
currentVersion: z.string().optional(),
|
|
198
|
+
currentVersion: z.string().optional().describe("If set, we'll use this as the current version"),
|
|
176
199
|
/**
|
|
177
|
-
* If set, we'll
|
|
178
|
-
* using "conventional-commit".
|
|
200
|
+
* If set, we'll use this as the next version.
|
|
179
201
|
* @example "2.0.0"
|
|
180
202
|
* @default undefined
|
|
181
203
|
*/
|
|
182
|
-
nextVersion: z.string().optional(),
|
|
204
|
+
nextVersion: z.string().optional().describe("If set, we'll use this as the next version."),
|
|
183
205
|
/**
|
|
184
|
-
* Override the default conventional-changelog preset configuration.
|
|
206
|
+
* Override the default "conventional-changelog-conventionalcommits" preset configuration.
|
|
185
207
|
*/
|
|
186
|
-
changelogPresetConfig: ChangelogPresetConfigSchema.partial()
|
|
208
|
+
changelogPresetConfig: ChangelogPresetConfigSchema.partial().describe(
|
|
209
|
+
'Override the default "conventional-changelog-conventionalcommits" preset configuration.'
|
|
210
|
+
)
|
|
187
211
|
});
|
|
188
212
|
function defineConfig(config) {
|
|
189
213
|
return config;
|
|
@@ -231,6 +255,8 @@ Options:
|
|
|
231
255
|
The header to be used in the changelog.
|
|
232
256
|
--files, --file, -F [Default: ["bower.json", "manifest.json", "npm-shrinkwrap.json", "package-lock.json", "package.json"]]
|
|
233
257
|
Files to be updated.
|
|
258
|
+
--glob, -G
|
|
259
|
+
Glob pattern to match files to be updated.
|
|
234
260
|
--tag-prefix [Default: "v"]
|
|
235
261
|
Specify a prefix for the git tag "fork-version" will create.
|
|
236
262
|
--pre-release-tag [Default: undefined]
|
|
@@ -270,6 +296,7 @@ Options:
|
|
|
270
296
|
changelog: { type: "string" },
|
|
271
297
|
header: { type: "string", shortFlag: "H" },
|
|
272
298
|
files: { type: "string", isMultiple: true, aliases: ["file"], shortFlag: "F" },
|
|
299
|
+
glob: { type: "string", shortFlag: "G" },
|
|
273
300
|
tagPrefix: { type: "string" },
|
|
274
301
|
preReleaseTag: { type: "string" },
|
|
275
302
|
commitAll: { type: "boolean" },
|
|
@@ -329,10 +356,21 @@ async function getUserConfig() {
|
|
|
329
356
|
...configFile,
|
|
330
357
|
...cliArguments.flags
|
|
331
358
|
};
|
|
359
|
+
let globResults = [];
|
|
360
|
+
if (mergedConfig.glob) {
|
|
361
|
+
globResults = await glob(mergedConfig.glob, {
|
|
362
|
+
cwd,
|
|
363
|
+
ignore: ["node_modules/**"],
|
|
364
|
+
nodir: true
|
|
365
|
+
});
|
|
366
|
+
}
|
|
332
367
|
return {
|
|
333
368
|
...mergedConfig,
|
|
334
369
|
path: cwd,
|
|
335
|
-
files:
|
|
370
|
+
files: filterGitIgnoredFiles(
|
|
371
|
+
cwd,
|
|
372
|
+
getFilesList(configFile?.files, cliArguments.flags?.files, globResults)
|
|
373
|
+
),
|
|
336
374
|
changelogPresetConfig: getChangelogPresetConfig(mergedConfig?.changelogPresetConfig)
|
|
337
375
|
};
|
|
338
376
|
}
|
|
@@ -355,7 +393,7 @@ async function loadConfigFile(configFilePath) {
|
|
|
355
393
|
}
|
|
356
394
|
return parsed.data;
|
|
357
395
|
}
|
|
358
|
-
function getFilesList(configFiles, cliFiles) {
|
|
396
|
+
function getFilesList(configFiles, cliFiles, globResults) {
|
|
359
397
|
const listOfFiles = /* @__PURE__ */ new Set();
|
|
360
398
|
if (Array.isArray(configFiles)) {
|
|
361
399
|
configFiles.forEach((file) => listOfFiles.add(file));
|
|
@@ -363,11 +401,16 @@ function getFilesList(configFiles, cliFiles) {
|
|
|
363
401
|
if (Array.isArray(cliFiles)) {
|
|
364
402
|
cliFiles.forEach((file) => listOfFiles.add(file));
|
|
365
403
|
}
|
|
404
|
+
globResults.forEach((file) => listOfFiles.add(file));
|
|
366
405
|
if (listOfFiles.size) {
|
|
367
406
|
return Array.from(listOfFiles);
|
|
368
407
|
}
|
|
369
408
|
return DEFAULT_CONFIG.files;
|
|
370
409
|
}
|
|
410
|
+
function filterGitIgnoredFiles(cwd, files) {
|
|
411
|
+
const dotgit = dotgitignore({ cwd });
|
|
412
|
+
return files.filter((file) => !dotgit.ignore(file));
|
|
413
|
+
}
|
|
371
414
|
async function getLatestGitTagVersion(tagPrefix) {
|
|
372
415
|
const gitTags = await gitSemverTags({ tagPrefix });
|
|
373
416
|
if (!gitTags.length) {
|
|
@@ -430,6 +473,7 @@ async function getCurrentVersion(config, logger, fileManager) {
|
|
|
430
473
|
if (versions.size === 0 && config.gitTagFallback) {
|
|
431
474
|
const version = await getLatestGitTagVersion(config.tagPrefix);
|
|
432
475
|
if (version) {
|
|
476
|
+
logger.log(`[Version] Using git tag fallback.`);
|
|
433
477
|
versions.add(version);
|
|
434
478
|
}
|
|
435
479
|
}
|
|
@@ -723,15 +767,15 @@ var JSONPackage = class {
|
|
|
723
767
|
this.logger.warn(`[File Manager] Unable to determine json package: ${fileName}`);
|
|
724
768
|
}
|
|
725
769
|
}
|
|
726
|
-
write(
|
|
727
|
-
const fileContents = readFileSync(
|
|
770
|
+
write(fileState, newVersion) {
|
|
771
|
+
const fileContents = readFileSync(fileState.path, "utf8");
|
|
728
772
|
const parsedJson = JSON.parse(fileContents);
|
|
729
773
|
parsedJson.version = newVersion;
|
|
730
774
|
if (parsedJson.packages?.[""]) {
|
|
731
775
|
parsedJson.packages[""].version = newVersion;
|
|
732
776
|
}
|
|
733
777
|
writeFileSync(
|
|
734
|
-
|
|
778
|
+
fileState.path,
|
|
735
779
|
stringifyPackage(parsedJson, detectIndent(fileContents).amount, detectNewline(fileContents)),
|
|
736
780
|
"utf8"
|
|
737
781
|
);
|
|
@@ -754,8 +798,8 @@ var PlainText = class {
|
|
|
754
798
|
}
|
|
755
799
|
this.logger.warn(`[File Manager] Unable to determine plain text: ${fileName}`);
|
|
756
800
|
}
|
|
757
|
-
write(
|
|
758
|
-
writeFileSync(
|
|
801
|
+
write(fileState, newVersion) {
|
|
802
|
+
writeFileSync(fileState.path, newVersion, "utf8");
|
|
759
803
|
}
|
|
760
804
|
};
|
|
761
805
|
|
|
@@ -783,34 +827,41 @@ var FileManager = class {
|
|
|
783
827
|
* ```
|
|
784
828
|
*/
|
|
785
829
|
read(fileName) {
|
|
786
|
-
|
|
830
|
+
const _fileName = fileName.toLowerCase();
|
|
831
|
+
if (_fileName.endsWith(".json")) {
|
|
787
832
|
return this.JSONPackage.read(fileName);
|
|
788
|
-
}
|
|
833
|
+
}
|
|
834
|
+
if (_fileName.endsWith("version.txt")) {
|
|
789
835
|
return this.PlainText.read(fileName);
|
|
790
836
|
}
|
|
791
837
|
this.logger.error(`[File Manager] Unsupported file: ${fileName}`);
|
|
792
838
|
}
|
|
793
839
|
/**
|
|
794
|
-
* Write the new version to the given file
|
|
840
|
+
* Write the new version to the given file.
|
|
795
841
|
*
|
|
796
842
|
* @example
|
|
797
843
|
* ```ts
|
|
798
|
-
* fileManager.write(
|
|
844
|
+
* fileManager.write(
|
|
845
|
+
* { name: "package.json", path: "/path/to/package.json", version: "1.2.2" },
|
|
846
|
+
* "1.2.3"
|
|
847
|
+
* );
|
|
799
848
|
* ```
|
|
800
849
|
*/
|
|
801
|
-
write(
|
|
850
|
+
write(fileState, newVersion) {
|
|
802
851
|
if (this.config.dryRun) {
|
|
803
852
|
return;
|
|
804
853
|
}
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
854
|
+
const _fileName = fileState.name.toLowerCase();
|
|
855
|
+
if (_fileName.endsWith(".json")) {
|
|
856
|
+
return this.JSONPackage.write(fileState, newVersion);
|
|
857
|
+
}
|
|
858
|
+
if (_fileName.endsWith("version.txt")) {
|
|
859
|
+
return this.PlainText.write(fileState, newVersion);
|
|
809
860
|
}
|
|
810
|
-
this.logger.error(`[File Manager] Unsupported file: ${
|
|
861
|
+
this.logger.error(`[File Manager] Unsupported file: ${fileState.path}`);
|
|
811
862
|
}
|
|
812
863
|
};
|
|
813
864
|
|
|
814
865
|
export { FileManager, ForkConfigSchema, Git, commitChanges, defineConfig, getCurrentVersion, getNextVersion, getUserConfig, tagChanges, updateChangelog };
|
|
815
866
|
//# sourceMappingURL=out.js.map
|
|
816
|
-
//# sourceMappingURL=chunk-
|
|
867
|
+
//# sourceMappingURL=chunk-2A2EKMWW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/schema.ts","../src/config/user-config.ts","../src/config/defaults.ts","../src/config/cli-arguments.ts","../src/config/changelog-preset-config.ts","../src/process/version.ts","../src/utils/git-tag-version.ts","../src/utils/release-type.ts","../src/process/changelog.ts","../src/utils/file-state.ts","../src/process/commit.ts","../src/utils/git.ts","../src/utils/format-commit-message.ts","../src/process/tag.ts","../src/strategies/json-package.ts","../src/libs/stringify-package.ts","../src/strategies/plain-text.ts","../src/strategies/file-manager.ts"],"names":["fileContent","parsed","semver","resolve","readFileSync","writeFileSync"],"mappings":"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","sourcesContent":["import { z } from \"zod\";\n\nconst ChangelogPresetConfigTypeSchema = z.object({\n\t/**\n\t * The type of commit message.\n\t * @example \"feat\", \"fix\", \"chore\", etc..\n\t */\n\ttype: z.string().describe('The type of commit message, such as \"feat\", \"fix\", \"chore\".'),\n\t/**\n\t * The section of the `CHANGELOG` the commit should show up in.\n\t */\n\tsection: z\n\t\t.string()\n\t\t.optional()\n\t\t.describe(\"The section of the `CHANGELOG` the commit should show up in.\"),\n\t/**\n\t * Should show in the generated changelog message?\n\t */\n\thidden: z.boolean().optional().describe(\"Should show in the generated changelog message?\"),\n});\n\nexport const ChangelogPresetConfigSchema = z.object({\n\t/**\n\t * List of explicitly supported commit message types.\n\t */\n\ttypes: z\n\t\t.array(ChangelogPresetConfigTypeSchema)\n\t\t.describe(\"List of explicitly supported commit message types.\"),\n\t/**\n\t * A URL representing a specific commit at a hash.\n\t * @default \"{{host}}/{{owner}}/{{repository}}/commit/{{hash}}\"\n\t */\n\tcommitUrlFormat: z.string().describe(\"A URL representing a specific commit at a hash.\"),\n\t/**\n\t * A URL representing the comparison between two git SHAs.\n\t * @default \"{{host}}/{{owner}}/{{repository}}/compare/{{previousTag}}...{{currentTag}}\"\n\t */\n\tcompareUrlFormat: z.string().describe(\"A URL representing the comparison between two git SHAs.\"),\n\t/**\n\t * A URL representing the issue format (allowing a different URL format to be swapped in\n\t * for Gitlab, Bitbucket, etc).\n\t * @default \"{{host}}/{{owner}}/{{repository}}/issues/{{id}}\"\n\t */\n\tissueUrlFormat: z.string().describe(\"A URL representing the issue format.\"),\n\t/**\n\t * A URL representing a user's profile on GitHub, Gitlab, etc. This URL is used\n\t * for substituting @eglavin with https://github.com/eglavin in commit messages.\n\t * @default \"{{host}}/{{user}}\"\n\t */\n\tuserUrlFormat: z.string().describe(\"A URL representing a user's profile on GitHub, Gitlab, etc.\"),\n\t/**\n\t * A string to be used to format the auto-generated release commit message.\n\t * @default \"chore(release): {{currentTag}}\"\n\t */\n\treleaseCommitMessageFormat: z\n\t\t.string()\n\t\t.describe(\"A string to be used to format the auto-generated release commit message.\"),\n\t/**\n\t * List of prefixes used to detect references to issues.\n\t * @default [\"#\"]\n\t */\n\tissuePrefixes: z\n\t\t.array(z.string())\n\t\t.describe(\"List of prefixes used to detect references to issues.\"),\n});\n\nexport type ChangelogPresetConfig = z.infer<typeof ChangelogPresetConfigSchema>;\n\nexport const ForkConfigSchema = z.object({\n\t/**\n\t * The path fork-version will run from.\n\t * @default\n\t * ```js\n\t * process.cwd()\n\t * ```\n\t */\n\tpath: z.string().describe('The path fork-version will run from. Defaults to \"process.cwd()\".'),\n\t/**\n\t * Name of the changelog file.\n\t * @default \"CHANGELOG.md\"\n\t */\n\tchangelog: z.string().describe('Name of the changelog file. Defaults to \"CHANGELOG.md\".'),\n\t/**\n\t * The header to be used in the changelog.\n\t * @default\n\t * ```markdown\n\t * # Changelog\n\t *\n\t * All notable changes to this project will be documented in this file. See [fork-version](https://github.com/eglavin/fork-version) for commit guidelines.\n\t * ```\n\t */\n\theader: z.string().describe(\"The header to be used in the changelog.\"),\n\t/**\n\t * List of the files to be updated.\n\t * @default\n\t * ```js\n\t * [\"bower.json\", \"manifest.json\", \"npm-shrinkwrap.json\", \"package-lock.json\", \"package.json\"]\n\t * ```\n\t */\n\tfiles: z.array(z.string()).describe(\"List of the files to be updated.\"),\n\t/**\n\t * Glob pattern to match files to be updated.\n\t *\n\t * Internally we're using [glob](https://github.com/isaacs/node-glob) to match files.\n\t *\n\t * Read more about the pattern syntax [here](https://github.com/isaacs/node-glob/tree/v10.3.12?tab=readme-ov-file#glob-primer).\n\t *\n\t * @default undefined\n\t * @example \"*.json\"\n\t */\n\tglob: z.string().optional().describe(\"Glob pattern to match files to be updated.\"),\n\t/**\n\t * Specify a prefix for the tag fork-version will create.\n\t *\n\t * For instance if your version tag is prefixed by \"version/\" instead of \"v\" you have to specify\n\t * `tagPrefix: \"version/\"`.\n\t *\n\t * `tagPrefix` can also be used for a monorepo environment where you might want to deploy\n\t * multiple package from the same repository. In this case you can specify a prefix for\n\t * each package:\n\t *\n\t * | Example Value | Tag Created |\n\t * |:-------------------------|:------------------------------|\n\t * | \"\" | `1.2.3` |\n\t * | \"version/\" | `version/1.2.3` |\n\t * | \"@eglavin/fork-version-\" | `@eglavin/fork-version-1.2.3` |\n\t *\n\t * @example \"\", \"version/\", \"@eglavin/fork-version-\"\n\t * @default \"v\"\n\t */\n\ttagPrefix: z\n\t\t.string()\n\t\t.describe('Specify a prefix for the tag fork-version will create. Defaults to \"v\".'),\n\t/**\n\t * Make a pre-release with an optional label, if value is a string it will be used as the\n\t * pre-release tag.\n\t *\n\t * | Example Value | Produced Version |\n\t * |:--------------|:-----------------|\n\t * | true | `1.2.3-0` |\n\t * | \"alpha\" | `1.2.3-alpha-0` |\n\t * | \"beta\" | `1.2.3-beta-0` |\n\t *\n\t * @example true, \"alpha\", \"beta\", \"rc\"\n\t * @default undefined\n\t */\n\tpreReleaseTag: z\n\t\t.string()\n\t\t.or(z.boolean())\n\t\t.optional()\n\t\t.describe(\"Make a pre-release with an optional label.\"),\n\n\t/**\n\t * If true, we'll commit all changes, not just files updated by fork-version.\n\t * @default false\n\t */\n\tcommitAll: z\n\t\t.boolean()\n\t\t.describe(\"If true, we'll commit all changes, not just files updated by fork-version.\"),\n\t/**\n\t * If true, we'll log debug information.\n\t * @default false\n\t */\n\tdebug: z.boolean().describe(\"If true, we'll log debug information.\"),\n\t/**\n\t * If true, no output will be written to disk or committed.\n\t * @default false\n\t */\n\tdryRun: z.boolean().describe(\"If true, no output will be written to disk or committed.\"),\n\t/**\n\t * If true and we cant find a version in the list of `files`, we'll fallback\n\t * and attempt to use the latest git tag to get the current version.\n\t * @default true\n\t */\n\tgitTagFallback: z\n\t\t.boolean()\n\t\t.describe(\n\t\t\t\"Fallback and attempt to use the latest git tag as the current version. Defaults to true.\",\n\t\t),\n\t/**\n\t * If true, we'll log the current version and exit.\n\t * @default false\n\t */\n\tinspectVersion: z.boolean().describe(\"If true, we'll log the current version and exit.\"),\n\t/**\n\t * If true, we'll sign the git commit using GPG.\n\t * @see {@link https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--Sltkeyidgt Git - GPG Sign Commits}\n\t * @default false\n\t */\n\tsign: z.boolean().describe(\"If true, we'll sign the git commit using GPG.\"),\n\t/**\n\t * If true, no output will be written to stdout.\n\t * @default false\n\t */\n\tsilent: z.boolean().describe(\"If true, no output will be written to stdout.\"),\n\t/**\n\t * If true, run git commit hooks.\n\t * @default false\n\t */\n\tverify: z.boolean().describe(\"If true, run git commit hooks.\"),\n\n\t/**\n\t * If set, we'll use this as the current version.\n\t * @example \"1.0.0\"\n\t * @default undefined\n\t */\n\tcurrentVersion: z.string().optional().describe(\"If set, we'll use this as the current version\"),\n\t/**\n\t * If set, we'll use this as the next version.\n\t * @example \"2.0.0\"\n\t * @default undefined\n\t */\n\tnextVersion: z.string().optional().describe(\"If set, we'll use this as the next version.\"),\n\n\t/**\n\t * Override the default \"conventional-changelog-conventionalcommits\" preset configuration.\n\t */\n\tchangelogPresetConfig: ChangelogPresetConfigSchema.partial().describe(\n\t\t'Override the default \"conventional-changelog-conventionalcommits\" preset configuration.',\n\t),\n});\n\nexport type ForkConfig = z.infer<typeof ForkConfigSchema>;\n\nexport function defineConfig(config: Partial<ForkConfig>): Partial<ForkConfig> {\n\treturn config;\n}\n","import { readFileSync } from \"node:fs\";\nimport { parse, resolve } from \"node:path\";\nimport JoyCon from \"joycon\";\nimport { bundleRequire } from \"bundle-require\";\nimport { glob } from \"glob\";\nimport dotgitignore from \"dotgitignore\";\n\nimport { ForkConfigSchema, type ForkConfig } from \"./schema\";\nimport { DEFAULT_CONFIG } from \"./defaults\";\nimport { getCliArguments } from \"./cli-arguments\";\nimport { getChangelogPresetConfig } from \"./changelog-preset-config\";\n\nexport async function getUserConfig(): Promise<ForkConfig> {\n\tconst cliArguments = getCliArguments();\n\n\tconst cwd = cliArguments.flags.path ? resolve(cliArguments.flags.path) : process.cwd();\n\tconst joycon = new JoyCon();\n\tconst configFilePath = await joycon.resolve({\n\t\tfiles: [\n\t\t\t\"fork.config.ts\",\n\t\t\t\"fork.config.js\",\n\t\t\t\"fork.config.cjs\",\n\t\t\t\"fork.config.mjs\",\n\t\t\t\"fork.config.json\",\n\t\t],\n\t\tcwd,\n\t\tstopDir: parse(cwd).root,\n\t});\n\n\tconst configFile = await loadConfigFile(configFilePath);\n\n\tconst mergedConfig = {\n\t\t...DEFAULT_CONFIG,\n\t\t...configFile,\n\t\t...cliArguments.flags,\n\t} as ForkConfig;\n\n\t// If the user has defined a glob pattern, use it to find the requested files.\n\tlet globResults: string[] = [];\n\tif (mergedConfig.glob) {\n\t\tglobResults = await glob(mergedConfig.glob, {\n\t\t\tcwd: cwd,\n\t\t\tignore: [\"node_modules/**\"],\n\t\t\tnodir: true,\n\t\t});\n\t}\n\n\treturn {\n\t\t...mergedConfig,\n\n\t\tpath: cwd,\n\t\tfiles: filterGitIgnoredFiles(\n\t\t\tcwd,\n\t\t\tgetFilesList(configFile?.files, cliArguments.flags?.files, globResults),\n\t\t),\n\t\tchangelogPresetConfig: getChangelogPresetConfig(mergedConfig?.changelogPresetConfig),\n\t};\n}\n\nasync function loadConfigFile(configFilePath: string | null) {\n\tif (!configFilePath) {\n\t\treturn {};\n\t}\n\n\t// Handle json config file.\n\tif (configFilePath.endsWith(\"json\")) {\n\t\tconst fileContent = JSON.parse(readFileSync(configFilePath).toString());\n\n\t\tconst parsed = ForkConfigSchema.partial().safeParse(fileContent);\n\t\tif (!parsed.success) {\n\t\t\tthrow parsed.error;\n\t\t}\n\t\treturn parsed.data;\n\t}\n\n\t// Otherwise expect config file to use js or ts.\n\tconst fileContent = await bundleRequire({ filepath: configFilePath });\n\n\tconst parsed = ForkConfigSchema.partial().safeParse(fileContent.mod.default || fileContent.mod);\n\tif (!parsed.success) {\n\t\tthrow parsed.error;\n\t}\n\treturn parsed.data;\n}\n\nfunction getFilesList(\n\tconfigFiles: string[] | undefined,\n\tcliFiles: string[] | undefined,\n\tglobResults: string[],\n): string[] {\n\tconst listOfFiles = new Set<string>();\n\n\t// Add files from the users config file\n\tif (Array.isArray(configFiles)) {\n\t\tconfigFiles.forEach((file) => listOfFiles.add(file));\n\t}\n\n\t// Add files from the cli arguments\n\tif (Array.isArray(cliFiles)) {\n\t\tcliFiles.forEach((file) => listOfFiles.add(file));\n\t}\n\n\t// Add files from glob results\n\tglobResults.forEach((file) => listOfFiles.add(file));\n\n\t// If the user has defined files use them, otherwise use the default list of files.\n\tif (listOfFiles.size) {\n\t\treturn Array.from(listOfFiles);\n\t}\n\n\treturn DEFAULT_CONFIG.files;\n}\n\nfunction filterGitIgnoredFiles(cwd: string, files: string[]) {\n\tconst dotgit = dotgitignore({ cwd });\n\n\treturn files.filter((file) => !dotgit.ignore(file));\n}\n","import type { ForkConfig } from \"./schema\";\n\nexport const DEFAULT_CONFIG: ForkConfig = {\n\tpath: process.cwd(),\n\tchangelog: \"CHANGELOG.md\",\n\tfiles: [\n\t\t\"package.json\",\n\t\t\"package-lock.json\",\n\t\t\"npm-shrinkwrap.json\",\n\t\t\"manifest.json\", // Chrome extensions\n\t\t\"bower.json\",\n\t],\n\theader: `# Changelog\n\nAll notable changes to this project will be documented in this file. See [fork-version](https://github.com/eglavin/fork-version) for commit guidelines.\n`,\n\ttagPrefix: \"v\",\n\n\tcommitAll: false,\n\tdebug: false,\n\tdryRun: false,\n\tgitTagFallback: true,\n\tinspectVersion: false,\n\tsign: false,\n\tsilent: false,\n\tverify: false,\n\n\tchangelogPresetConfig: {},\n};\n","import meow from \"meow\";\n\nexport function getCliArguments() {\n\treturn meow(\n\t\t`\nUsage:\n $ fork-version [options]\n\nOptions:\n --path [Default: process.cwd()]\n The path fork-version will run from.\n --changelog [Default: \"CHANGELOG.md\"]\n Name of the changelog file.\n --header, -H\n The header to be used in the changelog.\n --files, --file, -F [Default: [\"bower.json\", \"manifest.json\", \"npm-shrinkwrap.json\", \"package-lock.json\", \"package.json\"]]\n Files to be updated.\n --glob, -G\n Glob pattern to match files to be updated.\n --tag-prefix [Default: \"v\"]\n Specify a prefix for the git tag \"fork-version\" will create.\n --pre-release-tag [Default: undefined]\n Make a pre-release with optional label, If value is a string it\n will be used as the pre-release tag.\n\n --commit-all\n Commit all staged changes, not just files updated by fork-version.\n --debug\n If true, we'll output debug information.\n --dry-run\n If true, no output will be written to disk or committed.\n --git-tag-fallback [Default: true]\n If true and we cant find a version in the given files, we'll fallback\n and attempt to use the latest git tag for the current version.\n --inspect-version\n If set, we'll gather information about the current version and exit.\n --sign\n Should we sign the git commit using GPG?\n --silent\n If true, no output will be written to stdout.\n --verify\n If true, allow git to run git commit hooks.\n\n --current-version\n If set, we'll use this version number instead of trying to find a\n version in a \"file\".\n --next-version\n If set, we'll attempt to update the version number to this version,\n instead of incrementing using \"conventional-commit\".\n`,\n\t\t{\n\t\t\timportMeta: import.meta,\n\t\t\tbooleanDefault: undefined,\n\t\t\tflags: {\n\t\t\t\tpath: { type: \"string\", default: process.cwd() },\n\t\t\t\tchangelog: { type: \"string\" },\n\t\t\t\theader: { type: \"string\", shortFlag: \"H\" },\n\t\t\t\tfiles: { type: \"string\", isMultiple: true, aliases: [\"file\"], shortFlag: \"F\" },\n\t\t\t\tglob: { type: \"string\", shortFlag: \"G\" },\n\t\t\t\ttagPrefix: { type: \"string\" },\n\t\t\t\tpreReleaseTag: { type: \"string\" },\n\n\t\t\t\tcommitAll: { type: \"boolean\" },\n\t\t\t\tdebug: { type: \"boolean\" },\n\t\t\t\tdryRun: { type: \"boolean\" },\n\t\t\t\tgitTagFallback: { type: \"boolean\" },\n\t\t\t\tinspectVersion: { type: \"boolean\" },\n\t\t\t\tsign: { type: \"boolean\" },\n\t\t\t\tsilent: { type: \"boolean\" },\n\t\t\t\tverify: { type: \"boolean\" },\n\n\t\t\t\tcurrentVersion: { type: \"string\" },\n\t\t\t\tnextVersion: { type: \"string\" },\n\t\t\t},\n\t\t},\n\t);\n}\n","import conventionalChangelogConfigSpec from \"conventional-changelog-config-spec\";\n\nimport { ChangelogPresetConfigSchema, type ForkConfig } from \"./schema\";\n\nexport function getChangelogPresetConfig(\n\tusersChangelogPresetConfig?: ForkConfig[\"changelogPresetConfig\"],\n) {\n\tconst preset: { name: string; [_: string]: unknown } = {\n\t\tname: \"conventionalcommits\",\n\t};\n\n\t// First take any default values from the conventional-changelog-config-spec\n\tif (typeof conventionalChangelogConfigSpec.properties === \"object\") {\n\t\tObject.entries(conventionalChangelogConfigSpec.properties).forEach(([key, value]) => {\n\t\t\tif (\"default\" in value && value.default !== undefined) {\n\t\t\t\tpreset[key] = value.default;\n\t\t\t}\n\t\t});\n\t}\n\n\t// Then overwrite with any values from the users config\n\tif (usersChangelogPresetConfig && typeof usersChangelogPresetConfig === \"object\") {\n\t\tObject.entries(usersChangelogPresetConfig).forEach(([key, value]) => {\n\t\t\tif (value !== undefined) {\n\t\t\t\tpreset[key] = value;\n\t\t\t}\n\t\t});\n\t}\n\n\treturn ChangelogPresetConfigSchema.passthrough().parse(preset);\n}\n","import semver, { type ReleaseType } from \"semver\";\nimport conventionalRecommendedBump from \"conventional-recommended-bump\";\n\nimport { getLatestGitTagVersion } from \"../utils/git-tag-version\";\nimport { getReleaseType } from \"../utils/release-type\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { IFileManager, FileState } from \"../strategies/file-manager\";\nimport type { Logger } from \"../utils/logger\";\n\nexport interface CurrentVersion {\n\tversion: string;\n\tfiles: FileState[];\n}\n\nexport async function getCurrentVersion(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tfileManager: IFileManager,\n): Promise<CurrentVersion> {\n\tconst files: FileState[] = [];\n\tconst versions = new Set<string>();\n\n\tfor (const file of config.files) {\n\t\tconst fileState = fileManager.read(file);\n\n\t\tif (fileState) {\n\t\t\tfiles.push(fileState);\n\n\t\t\tif (config.currentVersion) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tversions.add(fileState.version);\n\t\t}\n\t}\n\n\tif (config.currentVersion) {\n\t\tversions.add(config.currentVersion);\n\t}\n\n\t// If we still don't have a version, try to get the latest git tag\n\tif (versions.size === 0 && config.gitTagFallback) {\n\t\tconst version = await getLatestGitTagVersion(config.tagPrefix);\n\t\tif (version) {\n\t\t\tlogger.log(`[Version] Using git tag fallback.`);\n\t\t\tversions.add(version);\n\t\t}\n\t}\n\n\tif (versions.size === 0) {\n\t\tthrow new Error(\"Unable to find current version\");\n\t} else if (versions.size > 1) {\n\t\tthrow new Error(\"Found multiple versions\");\n\t}\n\n\tconst currentVersion = versions.entries().next().value[0];\n\n\t// If we're just inspecting the version, output the version and exit\n\tif (config.inspectVersion) {\n\t\tconsole.log(currentVersion);\n\t\tprocess.exit(0);\n\t}\n\n\tlogger.log(`Current version: ${currentVersion}`);\n\treturn {\n\t\tfiles,\n\t\tversion: currentVersion,\n\t};\n}\n\nexport interface NextVersion {\n\tversion: string;\n\tlevel?: number;\n\tpreMajor?: boolean;\n\treason?: string;\n\treleaseType?: ReleaseType;\n}\n\nexport async function getNextVersion(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tcurrentVersion: string,\n): Promise<NextVersion> {\n\tif (config.nextVersion && semver.valid(config.nextVersion)) {\n\t\tlogger.log(`Next version: ${config.nextVersion}`);\n\t\treturn {\n\t\t\tversion: config.nextVersion,\n\t\t};\n\t}\n\n\tconst isPreMajor = semver.lt(currentVersion, \"1.0.0\");\n\n\tlet recommendedBump: Awaited<ReturnType<typeof conventionalRecommendedBump>>;\n\ttry {\n\t\trecommendedBump = await conventionalRecommendedBump({\n\t\t\tpreset: {\n\t\t\t\tname: \"conventionalcommits\",\n\t\t\t\t...config.changelogPresetConfig,\n\t\t\t\tpreMajor: isPreMajor,\n\t\t\t},\n\t\t\tpath: config.path,\n\t\t\ttagPrefix: config.tagPrefix,\n\t\t\tcwd: config.path,\n\t\t});\n\t} catch (error) {\n\t\tthrow new Error(`[conventional-recommended-bump] Unable to determine next version`);\n\t}\n\n\tif (recommendedBump.releaseType) {\n\t\tconst releaseType = getReleaseType(\n\t\t\trecommendedBump.releaseType,\n\t\t\tcurrentVersion,\n\t\t\tconfig.preReleaseTag,\n\t\t);\n\n\t\tconst state: NextVersion = {\n\t\t\t...recommendedBump,\n\t\t\tpreMajor: isPreMajor,\n\t\t\treleaseType,\n\t\t\tversion:\n\t\t\t\tsemver.inc(\n\t\t\t\t\tcurrentVersion,\n\t\t\t\t\treleaseType,\n\t\t\t\t\ttypeof config.preReleaseTag === \"string\" ? config.preReleaseTag : undefined,\n\t\t\t\t) ?? \"\",\n\t\t};\n\n\t\tlogger.log(`Next version: ${state.version} (${state.releaseType})`);\n\t\treturn state;\n\t}\n\n\tthrow new Error(\"Unable to find next version\");\n}\n","import gitSemverTags from \"git-semver-tags\";\nimport semver from \"semver\";\n\n/**\n * Get the latest git tag version.\n *\n * @example\n * ```ts\n * const tagPrefix = \"v\";\n * await getLatestGitTagVersion(tagPrefix); // 1.2.3\n * ```\n */\nexport async function getLatestGitTagVersion(tagPrefix: string | undefined): Promise<string> {\n\tconst gitTags = await gitSemverTags({ tagPrefix });\n\tif (!gitTags.length) {\n\t\treturn \"1.0.0\";\n\t}\n\n\tconst cleanedTags = [];\n\n\tfor (const tag of gitTags) {\n\t\tconst cleanedTag = semver.clean(tag.replace(new RegExp(`^${tagPrefix}`), \"\"));\n\n\t\tif (cleanedTag) {\n\t\t\tcleanedTags.push(cleanedTag);\n\t\t}\n\t}\n\n\treturn cleanedTags.sort(semver.rcompare)[0];\n}\n","import semver, { type ReleaseType } from \"semver\";\n\n/**\n * Get the priority of given type.\n * @example\n * - \"patch\" => 0\n * - \"minor\" => 1\n * - \"major\" => 2\n */\nfunction getPriority(type?: string): number {\n\treturn [\"patch\", \"minor\", \"major\"].indexOf(type ?? \"\");\n}\n\n/**\n * Get the given versions highest state.\n * @example\n * - \"patch\"\n * - \"minor\"\n * - \"major\"\n */\nfunction getVersionType(version: string): \"patch\" | \"minor\" | \"major\" | undefined {\n\tconst parseVersion = semver.parse(version);\n\n\tif (parseVersion?.major) {\n\t\treturn \"major\";\n\t} else if (parseVersion?.minor) {\n\t\treturn \"minor\";\n\t} else if (parseVersion?.patch) {\n\t\treturn \"patch\";\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Get the recommended release type for the given version depending on if\n * the user asks for a prerelease with or without a tag.\n * ```js\n * getReleaseType(\"patch\", \"1.0.0\", false) => \"patch\"\n * getReleaseType(\"major\", \"0.0.0-beta\", \"beta\") => \"premajor\"\n * ```\n */\nexport function getReleaseType(\n\treleaseType: \"major\" | \"minor\" | \"patch\",\n\tcurrentVersion: string,\n\tpreReleaseTag?: string | boolean,\n): ReleaseType {\n\tif (!preReleaseTag) {\n\t\treturn releaseType;\n\t}\n\n\tconst currentVersionsIsPreRelease = Array.isArray(semver.prerelease(currentVersion));\n\tif (currentVersionsIsPreRelease) {\n\t\tconst currentReleaseType = getVersionType(currentVersion);\n\n\t\tif (\n\t\t\tcurrentReleaseType === releaseType ||\n\t\t\tgetPriority(currentReleaseType) > getPriority(releaseType)\n\t\t) {\n\t\t\treturn \"prerelease\";\n\t\t}\n\t}\n\n\treturn `pre${releaseType}`;\n}\n","import { resolve } from \"node:path\";\nimport { writeFileSync, readFileSync } from \"node:fs\";\nimport conventionalChangelog from \"conventional-changelog\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\n\n/**\n * Matches the following changelog header formats:\n * - `## [1.2.3]`\n * - `<a name=\"1.2.3\"></a>`\n */\nconst RELEASE_PATTERN = /(^#+ \\[?[0-9]+\\.[0-9]+\\.[0-9]+|<a name=)/m;\n\n/**\n * Get the existing changelog content from the latest release onwards.\n * @see {@link RELEASE_PATTERN}\n */\nfunction getOldReleaseContent(filePath: string, exists: boolean): string {\n\tif (exists) {\n\t\tconst fileContents = readFileSync(filePath, \"utf-8\");\n\t\tconst oldContentStart = fileContents.search(RELEASE_PATTERN);\n\n\t\tif (oldContentStart !== -1) {\n\t\t\treturn fileContents.substring(oldContentStart);\n\t\t}\n\t}\n\n\treturn \"\";\n}\n\n/**\n * Generate the new changelog content for this release.\n */\nfunction getNewReleaseContent(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<string> {\n\treturn new Promise<string>((onResolve) => {\n\t\tlet newContent = \"\";\n\n\t\tconventionalChangelog(\n\t\t\t{\n\t\t\t\tpreset: {\n\t\t\t\t\tname: \"conventionalcommits\",\n\t\t\t\t\t...config.changelogPresetConfig,\n\t\t\t\t},\n\t\t\t\ttagPrefix: config.tagPrefix,\n\t\t\t\twarn: (...message: string[]) => logger.error(\"[conventional-changelog] \", ...message),\n\t\t\t\tcwd: config.path,\n\t\t\t},\n\t\t\t{\n\t\t\t\tversion: nextVersion,\n\t\t\t},\n\t\t\t{\n\t\t\t\tmerges: null,\n\t\t\t\tpath: config.path,\n\t\t\t},\n\t\t)\n\t\t\t.on(\"error\", (error) => {\n\t\t\t\tlogger.error(\"[conventional-changelog] Unable to parse changes\");\n\t\t\t\tthrow error;\n\t\t\t})\n\t\t\t.on(\"data\", (chunk) => {\n\t\t\t\tnewContent += chunk.toString();\n\t\t\t})\n\t\t\t.on(\"end\", () => {\n\t\t\t\tonResolve(newContent);\n\t\t\t});\n\t});\n}\n\ninterface UpdateChangelog {\n\tchangelogPath: string;\n\toldContent: string;\n\tnewContent: string;\n}\n\nexport async function updateChangelog(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<UpdateChangelog> {\n\tif (config.header.search(RELEASE_PATTERN) !== -1) {\n\t\t// Need to ensure the header doesn't contain the release pattern\n\t\tthrow new Error(\"Header cannot contain release pattern\");\n\t}\n\n\t// Create the changelog file if it doesn't exist\n\tconst changelogPath = resolve(config.path, config.changelog);\n\tif (!config.dryRun && !fileExists(changelogPath)) {\n\t\tlogger.log(`Creating Changelog file: ${changelogPath}`);\n\t\twriteFileSync(changelogPath, \"\\n\", \"utf8\");\n\t}\n\n\tconst oldContent = getOldReleaseContent(changelogPath, fileExists(changelogPath));\n\tconst newContent = await getNewReleaseContent(config, logger, nextVersion);\n\n\tlogger.log(`Updating Changelog: ${changelogPath}`);\n\tif (!config.dryRun && newContent) {\n\t\twriteFileSync(\n\t\t\tchangelogPath,\n\t\t\t`${config.header}\n${newContent}\n${oldContent}\n`.trim(),\n\t\t\t\"utf8\",\n\t\t);\n\t}\n\n\treturn {\n\t\tchangelogPath,\n\t\toldContent,\n\t\tnewContent,\n\t};\n}\n","import { lstatSync } from \"fs\";\n\n/**\n * Determine if a file exists.\n * @example\n * ```ts\n * fileExists(\"~/.bashrc\"); // true\n * fileExists(\"~/missing-file.txt\"); // false\n * ```\n */\nexport function fileExists(filePath: string): boolean {\n\ttry {\n\t\treturn lstatSync(filePath).isFile();\n\t} catch (e) {\n\t\treturn false;\n\t}\n}\n","import { resolve } from \"node:path\";\nimport { Git } from \"../utils/git\";\nimport { formatCommitMessage } from \"../utils/format-commit-message\";\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { FileState } from \"../strategies/file-manager\";\nimport type { Logger } from \"../utils/logger\";\n\ninterface CommitChanges {\n\tfilesToCommit: string[];\n\tgitAddOutput?: string;\n\tgitCommitOutput?: string;\n}\n\nexport async function commitChanges(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tfiles: FileState[],\n\tnextVersion: string,\n): Promise<CommitChanges> {\n\tconst git = new Git(config, logger);\n\n\tlogger.log(\"Committing changes\");\n\n\tconst filesToCommit: string[] = [];\n\tif (fileExists(resolve(config.path, config.changelog))) {\n\t\tfilesToCommit.push(resolve(config.path, config.changelog));\n\t}\n\tfor (const file of files) {\n\t\tfilesToCommit.push(file.path);\n\t}\n\n\t// If there are no files to commit don't continue.\n\tif (filesToCommit.length === 0) {\n\t\treturn {\n\t\t\tfilesToCommit,\n\t\t};\n\t}\n\n\tconst shouldVerify = config.verify ? undefined : \"--no-verify\";\n\tconst shouldSign = config.sign ? \"--gpg-sign\" : undefined;\n\n\t// If commitAll is set, commit all changed files.\n\tif (config.commitAll) {\n\t\treturn {\n\t\t\tfilesToCommit,\n\t\t\tgitAddOutput: await git.add(\"--all\"),\n\t\t\tgitCommitOutput: await git.commit(\n\t\t\t\tshouldVerify,\n\t\t\t\tshouldSign,\n\t\t\t\t\"--message\",\n\t\t\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t\t\t),\n\t\t};\n\t}\n\n\treturn {\n\t\tfilesToCommit,\n\t\tgitAddOutput: await git.add(...filesToCommit),\n\t\tgitCommitOutput: await git.commit(\n\t\t\tshouldVerify,\n\t\t\tshouldSign,\n\t\t\t...filesToCommit,\n\t\t\t\"--message\",\n\t\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t\t),\n\t};\n}\n","import { execFile } from \"node:child_process\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"./logger\";\n\nexport class Git {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {\n\t\tthis.add = this.add.bind(this);\n\t\tthis.commit = this.commit.bind(this);\n\t\tthis.tag = this.tag.bind(this);\n\t\tthis.currentBranch = this.currentBranch.bind(this);\n\t}\n\n\tpublic add(...args: (string | undefined)[]) {\n\t\tif (this.config.dryRun) {\n\t\t\treturn Promise.resolve(\"\");\n\t\t}\n\n\t\treturn this.execGit(\"add\", args.filter(Boolean) as string[]);\n\t}\n\n\tpublic commit(...args: (string | undefined)[]) {\n\t\tif (this.config.dryRun) {\n\t\t\treturn Promise.resolve(\"\");\n\t\t}\n\n\t\treturn this.execGit(\"commit\", args.filter(Boolean) as string[]);\n\t}\n\n\tpublic tag(...args: (string | undefined)[]) {\n\t\tif (this.config.dryRun) {\n\t\t\treturn Promise.resolve(\"\");\n\t\t}\n\n\t\treturn this.execGit(\"tag\", args.filter(Boolean) as string[]);\n\t}\n\n\tpublic async currentBranch() {\n\t\treturn (await this.execGit(\"rev-parse\", [\"--abbrev-ref\", \"HEAD\"])).trim();\n\t}\n\n\tprivate execGit(command: string, args: string[]): Promise<string> {\n\t\tthis.logger.debug(`[git ${command}] ${args.join(\" \")}`);\n\n\t\treturn new Promise((onResolve, onReject) => {\n\t\t\texecFile(\n\t\t\t\t\"git\",\n\t\t\t\t[command, ...args],\n\t\t\t\t{\n\t\t\t\t\tcwd: this.config.path,\n\t\t\t\t},\n\t\t\t\t(error, stdout, stderr) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tthis.logger.error(`[git ${command}] `);\n\t\t\t\t\t\tonReject(error);\n\t\t\t\t\t}\n\n\t\t\t\t\tonResolve(stdout ? stdout : stderr);\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}\n}\n","/**\n * Formats the commit message by replacing the `{{currentTag}}` placeholder\n * globally with the new version.\n *\n * Falls back to `chore(release): {{currentTag}}` if message is argument is falsy.\n */\nexport function formatCommitMessage(message: string | undefined, version: string): string {\n\tif (!message) {\n\t\tmessage = \"chore(release): {{currentTag}}\";\n\t}\n\n\treturn message.replace(new RegExp(\"{{currentTag}}\", \"g\"), version);\n}\n","import { Git } from \"../utils/git\";\nimport { formatCommitMessage } from \"../utils/format-commit-message\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\n\ninterface TagChanges {\n\tgitTagOutput: string;\n}\n\nexport async function tagChanges(\n\tconfig: ForkConfig,\n\tlogger: Logger,\n\tnextVersion: string,\n): Promise<TagChanges> {\n\tconst git = new Git(config, logger);\n\n\t/** @example \"v1.2.3\" or \"version/1.2.3\" */\n\tconst tag = `${config.tagPrefix}${nextVersion}`;\n\n\tlogger.log(`Creating Tag: ${tag}`);\n\n\tconst gitTagOutput = await git.tag(\n\t\tconfig.sign ? \"--sign\" : \"--annotate\",\n\t\ttag,\n\t\t\"--message\",\n\t\tformatCommitMessage(config.changelogPresetConfig?.releaseCommitMessageFormat, nextVersion),\n\t);\n\n\treturn {\n\t\tgitTagOutput,\n\t};\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nimport detectIndent from \"detect-indent\";\nimport { detectNewline } from \"detect-newline\";\n\nimport { stringifyPackage } from \"../libs/stringify-package\";\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\n\n/**\n * A json package file should have a version property, like what can be seen\n * in the package.json file in the root of this project.\n *\n * @example\n * ```json\n * {\n * \"name\": \"fork-version\",\n * \"version\": \"1.2.3\",\n * \"private\": true,\n * }\n * ```\n */\nexport class JSONPackage implements IFileManager {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {}\n\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst filePath = resolve(this.config.path, fileName);\n\n\t\tif (fileExists(filePath)) {\n\t\t\tconst fileContents = readFileSync(filePath, \"utf8\");\n\t\t\tconst parsedJson = JSON.parse(fileContents);\n\n\t\t\tif (parsedJson.version) {\n\t\t\t\treturn {\n\t\t\t\t\tname: fileName,\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tversion: parsedJson.version,\n\n\t\t\t\t\tisPrivate: typeof parsedJson?.private === \"boolean\" ? parsedJson.private : true,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.logger.warn(`[File Manager] Unable to determine json package: ${fileName}`);\n\t\t}\n\t}\n\n\tpublic write(fileState: FileState, newVersion: string) {\n\t\tconst fileContents = readFileSync(fileState.path, \"utf8\");\n\t\tconst parsedJson = JSON.parse(fileContents);\n\n\t\tparsedJson.version = newVersion;\n\t\tif (parsedJson.packages?.[\"\"]) {\n\t\t\tparsedJson.packages[\"\"].version = newVersion; // package-lock v2 stores version here too.\n\t\t}\n\n\t\twriteFileSync(\n\t\t\tfileState.path,\n\t\t\tstringifyPackage(parsedJson, detectIndent(fileContents).amount, detectNewline(fileContents)),\n\t\t\t\"utf8\",\n\t\t);\n\t}\n}\n","// https://github.com/npm/stringify-package/blob/main/LICENSE\n// Extracted from npm/stringify-package\n//\n// Copyright npm, Inc\n//\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\nconst DEFAULT_INDENT = 2;\nconst CRLF = \"\\r\\n\";\nconst LF = \"\\n\";\n\n/**\n * @param data The object to stringify\n * @param indent `2, 4, \" \", \"\\t\"` Number of spaces a string of spaces or tab character, defaults to 2\n * @param newline `\"\\r\\n\", \"\\n\"` Windows or Unix line endings, defaults to Unix\n */\nexport function stringifyPackage(\n\tdata: object,\n\tindent?: string | number,\n\tnewline?: typeof CRLF | typeof LF,\n): string {\n\tconst stringified = JSON.stringify(data, null, indent ?? DEFAULT_INDENT);\n\n\tif (newline === CRLF) {\n\t\treturn stringified.replace(new RegExp(LF, \"g\"), CRLF);\n\t}\n\n\treturn stringified;\n}\n","import { resolve } from \"node:path\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\n\nimport { fileExists } from \"../utils/file-state\";\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\nimport type { FileState, IFileManager } from \"./file-manager\";\n\n/**\n * A plain text file will have just the version as the content.\n *\n * @example\n * ```txt\n * 1.2.3\n * ```\n */\nexport class PlainText implements IFileManager {\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {}\n\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst filePath = resolve(this.config.path, fileName);\n\n\t\tif (fileExists(filePath)) {\n\t\t\tconst fileContents = readFileSync(filePath, \"utf8\");\n\n\t\t\treturn {\n\t\t\t\tname: fileName,\n\t\t\t\tpath: filePath,\n\t\t\t\tversion: fileContents || \"\",\n\t\t\t};\n\t\t}\n\n\t\tthis.logger.warn(`[File Manager] Unable to determine plain text: ${fileName}`);\n\t}\n\n\tpublic write(fileState: FileState, newVersion: string) {\n\t\twriteFileSync(fileState.path, newVersion, \"utf8\");\n\t}\n}\n","import { JSONPackage } from \"./json-package\";\nimport { PlainText } from \"./plain-text\";\n\nimport type { ForkConfig } from \"../config/schema\";\nimport type { Logger } from \"../utils/logger\";\n\nexport interface FileState {\n\tname: string;\n\tpath: string;\n\tversion: string;\n\n\t[other: string]: unknown;\n}\n\nexport interface IFileManager {\n\tread(fileName: string): FileState | undefined;\n\twrite(fileState: FileState, newVersion: string): void;\n}\n\nexport class FileManager implements IFileManager {\n\tprivate JSONPackage: JSONPackage;\n\tprivate PlainText: PlainText;\n\n\tconstructor(\n\t\tprivate config: ForkConfig,\n\t\tprivate logger: Logger,\n\t) {\n\t\tthis.JSONPackage = new JSONPackage(config, logger);\n\t\tthis.PlainText = new PlainText(config, logger);\n\t}\n\n\t/**\n\t * Get the state from the given file name.\n\t *\n\t * @example\n\t * ```ts\n\t * fileManager.read(\"package.json\");\n\t * ```\n\t *\n\t * @returns\n\t * ```json\n\t * { \"name\": \"package.json\", \"path\": \"/path/to/package.json\", \"version\": \"1.2.3\", \"isPrivate\": true }\n\t * ```\n\t */\n\tpublic read(fileName: string): FileState | undefined {\n\t\tconst _fileName = fileName.toLowerCase();\n\n\t\tif (_fileName.endsWith(\".json\")) {\n\t\t\treturn this.JSONPackage.read(fileName);\n\t\t}\n\n\t\tif (_fileName.endsWith(\"version.txt\")) {\n\t\t\treturn this.PlainText.read(fileName);\n\t\t}\n\n\t\tthis.logger.error(`[File Manager] Unsupported file: ${fileName}`);\n\t}\n\n\t/**\n\t * Write the new version to the given file.\n\t *\n\t * @example\n\t * ```ts\n\t * fileManager.write(\n\t * { name: \"package.json\", path: \"/path/to/package.json\", version: \"1.2.2\" },\n\t * \"1.2.3\"\n\t * );\n\t * ```\n\t */\n\tpublic write(fileState: FileState, newVersion: string): void {\n\t\tif (this.config.dryRun) {\n\t\t\treturn;\n\t\t}\n\t\tconst _fileName = fileState.name.toLowerCase();\n\n\t\tif (_fileName.endsWith(\".json\")) {\n\t\t\treturn this.JSONPackage.write(fileState, newVersion);\n\t\t}\n\n\t\tif (_fileName.endsWith(\"version.txt\")) {\n\t\t\treturn this.PlainText.write(fileState, newVersion);\n\t\t}\n\n\t\tthis.logger.error(`[File Manager] Unsupported file: ${fileState.path}`);\n\t}\n}\n"]}
|