diff --git a/scripts/update-cli-repos.js b/scripts/update-cli-repos.js index a2bdb0efadf70..fb0e8d4093356 100644 --- a/scripts/update-cli-repos.js +++ b/scripts/update-cli-repos.js @@ -1,28 +1,49 @@ const { join } = require('node:path') const { fs, gh, run } = require('./util.js') -const query = ` -query { - search (query: "org:npm topic:npm-cli fork:true archived:false", type: REPOSITORY, first: 100) { - nodes { - ... on Repository { - name +const searchQuery = 'org:npm topic:npm-cli fork:true archived:false' + +const fetchRepoNames = async () => { + const repoNames = new Set() + let page = 1 + + while (true) { + const result = await gh( + 'api', + `search/repositories?q=${encodeURIComponent(searchQuery)}&per_page=100&page=${page}`, + { stdio: 'pipe' } + ) + + if (result.code !== 0) { + throw new Error(result.stderr) + } + + const repoList = JSON.parse(result.stdout) + const pageNames = Array.isArray(repoList.items) ? repoList.items.map((repo) => repo.name) : [] + + if (pageNames.length === 0) { + break + } + + for (const name of pageNames) { + if (name) { + repoNames.add(name) } } - } -} -` -const main = async () => { - const result = await gh('api', 'graphql', '-f', `query=${query}`, { stdio: 'pipe' }) - if (result.code !== 0) { - throw new Error(result.stderr) + if (pageNames.length < 100) { + break + } + + page++ } - const repoList = JSON.parse(result.stdout) - const sortedRepoList = repoList.data.search.nodes.map((node) => node.name).sort() + return [...repoNames].sort() +} - return fs.writeFile(join(__dirname, 'npm-cli-repos.txt'), sortedRepoList.join('\n')) +const main = async () => { + const repoNames = await fetchRepoNames() + return fs.writeFile(join(__dirname, 'npm-cli-repos.txt'), repoNames.join('\n')) } run(main)