@antora/content-aggregator 3.2.0-alpha.4 → 3.2.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,32 +1,32 @@
1
1
  'use strict'
2
2
 
3
3
  const computeOrigin = require('./compute-origin')
4
- const { createHash } = require('crypto')
4
+ const { createHash } = require('node:crypto')
5
5
  const createGitHttpPlugin = require('./git-plugin-http')
6
6
  const decodeUint8Array = require('./decode-uint8-array')
7
7
  const deepClone = require('./deep-clone')
8
- const EventEmitter = require('events')
8
+ const EventEmitter = require('node:events')
9
9
  const expandPath = require('@antora/expand-path-helper')
10
10
  const File = require('./file')
11
11
  const filterRefs = require('./filter-refs')
12
- const fs = require('fs')
12
+ const fs = require('node:fs')
13
13
  const { promises: fsp } = fs
14
14
  const getCacheDir = require('cache-directory')
15
15
  const GitCredentialManagerStore = require('./git-credential-manager-store')
16
16
  const git = require('./git')
17
17
  const { NotFoundError, ObjectTypeError, UnknownTransportError, UrlParseError } = git.Errors
18
- const globStream = require('glob-stream')
19
- const { inspect } = require('util')
18
+ const { globStream } = require('fast-glob')
19
+ const { inspect } = require('node:util')
20
20
  const invariably = require('./invariably')
21
21
  const logger = require('./logger')
22
22
  const { makeMatcherRx, versionMatcherOpts: VERSION_MATCHER_OPTS } = require('./matcher')
23
23
  const MultiProgress = require('multi-progress') // calls require('progress') as a peer dependencies
24
- const ospath = require('path')
24
+ const ospath = require('node:path')
25
25
  const { posix: path } = ospath
26
26
  const posixify = require('./posixify')
27
27
  const removeGitSuffix = require('./remove-git-suffix')
28
28
  const { fs: resolvePathGlobsFs, git: resolvePathGlobsGit } = require('./resolve-path-globs')
29
- const { pipeline, Writable } = require('stream')
29
+ const { pipeline, Writable } = require('node:stream')
30
30
  const forEach = (write) => new Writable({ objectMode: true, write })
31
31
  const userRequire = require('@antora/user-require-helper')
32
32
  const yaml = require('js-yaml')
@@ -102,7 +102,8 @@ function aggregateContent (playbook) {
102
102
  }, new Map())
103
103
  const progress = !quiet && createProgress(sourcesByUrl.keys(), process.stdout)
104
104
  const refPatternCache = Object.assign(new Map(), { braces: new Map() })
105
- const loadOpts = { cacheDir, fetch, gitPlugins, progress, startDir, refPatternCache }
105
+ const fetchConfig = { always: fetch, depth: Math.max(0, gitConfig.fetchDepth ?? 1) }
106
+ const loadOpts = { cacheDir, fetch: fetchConfig, gitPlugins, progress, startDir, refPatternCache }
106
107
  return collectFiles(sourcesByUrl, loadOpts, concurrency).then(buildAggregate, (err) => {
107
108
  progress && progress.terminate()
108
109
  throw err
@@ -110,11 +111,11 @@ function aggregateContent (playbook) {
110
111
  })
111
112
  }
112
113
 
