Merge pull request #505 from actions/robherley/merge-artifacts
Add sub-action to merge artifacts
This commit is contained in:
commit
26f96dfa69
91
.github/workflows/test.yml
vendored
91
.github/workflows/test.yml
vendored
@ -141,12 +141,16 @@ jobs:
|
|||||||
}
|
}
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
|
|
||||||
|
- name: 'Alter file 1 content'
|
||||||
|
run: |
|
||||||
|
echo "This file has changed" > path/to/dir-1/file1.txt
|
||||||
|
|
||||||
# Replace the contents of Artifact #1
|
# Replace the contents of Artifact #1
|
||||||
- name: 'Overwrite artifact #1 again'
|
- name: 'Overwrite artifact #1'
|
||||||
uses: ./
|
uses: ./
|
||||||
with:
|
with:
|
||||||
name: 'Artifact-A-${{ matrix.runs-on }}'
|
name: 'Artifact-A-${{ matrix.runs-on }}'
|
||||||
path: path/to/dir-2/file2.txt
|
path: path/to/dir-1/file1.txt
|
||||||
overwrite: true
|
overwrite: true
|
||||||
|
|
||||||
# Download replaced Artifact #1 and verify the correctness of the content
|
# Download replaced Artifact #1 and verify the correctness of the content
|
||||||
@ -158,13 +162,90 @@ jobs:
|
|||||||
|
|
||||||
- name: 'Verify Artifact #1 again'
|
- name: 'Verify Artifact #1 again'
|
||||||
run: |
|
run: |
|
||||||
$file = "overwrite/some/new/path/file2.txt"
|
$file = "overwrite/some/new/path/file1.txt"
|
||||||
if(!(Test-Path -path $file))
|
if(!(Test-Path -path $file))
|
||||||
{
|
{
|
||||||
Write-Error "Expected file does not exist"
|
Write-Error "Expected file does not exist"
|
||||||
}
|
}
|
||||||
if(!((Get-Content $file) -ceq "Hello world from file #2"))
|
if(!((Get-Content $file) -ceq "This file has changed"))
|
||||||
{
|
{
|
||||||
Write-Error "File contents of downloaded artifacts are incorrect"
|
Write-Error "File contents of downloaded artifact are incorrect"
|
||||||
}
|
}
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
|
merge:
|
||||||
|
name: Merge
|
||||||
|
needs: build
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# Merge all artifacts from previous jobs
|
||||||
|
- name: Merge all artifacts in run
|
||||||
|
uses: ./merge/
|
||||||
|
with:
|
||||||
|
# our matrix produces artifacts with the same file, this prevents "stomping" on each other, also makes it
|
||||||
|
# easier to identify each of the merged artifacts
|
||||||
|
separate-directories: true
|
||||||
|
- name: 'Download merged artifacts'
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: merged-artifacts
|
||||||
|
path: all-merged-artifacts
|
||||||
|
- name: 'Check merged artifact has directories for each artifact'
|
||||||
|
run: |
|
||||||
|
$artifacts = @(
|
||||||
|
"Artifact-A-ubuntu-latest",
|
||||||
|
"Artifact-A-macos-latest",
|
||||||
|
"Artifact-A-windows-latest",
|
||||||
|
"Artifact-Wildcard-ubuntu-latest",
|
||||||
|
"Artifact-Wildcard-macos-latest",
|
||||||
|
"Artifact-Wildcard-windows-latest",
|
||||||
|
"Multi-Path-Artifact-ubuntu-latest",
|
||||||
|
"Multi-Path-Artifact-macos-latest",
|
||||||
|
"Multi-Path-Artifact-windows-latest"
|
||||||
|
)
|
||||||
|
|
||||||
|
foreach ($artifact in $artifacts) {
|
||||||
|
$path = "all-merged-artifacts/$artifact"
|
||||||
|
if (!(Test-Path $path)) {
|
||||||
|
Write-Error "$path does not exist."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
shell: pwsh
|
||||||
|
|
||||||
|
# Merge Artifact-A-* from previous jobs
|
||||||
|
- name: Merge all Artifact-A
|
||||||
|
uses: ./merge/
|
||||||
|
with:
|
||||||
|
name: Merged-Artifact-As
|
||||||
|
pattern: 'Artifact-A-*'
|
||||||
|
separate-directories: true
|
||||||
|
|
||||||
|
# Download merged artifacts and verify the correctness of the content
|
||||||
|
- name: 'Download merged artifacts'
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: Merged-Artifact-As
|
||||||
|
path: merged-artifact-a
|
||||||
|
|
||||||
|
- name: 'Verify merged artifacts'
|
||||||
|
run: |
|
||||||
|
$files = @(
|
||||||
|
"merged-artifact-a/Artifact-A-ubuntu-latest/file1.txt",
|
||||||
|
"merged-artifact-a/Artifact-A-macos-latest/file1.txt",
|
||||||
|
"merged-artifact-a/Artifact-A-windows-latest/file1.txt"
|
||||||
|
)
|
||||||
|
|
||||||
|
foreach ($file in $files) {
|
||||||
|
if (!(Test-Path $file)) {
|
||||||
|
Write-Error "$file does not exist."
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!((Get-Content $file) -ceq "This file has changed")) {
|
||||||
|
Write-Error "$file has incorrect content."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
shell: pwsh
|
||||||
|
|
||||||
|
|||||||
BIN
.licenses/npm/minimatch.dep.yml
generated
Normal file
BIN
.licenses/npm/minimatch.dep.yml
generated
Normal file
Binary file not shown.
@ -41,6 +41,8 @@ The release of upload-artifact@v4 and download-artifact@v4 are major changes to
|
|||||||
|
|
||||||
For more information, see the [`@actions/artifact`](https://github.com/actions/toolkit/tree/main/packages/artifact) documentation.
|
For more information, see the [`@actions/artifact`](https://github.com/actions/toolkit/tree/main/packages/artifact) documentation.
|
||||||
|
|
||||||
|
There is also a new sub-action, `actions/upload-artifact/merge`. For more info, check out that action's [README](./merge/README.md).
|
||||||
|
|
||||||
### Improvements
|
### Improvements
|
||||||
|
|
||||||
1. Uploads are significantly faster, upwards of 90% improvement in worst case scenarios.
|
1. Uploads are significantly faster, upwards of 90% improvement in worst case scenarios.
|
||||||
|
|||||||
175
__tests__/merge.test.ts
Normal file
175
__tests__/merge.test.ts
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
import * as core from '@actions/core'
|
||||||
|
import artifact from '@actions/artifact'
|
||||||
|
import {run} from '../src/merge/merge-artifacts'
|
||||||
|
import {Inputs} from '../src/merge/constants'
|
||||||
|
import * as search from '../src/shared/search'
|
||||||
|
|
||||||
|
const fixtures = {
|
||||||
|
artifactName: 'my-merged-artifact',
|
||||||
|
tmpDirectory: '/tmp/merge-artifact',
|
||||||
|
filesToUpload: [
|
||||||
|
'/some/artifact/path/file-a.txt',
|
||||||
|
'/some/artifact/path/file-b.txt',
|
||||||
|
'/some/artifact/path/file-c.txt'
|
||||||
|
],
|
||||||
|
artifacts: [
|
||||||
|
{
|
||||||
|
name: 'my-artifact-a',
|
||||||
|
id: 1,
|
||||||
|
size: 100,
|
||||||
|
createdAt: new Date('2024-01-01T00:00:00Z')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'my-artifact-b',
|
||||||
|
id: 2,
|
||||||
|
size: 100,
|
||||||
|
createdAt: new Date('2024-01-01T00:00:00Z')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'my-artifact-c',
|
||||||
|
id: 3,
|
||||||
|
size: 100,
|
||||||
|
createdAt: new Date('2024-01-01T00:00:00Z')
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
jest.mock('@actions/github', () => ({
|
||||||
|
context: {
|
||||||
|
repo: {
|
||||||
|
owner: 'actions',
|
||||||
|
repo: 'toolkit'
|
||||||
|
},
|
||||||
|
runId: 123,
|
||||||
|
serverUrl: 'https://github.com'
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
|
||||||
|
jest.mock('@actions/core')
|
||||||
|
|
||||||
|
jest.mock('fs/promises', () => ({
|
||||||
|
mkdtemp: jest.fn().mockResolvedValue('/tmp/merge-artifact'),
|
||||||
|
rm: jest.fn().mockResolvedValue(undefined)
|
||||||
|
}))
|
||||||
|
|
||||||
|
/* eslint-disable no-unused-vars */
|
||||||
|
const mockInputs = (overrides?: Partial<{[K in Inputs]?: any}>) => {
|
||||||
|
const inputs = {
|
||||||
|
[Inputs.Name]: 'my-merged-artifact',
|
||||||
|
[Inputs.Pattern]: '*',
|
||||||
|
[Inputs.SeparateDirectories]: false,
|
||||||
|
[Inputs.RetentionDays]: 0,
|
||||||
|
[Inputs.CompressionLevel]: 6,
|
||||||
|
[Inputs.DeleteMerged]: false,
|
||||||
|
...overrides
|
||||||
|
}
|
||||||
|
|
||||||
|
;(core.getInput as jest.Mock).mockImplementation((name: string) => {
|
||||||
|
return inputs[name]
|
||||||
|
})
|
||||||
|
;(core.getBooleanInput as jest.Mock).mockImplementation((name: string) => {
|
||||||
|
return inputs[name]
|
||||||
|
})
|
||||||
|
|
||||||
|
return inputs
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('merge', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
mockInputs()
|
||||||
|
|
||||||
|
jest
|
||||||
|
.spyOn(artifact, 'listArtifacts')
|
||||||
|
.mockResolvedValue({artifacts: fixtures.artifacts})
|
||||||
|
|
||||||
|
jest.spyOn(artifact, 'downloadArtifact').mockResolvedValue({
|
||||||
|
downloadPath: fixtures.tmpDirectory
|
||||||
|
})
|
||||||
|
|
||||||
|
jest.spyOn(search, 'findFilesToUpload').mockResolvedValue({
|
||||||
|
filesToUpload: fixtures.filesToUpload,
|
||||||
|
rootDirectory: fixtures.tmpDirectory
|
||||||
|
})
|
||||||
|
|
||||||
|
jest.spyOn(artifact, 'uploadArtifact').mockResolvedValue({
|
||||||
|
size: 123,
|
||||||
|
id: 1337
|
||||||
|
})
|
||||||
|
|
||||||
|
jest
|
||||||
|
.spyOn(artifact, 'deleteArtifact')
|
||||||
|
.mockImplementation(async artifactName => {
|
||||||
|
const artifact = fixtures.artifacts.find(a => a.name === artifactName)
|
||||||
|
if (!artifact) throw new Error(`Artifact ${artifactName} not found`)
|
||||||
|
return {id: artifact.id}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('merges artifacts', async () => {
|
||||||
|
await run()
|
||||||
|
|
||||||
|
for (const a of fixtures.artifacts) {
|
||||||
|
expect(artifact.downloadArtifact).toHaveBeenCalledWith(a.id, {
|
||||||
|
path: fixtures.tmpDirectory
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
expect(artifact.uploadArtifact).toHaveBeenCalledWith(
|
||||||
|
fixtures.artifactName,
|
||||||
|
fixtures.filesToUpload,
|
||||||
|
fixtures.tmpDirectory,
|
||||||
|
{compressionLevel: 6}
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('fails if no artifacts found', async () => {
|
||||||
|
mockInputs({[Inputs.Pattern]: 'this-does-not-match'})
|
||||||
|
|
||||||
|
expect(run()).rejects.toThrow()
|
||||||
|
|
||||||
|
expect(artifact.uploadArtifact).not.toBeCalled()
|
||||||
|
expect(artifact.downloadArtifact).not.toBeCalled()
|
||||||
|
})
|
||||||
|
|
||||||
|
it('supports custom compression level', async () => {
|
||||||
|
mockInputs({
|
||||||
|
[Inputs.CompressionLevel]: 2
|
||||||
|
})
|
||||||
|
|
||||||
|
await run()
|
||||||
|
|
||||||
|
expect(artifact.uploadArtifact).toHaveBeenCalledWith(
|
||||||
|
fixtures.artifactName,
|
||||||
|
fixtures.filesToUpload,
|
||||||
|
fixtures.tmpDirectory,
|
||||||
|
{compressionLevel: 2}
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('supports custom retention days', async () => {
|
||||||
|
mockInputs({
|
||||||
|
[Inputs.RetentionDays]: 7
|
||||||
|
})
|
||||||
|
|
||||||
|
await run()
|
||||||
|
|
||||||
|
expect(artifact.uploadArtifact).toHaveBeenCalledWith(
|
||||||
|
fixtures.artifactName,
|
||||||
|
fixtures.filesToUpload,
|
||||||
|
fixtures.tmpDirectory,
|
||||||
|
{retentionDays: 7, compressionLevel: 6}
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('supports deleting artifacts after merge', async () => {
|
||||||
|
mockInputs({
|
||||||
|
[Inputs.DeleteMerged]: true
|
||||||
|
})
|
||||||
|
|
||||||
|
await run()
|
||||||
|
|
||||||
|
for (const a of fixtures.artifacts) {
|
||||||
|
expect(artifact.deleteArtifact).toHaveBeenCalledWith(a.name)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
133673
dist/merge/index.js
vendored
Normal file
133673
dist/merge/index.js
vendored
Normal file
File diff suppressed because one or more lines are too long
4842
dist/upload/index.js
vendored
4842
dist/upload/index.js
vendored
@ -9757,7 +9757,7 @@ const os = __importStar(__nccwpck_require__(22037));
|
|||||||
const path = __importStar(__nccwpck_require__(71017));
|
const path = __importStar(__nccwpck_require__(71017));
|
||||||
const pathHelper = __importStar(__nccwpck_require__(1849));
|
const pathHelper = __importStar(__nccwpck_require__(1849));
|
||||||
const assert_1 = __importDefault(__nccwpck_require__(39491));
|
const assert_1 = __importDefault(__nccwpck_require__(39491));
|
||||||
const minimatch_1 = __nccwpck_require__(83973);
|
const minimatch_1 = __nccwpck_require__(92680);
|
||||||
const internal_match_kind_1 = __nccwpck_require__(81063);
|
const internal_match_kind_1 = __nccwpck_require__(81063);
|
||||||
const internal_path_1 = __nccwpck_require__(96836);
|
const internal_path_1 = __nccwpck_require__(96836);
|
||||||
const IS_WINDOWS = process.platform === 'win32';
|
const IS_WINDOWS = process.platform === 'win32';
|
||||||
@ -10002,6 +10002,1168 @@ class SearchState {
|
|||||||
exports.SearchState = SearchState;
|
exports.SearchState = SearchState;
|
||||||
//# sourceMappingURL=internal-search-state.js.map
|
//# sourceMappingURL=internal-search-state.js.map
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 9144:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
var concatMap = __nccwpck_require__(86891);
|
||||||
|
var balanced = __nccwpck_require__(9417);
|
||||||
|
|
||||||
|
module.exports = expandTop;
|
||||||
|
|
||||||
|
var escSlash = '\0SLASH'+Math.random()+'\0';
|
||||||
|
var escOpen = '\0OPEN'+Math.random()+'\0';
|
||||||
|
var escClose = '\0CLOSE'+Math.random()+'\0';
|
||||||
|
var escComma = '\0COMMA'+Math.random()+'\0';
|
||||||
|
var escPeriod = '\0PERIOD'+Math.random()+'\0';
|
||||||
|
|
||||||
|
function numeric(str) {
|
||||||
|
return parseInt(str, 10) == str
|
||||||
|
? parseInt(str, 10)
|
||||||
|
: str.charCodeAt(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function escapeBraces(str) {
|
||||||
|
return str.split('\\\\').join(escSlash)
|
||||||
|
.split('\\{').join(escOpen)
|
||||||
|
.split('\\}').join(escClose)
|
||||||
|
.split('\\,').join(escComma)
|
||||||
|
.split('\\.').join(escPeriod);
|
||||||
|
}
|
||||||
|
|
||||||
|
function unescapeBraces(str) {
|
||||||
|
return str.split(escSlash).join('\\')
|
||||||
|
.split(escOpen).join('{')
|
||||||
|
.split(escClose).join('}')
|
||||||
|
.split(escComma).join(',')
|
||||||
|
.split(escPeriod).join('.');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Basically just str.split(","), but handling cases
|
||||||
|
// where we have nested braced sections, which should be
|
||||||
|
// treated as individual members, like {a,{b,c},d}
|
||||||
|
function parseCommaParts(str) {
|
||||||
|
if (!str)
|
||||||
|
return [''];
|
||||||
|
|
||||||
|
var parts = [];
|
||||||
|
var m = balanced('{', '}', str);
|
||||||
|
|
||||||
|
if (!m)
|
||||||
|
return str.split(',');
|
||||||
|
|
||||||
|
var pre = m.pre;
|
||||||
|
var body = m.body;
|
||||||
|
var post = m.post;
|
||||||
|
var p = pre.split(',');
|
||||||
|
|
||||||
|
p[p.length-1] += '{' + body + '}';
|
||||||
|
var postParts = parseCommaParts(post);
|
||||||
|
if (post.length) {
|
||||||
|
p[p.length-1] += postParts.shift();
|
||||||
|
p.push.apply(p, postParts);
|
||||||
|
}
|
||||||
|
|
||||||
|
parts.push.apply(parts, p);
|
||||||
|
|
||||||
|
return parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
function expandTop(str) {
|
||||||
|
if (!str)
|
||||||
|
return [];
|
||||||
|
|
||||||
|
// I don't know why Bash 4.3 does this, but it does.
|
||||||
|
// Anything starting with {} will have the first two bytes preserved
|
||||||
|
// but *only* at the top level, so {},a}b will not expand to anything,
|
||||||
|
// but a{},b}c will be expanded to [a}c,abc].
|
||||||
|
// One could argue that this is a bug in Bash, but since the goal of
|
||||||
|
// this module is to match Bash's rules, we escape a leading {}
|
||||||
|
if (str.substr(0, 2) === '{}') {
|
||||||
|
str = '\\{\\}' + str.substr(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
return expand(escapeBraces(str), true).map(unescapeBraces);
|
||||||
|
}
|
||||||
|
|
||||||
|
function identity(e) {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
function embrace(str) {
|
||||||
|
return '{' + str + '}';
|
||||||
|
}
|
||||||
|
function isPadded(el) {
|
||||||
|
return /^-?0\d/.test(el);
|
||||||
|
}
|
||||||
|
|
||||||
|
function lte(i, y) {
|
||||||
|
return i <= y;
|
||||||
|
}
|
||||||
|
function gte(i, y) {
|
||||||
|
return i >= y;
|
||||||
|
}
|
||||||
|
|
||||||
|
function expand(str, isTop) {
|
||||||
|
var expansions = [];
|
||||||
|
|
||||||
|
var m = balanced('{', '}', str);
|
||||||
|
if (!m || /\$$/.test(m.pre)) return [str];
|
||||||
|
|
||||||
|
var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
|
||||||
|
var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
|
||||||
|
var isSequence = isNumericSequence || isAlphaSequence;
|
||||||
|
var isOptions = m.body.indexOf(',') >= 0;
|
||||||
|
if (!isSequence && !isOptions) {
|
||||||
|
// {a},b}
|
||||||
|
if (m.post.match(/,.*\}/)) {
|
||||||
|
str = m.pre + '{' + m.body + escClose + m.post;
|
||||||
|
return expand(str);
|
||||||
|
}
|
||||||
|
return [str];
|
||||||
|
}
|
||||||
|
|
||||||
|
var n;
|
||||||
|
if (isSequence) {
|
||||||
|
n = m.body.split(/\.\./);
|
||||||
|
} else {
|
||||||
|
n = parseCommaParts(m.body);
|
||||||
|
if (n.length === 1) {
|
||||||
|
// x{{a,b}}y ==> x{a}y x{b}y
|
||||||
|
n = expand(n[0], false).map(embrace);
|
||||||
|
if (n.length === 1) {
|
||||||
|
var post = m.post.length
|
||||||
|
? expand(m.post, false)
|
||||||
|
: [''];
|
||||||
|
return post.map(function(p) {
|
||||||
|
return m.pre + n[0] + p;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// at this point, n is the parts, and we know it's not a comma set
|
||||||
|
// with a single entry.
|
||||||
|
|
||||||
|
// no need to expand pre, since it is guaranteed to be free of brace-sets
|
||||||
|
var pre = m.pre;
|
||||||
|
var post = m.post.length
|
||||||
|
? expand(m.post, false)
|
||||||
|
: [''];
|
||||||
|
|
||||||
|
var N;
|
||||||
|
|
||||||
|
if (isSequence) {
|
||||||
|
var x = numeric(n[0]);
|
||||||
|
var y = numeric(n[1]);
|
||||||
|
var width = Math.max(n[0].length, n[1].length)
|
||||||
|
var incr = n.length == 3
|
||||||
|
? Math.abs(numeric(n[2]))
|
||||||
|
: 1;
|
||||||
|
var test = lte;
|
||||||
|
var reverse = y < x;
|
||||||
|
if (reverse) {
|
||||||
|
incr *= -1;
|
||||||
|
test = gte;
|
||||||
|
}
|
||||||
|
var pad = n.some(isPadded);
|
||||||
|
|
||||||
|
N = [];
|
||||||
|
|
||||||
|
for (var i = x; test(i, y); i += incr) {
|
||||||
|
var c;
|
||||||
|
if (isAlphaSequence) {
|
||||||
|
c = String.fromCharCode(i);
|
||||||
|
if (c === '\\')
|
||||||
|
c = '';
|
||||||
|
} else {
|
||||||
|
c = String(i);
|
||||||
|
if (pad) {
|
||||||
|
var need = width - c.length;
|
||||||
|
if (need > 0) {
|
||||||
|
var z = new Array(need + 1).join('0');
|
||||||
|
if (i < 0)
|
||||||
|
c = '-' + z + c.slice(1);
|
||||||
|
else
|
||||||
|
c = z + c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
N.push(c);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
N = concatMap(n, function(el) { return expand(el, false) });
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var j = 0; j < N.length; j++) {
|
||||||
|
for (var k = 0; k < post.length; k++) {
|
||||||
|
var expansion = pre + N[j] + post[k];
|
||||||
|
if (!isTop || isSequence || expansion)
|
||||||
|
expansions.push(expansion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return expansions;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 92680:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
module.exports = minimatch
|
||||||
|
minimatch.Minimatch = Minimatch
|
||||||
|
|
||||||
|
var path = (function () { try { return __nccwpck_require__(71017) } catch (e) {}}()) || {
|
||||||
|
sep: '/'
|
||||||
|
}
|
||||||
|
minimatch.sep = path.sep
|
||||||
|
|
||||||
|
var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
|
||||||
|
var expand = __nccwpck_require__(9144)
|
||||||
|
|
||||||
|
var plTypes = {
|
||||||
|
'!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
|
||||||
|
'?': { open: '(?:', close: ')?' },
|
||||||
|
'+': { open: '(?:', close: ')+' },
|
||||||
|
'*': { open: '(?:', close: ')*' },
|
||||||
|
'@': { open: '(?:', close: ')' }
|
||||||
|
}
|
||||||
|
|
||||||
|
// any single thing other than /
|
||||||
|
// don't need to escape / when using new RegExp()
|
||||||
|
var qmark = '[^/]'
|
||||||
|
|
||||||
|
// * => any number of characters
|
||||||
|
var star = qmark + '*?'
|
||||||
|
|
||||||
|
// ** when dots are allowed. Anything goes, except .. and .
|
||||||
|
// not (^ or / followed by one or two dots followed by $ or /),
|
||||||
|
// followed by anything, any number of times.
|
||||||
|
var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'
|
||||||
|
|
||||||
|
// not a ^ or / followed by a dot,
|
||||||
|
// followed by anything, any number of times.
|
||||||
|
var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'
|
||||||
|
|
||||||
|
// characters that need to be escaped in RegExp.
|
||||||
|
var reSpecials = charSet('().*{}+?[]^$\\!')
|
||||||
|
|
||||||
|
// "abc" -> { a:true, b:true, c:true }
|
||||||
|
function charSet (s) {
|
||||||
|
return s.split('').reduce(function (set, c) {
|
||||||
|
set[c] = true
|
||||||
|
return set
|
||||||
|
}, {})
|
||||||
|
}
|
||||||
|
|
||||||
|
// normalizes slashes.
|
||||||
|
var slashSplit = /\/+/
|
||||||
|
|
||||||
|
minimatch.filter = filter
|
||||||
|
function filter (pattern, options) {
|
||||||
|
options = options || {}
|
||||||
|
return function (p, i, list) {
|
||||||
|
return minimatch(p, pattern, options)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ext (a, b) {
|
||||||
|
b = b || {}
|
||||||
|
var t = {}
|
||||||
|
Object.keys(a).forEach(function (k) {
|
||||||
|
t[k] = a[k]
|
||||||
|
})
|
||||||
|
Object.keys(b).forEach(function (k) {
|
||||||
|
t[k] = b[k]
|
||||||
|
})
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
|
minimatch.defaults = function (def) {
|
||||||
|
if (!def || typeof def !== 'object' || !Object.keys(def).length) {
|
||||||
|
return minimatch
|
||||||
|
}
|
||||||
|
|
||||||
|
var orig = minimatch
|
||||||
|
|
||||||
|
var m = function minimatch (p, pattern, options) {
|
||||||
|
return orig(p, pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Minimatch = function Minimatch (pattern, options) {
|
||||||
|
return new orig.Minimatch(pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
m.Minimatch.defaults = function defaults (options) {
|
||||||
|
return orig.defaults(ext(def, options)).Minimatch
|
||||||
|
}
|
||||||
|
|
||||||
|
m.filter = function filter (pattern, options) {
|
||||||
|
return orig.filter(pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.defaults = function defaults (options) {
|
||||||
|
return orig.defaults(ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.makeRe = function makeRe (pattern, options) {
|
||||||
|
return orig.makeRe(pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.braceExpand = function braceExpand (pattern, options) {
|
||||||
|
return orig.braceExpand(pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.match = function (list, pattern, options) {
|
||||||
|
return orig.match(list, pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.defaults = function (def) {
|
||||||
|
return minimatch.defaults(def).Minimatch
|
||||||
|
}
|
||||||
|
|
||||||
|
function minimatch (p, pattern, options) {
|
||||||
|
assertValidPattern(pattern)
|
||||||
|
|
||||||
|
if (!options) options = {}
|
||||||
|
|
||||||
|
// shortcut: comments match nothing.
|
||||||
|
if (!options.nocomment && pattern.charAt(0) === '#') {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Minimatch(pattern, options).match(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
function Minimatch (pattern, options) {
|
||||||
|
if (!(this instanceof Minimatch)) {
|
||||||
|
return new Minimatch(pattern, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
assertValidPattern(pattern)
|
||||||
|
|
||||||
|
if (!options) options = {}
|
||||||
|
|
||||||
|
pattern = pattern.trim()
|
||||||
|
|
||||||
|
// windows support: need to use /, not \
|
||||||
|
if (!options.allowWindowsEscape && path.sep !== '/') {
|
||||||
|
pattern = pattern.split(path.sep).join('/')
|
||||||
|
}
|
||||||
|
|
||||||
|
this.options = options
|
||||||
|
this.set = []
|
||||||
|
this.pattern = pattern
|
||||||
|
this.regexp = null
|
||||||
|
this.negate = false
|
||||||
|
this.comment = false
|
||||||
|
this.empty = false
|
||||||
|
this.partial = !!options.partial
|
||||||
|
|
||||||
|
// make the set of regexps etc.
|
||||||
|
this.make()
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.debug = function () {}
|
||||||
|
|
||||||
|
Minimatch.prototype.make = make
|
||||||
|
function make () {
|
||||||
|
var pattern = this.pattern
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
// empty patterns and comments match nothing.
|
||||||
|
if (!options.nocomment && pattern.charAt(0) === '#') {
|
||||||
|
this.comment = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!pattern) {
|
||||||
|
this.empty = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// step 1: figure out negation, etc.
|
||||||
|
this.parseNegate()
|
||||||
|
|
||||||
|
// step 2: expand braces
|
||||||
|
var set = this.globSet = this.braceExpand()
|
||||||
|
|
||||||
|
if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) }
|
||||||
|
|
||||||
|
this.debug(this.pattern, set)
|
||||||
|
|
||||||
|
// step 3: now we have a set, so turn each one into a series of path-portion
|
||||||
|
// matching patterns.
|
||||||
|
// These will be regexps, except in the case of "**", which is
|
||||||
|
// set to the GLOBSTAR object for globstar behavior,
|
||||||
|
// and will not contain any / characters
|
||||||
|
set = this.globParts = set.map(function (s) {
|
||||||
|
return s.split(slashSplit)
|
||||||
|
})
|
||||||
|
|
||||||
|
this.debug(this.pattern, set)
|
||||||
|
|
||||||
|
// glob --> regexps
|
||||||
|
set = set.map(function (s, si, set) {
|
||||||
|
return s.map(this.parse, this)
|
||||||
|
}, this)
|
||||||
|
|
||||||
|
this.debug(this.pattern, set)
|
||||||
|
|
||||||
|
// filter out everything that didn't compile properly.
|
||||||
|
set = set.filter(function (s) {
|
||||||
|
return s.indexOf(false) === -1
|
||||||
|
})
|
||||||
|
|
||||||
|
this.debug(this.pattern, set)
|
||||||
|
|
||||||
|
this.set = set
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.parseNegate = parseNegate
|
||||||
|
function parseNegate () {
|
||||||
|
var pattern = this.pattern
|
||||||
|
var negate = false
|
||||||
|
var options = this.options
|
||||||
|
var negateOffset = 0
|
||||||
|
|
||||||
|
if (options.nonegate) return
|
||||||
|
|
||||||
|
for (var i = 0, l = pattern.length
|
||||||
|
; i < l && pattern.charAt(i) === '!'
|
||||||
|
; i++) {
|
||||||
|
negate = !negate
|
||||||
|
negateOffset++
|
||||||
|
}
|
||||||
|
|
||||||
|
if (negateOffset) this.pattern = pattern.substr(negateOffset)
|
||||||
|
this.negate = negate
|
||||||
|
}
|
||||||
|
|
||||||
|
// Brace expansion:
|
||||||
|
// a{b,c}d -> abd acd
|
||||||
|
// a{b,}c -> abc ac
|
||||||
|
// a{0..3}d -> a0d a1d a2d a3d
|
||||||
|
// a{b,c{d,e}f}g -> abg acdfg acefg
|
||||||
|
// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
|
||||||
|
//
|
||||||
|
// Invalid sets are not expanded.
|
||||||
|
// a{2..}b -> a{2..}b
|
||||||
|
// a{b}c -> a{b}c
|
||||||
|
minimatch.braceExpand = function (pattern, options) {
|
||||||
|
return braceExpand(pattern, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.braceExpand = braceExpand
|
||||||
|
|
||||||
|
function braceExpand (pattern, options) {
|
||||||
|
if (!options) {
|
||||||
|
if (this instanceof Minimatch) {
|
||||||
|
options = this.options
|
||||||
|
} else {
|
||||||
|
options = {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pattern = typeof pattern === 'undefined'
|
||||||
|
? this.pattern : pattern
|
||||||
|
|
||||||
|
assertValidPattern(pattern)
|
||||||
|
|
||||||
|
// Thanks to Yeting Li <https://github.com/yetingli> for
|
||||||
|
// improving this regexp to avoid a ReDOS vulnerability.
|
||||||
|
if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
|
||||||
|
// shortcut. no need to expand.
|
||||||
|
return [pattern]
|
||||||
|
}
|
||||||
|
|
||||||
|
return expand(pattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
var MAX_PATTERN_LENGTH = 1024 * 64
|
||||||
|
var assertValidPattern = function (pattern) {
|
||||||
|
if (typeof pattern !== 'string') {
|
||||||
|
throw new TypeError('invalid pattern')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pattern.length > MAX_PATTERN_LENGTH) {
|
||||||
|
throw new TypeError('pattern is too long')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse a component of the expanded set.
|
||||||
|
// At this point, no pattern may contain "/" in it
|
||||||
|
// so we're going to return a 2d array, where each entry is the full
|
||||||
|
// pattern, split on '/', and then turned into a regular expression.
|
||||||
|
// A regexp is made at the end which joins each array with an
|
||||||
|
// escaped /, and another full one which joins each regexp with |.
|
||||||
|
//
|
||||||
|
// Following the lead of Bash 4.1, note that "**" only has special meaning
|
||||||
|
// when it is the *only* thing in a path portion. Otherwise, any series
|
||||||
|
// of * is equivalent to a single *. Globstar behavior is enabled by
|
||||||
|
// default, and can be disabled by setting options.noglobstar.
|
||||||
|
Minimatch.prototype.parse = parse
|
||||||
|
var SUBPARSE = {}
|
||||||
|
function parse (pattern, isSub) {
|
||||||
|
assertValidPattern(pattern)
|
||||||
|
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
// shortcuts
|
||||||
|
if (pattern === '**') {
|
||||||
|
if (!options.noglobstar)
|
||||||
|
return GLOBSTAR
|
||||||
|
else
|
||||||
|
pattern = '*'
|
||||||
|
}
|
||||||
|
if (pattern === '') return ''
|
||||||
|
|
||||||
|
var re = ''
|
||||||
|
var hasMagic = !!options.nocase
|
||||||
|
var escaping = false
|
||||||
|
// ? => one single character
|
||||||
|
var patternListStack = []
|
||||||
|
var negativeLists = []
|
||||||
|
var stateChar
|
||||||
|
var inClass = false
|
||||||
|
var reClassStart = -1
|
||||||
|
var classStart = -1
|
||||||
|
// . and .. never match anything that doesn't start with .,
|
||||||
|
// even when options.dot is set.
|
||||||
|
var patternStart = pattern.charAt(0) === '.' ? '' // anything
|
||||||
|
// not (start or / followed by . or .. followed by / or end)
|
||||||
|
: options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
|
||||||
|
: '(?!\\.)'
|
||||||
|
var self = this
|
||||||
|
|
||||||
|
function clearStateChar () {
|
||||||
|
if (stateChar) {
|
||||||
|
// we had some state-tracking character
|
||||||
|
// that wasn't consumed by this pass.
|
||||||
|
switch (stateChar) {
|
||||||
|
case '*':
|
||||||
|
re += star
|
||||||
|
hasMagic = true
|
||||||
|
break
|
||||||
|
case '?':
|
||||||
|
re += qmark
|
||||||
|
hasMagic = true
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
re += '\\' + stateChar
|
||||||
|
break
|
||||||
|
}
|
||||||
|
self.debug('clearStateChar %j %j', stateChar, re)
|
||||||
|
stateChar = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0, len = pattern.length, c
|
||||||
|
; (i < len) && (c = pattern.charAt(i))
|
||||||
|
; i++) {
|
||||||
|
this.debug('%s\t%s %s %j', pattern, i, re, c)
|
||||||
|
|
||||||
|
// skip over any that are escaped.
|
||||||
|
if (escaping && reSpecials[c]) {
|
||||||
|
re += '\\' + c
|
||||||
|
escaping = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
/* istanbul ignore next */
|
||||||
|
case '/': {
|
||||||
|
// completely not allowed, even escaped.
|
||||||
|
// Should already be path-split by now.
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
case '\\':
|
||||||
|
clearStateChar()
|
||||||
|
escaping = true
|
||||||
|
continue
|
||||||
|
|
||||||
|
// the various stateChar values
|
||||||
|
// for the "extglob" stuff.
|
||||||
|
case '?':
|
||||||
|
case '*':
|
||||||
|
case '+':
|
||||||
|
case '@':
|
||||||
|
case '!':
|
||||||
|
this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)
|
||||||
|
|
||||||
|
// all of those are literals inside a class, except that
|
||||||
|
// the glob [!a] means [^a] in regexp
|
||||||
|
if (inClass) {
|
||||||
|
this.debug(' in class')
|
||||||
|
if (c === '!' && i === classStart + 1) c = '^'
|
||||||
|
re += c
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we already have a stateChar, then it means
|
||||||
|
// that there was something like ** or +? in there.
|
||||||
|
// Handle the stateChar, then proceed with this one.
|
||||||
|
self.debug('call clearStateChar %j', stateChar)
|
||||||
|
clearStateChar()
|
||||||
|
stateChar = c
|
||||||
|
// if extglob is disabled, then +(asdf|foo) isn't a thing.
|
||||||
|
// just clear the statechar *now*, rather than even diving into
|
||||||
|
// the patternList stuff.
|
||||||
|
if (options.noext) clearStateChar()
|
||||||
|
continue
|
||||||
|
|
||||||
|
case '(':
|
||||||
|
if (inClass) {
|
||||||
|
re += '('
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stateChar) {
|
||||||
|
re += '\\('
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
patternListStack.push({
|
||||||
|
type: stateChar,
|
||||||
|
start: i - 1,
|
||||||
|
reStart: re.length,
|
||||||
|
open: plTypes[stateChar].open,
|
||||||
|
close: plTypes[stateChar].close
|
||||||
|
})
|
||||||
|
// negation is (?:(?!js)[^/]*)
|
||||||
|
re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
|
||||||
|
this.debug('plType %j %j', stateChar, re)
|
||||||
|
stateChar = false
|
||||||
|
continue
|
||||||
|
|
||||||
|
case ')':
|
||||||
|
if (inClass || !patternListStack.length) {
|
||||||
|
re += '\\)'
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
clearStateChar()
|
||||||
|
hasMagic = true
|
||||||
|
var pl = patternListStack.pop()
|
||||||
|
// negation is (?:(?!js)[^/]*)
|
||||||
|
// The others are (?:<pattern>)<type>
|
||||||
|
re += pl.close
|
||||||
|
if (pl.type === '!') {
|
||||||
|
negativeLists.push(pl)
|
||||||
|
}
|
||||||
|
pl.reEnd = re.length
|
||||||
|
continue
|
||||||
|
|
||||||
|
case '|':
|
||||||
|
if (inClass || !patternListStack.length || escaping) {
|
||||||
|
re += '\\|'
|
||||||
|
escaping = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
clearStateChar()
|
||||||
|
re += '|'
|
||||||
|
continue
|
||||||
|
|
||||||
|
// these are mostly the same in regexp and glob
|
||||||
|
case '[':
|
||||||
|
// swallow any state-tracking char before the [
|
||||||
|
clearStateChar()
|
||||||
|
|
||||||
|
if (inClass) {
|
||||||
|
re += '\\' + c
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
inClass = true
|
||||||
|
classStart = i
|
||||||
|
reClassStart = re.length
|
||||||
|
re += c
|
||||||
|
continue
|
||||||
|
|
||||||
|
case ']':
|
||||||
|
// a right bracket shall lose its special
|
||||||
|
// meaning and represent itself in
|
||||||
|
// a bracket expression if it occurs
|
||||||
|
// first in the list. -- POSIX.2 2.8.3.2
|
||||||
|
if (i === classStart + 1 || !inClass) {
|
||||||
|
re += '\\' + c
|
||||||
|
escaping = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle the case where we left a class open.
|
||||||
|
// "[z-a]" is valid, equivalent to "\[z-a\]"
|
||||||
|
// split where the last [ was, make sure we don't have
|
||||||
|
// an invalid re. if so, re-walk the contents of the
|
||||||
|
// would-be class to re-translate any characters that
|
||||||
|
// were passed through as-is
|
||||||
|
// TODO: It would probably be faster to determine this
|
||||||
|
// without a try/catch and a new RegExp, but it's tricky
|
||||||
|
// to do safely. For now, this is safe and works.
|
||||||
|
var cs = pattern.substring(classStart + 1, i)
|
||||||
|
try {
|
||||||
|
RegExp('[' + cs + ']')
|
||||||
|
} catch (er) {
|
||||||
|
// not a valid class!
|
||||||
|
var sp = this.parse(cs, SUBPARSE)
|
||||||
|
re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
|
||||||
|
hasMagic = hasMagic || sp[1]
|
||||||
|
inClass = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// finish up the class.
|
||||||
|
hasMagic = true
|
||||||
|
inClass = false
|
||||||
|
re += c
|
||||||
|
continue
|
||||||
|
|
||||||
|
default:
|
||||||
|
// swallow any state char that wasn't consumed
|
||||||
|
clearStateChar()
|
||||||
|
|
||||||
|
if (escaping) {
|
||||||
|
// no need
|
||||||
|
escaping = false
|
||||||
|
} else if (reSpecials[c]
|
||||||
|
&& !(c === '^' && inClass)) {
|
||||||
|
re += '\\'
|
||||||
|
}
|
||||||
|
|
||||||
|
re += c
|
||||||
|
|
||||||
|
} // switch
|
||||||
|
} // for
|
||||||
|
|
||||||
|
// handle the case where we left a class open.
|
||||||
|
// "[abc" is valid, equivalent to "\[abc"
|
||||||
|
if (inClass) {
|
||||||
|
// split where the last [ was, and escape it
|
||||||
|
// this is a huge pita. We now have to re-walk
|
||||||
|
// the contents of the would-be class to re-translate
|
||||||
|
// any characters that were passed through as-is
|
||||||
|
cs = pattern.substr(classStart + 1)
|
||||||
|
sp = this.parse(cs, SUBPARSE)
|
||||||
|
re = re.substr(0, reClassStart) + '\\[' + sp[0]
|
||||||
|
hasMagic = hasMagic || sp[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle the case where we had a +( thing at the *end*
|
||||||
|
// of the pattern.
|
||||||
|
// each pattern list stack adds 3 chars, and we need to go through
|
||||||
|
// and escape any | chars that were passed through as-is for the regexp.
|
||||||
|
// Go through and escape them, taking care not to double-escape any
|
||||||
|
// | chars that were already escaped.
|
||||||
|
for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
|
||||||
|
var tail = re.slice(pl.reStart + pl.open.length)
|
||||||
|
this.debug('setting tail', re, pl)
|
||||||
|
// maybe some even number of \, then maybe 1 \, followed by a |
|
||||||
|
tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
|
||||||
|
if (!$2) {
|
||||||
|
// the | isn't already escaped, so escape it.
|
||||||
|
$2 = '\\'
|
||||||
|
}
|
||||||
|
|
||||||
|
// need to escape all those slashes *again*, without escaping the
|
||||||
|
// one that we need for escaping the | character. As it works out,
|
||||||
|
// escaping an even number of slashes can be done by simply repeating
|
||||||
|
// it exactly after itself. That's why this trick works.
|
||||||
|
//
|
||||||
|
// I am sorry that you have to see this.
|
||||||
|
return $1 + $1 + $2 + '|'
|
||||||
|
})
|
||||||
|
|
||||||
|
this.debug('tail=%j\n %s', tail, tail, pl, re)
|
||||||
|
var t = pl.type === '*' ? star
|
||||||
|
: pl.type === '?' ? qmark
|
||||||
|
: '\\' + pl.type
|
||||||
|
|
||||||
|
hasMagic = true
|
||||||
|
re = re.slice(0, pl.reStart) + t + '\\(' + tail
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle trailing things that only matter at the very end.
|
||||||
|
clearStateChar()
|
||||||
|
if (escaping) {
|
||||||
|
// trailing \\
|
||||||
|
re += '\\\\'
|
||||||
|
}
|
||||||
|
|
||||||
|
// only need to apply the nodot start if the re starts with
|
||||||
|
// something that could conceivably capture a dot
|
||||||
|
var addPatternStart = false
|
||||||
|
switch (re.charAt(0)) {
|
||||||
|
case '[': case '.': case '(': addPatternStart = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hack to work around lack of negative lookbehind in JS
|
||||||
|
// A pattern like: *.!(x).!(y|z) needs to ensure that a name
|
||||||
|
// like 'a.xyz.yz' doesn't match. So, the first negative
|
||||||
|
// lookahead, has to look ALL the way ahead, to the end of
|
||||||
|
// the pattern.
|
||||||
|
for (var n = negativeLists.length - 1; n > -1; n--) {
|
||||||
|
var nl = negativeLists[n]
|
||||||
|
|
||||||
|
var nlBefore = re.slice(0, nl.reStart)
|
||||||
|
var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
|
||||||
|
var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
|
||||||
|
var nlAfter = re.slice(nl.reEnd)
|
||||||
|
|
||||||
|
nlLast += nlAfter
|
||||||
|
|
||||||
|
// Handle nested stuff like *(*.js|!(*.json)), where open parens
|
||||||
|
// mean that we should *not* include the ) in the bit that is considered
|
||||||
|
// "after" the negated section.
|
||||||
|
var openParensBefore = nlBefore.split('(').length - 1
|
||||||
|
var cleanAfter = nlAfter
|
||||||
|
for (i = 0; i < openParensBefore; i++) {
|
||||||
|
cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
|
||||||
|
}
|
||||||
|
nlAfter = cleanAfter
|
||||||
|
|
||||||
|
var dollar = ''
|
||||||
|
if (nlAfter === '' && isSub !== SUBPARSE) {
|
||||||
|
dollar = '$'
|
||||||
|
}
|
||||||
|
var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
|
||||||
|
re = newRe
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the re is not "" at this point, then we need to make sure
|
||||||
|
// it doesn't match against an empty path part.
|
||||||
|
// Otherwise a/* will match a/, which it should not.
|
||||||
|
if (re !== '' && hasMagic) {
|
||||||
|
re = '(?=.)' + re
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addPatternStart) {
|
||||||
|
re = patternStart + re
|
||||||
|
}
|
||||||
|
|
||||||
|
// parsing just a piece of a larger pattern.
|
||||||
|
if (isSub === SUBPARSE) {
|
||||||
|
return [re, hasMagic]
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip the regexp for non-magical patterns
|
||||||
|
// unescape anything in it, though, so that it'll be
|
||||||
|
// an exact match against a file etc.
|
||||||
|
if (!hasMagic) {
|
||||||
|
return globUnescape(pattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
var flags = options.nocase ? 'i' : ''
|
||||||
|
try {
|
||||||
|
var regExp = new RegExp('^' + re + '$', flags)
|
||||||
|
} catch (er) /* istanbul ignore next - should be impossible */ {
|
||||||
|
// If it was an invalid regular expression, then it can't match
|
||||||
|
// anything. This trick looks for a character after the end of
|
||||||
|
// the string, which is of course impossible, except in multi-line
|
||||||
|
// mode, but it's not a /m regex.
|
||||||
|
return new RegExp('$.')
|
||||||
|
}
|
||||||
|
|
||||||
|
regExp._glob = pattern
|
||||||
|
regExp._src = re
|
||||||
|
|
||||||
|
return regExp
|
||||||
|
}
|
||||||
|
|
||||||
|
minimatch.makeRe = function (pattern, options) {
|
||||||
|
return new Minimatch(pattern, options || {}).makeRe()
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.makeRe = makeRe
|
||||||
|
function makeRe () {
|
||||||
|
if (this.regexp || this.regexp === false) return this.regexp
|
||||||
|
|
||||||
|
// at this point, this.set is a 2d array of partial
|
||||||
|
// pattern strings, or "**".
|
||||||
|
//
|
||||||
|
// It's better to use .match(). This function shouldn't
|
||||||
|
// be used, really, but it's pretty convenient sometimes,
|
||||||
|
// when you just want to work with a regex.
|
||||||
|
var set = this.set
|
||||||
|
|
||||||
|
if (!set.length) {
|
||||||
|
this.regexp = false
|
||||||
|
return this.regexp
|
||||||
|
}
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
var twoStar = options.noglobstar ? star
|
||||||
|
: options.dot ? twoStarDot
|
||||||
|
: twoStarNoDot
|
||||||
|
var flags = options.nocase ? 'i' : ''
|
||||||
|
|
||||||
|
var re = set.map(function (pattern) {
|
||||||
|
return pattern.map(function (p) {
|
||||||
|
return (p === GLOBSTAR) ? twoStar
|
||||||
|
: (typeof p === 'string') ? regExpEscape(p)
|
||||||
|
: p._src
|
||||||
|
}).join('\\\/')
|
||||||
|
}).join('|')
|
||||||
|
|
||||||
|
// must match entire pattern
|
||||||
|
// ending in a * or ** will make it less strict.
|
||||||
|
re = '^(?:' + re + ')$'
|
||||||
|
|
||||||
|
// can match anything, as long as it's not this.
|
||||||
|
if (this.negate) re = '^(?!' + re + ').*$'
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.regexp = new RegExp(re, flags)
|
||||||
|
} catch (ex) /* istanbul ignore next - should be impossible */ {
|
||||||
|
this.regexp = false
|
||||||
|
}
|
||||||
|
return this.regexp
|
||||||
|
}
|
||||||
|
|
||||||
|
minimatch.match = function (list, pattern, options) {
|
||||||
|
options = options || {}
|
||||||
|
var mm = new Minimatch(pattern, options)
|
||||||
|
list = list.filter(function (f) {
|
||||||
|
return mm.match(f)
|
||||||
|
})
|
||||||
|
if (mm.options.nonull && !list.length) {
|
||||||
|
list.push(pattern)
|
||||||
|
}
|
||||||
|
return list
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.match = function match (f, partial) {
|
||||||
|
if (typeof partial === 'undefined') partial = this.partial
|
||||||
|
this.debug('match', f, this.pattern)
|
||||||
|
// short-circuit in the case of busted things.
|
||||||
|
// comments, etc.
|
||||||
|
if (this.comment) return false
|
||||||
|
if (this.empty) return f === ''
|
||||||
|
|
||||||
|
if (f === '/' && partial) return true
|
||||||
|
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
// windows: need to use /, not \
|
||||||
|
if (path.sep !== '/') {
|
||||||
|
f = f.split(path.sep).join('/')
|
||||||
|
}
|
||||||
|
|
||||||
|
// treat the test path as a set of pathparts.
|
||||||
|
f = f.split(slashSplit)
|
||||||
|
this.debug(this.pattern, 'split', f)
|
||||||
|
|
||||||
|
// just ONE of the pattern sets in this.set needs to match
|
||||||
|
// in order for it to be valid. If negating, then just one
|
||||||
|
// match means that we have failed.
|
||||||
|
// Either way, return on the first hit.
|
||||||
|
|
||||||
|
var set = this.set
|
||||||
|
this.debug(this.pattern, 'set', set)
|
||||||
|
|
||||||
|
// Find the basename of the path by looking for the last non-empty segment
|
||||||
|
var filename
|
||||||
|
var i
|
||||||
|
for (i = f.length - 1; i >= 0; i--) {
|
||||||
|
filename = f[i]
|
||||||
|
if (filename) break
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < set.length; i++) {
|
||||||
|
var pattern = set[i]
|
||||||
|
var file = f
|
||||||
|
if (options.matchBase && pattern.length === 1) {
|
||||||
|
file = [filename]
|
||||||
|
}
|
||||||
|
var hit = this.matchOne(file, pattern, partial)
|
||||||
|
if (hit) {
|
||||||
|
if (options.flipNegate) return true
|
||||||
|
return !this.negate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// didn't get any hits. this is success if it's a negative
|
||||||
|
// pattern, failure otherwise.
|
||||||
|
if (options.flipNegate) return false
|
||||||
|
return this.negate
|
||||||
|
}
|
||||||
|
|
||||||
|
// set partial to true to test if, for example,
|
||||||
|
// "/a/b" matches the start of "/*/b/*/d"
|
||||||
|
// Partial means, if you run out of file before you run
|
||||||
|
// out of pattern, then that's fine, as long as all
|
||||||
|
// the parts match.
|
||||||
|
Minimatch.prototype.matchOne = function (file, pattern, partial) {
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
this.debug('matchOne',
|
||||||
|
{ 'this': this, file: file, pattern: pattern })
|
||||||
|
|
||||||
|
this.debug('matchOne', file.length, pattern.length)
|
||||||
|
|
||||||
|
for (var fi = 0,
|
||||||
|
pi = 0,
|
||||||
|
fl = file.length,
|
||||||
|
pl = pattern.length
|
||||||
|
; (fi < fl) && (pi < pl)
|
||||||
|
; fi++, pi++) {
|
||||||
|
this.debug('matchOne loop')
|
||||||
|
var p = pattern[pi]
|
||||||
|
var f = file[fi]
|
||||||
|
|
||||||
|
this.debug(pattern, p, f)
|
||||||
|
|
||||||
|
// should be impossible.
|
||||||
|
// some invalid regexp stuff in the set.
|
||||||
|
/* istanbul ignore if */
|
||||||
|
if (p === false) return false
|
||||||
|
|
||||||
|
if (p === GLOBSTAR) {
|
||||||
|
this.debug('GLOBSTAR', [pattern, p, f])
|
||||||
|
|
||||||
|
// "**"
|
||||||
|
// a/**/b/**/c would match the following:
|
||||||
|
// a/b/x/y/z/c
|
||||||
|
// a/x/y/z/b/c
|
||||||
|
// a/b/x/b/x/c
|
||||||
|
// a/b/c
|
||||||
|
// To do this, take the rest of the pattern after
|
||||||
|
// the **, and see if it would match the file remainder.
|
||||||
|
// If so, return success.
|
||||||
|
// If not, the ** "swallows" a segment, and try again.
|
||||||
|
// This is recursively awful.
|
||||||
|
//
|
||||||
|
// a/**/b/**/c matching a/b/x/y/z/c
|
||||||
|
// - a matches a
|
||||||
|
// - doublestar
|
||||||
|
// - matchOne(b/x/y/z/c, b/**/c)
|
||||||
|
// - b matches b
|
||||||
|
// - doublestar
|
||||||
|
// - matchOne(x/y/z/c, c) -> no
|
||||||
|
// - matchOne(y/z/c, c) -> no
|
||||||
|
// - matchOne(z/c, c) -> no
|
||||||
|
// - matchOne(c, c) yes, hit
|
||||||
|
var fr = fi
|
||||||
|
var pr = pi + 1
|
||||||
|
if (pr === pl) {
|
||||||
|
this.debug('** at the end')
|
||||||
|
// a ** at the end will just swallow the rest.
|
||||||
|
// We have found a match.
|
||||||
|
// however, it will not swallow /.x, unless
|
||||||
|
// options.dot is set.
|
||||||
|
// . and .. are *never* matched by **, for explosively
|
||||||
|
// exponential reasons.
|
||||||
|
for (; fi < fl; fi++) {
|
||||||
|
if (file[fi] === '.' || file[fi] === '..' ||
|
||||||
|
(!options.dot && file[fi].charAt(0) === '.')) return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// ok, let's see if we can swallow whatever we can.
|
||||||
|
while (fr < fl) {
|
||||||
|
var swallowee = file[fr]
|
||||||
|
|
||||||
|
this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)
|
||||||
|
|
||||||
|
// XXX remove this slice. Just pass the start index.
|
||||||
|
if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
|
||||||
|
this.debug('globstar found match!', fr, fl, swallowee)
|
||||||
|
// found a match.
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
// can't swallow "." or ".." ever.
|
||||||
|
// can only swallow ".foo" when explicitly asked.
|
||||||
|
if (swallowee === '.' || swallowee === '..' ||
|
||||||
|
(!options.dot && swallowee.charAt(0) === '.')) {
|
||||||
|
this.debug('dot detected!', file, fr, pattern, pr)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
// ** swallows a segment, and continue.
|
||||||
|
this.debug('globstar swallow a segment, and continue')
|
||||||
|
fr++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// no match was found.
|
||||||
|
// However, in partial mode, we can't say this is necessarily over.
|
||||||
|
// If there's more *pattern* left, then
|
||||||
|
/* istanbul ignore if */
|
||||||
|
if (partial) {
|
||||||
|
// ran out of file
|
||||||
|
this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
|
||||||
|
if (fr === fl) return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// something other than **
|
||||||
|
// non-magic patterns just have to match exactly
|
||||||
|
// patterns with magic have been turned into regexps.
|
||||||
|
var hit
|
||||||
|
if (typeof p === 'string') {
|
||||||
|
hit = f === p
|
||||||
|
this.debug('string match', p, f, hit)
|
||||||
|
} else {
|
||||||
|
hit = f.match(p)
|
||||||
|
this.debug('pattern match', p, f, hit)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hit) return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note: ending in / means that we'll get a final ""
|
||||||
|
// at the end of the pattern. This can only match a
|
||||||
|
// corresponding "" at the end of the file.
|
||||||
|
// If the file ends in /, then it can only match a
|
||||||
|
// a pattern that ends in /, unless the pattern just
|
||||||
|
// doesn't have any more for it. But, a/b/ should *not*
|
||||||
|
// match "a/b/*", even though "" matches against the
|
||||||
|
// [^/]*? pattern, except in partial mode, where it might
|
||||||
|
// simply not be reached yet.
|
||||||
|
// However, a/b/ should still satisfy a/*
|
||||||
|
|
||||||
|
// now either we fell off the end of the pattern, or we're done.
|
||||||
|
if (fi === fl && pi === pl) {
|
||||||
|
// ran out of pattern and filename at the same time.
|
||||||
|
// an exact hit!
|
||||||
|
return true
|
||||||
|
} else if (fi === fl) {
|
||||||
|
// ran out of file, but still had pattern left.
|
||||||
|
// this is ok if we're doing the match as part of
|
||||||
|
// a glob fs traversal.
|
||||||
|
return partial
|
||||||
|
} else /* istanbul ignore else */ if (pi === pl) {
|
||||||
|
// ran out of pattern, still have file left.
|
||||||
|
// this is only acceptable if we're on the very last
|
||||||
|
// empty segment of a file with a trailing slash.
|
||||||
|
// a/* should match a/b/
|
||||||
|
return (fi === fl - 1) && (file[fi] === '')
|
||||||
|
}
|
||||||
|
|
||||||
|
// should be unreachable.
|
||||||
|
/* istanbul ignore next */
|
||||||
|
throw new Error('wtf?')
|
||||||
|
}
|
||||||
|
|
||||||
|
// replace stuff like \* with *
|
||||||
|
function globUnescape (s) {
|
||||||
|
return s.replace(/\\(.)/g, '$1')
|
||||||
|
}
|
||||||
|
|
||||||
|
function regExpEscape (s) {
|
||||||
|
return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 35526:
|
/***/ 35526:
|
||||||
@ -54585,6 +55747,214 @@ utils.walkdir = function(dirpath, base, callback) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 58311:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
var concatMap = __nccwpck_require__(86891);
|
||||||
|
var balanced = __nccwpck_require__(9417);
|
||||||
|
|
||||||
|
module.exports = expandTop;
|
||||||
|
|
||||||
|
var escSlash = '\0SLASH'+Math.random()+'\0';
|
||||||
|
var escOpen = '\0OPEN'+Math.random()+'\0';
|
||||||
|
var escClose = '\0CLOSE'+Math.random()+'\0';
|
||||||
|
var escComma = '\0COMMA'+Math.random()+'\0';
|
||||||
|
var escPeriod = '\0PERIOD'+Math.random()+'\0';
|
||||||
|
|
||||||
|
function numeric(str) {
|
||||||
|
return parseInt(str, 10) == str
|
||||||
|
? parseInt(str, 10)
|
||||||
|
: str.charCodeAt(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function escapeBraces(str) {
|
||||||
|
return str.split('\\\\').join(escSlash)
|
||||||
|
.split('\\{').join(escOpen)
|
||||||
|
.split('\\}').join(escClose)
|
||||||
|
.split('\\,').join(escComma)
|
||||||
|
.split('\\.').join(escPeriod);
|
||||||
|
}
|
||||||
|
|
||||||
|
function unescapeBraces(str) {
|
||||||
|
return str.split(escSlash).join('\\')
|
||||||
|
.split(escOpen).join('{')
|
||||||
|
.split(escClose).join('}')
|
||||||
|
.split(escComma).join(',')
|
||||||
|
.split(escPeriod).join('.');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Basically just str.split(","), but handling cases
|
||||||
|
// where we have nested braced sections, which should be
|
||||||
|
// treated as individual members, like {a,{b,c},d}
|
||||||
|
function parseCommaParts(str) {
|
||||||
|
if (!str)
|
||||||
|
return [''];
|
||||||
|
|
||||||
|
var parts = [];
|
||||||
|
var m = balanced('{', '}', str);
|
||||||
|
|
||||||
|
if (!m)
|
||||||
|
return str.split(',');
|
||||||
|
|
||||||
|
var pre = m.pre;
|
||||||
|
var body = m.body;
|
||||||
|
var post = m.post;
|
||||||
|
var p = pre.split(',');
|
||||||
|
|
||||||
|
p[p.length-1] += '{' + body + '}';
|
||||||
|
var postParts = parseCommaParts(post);
|
||||||
|
if (post.length) {
|
||||||
|
p[p.length-1] += postParts.shift();
|
||||||
|
p.push.apply(p, postParts);
|
||||||
|
}
|
||||||
|
|
||||||
|
parts.push.apply(parts, p);
|
||||||
|
|
||||||
|
return parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
function expandTop(str) {
|
||||||
|
if (!str)
|
||||||
|
return [];
|
||||||
|
|
||||||
|
// I don't know why Bash 4.3 does this, but it does.
|
||||||
|
// Anything starting with {} will have the first two bytes preserved
|
||||||
|
// but *only* at the top level, so {},a}b will not expand to anything,
|
||||||
|
// but a{},b}c will be expanded to [a}c,abc].
|
||||||
|
// One could argue that this is a bug in Bash, but since the goal of
|
||||||
|
// this module is to match Bash's rules, we escape a leading {}
|
||||||
|
if (str.substr(0, 2) === '{}') {
|
||||||
|
str = '\\{\\}' + str.substr(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
return expand(escapeBraces(str), true).map(unescapeBraces);
|
||||||
|
}
|
||||||
|
|
||||||
|
function identity(e) {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
function embrace(str) {
|
||||||
|
return '{' + str + '}';
|
||||||
|
}
|
||||||
|
function isPadded(el) {
|
||||||
|
return /^-?0\d/.test(el);
|
||||||
|
}
|
||||||
|
|
||||||
|
function lte(i, y) {
|
||||||
|
return i <= y;
|
||||||
|
}
|
||||||
|
function gte(i, y) {
|
||||||
|
return i >= y;
|
||||||
|
}
|
||||||
|
|
||||||
|
function expand(str, isTop) {
|
||||||
|
var expansions = [];
|
||||||
|
|
||||||
|
var m = balanced('{', '}', str);
|
||||||
|
if (!m || /\$$/.test(m.pre)) return [str];
|
||||||
|
|
||||||
|
var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
|
||||||
|
var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
|
||||||
|
var isSequence = isNumericSequence || isAlphaSequence;
|
||||||
|
var isOptions = m.body.indexOf(',') >= 0;
|
||||||
|
if (!isSequence && !isOptions) {
|
||||||
|
// {a},b}
|
||||||
|
if (m.post.match(/,.*\}/)) {
|
||||||
|
str = m.pre + '{' + m.body + escClose + m.post;
|
||||||
|
return expand(str);
|
||||||
|
}
|
||||||
|
return [str];
|
||||||
|
}
|
||||||
|
|
||||||
|
var n;
|
||||||
|
if (isSequence) {
|
||||||
|
n = m.body.split(/\.\./);
|
||||||
|
} else {
|
||||||
|
n = parseCommaParts(m.body);
|
||||||
|
if (n.length === 1) {
|
||||||
|
// x{{a,b}}y ==> x{a}y x{b}y
|
||||||
|
n = expand(n[0], false).map(embrace);
|
||||||
|
if (n.length === 1) {
|
||||||
|
var post = m.post.length
|
||||||
|
? expand(m.post, false)
|
||||||
|
: [''];
|
||||||
|
return post.map(function(p) {
|
||||||
|
return m.pre + n[0] + p;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// at this point, n is the parts, and we know it's not a comma set
|
||||||
|
// with a single entry.
|
||||||
|
|
||||||
|
// no need to expand pre, since it is guaranteed to be free of brace-sets
|
||||||
|
var pre = m.pre;
|
||||||
|
var post = m.post.length
|
||||||
|
? expand(m.post, false)
|
||||||
|
: [''];
|
||||||
|
|
||||||
|
var N;
|
||||||
|
|
||||||
|
if (isSequence) {
|
||||||
|
var x = numeric(n[0]);
|
||||||
|
var y = numeric(n[1]);
|
||||||
|
var width = Math.max(n[0].length, n[1].length)
|
||||||
|
var incr = n.length == 3
|
||||||
|
? Math.abs(numeric(n[2]))
|
||||||
|
: 1;
|
||||||
|
var test = lte;
|
||||||
|
var reverse = y < x;
|
||||||
|
if (reverse) {
|
||||||
|
incr *= -1;
|
||||||
|
test = gte;
|
||||||
|
}
|
||||||
|
var pad = n.some(isPadded);
|
||||||
|
|
||||||
|
N = [];
|
||||||
|
|
||||||
|
for (var i = x; test(i, y); i += incr) {
|
||||||
|
var c;
|
||||||
|
if (isAlphaSequence) {
|
||||||
|
c = String.fromCharCode(i);
|
||||||
|
if (c === '\\')
|
||||||
|
c = '';
|
||||||
|
} else {
|
||||||
|
c = String(i);
|
||||||
|
if (pad) {
|
||||||
|
var need = width - c.length;
|
||||||
|
if (need > 0) {
|
||||||
|
var z = new Array(need + 1).join('0');
|
||||||
|
if (i < 0)
|
||||||
|
c = '-' + z + c.slice(1);
|
||||||
|
else
|
||||||
|
c = z + c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
N.push(c);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
N = concatMap(n, function(el) { return expand(el, false) });
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var j = 0; j < N.length; j++) {
|
||||||
|
for (var k = 0; k < post.length; k++) {
|
||||||
|
var expansion = pre + N[j] + post[k];
|
||||||
|
if (!isTop || isSequence || expansion)
|
||||||
|
expansions.push(expansion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return expansions;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 84938:
|
/***/ 84938:
|
||||||
@ -54604,7 +55974,7 @@ function ownProp (obj, field) {
|
|||||||
|
|
||||||
var fs = __nccwpck_require__(57147)
|
var fs = __nccwpck_require__(57147)
|
||||||
var path = __nccwpck_require__(71017)
|
var path = __nccwpck_require__(71017)
|
||||||
var minimatch = __nccwpck_require__(83973)
|
var minimatch = __nccwpck_require__(8487)
|
||||||
var isAbsolute = __nccwpck_require__(38714)
|
var isAbsolute = __nccwpck_require__(38714)
|
||||||
var Minimatch = minimatch.Minimatch
|
var Minimatch = minimatch.Minimatch
|
||||||
|
|
||||||
@ -54878,7 +56248,7 @@ function childrenIgnored (self, path) {
|
|||||||
module.exports = glob
|
module.exports = glob
|
||||||
|
|
||||||
var rp = __nccwpck_require__(46863)
|
var rp = __nccwpck_require__(46863)
|
||||||
var minimatch = __nccwpck_require__(83973)
|
var minimatch = __nccwpck_require__(8487)
|
||||||
var Minimatch = minimatch.Minimatch
|
var Minimatch = minimatch.Minimatch
|
||||||
var inherits = __nccwpck_require__(44124)
|
var inherits = __nccwpck_require__(44124)
|
||||||
var EE = (__nccwpck_require__(82361).EventEmitter)
|
var EE = (__nccwpck_require__(82361).EventEmitter)
|
||||||
@ -55636,7 +57006,7 @@ module.exports = globSync
|
|||||||
globSync.GlobSync = GlobSync
|
globSync.GlobSync = GlobSync
|
||||||
|
|
||||||
var rp = __nccwpck_require__(46863)
|
var rp = __nccwpck_require__(46863)
|
||||||
var minimatch = __nccwpck_require__(83973)
|
var minimatch = __nccwpck_require__(8487)
|
||||||
var Minimatch = minimatch.Minimatch
|
var Minimatch = minimatch.Minimatch
|
||||||
var Glob = (__nccwpck_require__(30095).Glob)
|
var Glob = (__nccwpck_require__(30095).Glob)
|
||||||
var util = __nccwpck_require__(73837)
|
var util = __nccwpck_require__(73837)
|
||||||
@ -56120,6 +57490,960 @@ GlobSync.prototype._makeAbs = function (f) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 8487:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
module.exports = minimatch
|
||||||
|
minimatch.Minimatch = Minimatch
|
||||||
|
|
||||||
|
var path = (function () { try { return __nccwpck_require__(71017) } catch (e) {}}()) || {
|
||||||
|
sep: '/'
|
||||||
|
}
|
||||||
|
minimatch.sep = path.sep
|
||||||
|
|
||||||
|
var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
|
||||||
|
var expand = __nccwpck_require__(58311)
|
||||||
|
|
||||||
|
var plTypes = {
|
||||||
|
'!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
|
||||||
|
'?': { open: '(?:', close: ')?' },
|
||||||
|
'+': { open: '(?:', close: ')+' },
|
||||||
|
'*': { open: '(?:', close: ')*' },
|
||||||
|
'@': { open: '(?:', close: ')' }
|
||||||
|
}
|
||||||
|
|
||||||
|
// any single thing other than /
|
||||||
|
// don't need to escape / when using new RegExp()
|
||||||
|
var qmark = '[^/]'
|
||||||
|
|
||||||
|
// * => any number of characters
|
||||||
|
var star = qmark + '*?'
|
||||||
|
|
||||||
|
// ** when dots are allowed. Anything goes, except .. and .
|
||||||
|
// not (^ or / followed by one or two dots followed by $ or /),
|
||||||
|
// followed by anything, any number of times.
|
||||||
|
var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'
|
||||||
|
|
||||||
|
// not a ^ or / followed by a dot,
|
||||||
|
// followed by anything, any number of times.
|
||||||
|
var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'
|
||||||
|
|
||||||
|
// characters that need to be escaped in RegExp.
|
||||||
|
var reSpecials = charSet('().*{}+?[]^$\\!')
|
||||||
|
|
||||||
|
// "abc" -> { a:true, b:true, c:true }
|
||||||
|
function charSet (s) {
|
||||||
|
return s.split('').reduce(function (set, c) {
|
||||||
|
set[c] = true
|
||||||
|
return set
|
||||||
|
}, {})
|
||||||
|
}
|
||||||
|
|
||||||
|
// normalizes slashes.
|
||||||
|
var slashSplit = /\/+/
|
||||||
|
|
||||||
|
minimatch.filter = filter
|
||||||
|
function filter (pattern, options) {
|
||||||
|
options = options || {}
|
||||||
|
return function (p, i, list) {
|
||||||
|
return minimatch(p, pattern, options)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ext (a, b) {
|
||||||
|
b = b || {}
|
||||||
|
var t = {}
|
||||||
|
Object.keys(a).forEach(function (k) {
|
||||||
|
t[k] = a[k]
|
||||||
|
})
|
||||||
|
Object.keys(b).forEach(function (k) {
|
||||||
|
t[k] = b[k]
|
||||||
|
})
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
|
minimatch.defaults = function (def) {
|
||||||
|
if (!def || typeof def !== 'object' || !Object.keys(def).length) {
|
||||||
|
return minimatch
|
||||||
|
}
|
||||||
|
|
||||||
|
var orig = minimatch
|
||||||
|
|
||||||
|
var m = function minimatch (p, pattern, options) {
|
||||||
|
return orig(p, pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Minimatch = function Minimatch (pattern, options) {
|
||||||
|
return new orig.Minimatch(pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
m.Minimatch.defaults = function defaults (options) {
|
||||||
|
return orig.defaults(ext(def, options)).Minimatch
|
||||||
|
}
|
||||||
|
|
||||||
|
m.filter = function filter (pattern, options) {
|
||||||
|
return orig.filter(pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.defaults = function defaults (options) {
|
||||||
|
return orig.defaults(ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.makeRe = function makeRe (pattern, options) {
|
||||||
|
return orig.makeRe(pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.braceExpand = function braceExpand (pattern, options) {
|
||||||
|
return orig.braceExpand(pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.match = function (list, pattern, options) {
|
||||||
|
return orig.match(list, pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.defaults = function (def) {
|
||||||
|
return minimatch.defaults(def).Minimatch
|
||||||
|
}
|
||||||
|
|
||||||
|
function minimatch (p, pattern, options) {
|
||||||
|
assertValidPattern(pattern)
|
||||||
|
|
||||||
|
if (!options) options = {}
|
||||||
|
|
||||||
|
// shortcut: comments match nothing.
|
||||||
|
if (!options.nocomment && pattern.charAt(0) === '#') {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Minimatch(pattern, options).match(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
function Minimatch (pattern, options) {
|
||||||
|
if (!(this instanceof Minimatch)) {
|
||||||
|
return new Minimatch(pattern, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
assertValidPattern(pattern)
|
||||||
|
|
||||||
|
if (!options) options = {}
|
||||||
|
|
||||||
|
pattern = pattern.trim()
|
||||||
|
|
||||||
|
// windows support: need to use /, not \
|
||||||
|
if (!options.allowWindowsEscape && path.sep !== '/') {
|
||||||
|
pattern = pattern.split(path.sep).join('/')
|
||||||
|
}
|
||||||
|
|
||||||
|
this.options = options
|
||||||
|
this.set = []
|
||||||
|
this.pattern = pattern
|
||||||
|
this.regexp = null
|
||||||
|
this.negate = false
|
||||||
|
this.comment = false
|
||||||
|
this.empty = false
|
||||||
|
this.partial = !!options.partial
|
||||||
|
|
||||||
|
// make the set of regexps etc.
|
||||||
|
this.make()
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.debug = function () {}
|
||||||
|
|
||||||
|
Minimatch.prototype.make = make
|
||||||
|
function make () {
|
||||||
|
var pattern = this.pattern
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
// empty patterns and comments match nothing.
|
||||||
|
if (!options.nocomment && pattern.charAt(0) === '#') {
|
||||||
|
this.comment = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!pattern) {
|
||||||
|
this.empty = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// step 1: figure out negation, etc.
|
||||||
|
this.parseNegate()
|
||||||
|
|
||||||
|
// step 2: expand braces
|
||||||
|
var set = this.globSet = this.braceExpand()
|
||||||
|
|
||||||
|
if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) }
|
||||||
|
|
||||||
|
this.debug(this.pattern, set)
|
||||||
|
|
||||||
|
// step 3: now we have a set, so turn each one into a series of path-portion
|
||||||
|
// matching patterns.
|
||||||
|
// These will be regexps, except in the case of "**", which is
|
||||||
|
// set to the GLOBSTAR object for globstar behavior,
|
||||||
|
// and will not contain any / characters
|
||||||
|
set = this.globParts = set.map(function (s) {
|
||||||
|
return s.split(slashSplit)
|
||||||
|
})
|
||||||
|
|
||||||
|
this.debug(this.pattern, set)
|
||||||
|
|
||||||
|
// glob --> regexps
|
||||||
|
set = set.map(function (s, si, set) {
|
||||||
|
return s.map(this.parse, this)
|
||||||
|
}, this)
|
||||||
|
|
||||||
|
this.debug(this.pattern, set)
|
||||||
|
|
||||||
|
// filter out everything that didn't compile properly.
|
||||||
|
set = set.filter(function (s) {
|
||||||
|
return s.indexOf(false) === -1
|
||||||
|
})
|
||||||
|
|
||||||
|
this.debug(this.pattern, set)
|
||||||
|
|
||||||
|
this.set = set
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.parseNegate = parseNegate
|
||||||
|
function parseNegate () {
|
||||||
|
var pattern = this.pattern
|
||||||
|
var negate = false
|
||||||
|
var options = this.options
|
||||||
|
var negateOffset = 0
|
||||||
|
|
||||||
|
if (options.nonegate) return
|
||||||
|
|
||||||
|
for (var i = 0, l = pattern.length
|
||||||
|
; i < l && pattern.charAt(i) === '!'
|
||||||
|
; i++) {
|
||||||
|
negate = !negate
|
||||||
|
negateOffset++
|
||||||
|
}
|
||||||
|
|
||||||
|
if (negateOffset) this.pattern = pattern.substr(negateOffset)
|
||||||
|
this.negate = negate
|
||||||
|
}
|
||||||
|
|
||||||
|
// Brace expansion:
|
||||||
|
// a{b,c}d -> abd acd
|
||||||
|
// a{b,}c -> abc ac
|
||||||
|
// a{0..3}d -> a0d a1d a2d a3d
|
||||||
|
// a{b,c{d,e}f}g -> abg acdfg acefg
|
||||||
|
// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
|
||||||
|
//
|
||||||
|
// Invalid sets are not expanded.
|
||||||
|
// a{2..}b -> a{2..}b
|
||||||
|
// a{b}c -> a{b}c
|
||||||
|
minimatch.braceExpand = function (pattern, options) {
|
||||||
|
return braceExpand(pattern, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.braceExpand = braceExpand
|
||||||
|
|
||||||
|
function braceExpand (pattern, options) {
|
||||||
|
if (!options) {
|
||||||
|
if (this instanceof Minimatch) {
|
||||||
|
options = this.options
|
||||||
|
} else {
|
||||||
|
options = {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pattern = typeof pattern === 'undefined'
|
||||||
|
? this.pattern : pattern
|
||||||
|
|
||||||
|
assertValidPattern(pattern)
|
||||||
|
|
||||||
|
// Thanks to Yeting Li <https://github.com/yetingli> for
|
||||||
|
// improving this regexp to avoid a ReDOS vulnerability.
|
||||||
|
if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
|
||||||
|
// shortcut. no need to expand.
|
||||||
|
return [pattern]
|
||||||
|
}
|
||||||
|
|
||||||
|
return expand(pattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
var MAX_PATTERN_LENGTH = 1024 * 64
|
||||||
|
var assertValidPattern = function (pattern) {
|
||||||
|
if (typeof pattern !== 'string') {
|
||||||
|
throw new TypeError('invalid pattern')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pattern.length > MAX_PATTERN_LENGTH) {
|
||||||
|
throw new TypeError('pattern is too long')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse a component of the expanded set.
|
||||||
|
// At this point, no pattern may contain "/" in it
|
||||||
|
// so we're going to return a 2d array, where each entry is the full
|
||||||
|
// pattern, split on '/', and then turned into a regular expression.
|
||||||
|
// A regexp is made at the end which joins each array with an
|
||||||
|
// escaped /, and another full one which joins each regexp with |.
|
||||||
|
//
|
||||||
|
// Following the lead of Bash 4.1, note that "**" only has special meaning
|
||||||
|
// when it is the *only* thing in a path portion. Otherwise, any series
|
||||||
|
// of * is equivalent to a single *. Globstar behavior is enabled by
|
||||||
|
// default, and can be disabled by setting options.noglobstar.
|
||||||
|
Minimatch.prototype.parse = parse
|
||||||
|
var SUBPARSE = {}
|
||||||
|
function parse (pattern, isSub) {
|
||||||
|
assertValidPattern(pattern)
|
||||||
|
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
// shortcuts
|
||||||
|
if (pattern === '**') {
|
||||||
|
if (!options.noglobstar)
|
||||||
|
return GLOBSTAR
|
||||||
|
else
|
||||||
|
pattern = '*'
|
||||||
|
}
|
||||||
|
if (pattern === '') return ''
|
||||||
|
|
||||||
|
var re = ''
|
||||||
|
var hasMagic = !!options.nocase
|
||||||
|
var escaping = false
|
||||||
|
// ? => one single character
|
||||||
|
var patternListStack = []
|
||||||
|
var negativeLists = []
|
||||||
|
var stateChar
|
||||||
|
var inClass = false
|
||||||
|
var reClassStart = -1
|
||||||
|
var classStart = -1
|
||||||
|
// . and .. never match anything that doesn't start with .,
|
||||||
|
// even when options.dot is set.
|
||||||
|
var patternStart = pattern.charAt(0) === '.' ? '' // anything
|
||||||
|
// not (start or / followed by . or .. followed by / or end)
|
||||||
|
: options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
|
||||||
|
: '(?!\\.)'
|
||||||
|
var self = this
|
||||||
|
|
||||||
|
function clearStateChar () {
|
||||||
|
if (stateChar) {
|
||||||
|
// we had some state-tracking character
|
||||||
|
// that wasn't consumed by this pass.
|
||||||
|
switch (stateChar) {
|
||||||
|
case '*':
|
||||||
|
re += star
|
||||||
|
hasMagic = true
|
||||||
|
break
|
||||||
|
case '?':
|
||||||
|
re += qmark
|
||||||
|
hasMagic = true
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
re += '\\' + stateChar
|
||||||
|
break
|
||||||
|
}
|
||||||
|
self.debug('clearStateChar %j %j', stateChar, re)
|
||||||
|
stateChar = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0, len = pattern.length, c
|
||||||
|
; (i < len) && (c = pattern.charAt(i))
|
||||||
|
; i++) {
|
||||||
|
this.debug('%s\t%s %s %j', pattern, i, re, c)
|
||||||
|
|
||||||
|
// skip over any that are escaped.
|
||||||
|
if (escaping && reSpecials[c]) {
|
||||||
|
re += '\\' + c
|
||||||
|
escaping = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
/* istanbul ignore next */
|
||||||
|
case '/': {
|
||||||
|
// completely not allowed, even escaped.
|
||||||
|
// Should already be path-split by now.
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
case '\\':
|
||||||
|
clearStateChar()
|
||||||
|
escaping = true
|
||||||
|
continue
|
||||||
|
|
||||||
|
// the various stateChar values
|
||||||
|
// for the "extglob" stuff.
|
||||||
|
case '?':
|
||||||
|
case '*':
|
||||||
|
case '+':
|
||||||
|
case '@':
|
||||||
|
case '!':
|
||||||
|
this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)
|
||||||
|
|
||||||
|
// all of those are literals inside a class, except that
|
||||||
|
// the glob [!a] means [^a] in regexp
|
||||||
|
if (inClass) {
|
||||||
|
this.debug(' in class')
|
||||||
|
if (c === '!' && i === classStart + 1) c = '^'
|
||||||
|
re += c
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we already have a stateChar, then it means
|
||||||
|
// that there was something like ** or +? in there.
|
||||||
|
// Handle the stateChar, then proceed with this one.
|
||||||
|
self.debug('call clearStateChar %j', stateChar)
|
||||||
|
clearStateChar()
|
||||||
|
stateChar = c
|
||||||
|
// if extglob is disabled, then +(asdf|foo) isn't a thing.
|
||||||
|
// just clear the statechar *now*, rather than even diving into
|
||||||
|
// the patternList stuff.
|
||||||
|
if (options.noext) clearStateChar()
|
||||||
|
continue
|
||||||
|
|
||||||
|
case '(':
|
||||||
|
if (inClass) {
|
||||||
|
re += '('
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stateChar) {
|
||||||
|
re += '\\('
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
patternListStack.push({
|
||||||
|
type: stateChar,
|
||||||
|
start: i - 1,
|
||||||
|
reStart: re.length,
|
||||||
|
open: plTypes[stateChar].open,
|
||||||
|
close: plTypes[stateChar].close
|
||||||
|
})
|
||||||
|
// negation is (?:(?!js)[^/]*)
|
||||||
|
re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
|
||||||
|
this.debug('plType %j %j', stateChar, re)
|
||||||
|
stateChar = false
|
||||||
|
continue
|
||||||
|
|
||||||
|
case ')':
|
||||||
|
if (inClass || !patternListStack.length) {
|
||||||
|
re += '\\)'
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
clearStateChar()
|
||||||
|
hasMagic = true
|
||||||
|
var pl = patternListStack.pop()
|
||||||
|
// negation is (?:(?!js)[^/]*)
|
||||||
|
// The others are (?:<pattern>)<type>
|
||||||
|
re += pl.close
|
||||||
|
if (pl.type === '!') {
|
||||||
|
negativeLists.push(pl)
|
||||||
|
}
|
||||||
|
pl.reEnd = re.length
|
||||||
|
continue
|
||||||
|
|
||||||
|
case '|':
|
||||||
|
if (inClass || !patternListStack.length || escaping) {
|
||||||
|
re += '\\|'
|
||||||
|
escaping = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
clearStateChar()
|
||||||
|
re += '|'
|
||||||
|
continue
|
||||||
|
|
||||||
|
// these are mostly the same in regexp and glob
|
||||||
|
case '[':
|
||||||
|
// swallow any state-tracking char before the [
|
||||||
|
clearStateChar()
|
||||||
|
|
||||||
|
if (inClass) {
|
||||||
|
re += '\\' + c
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
inClass = true
|
||||||
|
classStart = i
|
||||||
|
reClassStart = re.length
|
||||||
|
re += c
|
||||||
|
continue
|
||||||
|
|
||||||
|
case ']':
|
||||||
|
// a right bracket shall lose its special
|
||||||
|
// meaning and represent itself in
|
||||||
|
// a bracket expression if it occurs
|
||||||
|
// first in the list. -- POSIX.2 2.8.3.2
|
||||||
|
if (i === classStart + 1 || !inClass) {
|
||||||
|
re += '\\' + c
|
||||||
|
escaping = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle the case where we left a class open.
|
||||||
|
// "[z-a]" is valid, equivalent to "\[z-a\]"
|
||||||
|
// split where the last [ was, make sure we don't have
|
||||||
|
// an invalid re. if so, re-walk the contents of the
|
||||||
|
// would-be class to re-translate any characters that
|
||||||
|
// were passed through as-is
|
||||||
|
// TODO: It would probably be faster to determine this
|
||||||
|
// without a try/catch and a new RegExp, but it's tricky
|
||||||
|
// to do safely. For now, this is safe and works.
|
||||||
|
var cs = pattern.substring(classStart + 1, i)
|
||||||
|
try {
|
||||||
|
RegExp('[' + cs + ']')
|
||||||
|
} catch (er) {
|
||||||
|
// not a valid class!
|
||||||
|
var sp = this.parse(cs, SUBPARSE)
|
||||||
|
re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
|
||||||
|
hasMagic = hasMagic || sp[1]
|
||||||
|
inClass = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// finish up the class.
|
||||||
|
hasMagic = true
|
||||||
|
inClass = false
|
||||||
|
re += c
|
||||||
|
continue
|
||||||
|
|
||||||
|
default:
|
||||||
|
// swallow any state char that wasn't consumed
|
||||||
|
clearStateChar()
|
||||||
|
|
||||||
|
if (escaping) {
|
||||||
|
// no need
|
||||||
|
escaping = false
|
||||||
|
} else if (reSpecials[c]
|
||||||
|
&& !(c === '^' && inClass)) {
|
||||||
|
re += '\\'
|
||||||
|
}
|
||||||
|
|
||||||
|
re += c
|
||||||
|
|
||||||
|
} // switch
|
||||||
|
} // for
|
||||||
|
|
||||||
|
// handle the case where we left a class open.
|
||||||
|
// "[abc" is valid, equivalent to "\[abc"
|
||||||
|
if (inClass) {
|
||||||
|
// split where the last [ was, and escape it
|
||||||
|
// this is a huge pita. We now have to re-walk
|
||||||
|
// the contents of the would-be class to re-translate
|
||||||
|
// any characters that were passed through as-is
|
||||||
|
cs = pattern.substr(classStart + 1)
|
||||||
|
sp = this.parse(cs, SUBPARSE)
|
||||||
|
re = re.substr(0, reClassStart) + '\\[' + sp[0]
|
||||||
|
hasMagic = hasMagic || sp[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle the case where we had a +( thing at the *end*
|
||||||
|
// of the pattern.
|
||||||
|
// each pattern list stack adds 3 chars, and we need to go through
|
||||||
|
// and escape any | chars that were passed through as-is for the regexp.
|
||||||
|
// Go through and escape them, taking care not to double-escape any
|
||||||
|
// | chars that were already escaped.
|
||||||
|
for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
|
||||||
|
var tail = re.slice(pl.reStart + pl.open.length)
|
||||||
|
this.debug('setting tail', re, pl)
|
||||||
|
// maybe some even number of \, then maybe 1 \, followed by a |
|
||||||
|
tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
|
||||||
|
if (!$2) {
|
||||||
|
// the | isn't already escaped, so escape it.
|
||||||
|
$2 = '\\'
|
||||||
|
}
|
||||||
|
|
||||||
|
// need to escape all those slashes *again*, without escaping the
|
||||||
|
// one that we need for escaping the | character. As it works out,
|
||||||
|
// escaping an even number of slashes can be done by simply repeating
|
||||||
|
// it exactly after itself. That's why this trick works.
|
||||||
|
//
|
||||||
|
// I am sorry that you have to see this.
|
||||||
|
return $1 + $1 + $2 + '|'
|
||||||
|
})
|
||||||
|
|
||||||
|
this.debug('tail=%j\n %s', tail, tail, pl, re)
|
||||||
|
var t = pl.type === '*' ? star
|
||||||
|
: pl.type === '?' ? qmark
|
||||||
|
: '\\' + pl.type
|
||||||
|
|
||||||
|
hasMagic = true
|
||||||
|
re = re.slice(0, pl.reStart) + t + '\\(' + tail
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle trailing things that only matter at the very end.
|
||||||
|
clearStateChar()
|
||||||
|
if (escaping) {
|
||||||
|
// trailing \\
|
||||||
|
re += '\\\\'
|
||||||
|
}
|
||||||
|
|
||||||
|
// only need to apply the nodot start if the re starts with
|
||||||
|
// something that could conceivably capture a dot
|
||||||
|
var addPatternStart = false
|
||||||
|
switch (re.charAt(0)) {
|
||||||
|
case '[': case '.': case '(': addPatternStart = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hack to work around lack of negative lookbehind in JS
|
||||||
|
// A pattern like: *.!(x).!(y|z) needs to ensure that a name
|
||||||
|
// like 'a.xyz.yz' doesn't match. So, the first negative
|
||||||
|
// lookahead, has to look ALL the way ahead, to the end of
|
||||||
|
// the pattern.
|
||||||
|
for (var n = negativeLists.length - 1; n > -1; n--) {
|
||||||
|
var nl = negativeLists[n]
|
||||||
|
|
||||||
|
var nlBefore = re.slice(0, nl.reStart)
|
||||||
|
var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
|
||||||
|
var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
|
||||||
|
var nlAfter = re.slice(nl.reEnd)
|
||||||
|
|
||||||
|
nlLast += nlAfter
|
||||||
|
|
||||||
|
// Handle nested stuff like *(*.js|!(*.json)), where open parens
|
||||||
|
// mean that we should *not* include the ) in the bit that is considered
|
||||||
|
// "after" the negated section.
|
||||||
|
var openParensBefore = nlBefore.split('(').length - 1
|
||||||
|
var cleanAfter = nlAfter
|
||||||
|
for (i = 0; i < openParensBefore; i++) {
|
||||||
|
cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
|
||||||
|
}
|
||||||
|
nlAfter = cleanAfter
|
||||||
|
|
||||||
|
var dollar = ''
|
||||||
|
if (nlAfter === '' && isSub !== SUBPARSE) {
|
||||||
|
dollar = '$'
|
||||||
|
}
|
||||||
|
var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
|
||||||
|
re = newRe
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the re is not "" at this point, then we need to make sure
|
||||||
|
// it doesn't match against an empty path part.
|
||||||
|
// Otherwise a/* will match a/, which it should not.
|
||||||
|
if (re !== '' && hasMagic) {
|
||||||
|
re = '(?=.)' + re
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addPatternStart) {
|
||||||
|
re = patternStart + re
|
||||||
|
}
|
||||||
|
|
||||||
|
// parsing just a piece of a larger pattern.
|
||||||
|
if (isSub === SUBPARSE) {
|
||||||
|
return [re, hasMagic]
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip the regexp for non-magical patterns
|
||||||
|
// unescape anything in it, though, so that it'll be
|
||||||
|
// an exact match against a file etc.
|
||||||
|
if (!hasMagic) {
|
||||||
|
return globUnescape(pattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
var flags = options.nocase ? 'i' : ''
|
||||||
|
try {
|
||||||
|
var regExp = new RegExp('^' + re + '$', flags)
|
||||||
|
} catch (er) /* istanbul ignore next - should be impossible */ {
|
||||||
|
// If it was an invalid regular expression, then it can't match
|
||||||
|
// anything. This trick looks for a character after the end of
|
||||||
|
// the string, which is of course impossible, except in multi-line
|
||||||
|
// mode, but it's not a /m regex.
|
||||||
|
return new RegExp('$.')
|
||||||
|
}
|
||||||
|
|
||||||
|
regExp._glob = pattern
|
||||||
|
regExp._src = re
|
||||||
|
|
||||||
|
return regExp
|
||||||
|
}
|
||||||
|
|
||||||
|
minimatch.makeRe = function (pattern, options) {
|
||||||
|
return new Minimatch(pattern, options || {}).makeRe()
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.makeRe = makeRe
|
||||||
|
function makeRe () {
|
||||||
|
if (this.regexp || this.regexp === false) return this.regexp
|
||||||
|
|
||||||
|
// at this point, this.set is a 2d array of partial
|
||||||
|
// pattern strings, or "**".
|
||||||
|
//
|
||||||
|
// It's better to use .match(). This function shouldn't
|
||||||
|
// be used, really, but it's pretty convenient sometimes,
|
||||||
|
// when you just want to work with a regex.
|
||||||
|
var set = this.set
|
||||||
|
|
||||||
|
if (!set.length) {
|
||||||
|
this.regexp = false
|
||||||
|
return this.regexp
|
||||||
|
}
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
var twoStar = options.noglobstar ? star
|
||||||
|
: options.dot ? twoStarDot
|
||||||
|
: twoStarNoDot
|
||||||
|
var flags = options.nocase ? 'i' : ''
|
||||||
|
|
||||||
|
var re = set.map(function (pattern) {
|
||||||
|
return pattern.map(function (p) {
|
||||||
|
return (p === GLOBSTAR) ? twoStar
|
||||||
|
: (typeof p === 'string') ? regExpEscape(p)
|
||||||
|
: p._src
|
||||||
|
}).join('\\\/')
|
||||||
|
}).join('|')
|
||||||
|
|
||||||
|
// must match entire pattern
|
||||||
|
// ending in a * or ** will make it less strict.
|
||||||
|
re = '^(?:' + re + ')$'
|
||||||
|
|
||||||
|
// can match anything, as long as it's not this.
|
||||||
|
if (this.negate) re = '^(?!' + re + ').*$'
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.regexp = new RegExp(re, flags)
|
||||||
|
} catch (ex) /* istanbul ignore next - should be impossible */ {
|
||||||
|
this.regexp = false
|
||||||
|
}
|
||||||
|
return this.regexp
|
||||||
|
}
|
||||||
|
|
||||||
|
minimatch.match = function (list, pattern, options) {
|
||||||
|
options = options || {}
|
||||||
|
var mm = new Minimatch(pattern, options)
|
||||||
|
list = list.filter(function (f) {
|
||||||
|
return mm.match(f)
|
||||||
|
})
|
||||||
|
if (mm.options.nonull && !list.length) {
|
||||||
|
list.push(pattern)
|
||||||
|
}
|
||||||
|
return list
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.match = function match (f, partial) {
|
||||||
|
if (typeof partial === 'undefined') partial = this.partial
|
||||||
|
this.debug('match', f, this.pattern)
|
||||||
|
// short-circuit in the case of busted things.
|
||||||
|
// comments, etc.
|
||||||
|
if (this.comment) return false
|
||||||
|
if (this.empty) return f === ''
|
||||||
|
|
||||||
|
if (f === '/' && partial) return true
|
||||||
|
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
// windows: need to use /, not \
|
||||||
|
if (path.sep !== '/') {
|
||||||
|
f = f.split(path.sep).join('/')
|
||||||
|
}
|
||||||
|
|
||||||
|
// treat the test path as a set of pathparts.
|
||||||
|
f = f.split(slashSplit)
|
||||||
|
this.debug(this.pattern, 'split', f)
|
||||||
|
|
||||||
|
// just ONE of the pattern sets in this.set needs to match
|
||||||
|
// in order for it to be valid. If negating, then just one
|
||||||
|
// match means that we have failed.
|
||||||
|
// Either way, return on the first hit.
|
||||||
|
|
||||||
|
var set = this.set
|
||||||
|
this.debug(this.pattern, 'set', set)
|
||||||
|
|
||||||
|
// Find the basename of the path by looking for the last non-empty segment
|
||||||
|
var filename
|
||||||
|
var i
|
||||||
|
for (i = f.length - 1; i >= 0; i--) {
|
||||||
|
filename = f[i]
|
||||||
|
if (filename) break
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < set.length; i++) {
|
||||||
|
var pattern = set[i]
|
||||||
|
var file = f
|
||||||
|
if (options.matchBase && pattern.length === 1) {
|
||||||
|
file = [filename]
|
||||||
|
}
|
||||||
|
var hit = this.matchOne(file, pattern, partial)
|
||||||
|
if (hit) {
|
||||||
|
if (options.flipNegate) return true
|
||||||
|
return !this.negate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// didn't get any hits. this is success if it's a negative
|
||||||
|
// pattern, failure otherwise.
|
||||||
|
if (options.flipNegate) return false
|
||||||
|
return this.negate
|
||||||
|
}
|
||||||
|
|
||||||
|
// set partial to true to test if, for example,
|
||||||
|
// "/a/b" matches the start of "/*/b/*/d"
|
||||||
|
// Partial means, if you run out of file before you run
|
||||||
|
// out of pattern, then that's fine, as long as all
|
||||||
|
// the parts match.
|
||||||
|
Minimatch.prototype.matchOne = function (file, pattern, partial) {
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
this.debug('matchOne',
|
||||||
|
{ 'this': this, file: file, pattern: pattern })
|
||||||
|
|
||||||
|
this.debug('matchOne', file.length, pattern.length)
|
||||||
|
|
||||||
|
for (var fi = 0,
|
||||||
|
pi = 0,
|
||||||
|
fl = file.length,
|
||||||
|
pl = pattern.length
|
||||||
|
; (fi < fl) && (pi < pl)
|
||||||
|
; fi++, pi++) {
|
||||||
|
this.debug('matchOne loop')
|
||||||
|
var p = pattern[pi]
|
||||||
|
var f = file[fi]
|
||||||
|
|
||||||
|
this.debug(pattern, p, f)
|
||||||
|
|
||||||
|
// should be impossible.
|
||||||
|
// some invalid regexp stuff in the set.
|
||||||
|
/* istanbul ignore if */
|
||||||
|
if (p === false) return false
|
||||||
|
|
||||||
|
if (p === GLOBSTAR) {
|
||||||
|
this.debug('GLOBSTAR', [pattern, p, f])
|
||||||
|
|
||||||
|
// "**"
|
||||||
|
// a/**/b/**/c would match the following:
|
||||||
|
// a/b/x/y/z/c
|
||||||
|
// a/x/y/z/b/c
|
||||||
|
// a/b/x/b/x/c
|
||||||
|
// a/b/c
|
||||||
|
// To do this, take the rest of the pattern after
|
||||||
|
// the **, and see if it would match the file remainder.
|
||||||
|
// If so, return success.
|
||||||
|
// If not, the ** "swallows" a segment, and try again.
|
||||||
|
// This is recursively awful.
|
||||||
|
//
|
||||||
|
// a/**/b/**/c matching a/b/x/y/z/c
|
||||||
|
// - a matches a
|
||||||
|
// - doublestar
|
||||||
|
// - matchOne(b/x/y/z/c, b/**/c)
|
||||||
|
// - b matches b
|
||||||
|
// - doublestar
|
||||||
|
// - matchOne(x/y/z/c, c) -> no
|
||||||
|
// - matchOne(y/z/c, c) -> no
|
||||||
|
// - matchOne(z/c, c) -> no
|
||||||
|
// - matchOne(c, c) yes, hit
|
||||||
|
var fr = fi
|
||||||
|
var pr = pi + 1
|
||||||
|
if (pr === pl) {
|
||||||
|
this.debug('** at the end')
|
||||||
|
// a ** at the end will just swallow the rest.
|
||||||
|
// We have found a match.
|
||||||
|
// however, it will not swallow /.x, unless
|
||||||
|
// options.dot is set.
|
||||||
|
// . and .. are *never* matched by **, for explosively
|
||||||
|
// exponential reasons.
|
||||||
|
for (; fi < fl; fi++) {
|
||||||
|
if (file[fi] === '.' || file[fi] === '..' ||
|
||||||
|
(!options.dot && file[fi].charAt(0) === '.')) return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// ok, let's see if we can swallow whatever we can.
|
||||||
|
while (fr < fl) {
|
||||||
|
var swallowee = file[fr]
|
||||||
|
|
||||||
|
this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)
|
||||||
|
|
||||||
|
// XXX remove this slice. Just pass the start index.
|
||||||
|
if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
|
||||||
|
this.debug('globstar found match!', fr, fl, swallowee)
|
||||||
|
// found a match.
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
// can't swallow "." or ".." ever.
|
||||||
|
// can only swallow ".foo" when explicitly asked.
|
||||||
|
if (swallowee === '.' || swallowee === '..' ||
|
||||||
|
(!options.dot && swallowee.charAt(0) === '.')) {
|
||||||
|
this.debug('dot detected!', file, fr, pattern, pr)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
// ** swallows a segment, and continue.
|
||||||
|
this.debug('globstar swallow a segment, and continue')
|
||||||
|
fr++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// no match was found.
|
||||||
|
// However, in partial mode, we can't say this is necessarily over.
|
||||||
|
// If there's more *pattern* left, then
|
||||||
|
/* istanbul ignore if */
|
||||||
|
if (partial) {
|
||||||
|
// ran out of file
|
||||||
|
this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
|
||||||
|
if (fr === fl) return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// something other than **
|
||||||
|
// non-magic patterns just have to match exactly
|
||||||
|
// patterns with magic have been turned into regexps.
|
||||||
|
var hit
|
||||||
|
if (typeof p === 'string') {
|
||||||
|
hit = f === p
|
||||||
|
this.debug('string match', p, f, hit)
|
||||||
|
} else {
|
||||||
|
hit = f.match(p)
|
||||||
|
this.debug('pattern match', p, f, hit)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hit) return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note: ending in / means that we'll get a final ""
|
||||||
|
// at the end of the pattern. This can only match a
|
||||||
|
// corresponding "" at the end of the file.
|
||||||
|
// If the file ends in /, then it can only match a
|
||||||
|
// a pattern that ends in /, unless the pattern just
|
||||||
|
// doesn't have any more for it. But, a/b/ should *not*
|
||||||
|
// match "a/b/*", even though "" matches against the
|
||||||
|
// [^/]*? pattern, except in partial mode, where it might
|
||||||
|
// simply not be reached yet.
|
||||||
|
// However, a/b/ should still satisfy a/*
|
||||||
|
|
||||||
|
// now either we fell off the end of the pattern, or we're done.
|
||||||
|
if (fi === fl && pi === pl) {
|
||||||
|
// ran out of pattern and filename at the same time.
|
||||||
|
// an exact hit!
|
||||||
|
return true
|
||||||
|
} else if (fi === fl) {
|
||||||
|
// ran out of file, but still had pattern left.
|
||||||
|
// this is ok if we're doing the match as part of
|
||||||
|
// a glob fs traversal.
|
||||||
|
return partial
|
||||||
|
} else /* istanbul ignore else */ if (pi === pl) {
|
||||||
|
// ran out of pattern, still have file left.
|
||||||
|
// this is only acceptable if we're on the very last
|
||||||
|
// empty segment of a file with a trailing slash.
|
||||||
|
// a/* should match a/b/
|
||||||
|
return (fi === fl - 1) && (file[fi] === '')
|
||||||
|
}
|
||||||
|
|
||||||
|
// should be unreachable.
|
||||||
|
/* istanbul ignore next */
|
||||||
|
throw new Error('wtf?')
|
||||||
|
}
|
||||||
|
|
||||||
|
// replace stuff like \* with *
|
||||||
|
function globUnescape (s) {
|
||||||
|
return s.replace(/\\(.)/g, '$1')
|
||||||
|
}
|
||||||
|
|
||||||
|
function regExpEscape (s) {
|
||||||
|
return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 5364:
|
/***/ 5364:
|
||||||
@ -69595,7 +71919,6 @@ module.exports.BufferList = BufferList
|
|||||||
/***/ 33717:
|
/***/ 33717:
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
var concatMap = __nccwpck_require__(86891);
|
|
||||||
var balanced = __nccwpck_require__(9417);
|
var balanced = __nccwpck_require__(9417);
|
||||||
|
|
||||||
module.exports = expandTop;
|
module.exports = expandTop;
|
||||||
@ -69676,10 +71999,6 @@ function expandTop(str) {
|
|||||||
return expand(escapeBraces(str), true).map(unescapeBraces);
|
return expand(escapeBraces(str), true).map(unescapeBraces);
|
||||||
}
|
}
|
||||||
|
|
||||||
function identity(e) {
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
|
|
||||||
function embrace(str) {
|
function embrace(str) {
|
||||||
return '{' + str + '}';
|
return '{' + str + '}';
|
||||||
}
|
}
|
||||||
@ -69698,42 +72017,7 @@ function expand(str, isTop) {
|
|||||||
var expansions = [];
|
var expansions = [];
|
||||||
|
|
||||||
var m = balanced('{', '}', str);
|
var m = balanced('{', '}', str);
|
||||||
if (!m || /\$$/.test(m.pre)) return [str];
|
if (!m) return [str];
|
||||||
|
|
||||||
var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
|
|
||||||
var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
|
|
||||||
var isSequence = isNumericSequence || isAlphaSequence;
|
|
||||||
var isOptions = m.body.indexOf(',') >= 0;
|
|
||||||
if (!isSequence && !isOptions) {
|
|
||||||
// {a},b}
|
|
||||||
if (m.post.match(/,.*\}/)) {
|
|
||||||
str = m.pre + '{' + m.body + escClose + m.post;
|
|
||||||
return expand(str);
|
|
||||||
}
|
|
||||||
return [str];
|
|
||||||
}
|
|
||||||
|
|
||||||
var n;
|
|
||||||
if (isSequence) {
|
|
||||||
n = m.body.split(/\.\./);
|
|
||||||
} else {
|
|
||||||
n = parseCommaParts(m.body);
|
|
||||||
if (n.length === 1) {
|
|
||||||
// x{{a,b}}y ==> x{a}y x{b}y
|
|
||||||
n = expand(n[0], false).map(embrace);
|
|
||||||
if (n.length === 1) {
|
|
||||||
var post = m.post.length
|
|
||||||
? expand(m.post, false)
|
|
||||||
: [''];
|
|
||||||
return post.map(function(p) {
|
|
||||||
return m.pre + n[0] + p;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// at this point, n is the parts, and we know it's not a comma set
|
|
||||||
// with a single entry.
|
|
||||||
|
|
||||||
// no need to expand pre, since it is guaranteed to be free of brace-sets
|
// no need to expand pre, since it is guaranteed to be free of brace-sets
|
||||||
var pre = m.pre;
|
var pre = m.pre;
|
||||||
@ -69741,55 +72025,97 @@ function expand(str, isTop) {
|
|||||||
? expand(m.post, false)
|
? expand(m.post, false)
|
||||||
: [''];
|
: [''];
|
||||||
|
|
||||||
var N;
|
if (/\$$/.test(m.pre)) {
|
||||||
|
for (var k = 0; k < post.length; k++) {
|
||||||
if (isSequence) {
|
var expansion = pre+ '{' + m.body + '}' + post[k];
|
||||||
var x = numeric(n[0]);
|
expansions.push(expansion);
|
||||||
var y = numeric(n[1]);
|
|
||||||
var width = Math.max(n[0].length, n[1].length)
|
|
||||||
var incr = n.length == 3
|
|
||||||
? Math.abs(numeric(n[2]))
|
|
||||||
: 1;
|
|
||||||
var test = lte;
|
|
||||||
var reverse = y < x;
|
|
||||||
if (reverse) {
|
|
||||||
incr *= -1;
|
|
||||||
test = gte;
|
|
||||||
}
|
|
||||||
var pad = n.some(isPadded);
|
|
||||||
|
|
||||||
N = [];
|
|
||||||
|
|
||||||
for (var i = x; test(i, y); i += incr) {
|
|
||||||
var c;
|
|
||||||
if (isAlphaSequence) {
|
|
||||||
c = String.fromCharCode(i);
|
|
||||||
if (c === '\\')
|
|
||||||
c = '';
|
|
||||||
} else {
|
|
||||||
c = String(i);
|
|
||||||
if (pad) {
|
|
||||||
var need = width - c.length;
|
|
||||||
if (need > 0) {
|
|
||||||
var z = new Array(need + 1).join('0');
|
|
||||||
if (i < 0)
|
|
||||||
c = '-' + z + c.slice(1);
|
|
||||||
else
|
|
||||||
c = z + c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
N.push(c);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
N = concatMap(n, function(el) { return expand(el, false) });
|
var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
|
||||||
}
|
var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
|
||||||
|
var isSequence = isNumericSequence || isAlphaSequence;
|
||||||
|
var isOptions = m.body.indexOf(',') >= 0;
|
||||||
|
if (!isSequence && !isOptions) {
|
||||||
|
// {a},b}
|
||||||
|
if (m.post.match(/,.*\}/)) {
|
||||||
|
str = m.pre + '{' + m.body + escClose + m.post;
|
||||||
|
return expand(str);
|
||||||
|
}
|
||||||
|
return [str];
|
||||||
|
}
|
||||||
|
|
||||||
for (var j = 0; j < N.length; j++) {
|
var n;
|
||||||
for (var k = 0; k < post.length; k++) {
|
if (isSequence) {
|
||||||
var expansion = pre + N[j] + post[k];
|
n = m.body.split(/\.\./);
|
||||||
if (!isTop || isSequence || expansion)
|
} else {
|
||||||
expansions.push(expansion);
|
n = parseCommaParts(m.body);
|
||||||
|
if (n.length === 1) {
|
||||||
|
// x{{a,b}}y ==> x{a}y x{b}y
|
||||||
|
n = expand(n[0], false).map(embrace);
|
||||||
|
if (n.length === 1) {
|
||||||
|
return post.map(function(p) {
|
||||||
|
return m.pre + n[0] + p;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// at this point, n is the parts, and we know it's not a comma set
|
||||||
|
// with a single entry.
|
||||||
|
var N;
|
||||||
|
|
||||||
|
if (isSequence) {
|
||||||
|
var x = numeric(n[0]);
|
||||||
|
var y = numeric(n[1]);
|
||||||
|
var width = Math.max(n[0].length, n[1].length)
|
||||||
|
var incr = n.length == 3
|
||||||
|
? Math.abs(numeric(n[2]))
|
||||||
|
: 1;
|
||||||
|
var test = lte;
|
||||||
|
var reverse = y < x;
|
||||||
|
if (reverse) {
|
||||||
|
incr *= -1;
|
||||||
|
test = gte;
|
||||||
|
}
|
||||||
|
var pad = n.some(isPadded);
|
||||||
|
|
||||||
|
N = [];
|
||||||
|
|
||||||
|
for (var i = x; test(i, y); i += incr) {
|
||||||
|
var c;
|
||||||
|
if (isAlphaSequence) {
|
||||||
|
c = String.fromCharCode(i);
|
||||||
|
if (c === '\\')
|
||||||
|
c = '';
|
||||||
|
} else {
|
||||||
|
c = String(i);
|
||||||
|
if (pad) {
|
||||||
|
var need = width - c.length;
|
||||||
|
if (need > 0) {
|
||||||
|
var z = new Array(need + 1).join('0');
|
||||||
|
if (i < 0)
|
||||||
|
c = '-' + z + c.slice(1);
|
||||||
|
else
|
||||||
|
c = z + c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
N.push(c);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
N = [];
|
||||||
|
|
||||||
|
for (var j = 0; j < n.length; j++) {
|
||||||
|
N.push.apply(N, expand(n[j], false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var j = 0; j < N.length; j++) {
|
||||||
|
for (var k = 0; k < post.length; k++) {
|
||||||
|
var expansion = pre + N[j] + post[k];
|
||||||
|
if (!isTop || isSequence || expansion)
|
||||||
|
expansions.push(expansion);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81789,960 +84115,6 @@ function populateMaps (extensions, types) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 83973:
|
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
|
||||||
|
|
||||||
module.exports = minimatch
|
|
||||||
minimatch.Minimatch = Minimatch
|
|
||||||
|
|
||||||
var path = (function () { try { return __nccwpck_require__(71017) } catch (e) {}}()) || {
|
|
||||||
sep: '/'
|
|
||||||
}
|
|
||||||
minimatch.sep = path.sep
|
|
||||||
|
|
||||||
var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
|
|
||||||
var expand = __nccwpck_require__(33717)
|
|
||||||
|
|
||||||
var plTypes = {
|
|
||||||
'!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
|
|
||||||
'?': { open: '(?:', close: ')?' },
|
|
||||||
'+': { open: '(?:', close: ')+' },
|
|
||||||
'*': { open: '(?:', close: ')*' },
|
|
||||||
'@': { open: '(?:', close: ')' }
|
|
||||||
}
|
|
||||||
|
|
||||||
// any single thing other than /
|
|
||||||
// don't need to escape / when using new RegExp()
|
|
||||||
var qmark = '[^/]'
|
|
||||||
|
|
||||||
// * => any number of characters
|
|
||||||
var star = qmark + '*?'
|
|
||||||
|
|
||||||
// ** when dots are allowed. Anything goes, except .. and .
|
|
||||||
// not (^ or / followed by one or two dots followed by $ or /),
|
|
||||||
// followed by anything, any number of times.
|
|
||||||
var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'
|
|
||||||
|
|
||||||
// not a ^ or / followed by a dot,
|
|
||||||
// followed by anything, any number of times.
|
|
||||||
var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'
|
|
||||||
|
|
||||||
// characters that need to be escaped in RegExp.
|
|
||||||
var reSpecials = charSet('().*{}+?[]^$\\!')
|
|
||||||
|
|
||||||
// "abc" -> { a:true, b:true, c:true }
|
|
||||||
function charSet (s) {
|
|
||||||
return s.split('').reduce(function (set, c) {
|
|
||||||
set[c] = true
|
|
||||||
return set
|
|
||||||
}, {})
|
|
||||||
}
|
|
||||||
|
|
||||||
// normalizes slashes.
|
|
||||||
var slashSplit = /\/+/
|
|
||||||
|
|
||||||
minimatch.filter = filter
|
|
||||||
function filter (pattern, options) {
|
|
||||||
options = options || {}
|
|
||||||
return function (p, i, list) {
|
|
||||||
return minimatch(p, pattern, options)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function ext (a, b) {
|
|
||||||
b = b || {}
|
|
||||||
var t = {}
|
|
||||||
Object.keys(a).forEach(function (k) {
|
|
||||||
t[k] = a[k]
|
|
||||||
})
|
|
||||||
Object.keys(b).forEach(function (k) {
|
|
||||||
t[k] = b[k]
|
|
||||||
})
|
|
||||||
return t
|
|
||||||
}
|
|
||||||
|
|
||||||
minimatch.defaults = function (def) {
|
|
||||||
if (!def || typeof def !== 'object' || !Object.keys(def).length) {
|
|
||||||
return minimatch
|
|
||||||
}
|
|
||||||
|
|
||||||
var orig = minimatch
|
|
||||||
|
|
||||||
var m = function minimatch (p, pattern, options) {
|
|
||||||
return orig(p, pattern, ext(def, options))
|
|
||||||
}
|
|
||||||
|
|
||||||
m.Minimatch = function Minimatch (pattern, options) {
|
|
||||||
return new orig.Minimatch(pattern, ext(def, options))
|
|
||||||
}
|
|
||||||
m.Minimatch.defaults = function defaults (options) {
|
|
||||||
return orig.defaults(ext(def, options)).Minimatch
|
|
||||||
}
|
|
||||||
|
|
||||||
m.filter = function filter (pattern, options) {
|
|
||||||
return orig.filter(pattern, ext(def, options))
|
|
||||||
}
|
|
||||||
|
|
||||||
m.defaults = function defaults (options) {
|
|
||||||
return orig.defaults(ext(def, options))
|
|
||||||
}
|
|
||||||
|
|
||||||
m.makeRe = function makeRe (pattern, options) {
|
|
||||||
return orig.makeRe(pattern, ext(def, options))
|
|
||||||
}
|
|
||||||
|
|
||||||
m.braceExpand = function braceExpand (pattern, options) {
|
|
||||||
return orig.braceExpand(pattern, ext(def, options))
|
|
||||||
}
|
|
||||||
|
|
||||||
m.match = function (list, pattern, options) {
|
|
||||||
return orig.match(list, pattern, ext(def, options))
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
Minimatch.defaults = function (def) {
|
|
||||||
return minimatch.defaults(def).Minimatch
|
|
||||||
}
|
|
||||||
|
|
||||||
function minimatch (p, pattern, options) {
|
|
||||||
assertValidPattern(pattern)
|
|
||||||
|
|
||||||
if (!options) options = {}
|
|
||||||
|
|
||||||
// shortcut: comments match nothing.
|
|
||||||
if (!options.nocomment && pattern.charAt(0) === '#') {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Minimatch(pattern, options).match(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
function Minimatch (pattern, options) {
|
|
||||||
if (!(this instanceof Minimatch)) {
|
|
||||||
return new Minimatch(pattern, options)
|
|
||||||
}
|
|
||||||
|
|
||||||
assertValidPattern(pattern)
|
|
||||||
|
|
||||||
if (!options) options = {}
|
|
||||||
|
|
||||||
pattern = pattern.trim()
|
|
||||||
|
|
||||||
// windows support: need to use /, not \
|
|
||||||
if (!options.allowWindowsEscape && path.sep !== '/') {
|
|
||||||
pattern = pattern.split(path.sep).join('/')
|
|
||||||
}
|
|
||||||
|
|
||||||
this.options = options
|
|
||||||
this.set = []
|
|
||||||
this.pattern = pattern
|
|
||||||
this.regexp = null
|
|
||||||
this.negate = false
|
|
||||||
this.comment = false
|
|
||||||
this.empty = false
|
|
||||||
this.partial = !!options.partial
|
|
||||||
|
|
||||||
// make the set of regexps etc.
|
|
||||||
this.make()
|
|
||||||
}
|
|
||||||
|
|
||||||
Minimatch.prototype.debug = function () {}
|
|
||||||
|
|
||||||
Minimatch.prototype.make = make
|
|
||||||
function make () {
|
|
||||||
var pattern = this.pattern
|
|
||||||
var options = this.options
|
|
||||||
|
|
||||||
// empty patterns and comments match nothing.
|
|
||||||
if (!options.nocomment && pattern.charAt(0) === '#') {
|
|
||||||
this.comment = true
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (!pattern) {
|
|
||||||
this.empty = true
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// step 1: figure out negation, etc.
|
|
||||||
this.parseNegate()
|
|
||||||
|
|
||||||
// step 2: expand braces
|
|
||||||
var set = this.globSet = this.braceExpand()
|
|
||||||
|
|
||||||
if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) }
|
|
||||||
|
|
||||||
this.debug(this.pattern, set)
|
|
||||||
|
|
||||||
// step 3: now we have a set, so turn each one into a series of path-portion
|
|
||||||
// matching patterns.
|
|
||||||
// These will be regexps, except in the case of "**", which is
|
|
||||||
// set to the GLOBSTAR object for globstar behavior,
|
|
||||||
// and will not contain any / characters
|
|
||||||
set = this.globParts = set.map(function (s) {
|
|
||||||
return s.split(slashSplit)
|
|
||||||
})
|
|
||||||
|
|
||||||
this.debug(this.pattern, set)
|
|
||||||
|
|
||||||
// glob --> regexps
|
|
||||||
set = set.map(function (s, si, set) {
|
|
||||||
return s.map(this.parse, this)
|
|
||||||
}, this)
|
|
||||||
|
|
||||||
this.debug(this.pattern, set)
|
|
||||||
|
|
||||||
// filter out everything that didn't compile properly.
|
|
||||||
set = set.filter(function (s) {
|
|
||||||
return s.indexOf(false) === -1
|
|
||||||
})
|
|
||||||
|
|
||||||
this.debug(this.pattern, set)
|
|
||||||
|
|
||||||
this.set = set
|
|
||||||
}
|
|
||||||
|
|
||||||
Minimatch.prototype.parseNegate = parseNegate
|
|
||||||
function parseNegate () {
|
|
||||||
var pattern = this.pattern
|
|
||||||
var negate = false
|
|
||||||
var options = this.options
|
|
||||||
var negateOffset = 0
|
|
||||||
|
|
||||||
if (options.nonegate) return
|
|
||||||
|
|
||||||
for (var i = 0, l = pattern.length
|
|
||||||
; i < l && pattern.charAt(i) === '!'
|
|
||||||
; i++) {
|
|
||||||
negate = !negate
|
|
||||||
negateOffset++
|
|
||||||
}
|
|
||||||
|
|
||||||
if (negateOffset) this.pattern = pattern.substr(negateOffset)
|
|
||||||
this.negate = negate
|
|
||||||
}
|
|
||||||
|
|
||||||
// Brace expansion:
|
|
||||||
// a{b,c}d -> abd acd
|
|
||||||
// a{b,}c -> abc ac
|
|
||||||
// a{0..3}d -> a0d a1d a2d a3d
|
|
||||||
// a{b,c{d,e}f}g -> abg acdfg acefg
|
|
||||||
// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
|
|
||||||
//
|
|
||||||
// Invalid sets are not expanded.
|
|
||||||
// a{2..}b -> a{2..}b
|
|
||||||
// a{b}c -> a{b}c
|
|
||||||
minimatch.braceExpand = function (pattern, options) {
|
|
||||||
return braceExpand(pattern, options)
|
|
||||||
}
|
|
||||||
|
|
||||||
Minimatch.prototype.braceExpand = braceExpand
|
|
||||||
|
|
||||||
function braceExpand (pattern, options) {
|
|
||||||
if (!options) {
|
|
||||||
if (this instanceof Minimatch) {
|
|
||||||
options = this.options
|
|
||||||
} else {
|
|
||||||
options = {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pattern = typeof pattern === 'undefined'
|
|
||||||
? this.pattern : pattern
|
|
||||||
|
|
||||||
assertValidPattern(pattern)
|
|
||||||
|
|
||||||
// Thanks to Yeting Li <https://github.com/yetingli> for
|
|
||||||
// improving this regexp to avoid a ReDOS vulnerability.
|
|
||||||
if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
|
|
||||||
// shortcut. no need to expand.
|
|
||||||
return [pattern]
|
|
||||||
}
|
|
||||||
|
|
||||||
return expand(pattern)
|
|
||||||
}
|
|
||||||
|
|
||||||
var MAX_PATTERN_LENGTH = 1024 * 64
|
|
||||||
var assertValidPattern = function (pattern) {
|
|
||||||
if (typeof pattern !== 'string') {
|
|
||||||
throw new TypeError('invalid pattern')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pattern.length > MAX_PATTERN_LENGTH) {
|
|
||||||
throw new TypeError('pattern is too long')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse a component of the expanded set.
|
|
||||||
// At this point, no pattern may contain "/" in it
|
|
||||||
// so we're going to return a 2d array, where each entry is the full
|
|
||||||
// pattern, split on '/', and then turned into a regular expression.
|
|
||||||
// A regexp is made at the end which joins each array with an
|
|
||||||
// escaped /, and another full one which joins each regexp with |.
|
|
||||||
//
|
|
||||||
// Following the lead of Bash 4.1, note that "**" only has special meaning
|
|
||||||
// when it is the *only* thing in a path portion. Otherwise, any series
|
|
||||||
// of * is equivalent to a single *. Globstar behavior is enabled by
|
|
||||||
// default, and can be disabled by setting options.noglobstar.
|
|
||||||
Minimatch.prototype.parse = parse
|
|
||||||
var SUBPARSE = {}
|
|
||||||
function parse (pattern, isSub) {
|
|
||||||
assertValidPattern(pattern)
|
|
||||||
|
|
||||||
var options = this.options
|
|
||||||
|
|
||||||
// shortcuts
|
|
||||||
if (pattern === '**') {
|
|
||||||
if (!options.noglobstar)
|
|
||||||
return GLOBSTAR
|
|
||||||
else
|
|
||||||
pattern = '*'
|
|
||||||
}
|
|
||||||
if (pattern === '') return ''
|
|
||||||
|
|
||||||
var re = ''
|
|
||||||
var hasMagic = !!options.nocase
|
|
||||||
var escaping = false
|
|
||||||
// ? => one single character
|
|
||||||
var patternListStack = []
|
|
||||||
var negativeLists = []
|
|
||||||
var stateChar
|
|
||||||
var inClass = false
|
|
||||||
var reClassStart = -1
|
|
||||||
var classStart = -1
|
|
||||||
// . and .. never match anything that doesn't start with .,
|
|
||||||
// even when options.dot is set.
|
|
||||||
var patternStart = pattern.charAt(0) === '.' ? '' // anything
|
|
||||||
// not (start or / followed by . or .. followed by / or end)
|
|
||||||
: options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
|
|
||||||
: '(?!\\.)'
|
|
||||||
var self = this
|
|
||||||
|
|
||||||
function clearStateChar () {
|
|
||||||
if (stateChar) {
|
|
||||||
// we had some state-tracking character
|
|
||||||
// that wasn't consumed by this pass.
|
|
||||||
switch (stateChar) {
|
|
||||||
case '*':
|
|
||||||
re += star
|
|
||||||
hasMagic = true
|
|
||||||
break
|
|
||||||
case '?':
|
|
||||||
re += qmark
|
|
||||||
hasMagic = true
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
re += '\\' + stateChar
|
|
||||||
break
|
|
||||||
}
|
|
||||||
self.debug('clearStateChar %j %j', stateChar, re)
|
|
||||||
stateChar = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var i = 0, len = pattern.length, c
|
|
||||||
; (i < len) && (c = pattern.charAt(i))
|
|
||||||
; i++) {
|
|
||||||
this.debug('%s\t%s %s %j', pattern, i, re, c)
|
|
||||||
|
|
||||||
// skip over any that are escaped.
|
|
||||||
if (escaping && reSpecials[c]) {
|
|
||||||
re += '\\' + c
|
|
||||||
escaping = false
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (c) {
|
|
||||||
/* istanbul ignore next */
|
|
||||||
case '/': {
|
|
||||||
// completely not allowed, even escaped.
|
|
||||||
// Should already be path-split by now.
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
case '\\':
|
|
||||||
clearStateChar()
|
|
||||||
escaping = true
|
|
||||||
continue
|
|
||||||
|
|
||||||
// the various stateChar values
|
|
||||||
// for the "extglob" stuff.
|
|
||||||
case '?':
|
|
||||||
case '*':
|
|
||||||
case '+':
|
|
||||||
case '@':
|
|
||||||
case '!':
|
|
||||||
this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)
|
|
||||||
|
|
||||||
// all of those are literals inside a class, except that
|
|
||||||
// the glob [!a] means [^a] in regexp
|
|
||||||
if (inClass) {
|
|
||||||
this.debug(' in class')
|
|
||||||
if (c === '!' && i === classStart + 1) c = '^'
|
|
||||||
re += c
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// if we already have a stateChar, then it means
|
|
||||||
// that there was something like ** or +? in there.
|
|
||||||
// Handle the stateChar, then proceed with this one.
|
|
||||||
self.debug('call clearStateChar %j', stateChar)
|
|
||||||
clearStateChar()
|
|
||||||
stateChar = c
|
|
||||||
// if extglob is disabled, then +(asdf|foo) isn't a thing.
|
|
||||||
// just clear the statechar *now*, rather than even diving into
|
|
||||||
// the patternList stuff.
|
|
||||||
if (options.noext) clearStateChar()
|
|
||||||
continue
|
|
||||||
|
|
||||||
case '(':
|
|
||||||
if (inClass) {
|
|
||||||
re += '('
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!stateChar) {
|
|
||||||
re += '\\('
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
patternListStack.push({
|
|
||||||
type: stateChar,
|
|
||||||
start: i - 1,
|
|
||||||
reStart: re.length,
|
|
||||||
open: plTypes[stateChar].open,
|
|
||||||
close: plTypes[stateChar].close
|
|
||||||
})
|
|
||||||
// negation is (?:(?!js)[^/]*)
|
|
||||||
re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
|
|
||||||
this.debug('plType %j %j', stateChar, re)
|
|
||||||
stateChar = false
|
|
||||||
continue
|
|
||||||
|
|
||||||
case ')':
|
|
||||||
if (inClass || !patternListStack.length) {
|
|
||||||
re += '\\)'
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
clearStateChar()
|
|
||||||
hasMagic = true
|
|
||||||
var pl = patternListStack.pop()
|
|
||||||
// negation is (?:(?!js)[^/]*)
|
|
||||||
// The others are (?:<pattern>)<type>
|
|
||||||
re += pl.close
|
|
||||||
if (pl.type === '!') {
|
|
||||||
negativeLists.push(pl)
|
|
||||||
}
|
|
||||||
pl.reEnd = re.length
|
|
||||||
continue
|
|
||||||
|
|
||||||
case '|':
|
|
||||||
if (inClass || !patternListStack.length || escaping) {
|
|
||||||
re += '\\|'
|
|
||||||
escaping = false
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
clearStateChar()
|
|
||||||
re += '|'
|
|
||||||
continue
|
|
||||||
|
|
||||||
// these are mostly the same in regexp and glob
|
|
||||||
case '[':
|
|
||||||
// swallow any state-tracking char before the [
|
|
||||||
clearStateChar()
|
|
||||||
|
|
||||||
if (inClass) {
|
|
||||||
re += '\\' + c
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
inClass = true
|
|
||||||
classStart = i
|
|
||||||
reClassStart = re.length
|
|
||||||
re += c
|
|
||||||
continue
|
|
||||||
|
|
||||||
case ']':
|
|
||||||
// a right bracket shall lose its special
|
|
||||||
// meaning and represent itself in
|
|
||||||
// a bracket expression if it occurs
|
|
||||||
// first in the list. -- POSIX.2 2.8.3.2
|
|
||||||
if (i === classStart + 1 || !inClass) {
|
|
||||||
re += '\\' + c
|
|
||||||
escaping = false
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// handle the case where we left a class open.
|
|
||||||
// "[z-a]" is valid, equivalent to "\[z-a\]"
|
|
||||||
// split where the last [ was, make sure we don't have
|
|
||||||
// an invalid re. if so, re-walk the contents of the
|
|
||||||
// would-be class to re-translate any characters that
|
|
||||||
// were passed through as-is
|
|
||||||
// TODO: It would probably be faster to determine this
|
|
||||||
// without a try/catch and a new RegExp, but it's tricky
|
|
||||||
// to do safely. For now, this is safe and works.
|
|
||||||
var cs = pattern.substring(classStart + 1, i)
|
|
||||||
try {
|
|
||||||
RegExp('[' + cs + ']')
|
|
||||||
} catch (er) {
|
|
||||||
// not a valid class!
|
|
||||||
var sp = this.parse(cs, SUBPARSE)
|
|
||||||
re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
|
|
||||||
hasMagic = hasMagic || sp[1]
|
|
||||||
inClass = false
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// finish up the class.
|
|
||||||
hasMagic = true
|
|
||||||
inClass = false
|
|
||||||
re += c
|
|
||||||
continue
|
|
||||||
|
|
||||||
default:
|
|
||||||
// swallow any state char that wasn't consumed
|
|
||||||
clearStateChar()
|
|
||||||
|
|
||||||
if (escaping) {
|
|
||||||
// no need
|
|
||||||
escaping = false
|
|
||||||
} else if (reSpecials[c]
|
|
||||||
&& !(c === '^' && inClass)) {
|
|
||||||
re += '\\'
|
|
||||||
}
|
|
||||||
|
|
||||||
re += c
|
|
||||||
|
|
||||||
} // switch
|
|
||||||
} // for
|
|
||||||
|
|
||||||
// handle the case where we left a class open.
|
|
||||||
// "[abc" is valid, equivalent to "\[abc"
|
|
||||||
if (inClass) {
|
|
||||||
// split where the last [ was, and escape it
|
|
||||||
// this is a huge pita. We now have to re-walk
|
|
||||||
// the contents of the would-be class to re-translate
|
|
||||||
// any characters that were passed through as-is
|
|
||||||
cs = pattern.substr(classStart + 1)
|
|
||||||
sp = this.parse(cs, SUBPARSE)
|
|
||||||
re = re.substr(0, reClassStart) + '\\[' + sp[0]
|
|
||||||
hasMagic = hasMagic || sp[1]
|
|
||||||
}
|
|
||||||
|
|
||||||
// handle the case where we had a +( thing at the *end*
|
|
||||||
// of the pattern.
|
|
||||||
// each pattern list stack adds 3 chars, and we need to go through
|
|
||||||
// and escape any | chars that were passed through as-is for the regexp.
|
|
||||||
// Go through and escape them, taking care not to double-escape any
|
|
||||||
// | chars that were already escaped.
|
|
||||||
for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
|
|
||||||
var tail = re.slice(pl.reStart + pl.open.length)
|
|
||||||
this.debug('setting tail', re, pl)
|
|
||||||
// maybe some even number of \, then maybe 1 \, followed by a |
|
|
||||||
tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
|
|
||||||
if (!$2) {
|
|
||||||
// the | isn't already escaped, so escape it.
|
|
||||||
$2 = '\\'
|
|
||||||
}
|
|
||||||
|
|
||||||
// need to escape all those slashes *again*, without escaping the
|
|
||||||
// one that we need for escaping the | character. As it works out,
|
|
||||||
// escaping an even number of slashes can be done by simply repeating
|
|
||||||
// it exactly after itself. That's why this trick works.
|
|
||||||
//
|
|
||||||
// I am sorry that you have to see this.
|
|
||||||
return $1 + $1 + $2 + '|'
|
|
||||||
})
|
|
||||||
|
|
||||||
this.debug('tail=%j\n %s', tail, tail, pl, re)
|
|
||||||
var t = pl.type === '*' ? star
|
|
||||||
: pl.type === '?' ? qmark
|
|
||||||
: '\\' + pl.type
|
|
||||||
|
|
||||||
hasMagic = true
|
|
||||||
re = re.slice(0, pl.reStart) + t + '\\(' + tail
|
|
||||||
}
|
|
||||||
|
|
||||||
// handle trailing things that only matter at the very end.
|
|
||||||
clearStateChar()
|
|
||||||
if (escaping) {
|
|
||||||
// trailing \\
|
|
||||||
re += '\\\\'
|
|
||||||
}
|
|
||||||
|
|
||||||
// only need to apply the nodot start if the re starts with
|
|
||||||
// something that could conceivably capture a dot
|
|
||||||
var addPatternStart = false
|
|
||||||
switch (re.charAt(0)) {
|
|
||||||
case '[': case '.': case '(': addPatternStart = true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hack to work around lack of negative lookbehind in JS
|
|
||||||
// A pattern like: *.!(x).!(y|z) needs to ensure that a name
|
|
||||||
// like 'a.xyz.yz' doesn't match. So, the first negative
|
|
||||||
// lookahead, has to look ALL the way ahead, to the end of
|
|
||||||
// the pattern.
|
|
||||||
for (var n = negativeLists.length - 1; n > -1; n--) {
|
|
||||||
var nl = negativeLists[n]
|
|
||||||
|
|
||||||
var nlBefore = re.slice(0, nl.reStart)
|
|
||||||
var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
|
|
||||||
var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
|
|
||||||
var nlAfter = re.slice(nl.reEnd)
|
|
||||||
|
|
||||||
nlLast += nlAfter
|
|
||||||
|
|
||||||
// Handle nested stuff like *(*.js|!(*.json)), where open parens
|
|
||||||
// mean that we should *not* include the ) in the bit that is considered
|
|
||||||
// "after" the negated section.
|
|
||||||
var openParensBefore = nlBefore.split('(').length - 1
|
|
||||||
var cleanAfter = nlAfter
|
|
||||||
for (i = 0; i < openParensBefore; i++) {
|
|
||||||
cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
|
|
||||||
}
|
|
||||||
nlAfter = cleanAfter
|
|
||||||
|
|
||||||
var dollar = ''
|
|
||||||
if (nlAfter === '' && isSub !== SUBPARSE) {
|
|
||||||
dollar = '$'
|
|
||||||
}
|
|
||||||
var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
|
|
||||||
re = newRe
|
|
||||||
}
|
|
||||||
|
|
||||||
// if the re is not "" at this point, then we need to make sure
|
|
||||||
// it doesn't match against an empty path part.
|
|
||||||
// Otherwise a/* will match a/, which it should not.
|
|
||||||
if (re !== '' && hasMagic) {
|
|
||||||
re = '(?=.)' + re
|
|
||||||
}
|
|
||||||
|
|
||||||
if (addPatternStart) {
|
|
||||||
re = patternStart + re
|
|
||||||
}
|
|
||||||
|
|
||||||
// parsing just a piece of a larger pattern.
|
|
||||||
if (isSub === SUBPARSE) {
|
|
||||||
return [re, hasMagic]
|
|
||||||
}
|
|
||||||
|
|
||||||
// skip the regexp for non-magical patterns
|
|
||||||
// unescape anything in it, though, so that it'll be
|
|
||||||
// an exact match against a file etc.
|
|
||||||
if (!hasMagic) {
|
|
||||||
return globUnescape(pattern)
|
|
||||||
}
|
|
||||||
|
|
||||||
var flags = options.nocase ? 'i' : ''
|
|
||||||
try {
|
|
||||||
var regExp = new RegExp('^' + re + '$', flags)
|
|
||||||
} catch (er) /* istanbul ignore next - should be impossible */ {
|
|
||||||
// If it was an invalid regular expression, then it can't match
|
|
||||||
// anything. This trick looks for a character after the end of
|
|
||||||
// the string, which is of course impossible, except in multi-line
|
|
||||||
// mode, but it's not a /m regex.
|
|
||||||
return new RegExp('$.')
|
|
||||||
}
|
|
||||||
|
|
||||||
regExp._glob = pattern
|
|
||||||
regExp._src = re
|
|
||||||
|
|
||||||
return regExp
|
|
||||||
}
|
|
||||||
|
|
||||||
minimatch.makeRe = function (pattern, options) {
|
|
||||||
return new Minimatch(pattern, options || {}).makeRe()
|
|
||||||
}
|
|
||||||
|
|
||||||
Minimatch.prototype.makeRe = makeRe
|
|
||||||
function makeRe () {
|
|
||||||
if (this.regexp || this.regexp === false) return this.regexp
|
|
||||||
|
|
||||||
// at this point, this.set is a 2d array of partial
|
|
||||||
// pattern strings, or "**".
|
|
||||||
//
|
|
||||||
// It's better to use .match(). This function shouldn't
|
|
||||||
// be used, really, but it's pretty convenient sometimes,
|
|
||||||
// when you just want to work with a regex.
|
|
||||||
var set = this.set
|
|
||||||
|
|
||||||
if (!set.length) {
|
|
||||||
this.regexp = false
|
|
||||||
return this.regexp
|
|
||||||
}
|
|
||||||
var options = this.options
|
|
||||||
|
|
||||||
var twoStar = options.noglobstar ? star
|
|
||||||
: options.dot ? twoStarDot
|
|
||||||
: twoStarNoDot
|
|
||||||
var flags = options.nocase ? 'i' : ''
|
|
||||||
|
|
||||||
var re = set.map(function (pattern) {
|
|
||||||
return pattern.map(function (p) {
|
|
||||||
return (p === GLOBSTAR) ? twoStar
|
|
||||||
: (typeof p === 'string') ? regExpEscape(p)
|
|
||||||
: p._src
|
|
||||||
}).join('\\\/')
|
|
||||||
}).join('|')
|
|
||||||
|
|
||||||
// must match entire pattern
|
|
||||||
// ending in a * or ** will make it less strict.
|
|
||||||
re = '^(?:' + re + ')$'
|
|
||||||
|
|
||||||
// can match anything, as long as it's not this.
|
|
||||||
if (this.negate) re = '^(?!' + re + ').*$'
|
|
||||||
|
|
||||||
try {
|
|
||||||
this.regexp = new RegExp(re, flags)
|
|
||||||
} catch (ex) /* istanbul ignore next - should be impossible */ {
|
|
||||||
this.regexp = false
|
|
||||||
}
|
|
||||||
return this.regexp
|
|
||||||
}
|
|
||||||
|
|
||||||
minimatch.match = function (list, pattern, options) {
|
|
||||||
options = options || {}
|
|
||||||
var mm = new Minimatch(pattern, options)
|
|
||||||
list = list.filter(function (f) {
|
|
||||||
return mm.match(f)
|
|
||||||
})
|
|
||||||
if (mm.options.nonull && !list.length) {
|
|
||||||
list.push(pattern)
|
|
||||||
}
|
|
||||||
return list
|
|
||||||
}
|
|
||||||
|
|
||||||
Minimatch.prototype.match = function match (f, partial) {
|
|
||||||
if (typeof partial === 'undefined') partial = this.partial
|
|
||||||
this.debug('match', f, this.pattern)
|
|
||||||
// short-circuit in the case of busted things.
|
|
||||||
// comments, etc.
|
|
||||||
if (this.comment) return false
|
|
||||||
if (this.empty) return f === ''
|
|
||||||
|
|
||||||
if (f === '/' && partial) return true
|
|
||||||
|
|
||||||
var options = this.options
|
|
||||||
|
|
||||||
// windows: need to use /, not \
|
|
||||||
if (path.sep !== '/') {
|
|
||||||
f = f.split(path.sep).join('/')
|
|
||||||
}
|
|
||||||
|
|
||||||
// treat the test path as a set of pathparts.
|
|
||||||
f = f.split(slashSplit)
|
|
||||||
this.debug(this.pattern, 'split', f)
|
|
||||||
|
|
||||||
// just ONE of the pattern sets in this.set needs to match
|
|
||||||
// in order for it to be valid. If negating, then just one
|
|
||||||
// match means that we have failed.
|
|
||||||
// Either way, return on the first hit.
|
|
||||||
|
|
||||||
var set = this.set
|
|
||||||
this.debug(this.pattern, 'set', set)
|
|
||||||
|
|
||||||
// Find the basename of the path by looking for the last non-empty segment
|
|
||||||
var filename
|
|
||||||
var i
|
|
||||||
for (i = f.length - 1; i >= 0; i--) {
|
|
||||||
filename = f[i]
|
|
||||||
if (filename) break
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < set.length; i++) {
|
|
||||||
var pattern = set[i]
|
|
||||||
var file = f
|
|
||||||
if (options.matchBase && pattern.length === 1) {
|
|
||||||
file = [filename]
|
|
||||||
}
|
|
||||||
var hit = this.matchOne(file, pattern, partial)
|
|
||||||
if (hit) {
|
|
||||||
if (options.flipNegate) return true
|
|
||||||
return !this.negate
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// didn't get any hits. this is success if it's a negative
|
|
||||||
// pattern, failure otherwise.
|
|
||||||
if (options.flipNegate) return false
|
|
||||||
return this.negate
|
|
||||||
}
|
|
||||||
|
|
||||||
// set partial to true to test if, for example,
|
|
||||||
// "/a/b" matches the start of "/*/b/*/d"
|
|
||||||
// Partial means, if you run out of file before you run
|
|
||||||
// out of pattern, then that's fine, as long as all
|
|
||||||
// the parts match.
|
|
||||||
Minimatch.prototype.matchOne = function (file, pattern, partial) {
|
|
||||||
var options = this.options
|
|
||||||
|
|
||||||
this.debug('matchOne',
|
|
||||||
{ 'this': this, file: file, pattern: pattern })
|
|
||||||
|
|
||||||
this.debug('matchOne', file.length, pattern.length)
|
|
||||||
|
|
||||||
for (var fi = 0,
|
|
||||||
pi = 0,
|
|
||||||
fl = file.length,
|
|
||||||
pl = pattern.length
|
|
||||||
; (fi < fl) && (pi < pl)
|
|
||||||
; fi++, pi++) {
|
|
||||||
this.debug('matchOne loop')
|
|
||||||
var p = pattern[pi]
|
|
||||||
var f = file[fi]
|
|
||||||
|
|
||||||
this.debug(pattern, p, f)
|
|
||||||
|
|
||||||
// should be impossible.
|
|
||||||
// some invalid regexp stuff in the set.
|
|
||||||
/* istanbul ignore if */
|
|
||||||
if (p === false) return false
|
|
||||||
|
|
||||||
if (p === GLOBSTAR) {
|
|
||||||
this.debug('GLOBSTAR', [pattern, p, f])
|
|
||||||
|
|
||||||
// "**"
|
|
||||||
// a/**/b/**/c would match the following:
|
|
||||||
// a/b/x/y/z/c
|
|
||||||
// a/x/y/z/b/c
|
|
||||||
// a/b/x/b/x/c
|
|
||||||
// a/b/c
|
|
||||||
// To do this, take the rest of the pattern after
|
|
||||||
// the **, and see if it would match the file remainder.
|
|
||||||
// If so, return success.
|
|
||||||
// If not, the ** "swallows" a segment, and try again.
|
|
||||||
// This is recursively awful.
|
|
||||||
//
|
|
||||||
// a/**/b/**/c matching a/b/x/y/z/c
|
|
||||||
// - a matches a
|
|
||||||
// - doublestar
|
|
||||||
// - matchOne(b/x/y/z/c, b/**/c)
|
|
||||||
// - b matches b
|
|
||||||
// - doublestar
|
|
||||||
// - matchOne(x/y/z/c, c) -> no
|
|
||||||
// - matchOne(y/z/c, c) -> no
|
|
||||||
// - matchOne(z/c, c) -> no
|
|
||||||
// - matchOne(c, c) yes, hit
|
|
||||||
var fr = fi
|
|
||||||
var pr = pi + 1
|
|
||||||
if (pr === pl) {
|
|
||||||
this.debug('** at the end')
|
|
||||||
// a ** at the end will just swallow the rest.
|
|
||||||
// We have found a match.
|
|
||||||
// however, it will not swallow /.x, unless
|
|
||||||
// options.dot is set.
|
|
||||||
// . and .. are *never* matched by **, for explosively
|
|
||||||
// exponential reasons.
|
|
||||||
for (; fi < fl; fi++) {
|
|
||||||
if (file[fi] === '.' || file[fi] === '..' ||
|
|
||||||
(!options.dot && file[fi].charAt(0) === '.')) return false
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// ok, let's see if we can swallow whatever we can.
|
|
||||||
while (fr < fl) {
|
|
||||||
var swallowee = file[fr]
|
|
||||||
|
|
||||||
this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)
|
|
||||||
|
|
||||||
// XXX remove this slice. Just pass the start index.
|
|
||||||
if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
|
|
||||||
this.debug('globstar found match!', fr, fl, swallowee)
|
|
||||||
// found a match.
|
|
||||||
return true
|
|
||||||
} else {
|
|
||||||
// can't swallow "." or ".." ever.
|
|
||||||
// can only swallow ".foo" when explicitly asked.
|
|
||||||
if (swallowee === '.' || swallowee === '..' ||
|
|
||||||
(!options.dot && swallowee.charAt(0) === '.')) {
|
|
||||||
this.debug('dot detected!', file, fr, pattern, pr)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
// ** swallows a segment, and continue.
|
|
||||||
this.debug('globstar swallow a segment, and continue')
|
|
||||||
fr++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// no match was found.
|
|
||||||
// However, in partial mode, we can't say this is necessarily over.
|
|
||||||
// If there's more *pattern* left, then
|
|
||||||
/* istanbul ignore if */
|
|
||||||
if (partial) {
|
|
||||||
// ran out of file
|
|
||||||
this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
|
|
||||||
if (fr === fl) return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// something other than **
|
|
||||||
// non-magic patterns just have to match exactly
|
|
||||||
// patterns with magic have been turned into regexps.
|
|
||||||
var hit
|
|
||||||
if (typeof p === 'string') {
|
|
||||||
hit = f === p
|
|
||||||
this.debug('string match', p, f, hit)
|
|
||||||
} else {
|
|
||||||
hit = f.match(p)
|
|
||||||
this.debug('pattern match', p, f, hit)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hit) return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Note: ending in / means that we'll get a final ""
|
|
||||||
// at the end of the pattern. This can only match a
|
|
||||||
// corresponding "" at the end of the file.
|
|
||||||
// If the file ends in /, then it can only match a
|
|
||||||
// a pattern that ends in /, unless the pattern just
|
|
||||||
// doesn't have any more for it. But, a/b/ should *not*
|
|
||||||
// match "a/b/*", even though "" matches against the
|
|
||||||
// [^/]*? pattern, except in partial mode, where it might
|
|
||||||
// simply not be reached yet.
|
|
||||||
// However, a/b/ should still satisfy a/*
|
|
||||||
|
|
||||||
// now either we fell off the end of the pattern, or we're done.
|
|
||||||
if (fi === fl && pi === pl) {
|
|
||||||
// ran out of pattern and filename at the same time.
|
|
||||||
// an exact hit!
|
|
||||||
return true
|
|
||||||
} else if (fi === fl) {
|
|
||||||
// ran out of file, but still had pattern left.
|
|
||||||
// this is ok if we're doing the match as part of
|
|
||||||
// a glob fs traversal.
|
|
||||||
return partial
|
|
||||||
} else /* istanbul ignore else */ if (pi === pl) {
|
|
||||||
// ran out of pattern, still have file left.
|
|
||||||
// this is only acceptable if we're on the very last
|
|
||||||
// empty segment of a file with a trailing slash.
|
|
||||||
// a/* should match a/b/
|
|
||||||
return (fi === fl - 1) && (file[fi] === '')
|
|
||||||
}
|
|
||||||
|
|
||||||
// should be unreachable.
|
|
||||||
/* istanbul ignore next */
|
|
||||||
throw new Error('wtf?')
|
|
||||||
}
|
|
||||||
|
|
||||||
// replace stuff like \* with *
|
|
||||||
function globUnescape (s) {
|
|
||||||
return s.replace(/\\(.)/g, '$1')
|
|
||||||
}
|
|
||||||
|
|
||||||
function regExpEscape (s) {
|
|
||||||
return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 66186:
|
/***/ 66186:
|
||||||
@ -88034,216 +89406,6 @@ function readdirGlob(pattern, options, cb) {
|
|||||||
}
|
}
|
||||||
readdirGlob.ReaddirGlob = ReaddirGlob;
|
readdirGlob.ReaddirGlob = ReaddirGlob;
|
||||||
|
|
||||||
/***/ }),
|
|
||||||
|
|
||||||
/***/ 80226:
|
|
||||||
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
|
||||||
|
|
||||||
var balanced = __nccwpck_require__(9417);
|
|
||||||
|
|
||||||
module.exports = expandTop;
|
|
||||||
|
|
||||||
var escSlash = '\0SLASH'+Math.random()+'\0';
|
|
||||||
var escOpen = '\0OPEN'+Math.random()+'\0';
|
|
||||||
var escClose = '\0CLOSE'+Math.random()+'\0';
|
|
||||||
var escComma = '\0COMMA'+Math.random()+'\0';
|
|
||||||
var escPeriod = '\0PERIOD'+Math.random()+'\0';
|
|
||||||
|
|
||||||
function numeric(str) {
|
|
||||||
return parseInt(str, 10) == str
|
|
||||||
? parseInt(str, 10)
|
|
||||||
: str.charCodeAt(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
function escapeBraces(str) {
|
|
||||||
return str.split('\\\\').join(escSlash)
|
|
||||||
.split('\\{').join(escOpen)
|
|
||||||
.split('\\}').join(escClose)
|
|
||||||
.split('\\,').join(escComma)
|
|
||||||
.split('\\.').join(escPeriod);
|
|
||||||
}
|
|
||||||
|
|
||||||
function unescapeBraces(str) {
|
|
||||||
return str.split(escSlash).join('\\')
|
|
||||||
.split(escOpen).join('{')
|
|
||||||
.split(escClose).join('}')
|
|
||||||
.split(escComma).join(',')
|
|
||||||
.split(escPeriod).join('.');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Basically just str.split(","), but handling cases
|
|
||||||
// where we have nested braced sections, which should be
|
|
||||||
// treated as individual members, like {a,{b,c},d}
|
|
||||||
function parseCommaParts(str) {
|
|
||||||
if (!str)
|
|
||||||
return [''];
|
|
||||||
|
|
||||||
var parts = [];
|
|
||||||
var m = balanced('{', '}', str);
|
|
||||||
|
|
||||||
if (!m)
|
|
||||||
return str.split(',');
|
|
||||||
|
|
||||||
var pre = m.pre;
|
|
||||||
var body = m.body;
|
|
||||||
var post = m.post;
|
|
||||||
var p = pre.split(',');
|
|
||||||
|
|
||||||
p[p.length-1] += '{' + body + '}';
|
|
||||||
var postParts = parseCommaParts(post);
|
|
||||||
if (post.length) {
|
|
||||||
p[p.length-1] += postParts.shift();
|
|
||||||
p.push.apply(p, postParts);
|
|
||||||
}
|
|
||||||
|
|
||||||
parts.push.apply(parts, p);
|
|
||||||
|
|
||||||
return parts;
|
|
||||||
}
|
|
||||||
|
|
||||||
function expandTop(str) {
|
|
||||||
if (!str)
|
|
||||||
return [];
|
|
||||||
|
|
||||||
// I don't know why Bash 4.3 does this, but it does.
|
|
||||||
// Anything starting with {} will have the first two bytes preserved
|
|
||||||
// but *only* at the top level, so {},a}b will not expand to anything,
|
|
||||||
// but a{},b}c will be expanded to [a}c,abc].
|
|
||||||
// One could argue that this is a bug in Bash, but since the goal of
|
|
||||||
// this module is to match Bash's rules, we escape a leading {}
|
|
||||||
if (str.substr(0, 2) === '{}') {
|
|
||||||
str = '\\{\\}' + str.substr(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
return expand(escapeBraces(str), true).map(unescapeBraces);
|
|
||||||
}
|
|
||||||
|
|
||||||
function embrace(str) {
|
|
||||||
return '{' + str + '}';
|
|
||||||
}
|
|
||||||
function isPadded(el) {
|
|
||||||
return /^-?0\d/.test(el);
|
|
||||||
}
|
|
||||||
|
|
||||||
function lte(i, y) {
|
|
||||||
return i <= y;
|
|
||||||
}
|
|
||||||
function gte(i, y) {
|
|
||||||
return i >= y;
|
|
||||||
}
|
|
||||||
|
|
||||||
function expand(str, isTop) {
|
|
||||||
var expansions = [];
|
|
||||||
|
|
||||||
var m = balanced('{', '}', str);
|
|
||||||
if (!m) return [str];
|
|
||||||
|
|
||||||
// no need to expand pre, since it is guaranteed to be free of brace-sets
|
|
||||||
var pre = m.pre;
|
|
||||||
var post = m.post.length
|
|
||||||
? expand(m.post, false)
|
|
||||||
: [''];
|
|
||||||
|
|
||||||
if (/\$$/.test(m.pre)) {
|
|
||||||
for (var k = 0; k < post.length; k++) {
|
|
||||||
var expansion = pre+ '{' + m.body + '}' + post[k];
|
|
||||||
expansions.push(expansion);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
|
|
||||||
var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
|
|
||||||
var isSequence = isNumericSequence || isAlphaSequence;
|
|
||||||
var isOptions = m.body.indexOf(',') >= 0;
|
|
||||||
if (!isSequence && !isOptions) {
|
|
||||||
// {a},b}
|
|
||||||
if (m.post.match(/,.*\}/)) {
|
|
||||||
str = m.pre + '{' + m.body + escClose + m.post;
|
|
||||||
return expand(str);
|
|
||||||
}
|
|
||||||
return [str];
|
|
||||||
}
|
|
||||||
|
|
||||||
var n;
|
|
||||||
if (isSequence) {
|
|
||||||
n = m.body.split(/\.\./);
|
|
||||||
} else {
|
|
||||||
n = parseCommaParts(m.body);
|
|
||||||
if (n.length === 1) {
|
|
||||||
// x{{a,b}}y ==> x{a}y x{b}y
|
|
||||||
n = expand(n[0], false).map(embrace);
|
|
||||||
if (n.length === 1) {
|
|
||||||
return post.map(function(p) {
|
|
||||||
return m.pre + n[0] + p;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// at this point, n is the parts, and we know it's not a comma set
|
|
||||||
// with a single entry.
|
|
||||||
var N;
|
|
||||||
|
|
||||||
if (isSequence) {
|
|
||||||
var x = numeric(n[0]);
|
|
||||||
var y = numeric(n[1]);
|
|
||||||
var width = Math.max(n[0].length, n[1].length)
|
|
||||||
var incr = n.length == 3
|
|
||||||
? Math.abs(numeric(n[2]))
|
|
||||||
: 1;
|
|
||||||
var test = lte;
|
|
||||||
var reverse = y < x;
|
|
||||||
if (reverse) {
|
|
||||||
incr *= -1;
|
|
||||||
test = gte;
|
|
||||||
}
|
|
||||||
var pad = n.some(isPadded);
|
|
||||||
|
|
||||||
N = [];
|
|
||||||
|
|
||||||
for (var i = x; test(i, y); i += incr) {
|
|
||||||
var c;
|
|
||||||
if (isAlphaSequence) {
|
|
||||||
c = String.fromCharCode(i);
|
|
||||||
if (c === '\\')
|
|
||||||
c = '';
|
|
||||||
} else {
|
|
||||||
c = String(i);
|
|
||||||
if (pad) {
|
|
||||||
var need = width - c.length;
|
|
||||||
if (need > 0) {
|
|
||||||
var z = new Array(need + 1).join('0');
|
|
||||||
if (i < 0)
|
|
||||||
c = '-' + z + c.slice(1);
|
|
||||||
else
|
|
||||||
c = z + c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
N.push(c);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
N = [];
|
|
||||||
|
|
||||||
for (var j = 0; j < n.length; j++) {
|
|
||||||
N.push.apply(N, expand(n[j], false));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var j = 0; j < N.length; j++) {
|
|
||||||
for (var k = 0; k < post.length; k++) {
|
|
||||||
var expansion = pre + N[j] + post[k];
|
|
||||||
if (!isTop || isSequence || expansion)
|
|
||||||
expansions.push(expansion);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return expansions;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 79482:
|
/***/ 79482:
|
||||||
@ -88278,7 +89440,7 @@ minimatch.sep = path.sep
|
|||||||
|
|
||||||
const GLOBSTAR = Symbol('globstar **')
|
const GLOBSTAR = Symbol('globstar **')
|
||||||
minimatch.GLOBSTAR = GLOBSTAR
|
minimatch.GLOBSTAR = GLOBSTAR
|
||||||
const expand = __nccwpck_require__(80226)
|
const expand = __nccwpck_require__(33717)
|
||||||
|
|
||||||
const plTypes = {
|
const plTypes = {
|
||||||
'!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
|
'!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
|
||||||
@ -125531,6 +126693,214 @@ utils.walkdir = function(dirpath, base, callback) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 47679:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
var concatMap = __nccwpck_require__(86891);
|
||||||
|
var balanced = __nccwpck_require__(9417);
|
||||||
|
|
||||||
|
module.exports = expandTop;
|
||||||
|
|
||||||
|
var escSlash = '\0SLASH'+Math.random()+'\0';
|
||||||
|
var escOpen = '\0OPEN'+Math.random()+'\0';
|
||||||
|
var escClose = '\0CLOSE'+Math.random()+'\0';
|
||||||
|
var escComma = '\0COMMA'+Math.random()+'\0';
|
||||||
|
var escPeriod = '\0PERIOD'+Math.random()+'\0';
|
||||||
|
|
||||||
|
function numeric(str) {
|
||||||
|
return parseInt(str, 10) == str
|
||||||
|
? parseInt(str, 10)
|
||||||
|
: str.charCodeAt(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function escapeBraces(str) {
|
||||||
|
return str.split('\\\\').join(escSlash)
|
||||||
|
.split('\\{').join(escOpen)
|
||||||
|
.split('\\}').join(escClose)
|
||||||
|
.split('\\,').join(escComma)
|
||||||
|
.split('\\.').join(escPeriod);
|
||||||
|
}
|
||||||
|
|
||||||
|
function unescapeBraces(str) {
|
||||||
|
return str.split(escSlash).join('\\')
|
||||||
|
.split(escOpen).join('{')
|
||||||
|
.split(escClose).join('}')
|
||||||
|
.split(escComma).join(',')
|
||||||
|
.split(escPeriod).join('.');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Basically just str.split(","), but handling cases
|
||||||
|
// where we have nested braced sections, which should be
|
||||||
|
// treated as individual members, like {a,{b,c},d}
|
||||||
|
function parseCommaParts(str) {
|
||||||
|
if (!str)
|
||||||
|
return [''];
|
||||||
|
|
||||||
|
var parts = [];
|
||||||
|
var m = balanced('{', '}', str);
|
||||||
|
|
||||||
|
if (!m)
|
||||||
|
return str.split(',');
|
||||||
|
|
||||||
|
var pre = m.pre;
|
||||||
|
var body = m.body;
|
||||||
|
var post = m.post;
|
||||||
|
var p = pre.split(',');
|
||||||
|
|
||||||
|
p[p.length-1] += '{' + body + '}';
|
||||||
|
var postParts = parseCommaParts(post);
|
||||||
|
if (post.length) {
|
||||||
|
p[p.length-1] += postParts.shift();
|
||||||
|
p.push.apply(p, postParts);
|
||||||
|
}
|
||||||
|
|
||||||
|
parts.push.apply(parts, p);
|
||||||
|
|
||||||
|
return parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
function expandTop(str) {
|
||||||
|
if (!str)
|
||||||
|
return [];
|
||||||
|
|
||||||
|
// I don't know why Bash 4.3 does this, but it does.
|
||||||
|
// Anything starting with {} will have the first two bytes preserved
|
||||||
|
// but *only* at the top level, so {},a}b will not expand to anything,
|
||||||
|
// but a{},b}c will be expanded to [a}c,abc].
|
||||||
|
// One could argue that this is a bug in Bash, but since the goal of
|
||||||
|
// this module is to match Bash's rules, we escape a leading {}
|
||||||
|
if (str.substr(0, 2) === '{}') {
|
||||||
|
str = '\\{\\}' + str.substr(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
return expand(escapeBraces(str), true).map(unescapeBraces);
|
||||||
|
}
|
||||||
|
|
||||||
|
function identity(e) {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
function embrace(str) {
|
||||||
|
return '{' + str + '}';
|
||||||
|
}
|
||||||
|
function isPadded(el) {
|
||||||
|
return /^-?0\d/.test(el);
|
||||||
|
}
|
||||||
|
|
||||||
|
function lte(i, y) {
|
||||||
|
return i <= y;
|
||||||
|
}
|
||||||
|
function gte(i, y) {
|
||||||
|
return i >= y;
|
||||||
|
}
|
||||||
|
|
||||||
|
function expand(str, isTop) {
|
||||||
|
var expansions = [];
|
||||||
|
|
||||||
|
var m = balanced('{', '}', str);
|
||||||
|
if (!m || /\$$/.test(m.pre)) return [str];
|
||||||
|
|
||||||
|
var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
|
||||||
|
var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
|
||||||
|
var isSequence = isNumericSequence || isAlphaSequence;
|
||||||
|
var isOptions = m.body.indexOf(',') >= 0;
|
||||||
|
if (!isSequence && !isOptions) {
|
||||||
|
// {a},b}
|
||||||
|
if (m.post.match(/,.*\}/)) {
|
||||||
|
str = m.pre + '{' + m.body + escClose + m.post;
|
||||||
|
return expand(str);
|
||||||
|
}
|
||||||
|
return [str];
|
||||||
|
}
|
||||||
|
|
||||||
|
var n;
|
||||||
|
if (isSequence) {
|
||||||
|
n = m.body.split(/\.\./);
|
||||||
|
} else {
|
||||||
|
n = parseCommaParts(m.body);
|
||||||
|
if (n.length === 1) {
|
||||||
|
// x{{a,b}}y ==> x{a}y x{b}y
|
||||||
|
n = expand(n[0], false).map(embrace);
|
||||||
|
if (n.length === 1) {
|
||||||
|
var post = m.post.length
|
||||||
|
? expand(m.post, false)
|
||||||
|
: [''];
|
||||||
|
return post.map(function(p) {
|
||||||
|
return m.pre + n[0] + p;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// at this point, n is the parts, and we know it's not a comma set
|
||||||
|
// with a single entry.
|
||||||
|
|
||||||
|
// no need to expand pre, since it is guaranteed to be free of brace-sets
|
||||||
|
var pre = m.pre;
|
||||||
|
var post = m.post.length
|
||||||
|
? expand(m.post, false)
|
||||||
|
: [''];
|
||||||
|
|
||||||
|
var N;
|
||||||
|
|
||||||
|
if (isSequence) {
|
||||||
|
var x = numeric(n[0]);
|
||||||
|
var y = numeric(n[1]);
|
||||||
|
var width = Math.max(n[0].length, n[1].length)
|
||||||
|
var incr = n.length == 3
|
||||||
|
? Math.abs(numeric(n[2]))
|
||||||
|
: 1;
|
||||||
|
var test = lte;
|
||||||
|
var reverse = y < x;
|
||||||
|
if (reverse) {
|
||||||
|
incr *= -1;
|
||||||
|
test = gte;
|
||||||
|
}
|
||||||
|
var pad = n.some(isPadded);
|
||||||
|
|
||||||
|
N = [];
|
||||||
|
|
||||||
|
for (var i = x; test(i, y); i += incr) {
|
||||||
|
var c;
|
||||||
|
if (isAlphaSequence) {
|
||||||
|
c = String.fromCharCode(i);
|
||||||
|
if (c === '\\')
|
||||||
|
c = '';
|
||||||
|
} else {
|
||||||
|
c = String(i);
|
||||||
|
if (pad) {
|
||||||
|
var need = width - c.length;
|
||||||
|
if (need > 0) {
|
||||||
|
var z = new Array(need + 1).join('0');
|
||||||
|
if (i < 0)
|
||||||
|
c = '-' + z + c.slice(1);
|
||||||
|
else
|
||||||
|
c = z + c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
N.push(c);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
N = concatMap(n, function(el) { return expand(el, false) });
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var j = 0; j < N.length; j++) {
|
||||||
|
for (var k = 0; k < post.length; k++) {
|
||||||
|
var expansion = pre + N[j] + post[k];
|
||||||
|
if (!isTop || isSequence || expansion)
|
||||||
|
expansions.push(expansion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return expansions;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 15196:
|
/***/ 15196:
|
||||||
@ -125550,7 +126920,7 @@ function ownProp (obj, field) {
|
|||||||
|
|
||||||
var fs = __nccwpck_require__(57147)
|
var fs = __nccwpck_require__(57147)
|
||||||
var path = __nccwpck_require__(71017)
|
var path = __nccwpck_require__(71017)
|
||||||
var minimatch = __nccwpck_require__(83973)
|
var minimatch = __nccwpck_require__(64413)
|
||||||
var isAbsolute = __nccwpck_require__(38714)
|
var isAbsolute = __nccwpck_require__(38714)
|
||||||
var Minimatch = minimatch.Minimatch
|
var Minimatch = minimatch.Minimatch
|
||||||
|
|
||||||
@ -125824,7 +127194,7 @@ function childrenIgnored (self, path) {
|
|||||||
module.exports = glob
|
module.exports = glob
|
||||||
|
|
||||||
var rp = __nccwpck_require__(46863)
|
var rp = __nccwpck_require__(46863)
|
||||||
var minimatch = __nccwpck_require__(83973)
|
var minimatch = __nccwpck_require__(64413)
|
||||||
var Minimatch = minimatch.Minimatch
|
var Minimatch = minimatch.Minimatch
|
||||||
var inherits = __nccwpck_require__(44124)
|
var inherits = __nccwpck_require__(44124)
|
||||||
var EE = (__nccwpck_require__(82361).EventEmitter)
|
var EE = (__nccwpck_require__(82361).EventEmitter)
|
||||||
@ -126582,7 +127952,7 @@ module.exports = globSync
|
|||||||
globSync.GlobSync = GlobSync
|
globSync.GlobSync = GlobSync
|
||||||
|
|
||||||
var rp = __nccwpck_require__(46863)
|
var rp = __nccwpck_require__(46863)
|
||||||
var minimatch = __nccwpck_require__(83973)
|
var minimatch = __nccwpck_require__(64413)
|
||||||
var Minimatch = minimatch.Minimatch
|
var Minimatch = minimatch.Minimatch
|
||||||
var Glob = (__nccwpck_require__(27316).Glob)
|
var Glob = (__nccwpck_require__(27316).Glob)
|
||||||
var util = __nccwpck_require__(73837)
|
var util = __nccwpck_require__(73837)
|
||||||
@ -127066,6 +128436,960 @@ GlobSync.prototype._makeAbs = function (f) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ 64413:
|
||||||
|
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
|
||||||
|
|
||||||
|
module.exports = minimatch
|
||||||
|
minimatch.Minimatch = Minimatch
|
||||||
|
|
||||||
|
var path = (function () { try { return __nccwpck_require__(71017) } catch (e) {}}()) || {
|
||||||
|
sep: '/'
|
||||||
|
}
|
||||||
|
minimatch.sep = path.sep
|
||||||
|
|
||||||
|
var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
|
||||||
|
var expand = __nccwpck_require__(47679)
|
||||||
|
|
||||||
|
var plTypes = {
|
||||||
|
'!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
|
||||||
|
'?': { open: '(?:', close: ')?' },
|
||||||
|
'+': { open: '(?:', close: ')+' },
|
||||||
|
'*': { open: '(?:', close: ')*' },
|
||||||
|
'@': { open: '(?:', close: ')' }
|
||||||
|
}
|
||||||
|
|
||||||
|
// any single thing other than /
|
||||||
|
// don't need to escape / when using new RegExp()
|
||||||
|
var qmark = '[^/]'
|
||||||
|
|
||||||
|
// * => any number of characters
|
||||||
|
var star = qmark + '*?'
|
||||||
|
|
||||||
|
// ** when dots are allowed. Anything goes, except .. and .
|
||||||
|
// not (^ or / followed by one or two dots followed by $ or /),
|
||||||
|
// followed by anything, any number of times.
|
||||||
|
var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'
|
||||||
|
|
||||||
|
// not a ^ or / followed by a dot,
|
||||||
|
// followed by anything, any number of times.
|
||||||
|
var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'
|
||||||
|
|
||||||
|
// characters that need to be escaped in RegExp.
|
||||||
|
var reSpecials = charSet('().*{}+?[]^$\\!')
|
||||||
|
|
||||||
|
// "abc" -> { a:true, b:true, c:true }
|
||||||
|
function charSet (s) {
|
||||||
|
return s.split('').reduce(function (set, c) {
|
||||||
|
set[c] = true
|
||||||
|
return set
|
||||||
|
}, {})
|
||||||
|
}
|
||||||
|
|
||||||
|
// normalizes slashes.
|
||||||
|
var slashSplit = /\/+/
|
||||||
|
|
||||||
|
minimatch.filter = filter
|
||||||
|
function filter (pattern, options) {
|
||||||
|
options = options || {}
|
||||||
|
return function (p, i, list) {
|
||||||
|
return minimatch(p, pattern, options)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ext (a, b) {
|
||||||
|
b = b || {}
|
||||||
|
var t = {}
|
||||||
|
Object.keys(a).forEach(function (k) {
|
||||||
|
t[k] = a[k]
|
||||||
|
})
|
||||||
|
Object.keys(b).forEach(function (k) {
|
||||||
|
t[k] = b[k]
|
||||||
|
})
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
|
minimatch.defaults = function (def) {
|
||||||
|
if (!def || typeof def !== 'object' || !Object.keys(def).length) {
|
||||||
|
return minimatch
|
||||||
|
}
|
||||||
|
|
||||||
|
var orig = minimatch
|
||||||
|
|
||||||
|
var m = function minimatch (p, pattern, options) {
|
||||||
|
return orig(p, pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Minimatch = function Minimatch (pattern, options) {
|
||||||
|
return new orig.Minimatch(pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
m.Minimatch.defaults = function defaults (options) {
|
||||||
|
return orig.defaults(ext(def, options)).Minimatch
|
||||||
|
}
|
||||||
|
|
||||||
|
m.filter = function filter (pattern, options) {
|
||||||
|
return orig.filter(pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.defaults = function defaults (options) {
|
||||||
|
return orig.defaults(ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.makeRe = function makeRe (pattern, options) {
|
||||||
|
return orig.makeRe(pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.braceExpand = function braceExpand (pattern, options) {
|
||||||
|
return orig.braceExpand(pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.match = function (list, pattern, options) {
|
||||||
|
return orig.match(list, pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.defaults = function (def) {
|
||||||
|
return minimatch.defaults(def).Minimatch
|
||||||
|
}
|
||||||
|
|
||||||
|
function minimatch (p, pattern, options) {
|
||||||
|
assertValidPattern(pattern)
|
||||||
|
|
||||||
|
if (!options) options = {}
|
||||||
|
|
||||||
|
// shortcut: comments match nothing.
|
||||||
|
if (!options.nocomment && pattern.charAt(0) === '#') {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Minimatch(pattern, options).match(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
function Minimatch (pattern, options) {
|
||||||
|
if (!(this instanceof Minimatch)) {
|
||||||
|
return new Minimatch(pattern, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
assertValidPattern(pattern)
|
||||||
|
|
||||||
|
if (!options) options = {}
|
||||||
|
|
||||||
|
pattern = pattern.trim()
|
||||||
|
|
||||||
|
// windows support: need to use /, not \
|
||||||
|
if (!options.allowWindowsEscape && path.sep !== '/') {
|
||||||
|
pattern = pattern.split(path.sep).join('/')
|
||||||
|
}
|
||||||
|
|
||||||
|
this.options = options
|
||||||
|
this.set = []
|
||||||
|
this.pattern = pattern
|
||||||
|
this.regexp = null
|
||||||
|
this.negate = false
|
||||||
|
this.comment = false
|
||||||
|
this.empty = false
|
||||||
|
this.partial = !!options.partial
|
||||||
|
|
||||||
|
// make the set of regexps etc.
|
||||||
|
this.make()
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.debug = function () {}
|
||||||
|
|
||||||
|
Minimatch.prototype.make = make
|
||||||
|
function make () {
|
||||||
|
var pattern = this.pattern
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
// empty patterns and comments match nothing.
|
||||||
|
if (!options.nocomment && pattern.charAt(0) === '#') {
|
||||||
|
this.comment = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!pattern) {
|
||||||
|
this.empty = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// step 1: figure out negation, etc.
|
||||||
|
this.parseNegate()
|
||||||
|
|
||||||
|
// step 2: expand braces
|
||||||
|
var set = this.globSet = this.braceExpand()
|
||||||
|
|
||||||
|
if (options.debug) this.debug = function debug() { console.error.apply(console, arguments) }
|
||||||
|
|
||||||
|
this.debug(this.pattern, set)
|
||||||
|
|
||||||
|
// step 3: now we have a set, so turn each one into a series of path-portion
|
||||||
|
// matching patterns.
|
||||||
|
// These will be regexps, except in the case of "**", which is
|
||||||
|
// set to the GLOBSTAR object for globstar behavior,
|
||||||
|
// and will not contain any / characters
|
||||||
|
set = this.globParts = set.map(function (s) {
|
||||||
|
return s.split(slashSplit)
|
||||||
|
})
|
||||||
|
|
||||||
|
this.debug(this.pattern, set)
|
||||||
|
|
||||||
|
// glob --> regexps
|
||||||
|
set = set.map(function (s, si, set) {
|
||||||
|
return s.map(this.parse, this)
|
||||||
|
}, this)
|
||||||
|
|
||||||
|
this.debug(this.pattern, set)
|
||||||
|
|
||||||
|
// filter out everything that didn't compile properly.
|
||||||
|
set = set.filter(function (s) {
|
||||||
|
return s.indexOf(false) === -1
|
||||||
|
})
|
||||||
|
|
||||||
|
this.debug(this.pattern, set)
|
||||||
|
|
||||||
|
this.set = set
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.parseNegate = parseNegate
|
||||||
|
function parseNegate () {
|
||||||
|
var pattern = this.pattern
|
||||||
|
var negate = false
|
||||||
|
var options = this.options
|
||||||
|
var negateOffset = 0
|
||||||
|
|
||||||
|
if (options.nonegate) return
|
||||||
|
|
||||||
|
for (var i = 0, l = pattern.length
|
||||||
|
; i < l && pattern.charAt(i) === '!'
|
||||||
|
; i++) {
|
||||||
|
negate = !negate
|
||||||
|
negateOffset++
|
||||||
|
}
|
||||||
|
|
||||||
|
if (negateOffset) this.pattern = pattern.substr(negateOffset)
|
||||||
|
this.negate = negate
|
||||||
|
}
|
||||||
|
|
||||||
|
// Brace expansion:
|
||||||
|
// a{b,c}d -> abd acd
|
||||||
|
// a{b,}c -> abc ac
|
||||||
|
// a{0..3}d -> a0d a1d a2d a3d
|
||||||
|
// a{b,c{d,e}f}g -> abg acdfg acefg
|
||||||
|
// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
|
||||||
|
//
|
||||||
|
// Invalid sets are not expanded.
|
||||||
|
// a{2..}b -> a{2..}b
|
||||||
|
// a{b}c -> a{b}c
|
||||||
|
minimatch.braceExpand = function (pattern, options) {
|
||||||
|
return braceExpand(pattern, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.braceExpand = braceExpand
|
||||||
|
|
||||||
|
function braceExpand (pattern, options) {
|
||||||
|
if (!options) {
|
||||||
|
if (this instanceof Minimatch) {
|
||||||
|
options = this.options
|
||||||
|
} else {
|
||||||
|
options = {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pattern = typeof pattern === 'undefined'
|
||||||
|
? this.pattern : pattern
|
||||||
|
|
||||||
|
assertValidPattern(pattern)
|
||||||
|
|
||||||
|
// Thanks to Yeting Li <https://github.com/yetingli> for
|
||||||
|
// improving this regexp to avoid a ReDOS vulnerability.
|
||||||
|
if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
|
||||||
|
// shortcut. no need to expand.
|
||||||
|
return [pattern]
|
||||||
|
}
|
||||||
|
|
||||||
|
return expand(pattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
var MAX_PATTERN_LENGTH = 1024 * 64
|
||||||
|
var assertValidPattern = function (pattern) {
|
||||||
|
if (typeof pattern !== 'string') {
|
||||||
|
throw new TypeError('invalid pattern')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pattern.length > MAX_PATTERN_LENGTH) {
|
||||||
|
throw new TypeError('pattern is too long')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse a component of the expanded set.
|
||||||
|
// At this point, no pattern may contain "/" in it
|
||||||
|
// so we're going to return a 2d array, where each entry is the full
|
||||||
|
// pattern, split on '/', and then turned into a regular expression.
|
||||||
|
// A regexp is made at the end which joins each array with an
|
||||||
|
// escaped /, and another full one which joins each regexp with |.
|
||||||
|
//
|
||||||
|
// Following the lead of Bash 4.1, note that "**" only has special meaning
|
||||||
|
// when it is the *only* thing in a path portion. Otherwise, any series
|
||||||
|
// of * is equivalent to a single *. Globstar behavior is enabled by
|
||||||
|
// default, and can be disabled by setting options.noglobstar.
|
||||||
|
Minimatch.prototype.parse = parse
|
||||||
|
var SUBPARSE = {}
|
||||||
|
function parse (pattern, isSub) {
|
||||||
|
assertValidPattern(pattern)
|
||||||
|
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
// shortcuts
|
||||||
|
if (pattern === '**') {
|
||||||
|
if (!options.noglobstar)
|
||||||
|
return GLOBSTAR
|
||||||
|
else
|
||||||
|
pattern = '*'
|
||||||
|
}
|
||||||
|
if (pattern === '') return ''
|
||||||
|
|
||||||
|
var re = ''
|
||||||
|
var hasMagic = !!options.nocase
|
||||||
|
var escaping = false
|
||||||
|
// ? => one single character
|
||||||
|
var patternListStack = []
|
||||||
|
var negativeLists = []
|
||||||
|
var stateChar
|
||||||
|
var inClass = false
|
||||||
|
var reClassStart = -1
|
||||||
|
var classStart = -1
|
||||||
|
// . and .. never match anything that doesn't start with .,
|
||||||
|
// even when options.dot is set.
|
||||||
|
var patternStart = pattern.charAt(0) === '.' ? '' // anything
|
||||||
|
// not (start or / followed by . or .. followed by / or end)
|
||||||
|
: options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
|
||||||
|
: '(?!\\.)'
|
||||||
|
var self = this
|
||||||
|
|
||||||
|
function clearStateChar () {
|
||||||
|
if (stateChar) {
|
||||||
|
// we had some state-tracking character
|
||||||
|
// that wasn't consumed by this pass.
|
||||||
|
switch (stateChar) {
|
||||||
|
case '*':
|
||||||
|
re += star
|
||||||
|
hasMagic = true
|
||||||
|
break
|
||||||
|
case '?':
|
||||||
|
re += qmark
|
||||||
|
hasMagic = true
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
re += '\\' + stateChar
|
||||||
|
break
|
||||||
|
}
|
||||||
|
self.debug('clearStateChar %j %j', stateChar, re)
|
||||||
|
stateChar = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0, len = pattern.length, c
|
||||||
|
; (i < len) && (c = pattern.charAt(i))
|
||||||
|
; i++) {
|
||||||
|
this.debug('%s\t%s %s %j', pattern, i, re, c)
|
||||||
|
|
||||||
|
// skip over any that are escaped.
|
||||||
|
if (escaping && reSpecials[c]) {
|
||||||
|
re += '\\' + c
|
||||||
|
escaping = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
/* istanbul ignore next */
|
||||||
|
case '/': {
|
||||||
|
// completely not allowed, even escaped.
|
||||||
|
// Should already be path-split by now.
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
case '\\':
|
||||||
|
clearStateChar()
|
||||||
|
escaping = true
|
||||||
|
continue
|
||||||
|
|
||||||
|
// the various stateChar values
|
||||||
|
// for the "extglob" stuff.
|
||||||
|
case '?':
|
||||||
|
case '*':
|
||||||
|
case '+':
|
||||||
|
case '@':
|
||||||
|
case '!':
|
||||||
|
this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)
|
||||||
|
|
||||||
|
// all of those are literals inside a class, except that
|
||||||
|
// the glob [!a] means [^a] in regexp
|
||||||
|
if (inClass) {
|
||||||
|
this.debug(' in class')
|
||||||
|
if (c === '!' && i === classStart + 1) c = '^'
|
||||||
|
re += c
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we already have a stateChar, then it means
|
||||||
|
// that there was something like ** or +? in there.
|
||||||
|
// Handle the stateChar, then proceed with this one.
|
||||||
|
self.debug('call clearStateChar %j', stateChar)
|
||||||
|
clearStateChar()
|
||||||
|
stateChar = c
|
||||||
|
// if extglob is disabled, then +(asdf|foo) isn't a thing.
|
||||||
|
// just clear the statechar *now*, rather than even diving into
|
||||||
|
// the patternList stuff.
|
||||||
|
if (options.noext) clearStateChar()
|
||||||
|
continue
|
||||||
|
|
||||||
|
case '(':
|
||||||
|
if (inClass) {
|
||||||
|
re += '('
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stateChar) {
|
||||||
|
re += '\\('
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
patternListStack.push({
|
||||||
|
type: stateChar,
|
||||||
|
start: i - 1,
|
||||||
|
reStart: re.length,
|
||||||
|
open: plTypes[stateChar].open,
|
||||||
|
close: plTypes[stateChar].close
|
||||||
|
})
|
||||||
|
// negation is (?:(?!js)[^/]*)
|
||||||
|
re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
|
||||||
|
this.debug('plType %j %j', stateChar, re)
|
||||||
|
stateChar = false
|
||||||
|
continue
|
||||||
|
|
||||||
|
case ')':
|
||||||
|
if (inClass || !patternListStack.length) {
|
||||||
|
re += '\\)'
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
clearStateChar()
|
||||||
|
hasMagic = true
|
||||||
|
var pl = patternListStack.pop()
|
||||||
|
// negation is (?:(?!js)[^/]*)
|
||||||
|
// The others are (?:<pattern>)<type>
|
||||||
|
re += pl.close
|
||||||
|
if (pl.type === '!') {
|
||||||
|
negativeLists.push(pl)
|
||||||
|
}
|
||||||
|
pl.reEnd = re.length
|
||||||
|
continue
|
||||||
|
|
||||||
|
case '|':
|
||||||
|
if (inClass || !patternListStack.length || escaping) {
|
||||||
|
re += '\\|'
|
||||||
|
escaping = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
clearStateChar()
|
||||||
|
re += '|'
|
||||||
|
continue
|
||||||
|
|
||||||
|
// these are mostly the same in regexp and glob
|
||||||
|
case '[':
|
||||||
|
// swallow any state-tracking char before the [
|
||||||
|
clearStateChar()
|
||||||
|
|
||||||
|
if (inClass) {
|
||||||
|
re += '\\' + c
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
inClass = true
|
||||||
|
classStart = i
|
||||||
|
reClassStart = re.length
|
||||||
|
re += c
|
||||||
|
continue
|
||||||
|
|
||||||
|
case ']':
|
||||||
|
// a right bracket shall lose its special
|
||||||
|
// meaning and represent itself in
|
||||||
|
// a bracket expression if it occurs
|
||||||
|
// first in the list. -- POSIX.2 2.8.3.2
|
||||||
|
if (i === classStart + 1 || !inClass) {
|
||||||
|
re += '\\' + c
|
||||||
|
escaping = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle the case where we left a class open.
|
||||||
|
// "[z-a]" is valid, equivalent to "\[z-a\]"
|
||||||
|
// split where the last [ was, make sure we don't have
|
||||||
|
// an invalid re. if so, re-walk the contents of the
|
||||||
|
// would-be class to re-translate any characters that
|
||||||
|
// were passed through as-is
|
||||||
|
// TODO: It would probably be faster to determine this
|
||||||
|
// without a try/catch and a new RegExp, but it's tricky
|
||||||
|
// to do safely. For now, this is safe and works.
|
||||||
|
var cs = pattern.substring(classStart + 1, i)
|
||||||
|
try {
|
||||||
|
RegExp('[' + cs + ']')
|
||||||
|
} catch (er) {
|
||||||
|
// not a valid class!
|
||||||
|
var sp = this.parse(cs, SUBPARSE)
|
||||||
|
re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
|
||||||
|
hasMagic = hasMagic || sp[1]
|
||||||
|
inClass = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// finish up the class.
|
||||||
|
hasMagic = true
|
||||||
|
inClass = false
|
||||||
|
re += c
|
||||||
|
continue
|
||||||
|
|
||||||
|
default:
|
||||||
|
// swallow any state char that wasn't consumed
|
||||||
|
clearStateChar()
|
||||||
|
|
||||||
|
if (escaping) {
|
||||||
|
// no need
|
||||||
|
escaping = false
|
||||||
|
} else if (reSpecials[c]
|
||||||
|
&& !(c === '^' && inClass)) {
|
||||||
|
re += '\\'
|
||||||
|
}
|
||||||
|
|
||||||
|
re += c
|
||||||
|
|
||||||
|
} // switch
|
||||||
|
} // for
|
||||||
|
|
||||||
|
// handle the case where we left a class open.
|
||||||
|
// "[abc" is valid, equivalent to "\[abc"
|
||||||
|
if (inClass) {
|
||||||
|
// split where the last [ was, and escape it
|
||||||
|
// this is a huge pita. We now have to re-walk
|
||||||
|
// the contents of the would-be class to re-translate
|
||||||
|
// any characters that were passed through as-is
|
||||||
|
cs = pattern.substr(classStart + 1)
|
||||||
|
sp = this.parse(cs, SUBPARSE)
|
||||||
|
re = re.substr(0, reClassStart) + '\\[' + sp[0]
|
||||||
|
hasMagic = hasMagic || sp[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle the case where we had a +( thing at the *end*
|
||||||
|
// of the pattern.
|
||||||
|
// each pattern list stack adds 3 chars, and we need to go through
|
||||||
|
// and escape any | chars that were passed through as-is for the regexp.
|
||||||
|
// Go through and escape them, taking care not to double-escape any
|
||||||
|
// | chars that were already escaped.
|
||||||
|
for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
|
||||||
|
var tail = re.slice(pl.reStart + pl.open.length)
|
||||||
|
this.debug('setting tail', re, pl)
|
||||||
|
// maybe some even number of \, then maybe 1 \, followed by a |
|
||||||
|
tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
|
||||||
|
if (!$2) {
|
||||||
|
// the | isn't already escaped, so escape it.
|
||||||
|
$2 = '\\'
|
||||||
|
}
|
||||||
|
|
||||||
|
// need to escape all those slashes *again*, without escaping the
|
||||||
|
// one that we need for escaping the | character. As it works out,
|
||||||
|
// escaping an even number of slashes can be done by simply repeating
|
||||||
|
// it exactly after itself. That's why this trick works.
|
||||||
|
//
|
||||||
|
// I am sorry that you have to see this.
|
||||||
|
return $1 + $1 + $2 + '|'
|
||||||
|
})
|
||||||
|
|
||||||
|
this.debug('tail=%j\n %s', tail, tail, pl, re)
|
||||||
|
var t = pl.type === '*' ? star
|
||||||
|
: pl.type === '?' ? qmark
|
||||||
|
: '\\' + pl.type
|
||||||
|
|
||||||
|
hasMagic = true
|
||||||
|
re = re.slice(0, pl.reStart) + t + '\\(' + tail
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle trailing things that only matter at the very end.
|
||||||
|
clearStateChar()
|
||||||
|
if (escaping) {
|
||||||
|
// trailing \\
|
||||||
|
re += '\\\\'
|
||||||
|
}
|
||||||
|
|
||||||
|
// only need to apply the nodot start if the re starts with
|
||||||
|
// something that could conceivably capture a dot
|
||||||
|
var addPatternStart = false
|
||||||
|
switch (re.charAt(0)) {
|
||||||
|
case '[': case '.': case '(': addPatternStart = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hack to work around lack of negative lookbehind in JS
|
||||||
|
// A pattern like: *.!(x).!(y|z) needs to ensure that a name
|
||||||
|
// like 'a.xyz.yz' doesn't match. So, the first negative
|
||||||
|
// lookahead, has to look ALL the way ahead, to the end of
|
||||||
|
// the pattern.
|
||||||
|
for (var n = negativeLists.length - 1; n > -1; n--) {
|
||||||
|
var nl = negativeLists[n]
|
||||||
|
|
||||||
|
var nlBefore = re.slice(0, nl.reStart)
|
||||||
|
var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
|
||||||
|
var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
|
||||||
|
var nlAfter = re.slice(nl.reEnd)
|
||||||
|
|
||||||
|
nlLast += nlAfter
|
||||||
|
|
||||||
|
// Handle nested stuff like *(*.js|!(*.json)), where open parens
|
||||||
|
// mean that we should *not* include the ) in the bit that is considered
|
||||||
|
// "after" the negated section.
|
||||||
|
var openParensBefore = nlBefore.split('(').length - 1
|
||||||
|
var cleanAfter = nlAfter
|
||||||
|
for (i = 0; i < openParensBefore; i++) {
|
||||||
|
cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
|
||||||
|
}
|
||||||
|
nlAfter = cleanAfter
|
||||||
|
|
||||||
|
var dollar = ''
|
||||||
|
if (nlAfter === '' && isSub !== SUBPARSE) {
|
||||||
|
dollar = '$'
|
||||||
|
}
|
||||||
|
var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
|
||||||
|
re = newRe
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the re is not "" at this point, then we need to make sure
|
||||||
|
// it doesn't match against an empty path part.
|
||||||
|
// Otherwise a/* will match a/, which it should not.
|
||||||
|
if (re !== '' && hasMagic) {
|
||||||
|
re = '(?=.)' + re
|
||||||
|
}
|
||||||
|
|
||||||
|
if (addPatternStart) {
|
||||||
|
re = patternStart + re
|
||||||
|
}
|
||||||
|
|
||||||
|
// parsing just a piece of a larger pattern.
|
||||||
|
if (isSub === SUBPARSE) {
|
||||||
|
return [re, hasMagic]
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip the regexp for non-magical patterns
|
||||||
|
// unescape anything in it, though, so that it'll be
|
||||||
|
// an exact match against a file etc.
|
||||||
|
if (!hasMagic) {
|
||||||
|
return globUnescape(pattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
var flags = options.nocase ? 'i' : ''
|
||||||
|
try {
|
||||||
|
var regExp = new RegExp('^' + re + '$', flags)
|
||||||
|
} catch (er) /* istanbul ignore next - should be impossible */ {
|
||||||
|
// If it was an invalid regular expression, then it can't match
|
||||||
|
// anything. This trick looks for a character after the end of
|
||||||
|
// the string, which is of course impossible, except in multi-line
|
||||||
|
// mode, but it's not a /m regex.
|
||||||
|
return new RegExp('$.')
|
||||||
|
}
|
||||||
|
|
||||||
|
regExp._glob = pattern
|
||||||
|
regExp._src = re
|
||||||
|
|
||||||
|
return regExp
|
||||||
|
}
|
||||||
|
|
||||||
|
minimatch.makeRe = function (pattern, options) {
|
||||||
|
return new Minimatch(pattern, options || {}).makeRe()
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.makeRe = makeRe
|
||||||
|
function makeRe () {
|
||||||
|
if (this.regexp || this.regexp === false) return this.regexp
|
||||||
|
|
||||||
|
// at this point, this.set is a 2d array of partial
|
||||||
|
// pattern strings, or "**".
|
||||||
|
//
|
||||||
|
// It's better to use .match(). This function shouldn't
|
||||||
|
// be used, really, but it's pretty convenient sometimes,
|
||||||
|
// when you just want to work with a regex.
|
||||||
|
var set = this.set
|
||||||
|
|
||||||
|
if (!set.length) {
|
||||||
|
this.regexp = false
|
||||||
|
return this.regexp
|
||||||
|
}
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
var twoStar = options.noglobstar ? star
|
||||||
|
: options.dot ? twoStarDot
|
||||||
|
: twoStarNoDot
|
||||||
|
var flags = options.nocase ? 'i' : ''
|
||||||
|
|
||||||
|
var re = set.map(function (pattern) {
|
||||||
|
return pattern.map(function (p) {
|
||||||
|
return (p === GLOBSTAR) ? twoStar
|
||||||
|
: (typeof p === 'string') ? regExpEscape(p)
|
||||||
|
: p._src
|
||||||
|
}).join('\\\/')
|
||||||
|
}).join('|')
|
||||||
|
|
||||||
|
// must match entire pattern
|
||||||
|
// ending in a * or ** will make it less strict.
|
||||||
|
re = '^(?:' + re + ')$'
|
||||||
|
|
||||||
|
// can match anything, as long as it's not this.
|
||||||
|
if (this.negate) re = '^(?!' + re + ').*$'
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.regexp = new RegExp(re, flags)
|
||||||
|
} catch (ex) /* istanbul ignore next - should be impossible */ {
|
||||||
|
this.regexp = false
|
||||||
|
}
|
||||||
|
return this.regexp
|
||||||
|
}
|
||||||
|
|
||||||
|
minimatch.match = function (list, pattern, options) {
|
||||||
|
options = options || {}
|
||||||
|
var mm = new Minimatch(pattern, options)
|
||||||
|
list = list.filter(function (f) {
|
||||||
|
return mm.match(f)
|
||||||
|
})
|
||||||
|
if (mm.options.nonull && !list.length) {
|
||||||
|
list.push(pattern)
|
||||||
|
}
|
||||||
|
return list
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.match = function match (f, partial) {
|
||||||
|
if (typeof partial === 'undefined') partial = this.partial
|
||||||
|
this.debug('match', f, this.pattern)
|
||||||
|
// short-circuit in the case of busted things.
|
||||||
|
// comments, etc.
|
||||||
|
if (this.comment) return false
|
||||||
|
if (this.empty) return f === ''
|
||||||
|
|
||||||
|
if (f === '/' && partial) return true
|
||||||
|
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
// windows: need to use /, not \
|
||||||
|
if (path.sep !== '/') {
|
||||||
|
f = f.split(path.sep).join('/')
|
||||||
|
}
|
||||||
|
|
||||||
|
// treat the test path as a set of pathparts.
|
||||||
|
f = f.split(slashSplit)
|
||||||
|
this.debug(this.pattern, 'split', f)
|
||||||
|
|
||||||
|
// just ONE of the pattern sets in this.set needs to match
|
||||||
|
// in order for it to be valid. If negating, then just one
|
||||||
|
// match means that we have failed.
|
||||||
|
// Either way, return on the first hit.
|
||||||
|
|
||||||
|
var set = this.set
|
||||||
|
this.debug(this.pattern, 'set', set)
|
||||||
|
|
||||||
|
// Find the basename of the path by looking for the last non-empty segment
|
||||||
|
var filename
|
||||||
|
var i
|
||||||
|
for (i = f.length - 1; i >= 0; i--) {
|
||||||
|
filename = f[i]
|
||||||
|
if (filename) break
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < set.length; i++) {
|
||||||
|
var pattern = set[i]
|
||||||
|
var file = f
|
||||||
|
if (options.matchBase && pattern.length === 1) {
|
||||||
|
file = [filename]
|
||||||
|
}
|
||||||
|
var hit = this.matchOne(file, pattern, partial)
|
||||||
|
if (hit) {
|
||||||
|
if (options.flipNegate) return true
|
||||||
|
return !this.negate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// didn't get any hits. this is success if it's a negative
|
||||||
|
// pattern, failure otherwise.
|
||||||
|
if (options.flipNegate) return false
|
||||||
|
return this.negate
|
||||||
|
}
|
||||||
|
|
||||||
|
// set partial to true to test if, for example,
|
||||||
|
// "/a/b" matches the start of "/*/b/*/d"
|
||||||
|
// Partial means, if you run out of file before you run
|
||||||
|
// out of pattern, then that's fine, as long as all
|
||||||
|
// the parts match.
|
||||||
|
Minimatch.prototype.matchOne = function (file, pattern, partial) {
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
this.debug('matchOne',
|
||||||
|
{ 'this': this, file: file, pattern: pattern })
|
||||||
|
|
||||||
|
this.debug('matchOne', file.length, pattern.length)
|
||||||
|
|
||||||
|
for (var fi = 0,
|
||||||
|
pi = 0,
|
||||||
|
fl = file.length,
|
||||||
|
pl = pattern.length
|
||||||
|
; (fi < fl) && (pi < pl)
|
||||||
|
; fi++, pi++) {
|
||||||
|
this.debug('matchOne loop')
|
||||||
|
var p = pattern[pi]
|
||||||
|
var f = file[fi]
|
||||||
|
|
||||||
|
this.debug(pattern, p, f)
|
||||||
|
|
||||||
|
// should be impossible.
|
||||||
|
// some invalid regexp stuff in the set.
|
||||||
|
/* istanbul ignore if */
|
||||||
|
if (p === false) return false
|
||||||
|
|
||||||
|
if (p === GLOBSTAR) {
|
||||||
|
this.debug('GLOBSTAR', [pattern, p, f])
|
||||||
|
|
||||||
|
// "**"
|
||||||
|
// a/**/b/**/c would match the following:
|
||||||
|
// a/b/x/y/z/c
|
||||||
|
// a/x/y/z/b/c
|
||||||
|
// a/b/x/b/x/c
|
||||||
|
// a/b/c
|
||||||
|
// To do this, take the rest of the pattern after
|
||||||
|
// the **, and see if it would match the file remainder.
|
||||||
|
// If so, return success.
|
||||||
|
// If not, the ** "swallows" a segment, and try again.
|
||||||
|
// This is recursively awful.
|
||||||
|
//
|
||||||
|
// a/**/b/**/c matching a/b/x/y/z/c
|
||||||
|
// - a matches a
|
||||||
|
// - doublestar
|
||||||
|
// - matchOne(b/x/y/z/c, b/**/c)
|
||||||
|
// - b matches b
|
||||||
|
// - doublestar
|
||||||
|
// - matchOne(x/y/z/c, c) -> no
|
||||||
|
// - matchOne(y/z/c, c) -> no
|
||||||
|
// - matchOne(z/c, c) -> no
|
||||||
|
// - matchOne(c, c) yes, hit
|
||||||
|
var fr = fi
|
||||||
|
var pr = pi + 1
|
||||||
|
if (pr === pl) {
|
||||||
|
this.debug('** at the end')
|
||||||
|
// a ** at the end will just swallow the rest.
|
||||||
|
// We have found a match.
|
||||||
|
// however, it will not swallow /.x, unless
|
||||||
|
// options.dot is set.
|
||||||
|
// . and .. are *never* matched by **, for explosively
|
||||||
|
// exponential reasons.
|
||||||
|
for (; fi < fl; fi++) {
|
||||||
|
if (file[fi] === '.' || file[fi] === '..' ||
|
||||||
|
(!options.dot && file[fi].charAt(0) === '.')) return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// ok, let's see if we can swallow whatever we can.
|
||||||
|
while (fr < fl) {
|
||||||
|
var swallowee = file[fr]
|
||||||
|
|
||||||
|
this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)
|
||||||
|
|
||||||
|
// XXX remove this slice. Just pass the start index.
|
||||||
|
if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
|
||||||
|
this.debug('globstar found match!', fr, fl, swallowee)
|
||||||
|
// found a match.
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
// can't swallow "." or ".." ever.
|
||||||
|
// can only swallow ".foo" when explicitly asked.
|
||||||
|
if (swallowee === '.' || swallowee === '..' ||
|
||||||
|
(!options.dot && swallowee.charAt(0) === '.')) {
|
||||||
|
this.debug('dot detected!', file, fr, pattern, pr)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
// ** swallows a segment, and continue.
|
||||||
|
this.debug('globstar swallow a segment, and continue')
|
||||||
|
fr++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// no match was found.
|
||||||
|
// However, in partial mode, we can't say this is necessarily over.
|
||||||
|
// If there's more *pattern* left, then
|
||||||
|
/* istanbul ignore if */
|
||||||
|
if (partial) {
|
||||||
|
// ran out of file
|
||||||
|
this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
|
||||||
|
if (fr === fl) return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// something other than **
|
||||||
|
// non-magic patterns just have to match exactly
|
||||||
|
// patterns with magic have been turned into regexps.
|
||||||
|
var hit
|
||||||
|
if (typeof p === 'string') {
|
||||||
|
hit = f === p
|
||||||
|
this.debug('string match', p, f, hit)
|
||||||
|
} else {
|
||||||
|
hit = f.match(p)
|
||||||
|
this.debug('pattern match', p, f, hit)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hit) return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note: ending in / means that we'll get a final ""
|
||||||
|
// at the end of the pattern. This can only match a
|
||||||
|
// corresponding "" at the end of the file.
|
||||||
|
// If the file ends in /, then it can only match a
|
||||||
|
// a pattern that ends in /, unless the pattern just
|
||||||
|
// doesn't have any more for it. But, a/b/ should *not*
|
||||||
|
// match "a/b/*", even though "" matches against the
|
||||||
|
// [^/]*? pattern, except in partial mode, where it might
|
||||||
|
// simply not be reached yet.
|
||||||
|
// However, a/b/ should still satisfy a/*
|
||||||
|
|
||||||
|
// now either we fell off the end of the pattern, or we're done.
|
||||||
|
if (fi === fl && pi === pl) {
|
||||||
|
// ran out of pattern and filename at the same time.
|
||||||
|
// an exact hit!
|
||||||
|
return true
|
||||||
|
} else if (fi === fl) {
|
||||||
|
// ran out of file, but still had pattern left.
|
||||||
|
// this is ok if we're doing the match as part of
|
||||||
|
// a glob fs traversal.
|
||||||
|
return partial
|
||||||
|
} else /* istanbul ignore else */ if (pi === pl) {
|
||||||
|
// ran out of pattern, still have file left.
|
||||||
|
// this is only acceptable if we're on the very last
|
||||||
|
// empty segment of a file with a trailing slash.
|
||||||
|
// a/* should match a/b/
|
||||||
|
return (fi === fl - 1) && (file[fi] === '')
|
||||||
|
}
|
||||||
|
|
||||||
|
// should be unreachable.
|
||||||
|
/* istanbul ignore next */
|
||||||
|
throw new Error('wtf?')
|
||||||
|
}
|
||||||
|
|
||||||
|
// replace stuff like \* with *
|
||||||
|
function globUnescape (s) {
|
||||||
|
return s.replace(/\\(.)/g, '$1')
|
||||||
|
}
|
||||||
|
|
||||||
|
function regExpEscape (s) {
|
||||||
|
return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
/***/ 8725:
|
/***/ 8725:
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
- [Migration](#migration)
|
- [Migration](#migration)
|
||||||
- [Multiple uploads to the same named Artifact](#multiple-uploads-to-the-same-named-artifact)
|
- [Multiple uploads to the same named Artifact](#multiple-uploads-to-the-same-named-artifact)
|
||||||
- [Overwriting an Artifact](#overwriting-an-artifact)
|
- [Overwriting an Artifact](#overwriting-an-artifact)
|
||||||
|
- [Merging multiple artifacts](#merging-multiple-artifacts)
|
||||||
|
|
||||||
Several behavioral differences exist between Artifact actions `v3` and below vs `v4`. This document outlines common scenarios in `v3`, and how they would be handled in `v4`.
|
Several behavioral differences exist between Artifact actions `v3` and below vs `v4`. This document outlines common scenarios in `v3`, and how they would be handled in `v4`.
|
||||||
|
|
||||||
@ -142,3 +143,64 @@ jobs:
|
|||||||
```
|
```
|
||||||
|
|
||||||
Note that this will create an _entirely_ new Artifact, with a different ID from the previous.
|
Note that this will create an _entirely_ new Artifact, with a different ID from the previous.
|
||||||
|
|
||||||
|
## Merging multiple artifacts
|
||||||
|
|
||||||
|
In `v3`, multiple uploads from multiple jobs could be done to the same Artifact. This would result in a single archive, which could be useful for sending to upstream systems outside of Actions via API or UI downloads.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
jobs:
|
||||||
|
upload:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
runs-on: [ubuntu-latest, macos-latest, windows-latest]
|
||||||
|
runs-on: ${{ matrix.runs-on }}
|
||||||
|
steps:
|
||||||
|
- name: Create a File
|
||||||
|
run: echo "hello from ${{ matrix.runs-on }}" > file-${{ matrix.runs-on }}.txt
|
||||||
|
- name: Upload Artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: all-my-files # NOTE: same artifact name
|
||||||
|
path: file-${{ matrix.runs-on }}.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
The single `all-my-files` artifact would contain the following:
|
||||||
|
|
||||||
|
```
|
||||||
|
.
|
||||||
|
∟ file-ubuntu-latest.txt
|
||||||
|
∟ file-macos-latest.txt
|
||||||
|
∟ file-windows-latest.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
To achieve the same in `v4` you can change it like so:
|
||||||
|
|
||||||
|
```diff
|
||||||
|
jobs:
|
||||||
|
upload:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
runs-on: [ubuntu-latest, macos-latest, windows-latest]
|
||||||
|
runs-on: ${{ matrix.runs-on }}
|
||||||
|
steps:
|
||||||
|
- name: Create a File
|
||||||
|
run: echo "hello from ${{ matrix.runs-on }}" > file-${{ matrix.runs-on }}.txt
|
||||||
|
- name: Upload Artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
- name: all-my-files
|
||||||
|
+ name: my-artifact-${{ matrix.runs-on }}
|
||||||
|
path: file-${{ matrix.runs-on }}.txt
|
||||||
|
+ merge:
|
||||||
|
+ runs-on: ubuntu-latest
|
||||||
|
+ needs: upload
|
||||||
|
+ steps:
|
||||||
|
+ - name: Merge Artifacts
|
||||||
|
+ uses: actions/upload-artifact/merge@v4
|
||||||
|
+ with:
|
||||||
|
+ name: all-my-files
|
||||||
|
+ pattern: my-artifact-*
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that this will download all artifacts to a temporary directory and reupload them as a single artifact. For more information on inputs and other use cases for `actions/upload-artifact/merge@v4`, see [the action documentation](../merge/README.md).
|
||||||
|
|||||||
200
merge/README.md
Normal file
200
merge/README.md
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
# `@actions/upload-artifact/merge`
|
||||||
|
|
||||||
|
Merge multiple [Actions Artifacts](https://docs.github.com/en/actions/using-workflows/storing-workflow-data-as-artifacts) in Workflow Runs. Internally powered by [@actions/artifact](https://github.com/actions/toolkit/tree/main/packages/artifact) package.
|
||||||
|
|
||||||
|
- [`@actions/upload-artifact/merge`](#actionsupload-artifactmerge)
|
||||||
|
- [Usage](#usage)
|
||||||
|
- [Inputs](#inputs)
|
||||||
|
- [Outputs](#outputs)
|
||||||
|
- [Examples](#examples)
|
||||||
|
- [Combining all artifacts in a workflow run](#combining-all-artifacts-in-a-workflow-run)
|
||||||
|
- [Prefix directories in merged artifact](#prefix-directories-in-merged-artifact)
|
||||||
|
- [Deleting artifacts after merge](#deleting-artifacts-after-merge)
|
||||||
|
- [Retention and Compression Level](#retention-and-compression-level)
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> upload-artifact/merge@v4+ is not currently supported on GHES.
|
||||||
|
|
||||||
|
Note: this actions can only merge artifacts created with actions/upload-artifact@v4+
|
||||||
|
|
||||||
|
This sub-action is a helper to merge multiple artifacts after they are created. To do so, it will download multiple artifacts to a temporary directory and reupload them as a single artifact.
|
||||||
|
|
||||||
|
For most cases, this may not be the most efficient solution. See [the migration docs](../docs/MIGRATION.md#multiple-uploads-to-the-same-named-artifact) on how to download multiple artifacts to the same directory on a runner. This action should only be necessary for cases where multiple artifacts will need to be downloaded outside the runner environment, like downloads via the UI or REST API.
|
||||||
|
|
||||||
|
### Inputs
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: actions/upload-artifact/merge@v4
|
||||||
|
with:
|
||||||
|
# The name of the artifact that the artifacts will be merged into
|
||||||
|
# Optional. Default is 'merged-artifacts'
|
||||||
|
name:
|
||||||
|
|
||||||
|
# A glob pattern matching the artifacts that should be merged.
|
||||||
|
# Optional. Default is '*'
|
||||||
|
pattern:
|
||||||
|
|
||||||
|
# If true, the artifacts will be merged into separate directories.
|
||||||
|
# If false, the artifacts will be merged into the root of the destination.
|
||||||
|
# Optional. Default is 'false'
|
||||||
|
separate-directories:
|
||||||
|
|
||||||
|
# If true, the artifacts that were merged will be deleted.
|
||||||
|
# If false, the artifacts will still exist.
|
||||||
|
# Optional. Default is 'false'
|
||||||
|
delete-merged:
|
||||||
|
|
||||||
|
# Duration after which artifact will expire in days. 0 means using default retention.
|
||||||
|
# Minimum 1 day.
|
||||||
|
# Maximum 90 days unless changed from the repository settings page.
|
||||||
|
# Optional. Defaults to repository settings.
|
||||||
|
retention-days:
|
||||||
|
|
||||||
|
# The level of compression for Zlib to be applied to the artifact archive.
|
||||||
|
# The value can range from 0 to 9.
|
||||||
|
# For large files that are not easily compressed, a value of 0 is recommended for significantly faster uploads.
|
||||||
|
# Optional. Default is '6'
|
||||||
|
compression-level:
|
||||||
|
```
|
||||||
|
|
||||||
|
### Outputs
|
||||||
|
|
||||||
|
| Name | Description | Example |
|
||||||
|
| - | - | - |
|
||||||
|
| `artifact-id` | GitHub ID of an Artifact, can be used by the REST API | `1234` |
|
||||||
|
| `artifact-url` | URL to download an Artifact. Can be used in many scenarios such as linking to artifacts in issues or pull requests. Users must be logged-in in order for this URL to work. This URL is valid as long as the artifact has not expired or the artifact, run or repository have not been deleted | `https://github.com/example-org/example-repo/actions/runs/1/artifacts/1234` |
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
For each of these examples, assume we have a prior job matrix that generates three artifacts: `my-artifact-a`, `my-artifact-b` and `my-artifact-c`.
|
||||||
|
|
||||||
|
e.g.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
jobs:
|
||||||
|
upload:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
foo: [a, b, c]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Run a one-line script
|
||||||
|
run: echo "hello from job ${{ matrix.foo }}" > file-${{ matrix.foo }}.txt
|
||||||
|
- name: Upload
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: my-artifact-${{ matrix.foo }}
|
||||||
|
path: file-${{ matrix.foo }}.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
Each of the following examples will use the `needs: upload` as a prerequesite before any merging operations.
|
||||||
|
|
||||||
|
### Combining all artifacts in a workflow run
|
||||||
|
|
||||||
|
By default (with no inputs), calling this action will take all the artifacts in the workflow run and combined them into a single artifact called `merged-artifacts`:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
jobs:
|
||||||
|
# ... <upload job> ...
|
||||||
|
merge:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: upload
|
||||||
|
steps:
|
||||||
|
- name: Merge Artifacts
|
||||||
|
uses: actions/upload-artifact/merge@v4
|
||||||
|
```
|
||||||
|
|
||||||
|
This will result in an artifact called `merged-artifacts` with the following content:
|
||||||
|
|
||||||
|
```
|
||||||
|
.
|
||||||
|
∟ file-a.txt
|
||||||
|
∟ file-b.txt
|
||||||
|
∟ file-c.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
To change the name of the artifact and filter on what artifacts are added, you can use the `name` and `pattern` inputs:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
jobs:
|
||||||
|
# ... <upload job> ...
|
||||||
|
merge:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: upload
|
||||||
|
steps:
|
||||||
|
- name: Merge Artifacts
|
||||||
|
uses: actions/upload-artifact/merge@v4
|
||||||
|
with:
|
||||||
|
name: my-amazing-merged-artifact
|
||||||
|
pattern: my-artifact-*
|
||||||
|
```
|
||||||
|
|
||||||
|
### Prefix directories in merged artifact
|
||||||
|
|
||||||
|
To prevent overwriting files in artifacts that may have the same name, you can use the `separate-directories` to prefix the extracted files with directories (named after the original artifact):
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
jobs:
|
||||||
|
# ... <upload job> ...
|
||||||
|
merge:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: upload
|
||||||
|
steps:
|
||||||
|
- name: Merge Artifacts
|
||||||
|
uses: actions/upload-artifact/merge@v4
|
||||||
|
with:
|
||||||
|
separate-directories: true
|
||||||
|
```
|
||||||
|
|
||||||
|
This will result in the following artifact structure:
|
||||||
|
|
||||||
|
```
|
||||||
|
.
|
||||||
|
∟ my-artifact-a
|
||||||
|
∟ file-a.txt
|
||||||
|
∟ my-artifact-b
|
||||||
|
∟ file-b.txt
|
||||||
|
∟ my-artifact-c
|
||||||
|
∟ file-c.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
### Deleting artifacts after merge
|
||||||
|
|
||||||
|
After merge, the old artifacts may no longer be required. To automatically delete them after they are merged into a new artifact, you can use `delete-merged` like so:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
jobs:
|
||||||
|
# ... <upload job> ...
|
||||||
|
merge:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: upload
|
||||||
|
steps:
|
||||||
|
- name: Merge Artifacts
|
||||||
|
uses: actions/upload-artifact/merge@v4
|
||||||
|
with:
|
||||||
|
delete-merged: true
|
||||||
|
```
|
||||||
|
|
||||||
|
After this runs, the matching artifact (`my-artifact-a`, `my-artifact-b` and `my-artifact-c`) will be merged.
|
||||||
|
|
||||||
|
### Retention and Compression Level
|
||||||
|
|
||||||
|
Similar to actions/upload-artifact, both [`retention-days`](../README.md#retention-period) and [`compression-level`](../README.md#altering-compressions-level-speed-v-size) are supported:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
jobs:
|
||||||
|
# ... <upload job> ...
|
||||||
|
merge:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: upload
|
||||||
|
steps:
|
||||||
|
- name: Merge Artifacts
|
||||||
|
uses: actions/upload-artifact/merge@v4
|
||||||
|
with:
|
||||||
|
retention-days: 1
|
||||||
|
compression-level: 9
|
||||||
|
```
|
||||||
57
merge/action.yml
Normal file
57
merge/action.yml
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
name: 'Merge Build Artifacts'
|
||||||
|
description: 'Merge one or more build Artifacts'
|
||||||
|
author: 'GitHub'
|
||||||
|
inputs:
|
||||||
|
name:
|
||||||
|
description: 'The name of the artifact that the artifacts will be merged into.'
|
||||||
|
required: true
|
||||||
|
default: 'merged-artifacts'
|
||||||
|
pattern:
|
||||||
|
description: 'A glob pattern matching the artifact names that should be merged.'
|
||||||
|
default: '*'
|
||||||
|
separate-directories:
|
||||||
|
description: 'When multiple artifacts are matched, this changes the behavior of how they are merged in the archive.
|
||||||
|
If true, the matched artifacts will be extracted into individual named directories within the specified path.
|
||||||
|
If false, the matched artifacts will combined in the same directory.'
|
||||||
|
default: 'false'
|
||||||
|
retention-days:
|
||||||
|
description: >
|
||||||
|
Duration after which artifact will expire in days. 0 means using default retention.
|
||||||
|
|
||||||
|
Minimum 1 day.
|
||||||
|
Maximum 90 days unless changed from the repository settings page.
|
||||||
|
compression-level:
|
||||||
|
description: >
|
||||||
|
The level of compression for Zlib to be applied to the artifact archive.
|
||||||
|
The value can range from 0 to 9:
|
||||||
|
- 0: No compression
|
||||||
|
- 1: Best speed
|
||||||
|
- 6: Default compression (same as GNU Gzip)
|
||||||
|
- 9: Best compression
|
||||||
|
Higher levels will result in better compression, but will take longer to complete.
|
||||||
|
For large files that are not easily compressed, a value of 0 is recommended for significantly faster uploads.
|
||||||
|
default: '6'
|
||||||
|
delete-merged:
|
||||||
|
description: >
|
||||||
|
If true, the artifacts that were merged will be deleted.
|
||||||
|
If false, the artifacts will still exist.
|
||||||
|
default: 'false'
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
artifact-id:
|
||||||
|
description: >
|
||||||
|
A unique identifier for the artifact that was just uploaded. Empty if the artifact upload failed.
|
||||||
|
|
||||||
|
This ID can be used as input to other APIs to download, delete or get more information about an artifact: https://docs.github.com/en/rest/actions/artifacts
|
||||||
|
artifact-url:
|
||||||
|
description: >
|
||||||
|
A download URL for the artifact that was just uploaded. Empty if the artifact upload failed.
|
||||||
|
|
||||||
|
This download URL only works for requests Authenticated with GitHub. Anonymous downloads will be prompted to first login.
|
||||||
|
If an anonymous download URL is needed than a short time restricted URL can be generated using the download artifact API: https://docs.github.com/en/rest/actions/artifacts#download-an-artifact
|
||||||
|
|
||||||
|
This URL will be valid for as long as the artifact exists and the workflow run and repository exists. Once an artifact has expired this URL will no longer work.
|
||||||
|
Common uses cases for such a download URL can be adding download links to artifacts in descriptions or comments on pull requests or issues.
|
||||||
|
runs:
|
||||||
|
using: 'node20'
|
||||||
|
main: '../dist/merge/index.js'
|
||||||
648
package-lock.json
generated
648
package-lock.json
generated
@ -1,19 +1,20 @@
|
|||||||
{
|
{
|
||||||
"name": "upload-artifact",
|
"name": "upload-artifact",
|
||||||
"version": "4.0.0",
|
"version": "4.3.0",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "upload-artifact",
|
"name": "upload-artifact",
|
||||||
"version": "4.0.0",
|
"version": "4.3.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/artifact": "^2.1.0",
|
"@actions/artifact": "^2.1.0",
|
||||||
"@actions/core": "^1.10.0",
|
"@actions/core": "^1.10.0",
|
||||||
"@actions/github": "^6.0.0",
|
"@actions/github": "^6.0.0",
|
||||||
"@actions/glob": "^0.3.0",
|
"@actions/glob": "^0.3.0",
|
||||||
"@actions/io": "^1.1.2"
|
"@actions/io": "^1.1.2",
|
||||||
|
"minimatch": "^9.0.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^29.2.5",
|
"@types/jest": "^29.2.5",
|
||||||
@ -198,6 +199,26 @@
|
|||||||
"minimatch": "^3.0.4"
|
"minimatch": "^3.0.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@actions/glob/node_modules/brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dependencies": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@actions/glob/node_modules/minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dependencies": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@actions/http-client": {
|
"node_modules/@actions/http-client": {
|
||||||
"version": "2.2.0",
|
"version": "2.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.0.tgz",
|
||||||
@ -1068,6 +1089,28 @@
|
|||||||
"url": "https://opencollective.com/eslint"
|
"url": "https://opencollective.com/eslint"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@eslint/eslintrc/node_modules/minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@fastify/busboy": {
|
"node_modules/@fastify/busboy": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz",
|
||||||
@ -1096,6 +1139,28 @@
|
|||||||
"node": ">=10.10.0"
|
"node": ">=10.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@humanwhocodes/module-importer": {
|
"node_modules/@humanwhocodes/module-importer": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
|
||||||
@ -1402,6 +1467,16 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@jest/reporters/node_modules/brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@jest/reporters/node_modules/glob": {
|
"node_modules/@jest/reporters/node_modules/glob": {
|
||||||
"version": "7.2.3",
|
"version": "7.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
||||||
@ -1422,6 +1497,18 @@
|
|||||||
"url": "https://github.com/sponsors/isaacs"
|
"url": "https://github.com/sponsors/isaacs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@jest/reporters/node_modules/minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@jest/schemas": {
|
"node_modules/@jest/schemas": {
|
||||||
"version": "29.0.0",
|
"version": "29.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz",
|
||||||
@ -2367,6 +2454,15 @@
|
|||||||
"node": ">= 6"
|
"node": ">= 6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/archiver-utils/node_modules/brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dependencies": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/archiver-utils/node_modules/glob": {
|
"node_modules/archiver-utils/node_modules/glob": {
|
||||||
"version": "7.2.3",
|
"version": "7.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
||||||
@ -2386,6 +2482,17 @@
|
|||||||
"url": "https://github.com/sponsors/isaacs"
|
"url": "https://github.com/sponsors/isaacs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/archiver-utils/node_modules/minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dependencies": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/archiver-utils/node_modules/readable-stream": {
|
"node_modules/archiver-utils/node_modules/readable-stream": {
|
||||||
"version": "2.3.8",
|
"version": "2.3.8",
|
||||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
|
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
|
||||||
@ -2669,12 +2776,11 @@
|
|||||||
"integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw=="
|
"integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw=="
|
||||||
},
|
},
|
||||||
"node_modules/brace-expansion": {
|
"node_modules/brace-expansion": {
|
||||||
"version": "1.1.11",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
|
||||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"balanced-match": "^1.0.0",
|
"balanced-match": "^1.0.0"
|
||||||
"concat-map": "0.0.1"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/braces": {
|
"node_modules/braces": {
|
||||||
@ -2971,7 +3077,7 @@
|
|||||||
"node_modules/concat-map": {
|
"node_modules/concat-map": {
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
||||||
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
|
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
|
||||||
},
|
},
|
||||||
"node_modules/concurrently": {
|
"node_modules/concurrently": {
|
||||||
"version": "7.6.0",
|
"version": "7.6.0",
|
||||||
@ -3214,6 +3320,15 @@
|
|||||||
"dot-object": "bin/dot-object"
|
"dot-object": "bin/dot-object"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/dot-object/node_modules/brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dependencies": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/dot-object/node_modules/glob": {
|
"node_modules/dot-object/node_modules/glob": {
|
||||||
"version": "7.2.3",
|
"version": "7.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
||||||
@ -3233,6 +3348,17 @@
|
|||||||
"url": "https://github.com/sponsors/isaacs"
|
"url": "https://github.com/sponsors/isaacs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/dot-object/node_modules/minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dependencies": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.4.284",
|
"version": "1.4.284",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
|
||||||
@ -3591,6 +3717,16 @@
|
|||||||
"eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
|
"eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/eslint-plugin-import/node_modules/brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/eslint-plugin-import/node_modules/debug": {
|
"node_modules/eslint-plugin-import/node_modules/debug": {
|
||||||
"version": "2.6.9",
|
"version": "2.6.9",
|
||||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||||
@ -3612,6 +3748,18 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/eslint-plugin-import/node_modules/minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/eslint-plugin-import/node_modules/ms": {
|
"node_modules/eslint-plugin-import/node_modules/ms": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||||
@ -3669,6 +3817,28 @@
|
|||||||
"eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
|
"eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/eslint-plugin-jsx-a11y/node_modules/semver": {
|
"node_modules/eslint-plugin-jsx-a11y/node_modules/semver": {
|
||||||
"version": "6.3.1",
|
"version": "6.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
|
||||||
@ -3763,6 +3933,16 @@
|
|||||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/eslint/node_modules/brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/eslint/node_modules/escape-string-regexp": {
|
"node_modules/eslint/node_modules/escape-string-regexp": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
|
||||||
@ -3785,6 +3965,18 @@
|
|||||||
"type-check": "~0.4.0"
|
"type-check": "~0.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/eslint/node_modules/minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/eslint/node_modules/optionator": {
|
"node_modules/eslint/node_modules/optionator": {
|
||||||
"version": "0.9.1",
|
"version": "0.9.1",
|
||||||
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
|
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
|
||||||
@ -4247,15 +4439,6 @@
|
|||||||
"node": ">=10.13.0"
|
"node": ">=10.13.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/glob/node_modules/brace-expansion": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
|
|
||||||
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"balanced-match": "^1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/glob/node_modules/minimatch": {
|
"node_modules/glob/node_modules/minimatch": {
|
||||||
"version": "5.1.2",
|
"version": "5.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz",
|
||||||
@ -5035,6 +5218,16 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/jest-config/node_modules/brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/jest-config/node_modules/glob": {
|
"node_modules/jest-config/node_modules/glob": {
|
||||||
"version": "7.2.3",
|
"version": "7.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
||||||
@ -5055,6 +5248,18 @@
|
|||||||
"url": "https://github.com/sponsors/isaacs"
|
"url": "https://github.com/sponsors/isaacs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/jest-config/node_modules/minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/jest-diff": {
|
"node_modules/jest-diff": {
|
||||||
"version": "29.3.1",
|
"version": "29.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz",
|
||||||
@ -5335,6 +5540,16 @@
|
|||||||
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
|
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/jest-runtime/node_modules/brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/jest-runtime/node_modules/glob": {
|
"node_modules/jest-runtime/node_modules/glob": {
|
||||||
"version": "7.2.3",
|
"version": "7.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
||||||
@ -5355,6 +5570,18 @@
|
|||||||
"url": "https://github.com/sponsors/isaacs"
|
"url": "https://github.com/sponsors/isaacs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/jest-runtime/node_modules/minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/jest-snapshot": {
|
"node_modules/jest-snapshot": {
|
||||||
"version": "29.3.1",
|
"version": "29.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz",
|
||||||
@ -5844,14 +6071,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/minimatch": {
|
"node_modules/minimatch": {
|
||||||
"version": "3.1.2",
|
"version": "9.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
|
||||||
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
"integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"brace-expansion": "^1.1.7"
|
"brace-expansion": "^2.0.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "*"
|
"node": ">=16 || 14 >=14.17"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/isaacs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/minimist": {
|
"node_modules/minimist": {
|
||||||
@ -6370,14 +6600,6 @@
|
|||||||
"minimatch": "^5.1.0"
|
"minimatch": "^5.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/readdir-glob/node_modules/brace-expansion": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
|
|
||||||
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
|
|
||||||
"dependencies": {
|
|
||||||
"balanced-match": "^1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/readdir-glob/node_modules/minimatch": {
|
"node_modules/readdir-glob/node_modules/minimatch": {
|
||||||
"version": "5.1.6",
|
"version": "5.1.6",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
|
||||||
@ -6511,6 +6733,16 @@
|
|||||||
"url": "https://github.com/sponsors/isaacs"
|
"url": "https://github.com/sponsors/isaacs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/rimraf/node_modules/brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/rimraf/node_modules/glob": {
|
"node_modules/rimraf/node_modules/glob": {
|
||||||
"version": "7.2.3",
|
"version": "7.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
||||||
@ -6531,6 +6763,18 @@
|
|||||||
"url": "https://github.com/sponsors/isaacs"
|
"url": "https://github.com/sponsors/isaacs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/rimraf/node_modules/minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/run-parallel": {
|
"node_modules/run-parallel": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
|
||||||
@ -6894,6 +7138,16 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/test-exclude/node_modules/brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/test-exclude/node_modules/glob": {
|
"node_modules/test-exclude/node_modules/glob": {
|
||||||
"version": "7.2.3",
|
"version": "7.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
||||||
@ -6914,6 +7168,18 @@
|
|||||||
"url": "https://github.com/sponsors/isaacs"
|
"url": "https://github.com/sponsors/isaacs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/test-exclude/node_modules/minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"dependencies": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/text-table": {
|
"node_modules/text-table": {
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
|
||||||
@ -7496,6 +7762,15 @@
|
|||||||
"node": ">= 10"
|
"node": ">= 10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/zip-stream/node_modules/brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dependencies": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/zip-stream/node_modules/glob": {
|
"node_modules/zip-stream/node_modules/glob": {
|
||||||
"version": "7.2.3",
|
"version": "7.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
||||||
@ -7514,6 +7789,17 @@
|
|||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/isaacs"
|
"url": "https://github.com/sponsors/isaacs"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"node_modules/zip-stream/node_modules/minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dependencies": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -7658,6 +7944,25 @@
|
|||||||
"requires": {
|
"requires": {
|
||||||
"@actions/core": "^1.2.6",
|
"@actions/core": "^1.2.6",
|
||||||
"minimatch": "^3.0.4"
|
"minimatch": "^3.0.4"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"requires": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"requires": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@actions/http-client": {
|
"@actions/http-client": {
|
||||||
@ -8335,6 +8640,27 @@
|
|||||||
"js-yaml": "^4.1.0",
|
"js-yaml": "^4.1.0",
|
||||||
"minimatch": "^3.1.2",
|
"minimatch": "^3.1.2",
|
||||||
"strip-json-comments": "^3.1.1"
|
"strip-json-comments": "^3.1.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@fastify/busboy": {
|
"@fastify/busboy": {
|
||||||
@ -8357,6 +8683,27 @@
|
|||||||
"@humanwhocodes/object-schema": "^1.2.1",
|
"@humanwhocodes/object-schema": "^1.2.1",
|
||||||
"debug": "^4.1.1",
|
"debug": "^4.1.1",
|
||||||
"minimatch": "^3.0.5"
|
"minimatch": "^3.0.5"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@humanwhocodes/module-importer": {
|
"@humanwhocodes/module-importer": {
|
||||||
@ -8593,6 +8940,16 @@
|
|||||||
"v8-to-istanbul": "^9.0.1"
|
"v8-to-istanbul": "^9.0.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"glob": {
|
"glob": {
|
||||||
"version": "7.2.3",
|
"version": "7.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
||||||
@ -8606,6 +8963,15 @@
|
|||||||
"once": "^1.3.0",
|
"once": "^1.3.0",
|
||||||
"path-is-absolute": "^1.0.0"
|
"path-is-absolute": "^1.0.0"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -9363,6 +9729,15 @@
|
|||||||
"readable-stream": "^2.0.0"
|
"readable-stream": "^2.0.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"requires": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"glob": {
|
"glob": {
|
||||||
"version": "7.2.3",
|
"version": "7.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
||||||
@ -9376,6 +9751,14 @@
|
|||||||
"path-is-absolute": "^1.0.0"
|
"path-is-absolute": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"requires": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
"readable-stream": {
|
"readable-stream": {
|
||||||
"version": "2.3.8",
|
"version": "2.3.8",
|
||||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
|
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
|
||||||
@ -9596,12 +9979,11 @@
|
|||||||
"integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw=="
|
"integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw=="
|
||||||
},
|
},
|
||||||
"brace-expansion": {
|
"brace-expansion": {
|
||||||
"version": "1.1.11",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
|
||||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"balanced-match": "^1.0.0",
|
"balanced-match": "^1.0.0"
|
||||||
"concat-map": "0.0.1"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"braces": {
|
"braces": {
|
||||||
@ -9806,7 +10188,7 @@
|
|||||||
"concat-map": {
|
"concat-map": {
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
||||||
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
|
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
|
||||||
},
|
},
|
||||||
"concurrently": {
|
"concurrently": {
|
||||||
"version": "7.6.0",
|
"version": "7.6.0",
|
||||||
@ -9981,6 +10363,15 @@
|
|||||||
"glob": "^7.1.5"
|
"glob": "^7.1.5"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"requires": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"glob": {
|
"glob": {
|
||||||
"version": "7.2.3",
|
"version": "7.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
||||||
@ -9993,6 +10384,14 @@
|
|||||||
"once": "^1.3.0",
|
"once": "^1.3.0",
|
||||||
"path-is-absolute": "^1.0.0"
|
"path-is-absolute": "^1.0.0"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"requires": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -10161,6 +10560,16 @@
|
|||||||
"text-table": "^0.2.0"
|
"text-table": "^0.2.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"escape-string-regexp": {
|
"escape-string-regexp": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
|
||||||
@ -10177,6 +10586,15 @@
|
|||||||
"type-check": "~0.4.0"
|
"type-check": "~0.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
"optionator": {
|
"optionator": {
|
||||||
"version": "0.9.1",
|
"version": "0.9.1",
|
||||||
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
|
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
|
||||||
@ -10339,6 +10757,16 @@
|
|||||||
"tsconfig-paths": "^3.14.1"
|
"tsconfig-paths": "^3.14.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"debug": {
|
"debug": {
|
||||||
"version": "2.6.9",
|
"version": "2.6.9",
|
||||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||||
@ -10357,6 +10785,15 @@
|
|||||||
"esutils": "^2.0.2"
|
"esutils": "^2.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
"ms": {
|
"ms": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||||
@ -10395,6 +10832,25 @@
|
|||||||
"semver": "^6.3.0"
|
"semver": "^6.3.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
}
|
||||||
|
},
|
||||||
"semver": {
|
"semver": {
|
||||||
"version": "6.3.1",
|
"version": "6.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
|
||||||
@ -10773,15 +11229,6 @@
|
|||||||
"once": "^1.3.0"
|
"once": "^1.3.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"brace-expansion": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
|
|
||||||
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"balanced-match": "^1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"minimatch": {
|
"minimatch": {
|
||||||
"version": "5.1.2",
|
"version": "5.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz",
|
||||||
@ -11331,6 +11778,16 @@
|
|||||||
"strip-json-comments": "^3.1.1"
|
"strip-json-comments": "^3.1.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"glob": {
|
"glob": {
|
||||||
"version": "7.2.3",
|
"version": "7.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
||||||
@ -11344,6 +11801,15 @@
|
|||||||
"once": "^1.3.0",
|
"once": "^1.3.0",
|
||||||
"path-is-absolute": "^1.0.0"
|
"path-is-absolute": "^1.0.0"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -11570,6 +12036,16 @@
|
|||||||
"strip-bom": "^4.0.0"
|
"strip-bom": "^4.0.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"glob": {
|
"glob": {
|
||||||
"version": "7.2.3",
|
"version": "7.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
||||||
@ -11583,6 +12059,15 @@
|
|||||||
"once": "^1.3.0",
|
"once": "^1.3.0",
|
||||||
"path-is-absolute": "^1.0.0"
|
"path-is-absolute": "^1.0.0"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -11995,11 +12480,11 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"minimatch": {
|
"minimatch": {
|
||||||
"version": "3.1.2",
|
"version": "9.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
|
||||||
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
"integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"brace-expansion": "^1.1.7"
|
"brace-expansion": "^2.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"minimist": {
|
"minimist": {
|
||||||
@ -12371,14 +12856,6 @@
|
|||||||
"minimatch": "^5.1.0"
|
"minimatch": "^5.1.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"brace-expansion": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
|
|
||||||
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
|
|
||||||
"requires": {
|
|
||||||
"balanced-match": "^1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"minimatch": {
|
"minimatch": {
|
||||||
"version": "5.1.6",
|
"version": "5.1.6",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
|
||||||
@ -12473,6 +12950,16 @@
|
|||||||
"glob": "^7.1.3"
|
"glob": "^7.1.3"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"glob": {
|
"glob": {
|
||||||
"version": "7.2.3",
|
"version": "7.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
||||||
@ -12486,6 +12973,15 @@
|
|||||||
"once": "^1.3.0",
|
"once": "^1.3.0",
|
||||||
"path-is-absolute": "^1.0.0"
|
"path-is-absolute": "^1.0.0"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -12762,6 +13258,16 @@
|
|||||||
"minimatch": "^3.0.4"
|
"minimatch": "^3.0.4"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"glob": {
|
"glob": {
|
||||||
"version": "7.2.3",
|
"version": "7.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
||||||
@ -12775,6 +13281,15 @@
|
|||||||
"once": "^1.3.0",
|
"once": "^1.3.0",
|
||||||
"path-is-absolute": "^1.0.0"
|
"path-is-absolute": "^1.0.0"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -13202,6 +13717,15 @@
|
|||||||
"readable-stream": "^3.6.0"
|
"readable-stream": "^3.6.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"brace-expansion": {
|
||||||
|
"version": "1.1.11",
|
||||||
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
|
"requires": {
|
||||||
|
"balanced-match": "^1.0.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"glob": {
|
"glob": {
|
||||||
"version": "7.2.3",
|
"version": "7.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
|
||||||
@ -13214,6 +13738,14 @@
|
|||||||
"once": "^1.3.0",
|
"once": "^1.3.0",
|
||||||
"path-is-absolute": "^1.0.0"
|
"path-is-absolute": "^1.0.0"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"minimatch": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
||||||
|
"requires": {
|
||||||
|
"brace-expansion": "^1.1.7"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"name": "upload-artifact",
|
"name": "upload-artifact",
|
||||||
"version": "4.2.0",
|
"version": "4.3.0",
|
||||||
"description": "Upload an Actions Artifact in a workflow run",
|
"description": "Upload an Actions Artifact in a workflow run",
|
||||||
"main": "dist/upload/index.js",
|
"main": "dist/upload/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "tsc",
|
"build": "tsc",
|
||||||
"release": "ncc build src/upload/index.ts -o dist/upload",
|
"release": "ncc build src/upload/index.ts -o dist/upload && ncc build src/merge/index.ts -o dist/merge",
|
||||||
"check-all": "concurrently \"npm:format-check\" \"npm:lint\" \"npm:test\" \"npm:build\"",
|
"check-all": "concurrently \"npm:format-check\" \"npm:lint\" \"npm:test\" \"npm:build\"",
|
||||||
"format": "prettier --write **/*.ts",
|
"format": "prettier --write **/*.ts",
|
||||||
"format-check": "prettier --check **/*.ts",
|
"format-check": "prettier --check **/*.ts",
|
||||||
@ -33,7 +33,8 @@
|
|||||||
"@actions/core": "^1.10.0",
|
"@actions/core": "^1.10.0",
|
||||||
"@actions/github": "^6.0.0",
|
"@actions/github": "^6.0.0",
|
||||||
"@actions/glob": "^0.3.0",
|
"@actions/glob": "^0.3.0",
|
||||||
"@actions/io": "^1.1.2"
|
"@actions/io": "^1.1.2",
|
||||||
|
"minimatch": "^9.0.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^29.2.5",
|
"@types/jest": "^29.2.5",
|
||||||
|
|||||||
9
src/merge/constants.ts
Normal file
9
src/merge/constants.ts
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
/* eslint-disable no-unused-vars */
|
||||||
|
export enum Inputs {
|
||||||
|
Name = 'name',
|
||||||
|
Pattern = 'pattern',
|
||||||
|
SeparateDirectories = 'separate-directories',
|
||||||
|
RetentionDays = 'retention-days',
|
||||||
|
CompressionLevel = 'compression-level',
|
||||||
|
DeleteMerged = 'delete-merged'
|
||||||
|
}
|
||||||
6
src/merge/index.ts
Normal file
6
src/merge/index.ts
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import * as core from '@actions/core'
|
||||||
|
import {run} from './merge-artifacts'
|
||||||
|
|
||||||
|
run().catch(error => {
|
||||||
|
core.setFailed((error as Error).message)
|
||||||
|
})
|
||||||
44
src/merge/input-helper.ts
Normal file
44
src/merge/input-helper.ts
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
import * as core from '@actions/core'
|
||||||
|
import {Inputs} from './constants'
|
||||||
|
import {MergeInputs} from './merge-inputs'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper to get all the inputs for the action
|
||||||
|
*/
|
||||||
|
export function getInputs(): MergeInputs {
|
||||||
|
const name = core.getInput(Inputs.Name, {required: true})
|
||||||
|
const pattern = core.getInput(Inputs.Pattern, {required: true})
|
||||||
|
const separateDirectories = core.getBooleanInput(Inputs.SeparateDirectories)
|
||||||
|
const deleteMerged = core.getBooleanInput(Inputs.DeleteMerged)
|
||||||
|
|
||||||
|
const inputs = {
|
||||||
|
name,
|
||||||
|
pattern,
|
||||||
|
separateDirectories,
|
||||||
|
deleteMerged,
|
||||||
|
retentionDays: 0,
|
||||||
|
compressionLevel: 6
|
||||||
|
} as MergeInputs
|
||||||
|
|
||||||
|
const retentionDaysStr = core.getInput(Inputs.RetentionDays)
|
||||||
|
if (retentionDaysStr) {
|
||||||
|
inputs.retentionDays = parseInt(retentionDaysStr)
|
||||||
|
if (isNaN(inputs.retentionDays)) {
|
||||||
|
core.setFailed('Invalid retention-days')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const compressionLevelStr = core.getInput(Inputs.CompressionLevel)
|
||||||
|
if (compressionLevelStr) {
|
||||||
|
inputs.compressionLevel = parseInt(compressionLevelStr)
|
||||||
|
if (isNaN(inputs.compressionLevel)) {
|
||||||
|
core.setFailed('Invalid compression-level')
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inputs.compressionLevel < 0 || inputs.compressionLevel > 9) {
|
||||||
|
core.setFailed('Invalid compression-level. Valid values are 0-9')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return inputs
|
||||||
|
}
|
||||||
93
src/merge/merge-artifacts.ts
Normal file
93
src/merge/merge-artifacts.ts
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
import * as path from 'path'
|
||||||
|
import {mkdtemp, rm} from 'fs/promises'
|
||||||
|
import * as core from '@actions/core'
|
||||||
|
import {Minimatch} from 'minimatch'
|
||||||
|
import artifactClient, {UploadArtifactOptions} from '@actions/artifact'
|
||||||
|
import {getInputs} from './input-helper'
|
||||||
|
import {uploadArtifact} from '../shared/upload-artifact'
|
||||||
|
import {findFilesToUpload} from '../shared/search'
|
||||||
|
|
||||||
|
const PARALLEL_DOWNLOADS = 5
|
||||||
|
|
||||||
|
export const chunk = <T>(arr: T[], n: number): T[][] =>
|
||||||
|
arr.reduce((acc, cur, i) => {
|
||||||
|
const index = Math.floor(i / n)
|
||||||
|
acc[index] = [...(acc[index] || []), cur]
|
||||||
|
return acc
|
||||||
|
}, [] as T[][])
|
||||||
|
|
||||||
|
export async function run(): Promise<void> {
|
||||||
|
const inputs = getInputs()
|
||||||
|
const tmpDir = await mkdtemp('merge-artifact')
|
||||||
|
|
||||||
|
const listArtifactResponse = await artifactClient.listArtifacts({
|
||||||
|
latest: true
|
||||||
|
})
|
||||||
|
const matcher = new Minimatch(inputs.pattern)
|
||||||
|
const artifacts = listArtifactResponse.artifacts.filter(artifact =>
|
||||||
|
matcher.match(artifact.name)
|
||||||
|
)
|
||||||
|
core.debug(
|
||||||
|
`Filtered from ${listArtifactResponse.artifacts.length} to ${artifacts.length} artifacts`
|
||||||
|
)
|
||||||
|
|
||||||
|
if (artifacts.length === 0) {
|
||||||
|
throw new Error(`No artifacts found matching pattern '${inputs.pattern}'`)
|
||||||
|
}
|
||||||
|
|
||||||
|
core.info(`Preparing to download the following artifacts:`)
|
||||||
|
artifacts.forEach(artifact => {
|
||||||
|
core.info(`- ${artifact.name} (ID: ${artifact.id}, Size: ${artifact.size})`)
|
||||||
|
})
|
||||||
|
|
||||||
|
const downloadPromises = artifacts.map(artifact =>
|
||||||
|
artifactClient.downloadArtifact(artifact.id, {
|
||||||
|
path: inputs.separateDirectories
|
||||||
|
? path.join(tmpDir, artifact.name)
|
||||||
|
: tmpDir
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
const chunkedPromises = chunk(downloadPromises, PARALLEL_DOWNLOADS)
|
||||||
|
for (const chunk of chunkedPromises) {
|
||||||
|
await Promise.all(chunk)
|
||||||
|
}
|
||||||
|
|
||||||
|
const options: UploadArtifactOptions = {}
|
||||||
|
if (inputs.retentionDays) {
|
||||||
|
options.retentionDays = inputs.retentionDays
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof inputs.compressionLevel !== 'undefined') {
|
||||||
|
options.compressionLevel = inputs.compressionLevel
|
||||||
|
}
|
||||||
|
|
||||||
|
const searchResult = await findFilesToUpload(tmpDir)
|
||||||
|
|
||||||
|
await uploadArtifact(
|
||||||
|
inputs.name,
|
||||||
|
searchResult.filesToUpload,
|
||||||
|
searchResult.rootDirectory,
|
||||||
|
options
|
||||||
|
)
|
||||||
|
|
||||||
|
core.info(
|
||||||
|
`The ${artifacts.length} artifact(s) have been successfully merged!`
|
||||||
|
)
|
||||||
|
|
||||||
|
if (inputs.deleteMerged) {
|
||||||
|
const deletePromises = artifacts.map(artifact =>
|
||||||
|
artifactClient.deleteArtifact(artifact.name)
|
||||||
|
)
|
||||||
|
await Promise.all(deletePromises)
|
||||||
|
core.info(`The ${artifacts.length} artifact(s) have been deleted`)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
await rm(tmpDir, {recursive: true})
|
||||||
|
} catch (error) {
|
||||||
|
core.warning(
|
||||||
|
`Unable to remove temporary directory: ${(error as Error).message}`
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
33
src/merge/merge-inputs.ts
Normal file
33
src/merge/merge-inputs.ts
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
export interface MergeInputs {
|
||||||
|
/**
|
||||||
|
* The name of the artifact that the artifacts will be merged into
|
||||||
|
*/
|
||||||
|
name: string
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A glob pattern matching the artifacts that should be merged.
|
||||||
|
*/
|
||||||
|
pattern: string
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Duration after which artifact will expire in days
|
||||||
|
*/
|
||||||
|
retentionDays: number
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The level of compression for Zlib to be applied to the artifact archive.
|
||||||
|
*/
|
||||||
|
compressionLevel?: number
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If true, the artifacts that were merged will be deleted.
|
||||||
|
* If false, the artifacts will still exist.
|
||||||
|
*/
|
||||||
|
deleteMerged: boolean
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If true, the artifacts will be merged into separate directories.
|
||||||
|
* If false, the artifacts will be merged into the root of the destination.
|
||||||
|
*/
|
||||||
|
separateDirectories: boolean
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user