113
- async function collectFiles (sourcesByUrl, loadOpts, concurrency, fetchedUrls) {
114
+ async function collectFiles (sourcesByUrl, loadOpts, concurrency, fetchedUrls = []) {
114
115
  const loadTasks = [...sourcesByUrl.entries()].map(([url, sources]) => {
115
116
  const loadOptsForUrl = Object.assign({}, loadOpts)
116
- if (loadOpts.fetch && fetchedUrls && fetchedUrls.length && fetchedUrls.includes(url)) loadOptsForUrl.fetch = false
117
- if (tagsSpecified(sources)) loadOptsForUrl.fetchTags = true
117
+ if (loadOpts.fetch.always && fetchedUrls.length && fetchedUrls.includes(url)) loadOptsForUrl.fetch.always = false
118
+ if (tagsSpecified(sources)) loadOptsForUrl.fetch.tags = true
118
119
  return loadRepository.bind(null, url, loadOptsForUrl, { url, sources })
119
120
  })
120
121
  return gracefulPromiseAllWithLimit(loadTasks, concurrency.fetch).then(([results, rejections]) => {
@@ -163,7 +164,7 @@ async function loadRepository (url, opts, result = {}) {
163
164
  if (~url.indexOf(':') && GIT_URI_DETECTOR_RX.test(url)) {
164
165
  let credentials, displayUrl
165
166
  ;({ displayUrl, url, credentials } = extractCredentials(url))
166
- const { cacheDir, fetch, fetchTags, gitPlugins, progress } = opts
167
+ const { cacheDir, fetch, gitPlugins, progress } = opts
167
168
  dir = ospath.join(cacheDir, generateCloneFolderName(displayUrl))
168
169
  // NOTE the presence of the url property on the repo object implies the repository is remote
169
170
  repo = { cache, dir, fs, gitdir: dir, noCheckout: true, url }
@@ -171,9 +172,9 @@ async function loadRepository (url, opts, result = {}) {
171
172
  const validStateFile = ospath.join(dir, VALID_STATE_FILENAME)
172
173
  try {
173
174
  await fsp.access(validStateFile)
174
- if (fetch) {
175
+ if (fetch.always) {
175
176
  await fsp.unlink(validStateFile)
176
- const fetchOpts = buildFetchOptions(repo, progress, displayUrl, credentials, gitPlugins, fetchTags, 'fetch')
177
+ const fetchOpts = buildFetchOptions(repo, progress, displayUrl, credentials, gitPlugins, fetch, 'fetch')
177
178
  await git
178
179
  .fetch(fetchOpts)
179
180
  .then(() => {
@@ -193,7 +194,7 @@ async function loadRepository (url, opts, result = {}) {
193
194
  } catch (gitErr) {
194
195
  await fsp['rm' in fsp ? 'rm' : 'rmdir'](dir, { recursive: true, force: true })
195
196
  if (gitErr.rethrow) throw transformGitCloneError(gitErr, displayUrl)
196
- const fetchOpts = buildFetchOptions(repo, progress, displayUrl, credentials, gitPlugins, fetchTags, 'clone')
197
+ const fetchOpts = buildFetchOptions(repo, progress, displayUrl, credentials, gitPlugins, fetch, 'clone')
197
198
  await git
198
199
  .clone(fetchOpts)
199
200
  .then(() => git.resolveRef(Object.assign({ ref: 'HEAD', depth: 1 }, repo)))
@@ -325,9 +326,9 @@ async function selectReferences (source, repo, remote) {
325
326
  } else {
326
327
  worktreePatterns = worktreePatterns === undefined ? [worktreeName || '.'] : []
327
328
  }
329
+ let currentBranch
328
330
  if (branchPatterns.length === 1 && (branchPatterns[0] === 'HEAD' || branchPatterns[0] === '.')) {
329
- const currentBranch = await getCurrentBranchName(repo, remote)
330
- if (currentBranch) {
331
+ if ((currentBranch = await getCurrentBranchName(repo, remote).then((branch) => branch ?? false))) {
331
332
  branchPatterns = [currentBranch]
332
333
  } else if (isBare) {
333
334
  return [...refs.values()]
@@ -341,9 +342,7 @@ async function selectReferences (source, repo, remote) {
341
342
  let headBranchIdx
342
343
  // NOTE we can assume at least two entries if HEAD or . are present
343
344
  if (~(headBranchIdx = branchPatterns.indexOf('HEAD')) || ~(headBranchIdx = branchPatterns.indexOf('.'))) {
344
- const currentBranch = await getCurrentBranchName(repo, remote)
345
- if (currentBranch) {
346
- // NOTE ignore if current branch is already in list
345
+ if ((currentBranch = await getCurrentBranchName(repo, remote).then((branch) => branch ?? false))) {
347
346
  if (~branchPatterns.indexOf(currentBranch)) {
348
347
  branchPatterns.splice(headBranchIdx, 1)
349
348
  } else {
@@ -373,7 +372,11 @@ async function selectReferences (source, repo, remote) {
373
372
  }
374
373
  // NOTE only consider local branches if repo has a worktree or there are no remote tracking branches
375
374
  if (!isBare) {
376
- const localBranches = await git.listBranches(repo)
375
+ const localBranches = await git.listBranches(repo).then((branches) => {
376
+ if (branches.length) return branches
377
+ if (currentBranch == null) return getCurrentBranchName(repo).then((branch) => (branch ? [branch] : []))
378
+ return currentBranch ? [currentBranch] : []
379
+ })
377
380
  if (localBranches.length) {
378
381
  const worktrees = await findWorktrees(repo, worktreePatterns)
379
382
  let onMatch
@@ -406,11 +409,11 @@ async function selectReferences (source, repo, remote) {
406
409
  }
407
410
 
408
411
  /**
409
- * Returns the current branch name unless the HEAD is detached.
412
+ * Returns the current branch name or undefined if the HEAD is detached.
410
413
  */
411
414
  function getCurrentBranchName (repo, remote) {
412
415
  return (
413
- repo.noCheckout && remote
416
+ remote && repo.noCheckout
414
417
  ? git
415
418
  .resolveRef(Object.assign({ ref: 'refs/remotes/' + remote + '/HEAD', depth: 2 }, repo))
416
419
  .catch(() => git.resolveRef(Object.assign({ ref: 'HEAD', depth: 2 }, repo)))
@@ -458,12 +461,13 @@ function collectFilesFromStartPath (startPath, repo, authStatus, ref, originUrl,
458
461
  const worktreePath = ref.head
459
462
  const origin = computeOrigin(originUrl, authStatus, repo.gitdir, ref, startPath, worktreePath, editUrl)
460
463
  return (worktreePath ? readFilesFromWorktree(origin) : readFilesFromGitTree(repo, ref.oid, startPath))
461
- .then((files) =>
462
- Object.assign(deepClone((origin.descriptor = loadComponentDescriptor(files, ref, version))), {
463
- files: files.map((file) => assignFileProperties(file, origin)),
464
- origins: [origin],
465
- })
466
- )
464
+ .then((files) => {
465
+ const batch = deepClone((origin.descriptor = loadComponentDescriptor(files, ref, version)))
466
+ if ('nav' in batch) batch.nav.origin = origin
467
+ batch.files = files.map((file) => assignFileProperties(file, origin))
468
+ batch.origins = [origin]
469
+ return batch
470
+ })
467
471
  .catch((err) => {
468
472
  const where = worktreePath || (worktreePath === false ? repo.gitdir : repo.url || repo.dir)
469
473
  const flag = worktreePath ? ' <worktree>' : ref.remote && worktreePath === false ? ` <remotes/${ref.remote}>` : ''
@@ -488,19 +492,18 @@ function readFilesFromWorktree (origin) {
488
492
  }
489
493
 
490
494
  function srcFs (cwd, origin) {
491
- return new Promise((resolve, reject, cache = Object.create(null), files = [], relpathStart = cwd.length + 1) =>
495
+ return new Promise((resolve, reject, files = []) =>
492
496
  pipeline(
493
- globStream(CONTENT_SRC_GLOB, Object.assign({ cache, cwd }, CONTENT_SRC_OPTS)),
494
- forEach(({ path: abspathPosix }, _, done) => {
495
- if ((cache[abspathPosix] || {}).constructor === Array) return done() // detects some directories
496
- const abspath = posixify ? ospath.normalize(abspathPosix) : abspathPosix
497
- const relpath = abspath.substr(relpathStart)
498
- symlinkAwareStat(abspath).then(
499
- (stat) => {
500
- if (stat.isDirectory()) return done() // detects directories that slipped through cache check
497
+ globStream(CONTENT_SRC_GLOB, Object.assign({ cwd }, CONTENT_SRC_OPTS)),
498
+ forEach(({ path: relpath, dirent }, _, done) => {
499
+ if (dirent.isDirectory()) return done()
500
+ const relpathPosix = relpath
501
+ const abspath = posixify ? ospath.join(cwd, (relpath = ospath.normalize(relpath))) : cwd + '/' + relpath
502
+ fsp.stat(abspath).then(
503
+ (stat) =>
501
504
  fsp.readFile(abspath).then(
502
505
  (contents) => {
503
- files.push(new File({ path: posixify ? posixify(relpath) : relpath, contents, stat, src: { abspath } }))
506
+ files.push(new File({ path: relpathPosix, contents, stat, src: { abspath } }))
504
507
  done()
505
508
  },
506
509
  (readErr) => {
@@ -510,22 +513,28 @@ function srcFs (cwd, origin) {
510
513
  : logger.error(logObject, readErr.message.replace(`'${abspath}'`, relpath))
511
514
  done()
512
515
  }
513
- )
514
- },
516
+ ),
515
517
  (statErr) => {
516
518
  const logObject = { file: { abspath, origin } }
517
- if (statErr.symlink) {
518
- logger.error(
519
- logObject,
520
- (statErr.code === 'ELOOP' ? 'ELOOP: symbolic link cycle, ' : 'ENOENT: broken symbolic link, ') +
521
- `${relpath} -> ${statErr.symlink}`
522
- )
523
- } else if (statErr.code === 'ENOENT') {
524
- logger.warn(logObject, `ENOENT: file or directory disappeared, ${statErr.syscall} ${relpath}`)
519
+ if (dirent.isSymbolicLink()) {
520
+ fsp
521
+ .readlink(abspath)
522
+ .then(
523
+ (symlink) =>
524
+ (statErr.code === 'ELOOP' ? 'ELOOP: symbolic link cycle, ' : 'ENOENT: broken symbolic link, ') +
525
+ `${relpath} -> ${symlink}`,
526
+ () => statErr.message.replace(`'${abspath}'`, relpath)
527
+ )
528
+ .then((message) => {
529
+ logger.error(logObject, message)
530
+ done()
531
+ })
525
532
  } else {
526
- logger.error(logObject, statErr.message.replace(`'${abspath}'`, relpath))
533
+ statErr.code === 'ENOENT'
534
+ ? logger.warn(logObject, `ENOENT: file or directory disappeared, ${statErr.syscall} ${relpath}`)
535
+ : logger.error(logObject, statErr.message.replace(`'${abspath}'`, relpath))
536
+ done()
527
537
  }
528
- done()
529
538
  }
530
539
  )
531
540
  }),
@@ -695,8 +704,13 @@ function filterGitEntry (entry) {
695
704
 
696
705
  function gitEntryToFile (entry) {
697
706
  return git.readBlob(entry).then(({ blob: contents }) => {
698
- contents = Buffer.from(contents.buffer)
699
- const stat = Object.assign(new fs.Stats(), { mode: entry.mode, mtime: undefined, size: contents.byteLength })
707
+ const stat = {
708
+ mode: entry.mode,
709
+ size: (contents = Buffer.from(contents.buffer)).byteLength,
710
+ isDirectory: invariably.false,
711
+ isFile: invariably.true,
712
+ isSymbolicLink: invariably.false,
713
+ }
700
714
  return new File({ path: entry.path, contents, stat })
701
715
  })
702
716
  }
@@ -708,7 +722,7 @@ function loadComponentDescriptor (files, ref, version) {
708
722
  files.splice(descriptorFileIdx, 1)
709
723
  let data
710
724
  try {
711
- data = yaml.load(descriptorFile.contents.toString(), { schema: yaml.CORE_SCHEMA })
725
+ data = Object(yaml.load(descriptorFile.contents.toString(), { schema: yaml.CORE_SCHEMA }))
712
726
  } catch (err) {
713
727
  throw Object.assign(err, { message: `${COMPONENT_DESC_FILENAME} has invalid syntax; ${err.message}` })
714
728
  }
@@ -764,18 +778,20 @@ function assignFileProperties (file, origin) {
764
778
  return file
765
779
  }
766
780
 
767
- function buildFetchOptions (repo, progress, displayUrl, credentialsFromUrl, gitPlugins, fetchTags, operation) {
781
+ function buildFetchOptions (repo, progress, displayUrl, credentialsFromUrl, gitPlugins, fetch, operation) {
768
782
  const { credentialManager, http, urlRouter } = gitPlugins
783
+ const corsProxy = false
784
+ const depth = fetch.depth || undefined
769
785
  const onAuth = resolveCredentials.bind(credentialManager, new Map().set(undefined, credentialsFromUrl))
770
786
  const onAuthFailure = onAuth
771
787
  const onAuthSuccess = (url) => credentialManager.approved({ url })
772
- const opts = Object.assign({ corsProxy: false, depth: 1, http, onAuth, onAuthFailure, onAuthSuccess }, repo)
788
+ const opts = Object.assign({ corsProxy, depth, http, onAuth, onAuthFailure, onAuthSuccess }, repo)
773
789
  if (urlRouter) opts.url = urlRouter.ensureGitSuffix(opts.url)
774
790
  if (progress) opts.onProgress = createProgressListener(progress, displayUrl, operation)
775
791
  if (operation === 'fetch') {
776
792
  opts.prune = true
777
- if (fetchTags) opts.tags = opts.pruneTags = true
778
- } else if (!fetchTags) {
793
+ if (fetch.tags) opts.tags = opts.pruneTags = true
794
+ } else if (!fetch.tags) {
779
795
  opts.noTags = true
780
796
  }
781
797
  return opts
@@ -928,20 +944,6 @@ function isDirectory (url) {
928
944
  return fsp.stat(url).then((stat) => stat.isDirectory(), invariably.false)
929
945
  }
930
946
 
931
- function symlinkAwareStat (path_) {
932
- return fsp.lstat(path_).then((lstat) => {
933
- if (!lstat.isSymbolicLink()) return lstat
934
- return fsp.stat(path_).catch((statErr) =>
935
- fsp
936
- .readlink(path_)
937
- .catch(invariably.void)
938
- .then((symlink) => {
939
- throw Object.assign(statErr, { symlink })
940
- })
941
- )
942
- })
943
- }
944
-
945
947
  function tagsSpecified (sources) {
946
948
  return sources.some(({ tags }) => tags && (Array.isArray(tags) ? tags.length : true))
947
949
  }
@@ -1066,7 +1068,7 @@ function findWorktrees (repo, patterns) {
1066
1068
  if (!patterns.length) return new Map()
1067
1069
  const mainWorktree =
1068
1070
  patterns[0] === '.' && (patterns = patterns.slice(1))
1069
- ? getCurrentBranchName(repo).then((branch) => (branch ? [branch, { head: repo.dir, name: '.' }] : undefined))
1071
+ ? getCurrentBranchName(repo).then((branch) => branch && [branch, { head: repo.dir, name: '.' }])
1070
1072
  : Promise.resolve()
1071
1073
  const worktreesDir = patterns.length ? ospath.join(repo.dir, '.git', 'worktrees') : undefined
1072
1074
  const patternCache = repo.cache[REF_PATTERN_CACHE_KEY]
@@ -1080,13 +1082,11 @@ function findWorktrees (repo, patterns) {
1080
1082
  worktreeNames.map((worktreeName) => {
1081
1083
  const gitdir = ospath.resolve(worktreesDir, worktreeName)
1082
1084
  // NOTE branch name defaults to worktree name if HEAD is detached
1083
- return git
1084
- .currentBranch(Object.assign({}, repo, { gitdir }))
1085
- .then((branch = worktreeName) =>
1086
- fsp
1087
- .readFile(ospath.join(gitdir, 'gitdir'), 'utf8')
1088
- .then((contents) => [branch, { head: ospath.dirname(contents.trimEnd()), name: worktreeName }])
1089
- )
1085
+ return getCurrentBranchName(Object.assign({}, repo, { gitdir })).then((branch = worktreeName) =>
1086
+ fsp
1087
+ .readFile(ospath.join(gitdir, 'gitdir'), 'utf8')
1088
+ .then((contents) => [branch, { head: ospath.dirname(contents.trimEnd()), name: worktreeName }])
1089
+ )
1090
1090
  })
1091
1091
  )
1092
1092
  )
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
2
 
3
- const { posix: path } = require('path')
3
+ const { posix: path } = require('node:path')
4
4
  const posixify = require('./posixify')
5
5
  const removeGitSuffix = require('./remove-git-suffix')
6
6
 
package/lib/constants.js CHANGED
@@ -3,8 +3,8 @@
3
3
  module.exports = Object.freeze({
4
4
  COMPONENT_DESC_FILENAME: 'antora.yml',
5
5
  CONTENT_CACHE_FOLDER: 'content',
6
- CONTENT_SRC_GLOB: '**/*[!~]',
7
- CONTENT_SRC_OPTS: { follow: true, nomount: true, nosort: true, nounique: true, strict: false },
6
+ CONTENT_SRC_GLOB: '**/!(*~)',
7
+ CONTENT_SRC_OPTS: { dot: true, ignore: ['**/.*{,/**}'], objectMode: true, onlyFiles: false, unique: false },
8
8
  FILE_MODES: { 100644: 0o100666 & ~process.umask(), 100755: 0o100777 & ~process.umask() },
9
9
  GIT_CORE: 'antora',
10
10
  GIT_OPERATION_LABEL_LENGTH: 8,
@@ -3,4 +3,4 @@
3
3
  module.exports = (({ StringDecoder }) => {
4
4
  const decoder = new StringDecoder()
5
5
  return decoder.write.bind(decoder)
6
- })(require('string_decoder'))
6
+ })(require('node:string_decoder'))
@@ -1,10 +1,10 @@
1
1
  'use strict'
2
2
 
3
- const { homedir } = require('os')
3
+ const { homedir } = require('node:os')
4
4
  const expandPath = require('@antora/expand-path-helper')
5
- const { promises: fsp } = require('fs')
5
+ const { promises: fsp } = require('node:fs')
6
6
  const invariably = require('./invariably')
7
- const ospath = require('path')
7
+ const ospath = require('node:path')
8
8
 
9
9
  class GitCredentialManagerStore {
10
10
  configure ({ config, startDir }) {
package/lib/git.js CHANGED
@@ -1,3 +1,10 @@
1
1
  'use strict'
2
2
 
3
- module.exports = require('isomorphic-git')
3
+ const zlib = require('node:zlib')
4
+ const { promisify } = require('node:util')
5
+
6
+ module.exports = ((pakoModuleId) => {
7
+ const git = require('isomorphic-git')
8
+ require(pakoModuleId).inflate = promisify(zlib.inflate)
9
+ return git
10
+ })('pako')
package/lib/matcher.js CHANGED
@@ -16,15 +16,10 @@ const BASE_OPTS = {
16
16
  strictSlashes: true,
17
17
  }
18
18
 
19
- function makeMatcherRx (input, opts) {
20
- if (input && ~input.indexOf('{')) input = input.replace(/^([^({]+)\./, '$1(?:.)')
21
- return makeRe(input, opts)
22
- }
23
-
24
19
  module.exports = {
25
20
  MATCH_ALL_RX: Object.defineProperty({ test: () => true }, 'pattern', { value: '*' }),
26
21
  expandBraces,
27
- makeMatcherRx,
22
+ makeMatcherRx: makeRe,
28
23
  pathMatcherOpts: Object.assign({}, BASE_OPTS, { dot: false }),
29
24
  refMatcherOpts: (cache) =>
30
25
  Object.assign({}, BASE_OPTS, {
package/lib/posixify.js CHANGED
@@ -1,3 +1,3 @@
1
1
  'use strict'
2
2
 
3
- module.exports = require('path').sep === '\\' ? (p) => p.replace(/\\/g, '/') : undefined
3
+ module.exports = require('node:path').sep === '\\' ? (p) => p.replace(/\\/g, '/') : undefined
@@ -1,7 +1,7 @@
1
1
  'use strict'
2
2
 
3
3
  const deepFlatten = require('./deep-flatten')
4
- const { promises: fsp } = require('fs')
4
+ const { promises: fsp } = require('node:fs')
5
5
  const git = require('./git')
6
6
  const invariably = require('./invariably')
7
7
  const { expandBraces, makeMatcherRx, pathMatcherOpts: MATCHER_OPTS } = require('./matcher')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antora/content-aggregator",
3
- "version": "3.2.0-alpha.4",
3
+ "version": "3.2.0-alpha.5",
4
4
  "description": "Fetches and aggregates content from distributed sources for use in an Antora documentation pipeline.",
5
5
  "license": "MPL-2.0",
6
6
  "author": "OpenDevise Inc. (https://opendevise.com)",
@@ -29,23 +29,23 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "@antora/expand-path-helper": "~2.0",
32
- "@antora/logger": "3.2.0-alpha.4",
32
+ "@antora/logger": "3.2.0-alpha.5",
33
33
  "@antora/user-require-helper": "~2.0",
34
34
  "braces": "~3.0",
35
35
  "cache-directory": "~2.0",
36
- "glob-stream": "~7.0",
36
+ "fast-glob": "~3.3",
37
37
  "hpagent": "~1.2",
38
38
  "isomorphic-git": "~1.25",
39
39
  "js-yaml": "~4.1",
40
40
  "multi-progress": "~4.0",
41
- "picomatch": "~2.3",
41
+ "picomatch": "~4.0",
42
42
  "progress": "~2.0",
43
43
  "should-proxy": "~1.0",
44
44
  "simple-get": "~4.0",
45
- "vinyl": "~2.2"
45
+ "vinyl": "~3.0"
46
46
  },
47
47
  "engines": {
48
- "node": ">=16.0.0"
48
+ "node": ">=18.0.0"
49
49
  },
50
50
  "files": [
51
51
  "lib/"