diff --git a/.github/ISSUE_TEMPLATE/01-react-components-bug-report.yml b/.github/ISSUE_TEMPLATE/01-react-components-bug-report.yml index fa2b5be3bc008..0eab27be609fb 100644 --- a/.github/ISSUE_TEMPLATE/01-react-components-bug-report.yml +++ b/.github/ISSUE_TEMPLATE/01-react-components-bug-report.yml @@ -26,8 +26,15 @@ body: - Breadcrumb - Button - Card + - CardFooter + - CardHeader + - CardPreview + - Carousel + - CarouselNav - Checkbox - Combobox + - CompoundButton + - Counter Badge - DataGrid - Dialog - Divider @@ -38,14 +45,19 @@ body: - Image - InfoLabel - Input + - InteractionTag - Label - Link + - List - Menu + - MenuButton + - MenuList - MessageBar - Overflow - Persona - Popover - Portal + - PresenceBadge - ProgressBar - RadioGroup - Rating @@ -56,32 +68,36 @@ body: - Slider - SpinButton - Spinner + - SplitButton - SwatchPicker - Switch - - Table - TabList + - Table - Tag + - TagGroup - TagPicker - TeachingPopover - Text - Textarea - Toast + - ToggleButton - Toolbar - Tooltip - Tree + - ColorPicker (Preview) + - Nav (Preview) + - Virtualizer (Preview) + - VirtualizerScrollView (Preview) + - VirtualizerScrollViewDynamic (Preview) - Calendar (Compat) - DatePicker (Compat) - TimePicker (Compat) - - Carousel (Preview) - - List (Preview) - - Nav (Preview) - - Virtualizer (Preview) - - Motion - Icons + - Migration Shims V0 + - Migration Shims V8 + - Motion - Theme/Tokens - - Utilities (utilities we provide besides Components, e.g. apis from react-utilities) - - Migration Shims v0 - - Migration Shims v8 + - Utilities - Other... validations: required: true diff --git a/.github/triage-bot.config-v2.json b/.github/triage-bot.config-v2.json new file mode 100644 index 0000000000000..7cf06cef47717 --- /dev/null +++ b/.github/triage-bot.config-v2.json @@ -0,0 +1,24 @@ +{ + "$schema": "../scripts/triage-bot/triage-bot.schema-v2.json", + "params": [ + { + "frameworkType": "Fluent UI react-components (v9)", + "headingToParse": "Component", + "mapping": { + "packages/react-components/react-accordion": ["Accordion"], + "packages/react-components/react-avatar": ["Avatar", "AvatarGroup"], + "packages/react-components/react-utilities": ["Utilities"], + "packages/react-components/react-provider": ["FluentProvider"], + "packages/react-components/react-migration-v0-v9": ["Migration Shims v0"], + "packages/react-components/react-migration-v8-v9": ["Migration Shims v8"] + } + }, + { + "frameworkType": "Fluent UI react (v8)", + "headingToParse": "Package", + "mapping": { + "packages/azure-themes": ["azure-themes"] + } + } + ] +} diff --git a/package.json b/package.json index c50f53823e2dd..64d9840154243 100644 --- a/package.json +++ b/package.json @@ -33,8 +33,8 @@ "scrub": "node ./scripts/executors/src/scrub.js" }, "devDependencies": { - "@actions/core": "1.9.1", - "@actions/github": "5.0.3", + "@actions/core": "1.11.1", + "@actions/github": "6.0.0", "@babel/core": "7.24.6", "@babel/generator": "7.24.6", "@babel/parser": "7.24.6", @@ -137,6 +137,7 @@ "@types/eslint": "8.56.10", "@types/express": "4.17.21", "@types/fs-extra": "8.0.1", + "@types/github-script": "github:actions/github-script#v7.0.1", "@types/glob": "7.1.1", "@types/graphviz": "0.0.34", "@types/gulp": "4.0.9", diff --git a/packages/react-components/react-carousel/stories/src/Carousel/index.stories.tsx b/packages/react-components/react-carousel/stories/src/Carousel/index.stories.tsx index 29d2ccf2468ad..9d3be3b898bc6 100644 --- a/packages/react-components/react-carousel/stories/src/Carousel/index.stories.tsx +++ b/packages/react-components/react-carousel/stories/src/Carousel/index.stories.tsx @@ -24,7 +24,7 @@ export { FirstRunExperience } from './CarouselFirstRunExperience.stories'; export { Eventing } from './CarouselEventing.stories'; export default { - title: 'Components/Carousel', + title: 'Components/Carousel/Carousel', component: Carousel, subcomponents: { CarouselAutoplayButton, diff --git a/scripts/triage-bot/src/codeowners-parser.js b/scripts/triage-bot/src/codeowners-parser.js new file mode 100644 index 0000000000000..691f447db2f9c --- /dev/null +++ b/scripts/triage-bot/src/codeowners-parser.js @@ -0,0 +1,66 @@ +/** + * + * @param {Array} rules + */ +function serialize(rules) { + return rules + .map(rule => { + return [rule.path, rule.owners].join(' '); + }) + .join('\n'); +} + +/** + * + * @param {string} content + */ +function parse(content) { + /** @type {Array} */ + const rules = []; + + if (content.length === 0) { + return rules; + } + + const rawLines = content.trim().split('\n'); + + for (const rawLine of rawLines) { + const line = rawLine.trim(); + + if (!line || line.startsWith('#')) { + continue; + } + + rules.push(createRule(line)); + } + + return rules; +} + +/** + * + * @param {string} rule + * @returns {import('./types').FileOwnershipMatcher} + */ +function createRule(rule) { + const rawParts = rule.split(/\s+/); + /** @type {string[]} */ + const parts = []; + for (const part of rawParts) { + if (part.startsWith('#')) { + break; + } + parts.push(part); + } + + // The first part is expected to be the path + const path = parts[0]; + + // Rest of parts is expected to be the owners + const owners = parts.length > 1 ? parts.slice(1, parts.length) : []; + + return { path, owners }; +} + +exports.serialize = serialize; +exports.parse = parse; diff --git a/scripts/triage-bot/src/codeowners-parser.spec.ts b/scripts/triage-bot/src/codeowners-parser.spec.ts new file mode 100644 index 0000000000000..c1c24a351ed7d --- /dev/null +++ b/scripts/triage-bot/src/codeowners-parser.spec.ts @@ -0,0 +1,124 @@ +import { parse, serialize } from './codeowners-parser'; // Replace with the actual module path + +describe('#serialize', () => { + it('should return an empty string when rules are empty', () => { + const result = serialize([]); + expect(result).toEqual(''); + }); + + it(`should return valid codeowners file based on rules`, () => { + const result = serialize([ + { path: 'src/*.js', owners: ['@owner1', '@owner@fluent.com'] }, + { path: 'docs/*.md', owners: ['@owner3'] }, + ]); + expect(result).toMatchInlineSnapshot(` + "src/*.js @owner1,@owner@fluent.com + docs/*.md @owner3" + `); + }); +}); + +describe('#parse', () => { + it('should return an empty array when content is empty', () => { + const result = parse(''); + expect(result).toEqual([]); + }); + + it('should return an empty array when content only contains comments', () => { + const content = ` + # This is a comment + # Another comment line + `; + const result = parse(content); + expect(result).toEqual([]); + }); + + it('should parse a single rule correctly', () => { + const content = ` + src/*.js @owner1 @owner2 @team/one owner@fluent.com + `; + const result = parse(content); + expect(result).toEqual([ + { + path: 'src/*.js', + owners: ['@owner1', '@owner2', '@team/one', 'owner@fluent.com'], + }, + ]); + }); + + it('should ignore inline comments after rules', () => { + const content = ` + src/*.js @owner1 @owner2 # inline comment + `; + const result = parse(content); + expect(result).toEqual([ + { + path: 'src/*.js', + owners: ['@owner1', '@owner2'], + }, + ]); + }); + + it('should parse multiple rules correctly', () => { + const content = ` + src/*.js @owner1 @owner2 + docs/*.md @owner3 + # A comment + assets/*.png + `; + const result = parse(content); + expect(result).toEqual([ + { + path: 'src/*.js', + owners: ['@owner1', '@owner2'], + }, + { + path: 'docs/*.md', + owners: ['@owner3'], + }, + { + path: 'assets/*.png', + owners: [], + }, + ]); + }); + + it('should trim whitespace from lines and handle empty lines', () => { + const content = ` + src/*.js @owner1 @owner2 + + docs/*.md @owner3 + + # Comment + `; + const result = parse(content); + expect(result).toEqual([ + { + path: 'src/*.js', + owners: ['@owner1', '@owner2'], + }, + { + path: 'docs/*.md', + owners: ['@owner3'], + }, + ]); + }); + + it('should handle rules with no owners', () => { + const content = ` + src/*.js + docs/*.md + `; + const result = parse(content); + expect(result).toEqual([ + { + path: 'src/*.js', + owners: [], + }, + { + path: 'docs/*.md', + owners: [], + }, + ]); + }); +}); diff --git a/scripts/triage-bot/src/triage-bot-v2.js b/scripts/triage-bot/src/triage-bot-v2.js new file mode 100644 index 0000000000000..853a18fb504f2 --- /dev/null +++ b/scripts/triage-bot/src/triage-bot-v2.js @@ -0,0 +1,33 @@ +/* eslint-disable @typescript-eslint/naming-convention */ + +/** @typedef {import('github-script').AsyncFunctionArguments} AsyncFunctionArguments */ + +/** + * + * @param {AsyncFunctionArguments} options + */ +async function main(options) { + const { context, github } = options; + + const issueNumber = context.payload?.issue?.number; + + if (!issueNumber) { + throw new Error('no issue number provided!'); + } + + const issue = await github.rest.issues.get({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issueNumber, + }); + + const issueMD = issue.data.body; + + // 1. todo parse markdown + // 2. extract Component string `## Component > content` + // 3. assign Labels based on Component + // 4. assign code-owners based on Labels + console.log(issueMD); +} + +module.exports = main; diff --git a/scripts/triage-bot/src/types.ts b/scripts/triage-bot/src/types.ts index d5d4df7a30464..243f57a27083b 100644 --- a/scripts/triage-bot/src/types.ts +++ b/scripts/triage-bot/src/types.ts @@ -17,3 +17,23 @@ export interface Schema { assignees: string[]; }>; } + +export interface SchemaV2 { + params: Array<{ + /** Label added by issue template */ + frameworkType: string; + /** Which heading is the source of truth for parsing selected Option */ + headingToParse: string; + /** + * Mapping used against parsed CODEOWNERS file + */ + mapping: { + [projectRoot: string]: /* Options within issue Dropdown */ string[]; + }; + }>; +} + +export interface FileOwnershipMatcher { + path: string; + owners: string[]; +} diff --git a/scripts/triage-bot/triage-bot.schema-v2.json b/scripts/triage-bot/triage-bot.schema-v2.json new file mode 100644 index 0000000000000..88f7ea21780e0 --- /dev/null +++ b/scripts/triage-bot/triage-bot.schema-v2.json @@ -0,0 +1,29 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Triage Bot Config V2", + "type": "object", + "properties": { + "params": { + "type": "array", + "items": { + "type": "object", + "properties": { + "frameworkType": { + "type": "string" + }, + "headingToParse": { + "type": "string" + }, + "mapping": { + "type": "object", + "additionalProperties": { + "type": "array" + } + } + }, + "additionalProperties": false, + "required": ["frameworkType", "headingToParse", "mapping"] + } + } + } +} diff --git a/tools/workspace-plugin/generators.json b/tools/workspace-plugin/generators.json index 3a882f4f0b422..8c501b056ffb7 100644 --- a/tools/workspace-plugin/generators.json +++ b/tools/workspace-plugin/generators.json @@ -96,6 +96,11 @@ "schema": "./src/generators/epic-generator/schema.json", "description": "DEPRECATED: Create a migration tracker issue epic and subsequent team sub-issues on GitHub for React v9", "hidden": true + }, + "stories-map": { + "factory": "./src/generators/stories-map/generator", + "schema": "./src/generators/stories-map/schema.json", + "description": "stories-map generator" } } } diff --git a/tools/workspace-plugin/src/generators/stories-map/generator.spec.ts b/tools/workspace-plugin/src/generators/stories-map/generator.spec.ts new file mode 100644 index 0000000000000..add94fa8fb99d --- /dev/null +++ b/tools/workspace-plugin/src/generators/stories-map/generator.spec.ts @@ -0,0 +1,20 @@ +import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing'; +import { Tree } from '@nx/devkit'; + +import { storiesMapGenerator } from './generator'; +import { StoriesMapGeneratorSchema } from './schema'; + +describe('stories-map generator', () => { + let tree: Tree; + const options: StoriesMapGeneratorSchema = {}; + + beforeEach(() => { + tree = createTreeWithEmptyWorkspace(); + }); + + it('should run successfully', async () => { + await storiesMapGenerator(tree, options); + + expect(tree.exists('/stories-map.json')).toEqual(true); + }); +}); diff --git a/tools/workspace-plugin/src/generators/stories-map/generator.ts b/tools/workspace-plugin/src/generators/stories-map/generator.ts new file mode 100644 index 0000000000000..b1cc4b7eb04b1 --- /dev/null +++ b/tools/workspace-plugin/src/generators/stories-map/generator.ts @@ -0,0 +1,245 @@ +import * as tsquery from '@phenomnomnominal/tsquery'; +import ts from 'typescript'; +import * as path from 'node:path'; +import { formatFiles, getProjects, ProjectConfiguration, Tree, visitNotIgnoredFiles, writeJson } from '@nx/devkit'; +import { StoriesMapGeneratorSchema } from './schema'; + +type StoriesMetadata = Array<{ + title: string; + storyFilePath: string; + project: ProjectConfiguration; + group: + | { + name: string; + children: string[]; + githubLabel: string; + } + | undefined; +}>; + +type GroupedList = { [group_name: string]: Array<{ children: string[]; project: string }> }; +type AggregatedGroupedList = { [group_name: string]: { [project_name: string]: string[] } }; + +export async function storiesMapGenerator(tree: Tree, _options: StoriesMapGeneratorSchema) { + const stories = getStoriesMetadata(tree); + writeJson(tree, '/stories-map.json', stories); + + const list = generateIssuesOptionList(tree, stories); + + writeJson(tree, '/stories-list.json', list); + + const githubIssueOptions = createOptions(list); + const yamlList = githubIssueOptions.map(item => `- ${item}`).join(`\n`); + + console.log(yamlList); + + await formatFiles(tree); +} + +export default storiesMapGenerator; + +function createOptions(groups: AggregatedGroupedList) { + const list: string[] = []; + const components = { stable: [] as string[], preview: [] as string[], compat: [] as string[] }; + + for (const [group, entry] of Object.entries(groups)) { + if (group === 'Utilities') { + list.push(group); + continue; + } + if (group === 'Icons') { + list.push(group); + continue; + } + if (group === 'Motion') { + list.push(group); + continue; + } + if (group === 'Theme') { + list.push(`${group}/Tokens`); + continue; + } + + const entriesForList = Object.values(entry).flat(); + if (group === 'Migration Shims') { + const item = entriesForList.filter(val => /^V\d/.exec(val)); + list.push(...item.map(val => `${group} ${val}`)); + continue; + } + if (group === 'Components') { + const item = entriesForList.filter(val => val[0] === val[0].toUpperCase()).sort(); + components.stable.push(...item); + continue; + } + if (group === 'Compat Components') { + const item = entriesForList.sort().map(val => `${val} (Compat)`); + components.compat.push(...item); + continue; + } + if (group === 'Preview Components') { + const item = entriesForList.sort().map(val => `${val} (Preview)`); + components.preview.push(...item); + continue; + } + } + + list.sort().unshift(...components.stable, ...components.preview, ...components.compat); + list.push('Other...'); + + return list; +} + +function generateIssuesOptionList(tree: Tree, metadata: StoriesMetadata) { + const groups: GroupedList = {}; + + for (const entry of metadata) { + if (!entry.group) { + continue; + } + if (!groups[entry.group.name]) { + groups[entry.group.name] = []; + } + groups[entry.group.name].push({ project: entry.project.name!, children: unique(entry.group.children) }); + } + + const aggregatedGroups = aggregateData(groups); + + return aggregatedGroups; + + function aggregateData(input: typeof groups): AggregatedGroupedList { + const output = Object.entries(input).reduce((acc, [group, entry]) => { + if (!acc[group]) { + acc[group] = {}; + } + entry.forEach(val => { + if (!acc[group][val.project]) { + acc[group][val.project] = []; + } + + acc[group][val.project].push(...val.children); + acc[group][val.project] = unique(acc[group][val.project]); + }); + + return acc; + }, {} as { [group_name: string]: { [project_name: string]: string[] } }); + + return output; + } +} + +function getStoriesMetadata(tree: Tree) { + const v9projects: ProjectConfiguration[] = []; + const projects = getProjects(tree); + projects.forEach((projectConfig, _projectName) => { + if (projectConfig.tags?.includes('vNext')) { + v9projects.push(projectConfig); + } + }); + + const titles: StoriesMetadata = []; + + v9projects.forEach(config => { + visitNotIgnoredFiles(tree, config.root, filePath => { + if (filePath.includes('index.stories.')) { + const type = path.basename(filePath).split('.').at(-1) as 'tsx' | 'mdx'; + const content = tree.read(filePath, 'utf-8') as string; + const title = getStoryTitle(content, type); + + if (!title) { + console.warn(`No title found!: ${filePath}`); + return; + } + + titles.push({ + title, + storyFilePath: filePath, + project: config, + group: getStoryGroup(tree, { title, project: config }), + }); + } + }); + }); + + return titles; +} + +function getStoryTitle(source: string, type: 'tsx' | 'ts' | 'mdx') { + if (type === 'mdx') { + const title = extractMetaTitleWithRegex(source); + + return title; + } + + if (type === 'tsx' || type === 'ts') { + const [exportAssigment] = tsquery.query(source, 'ExportAssignment'); + + // default exporting variable eg: `const foo = {}; export default const;` + if (exportAssigment.expression.kind === ts.SyntaxKind.Identifier) { + const [exportIdentifierNode] = tsquery.match(exportAssigment, 'Identifier'); + + const exportIdentifierName = exportIdentifierNode.text; + + const [titleNode] = tsquery.query( + source, + `Identifier[name="${exportIdentifierName}"] ~ ObjectLiteralExpression PropertyAssignment > Identifier[name="title"] ~ StringLiteral`, + ); + + return titleNode.text; + } + + // default exporting expression eg: `export default {}` + const [titleNode] = tsquery.match( + exportAssigment, + 'ObjectLiteralExpression PropertyAssignment > Identifier[name="title"] ~ StringLiteral', + ); + + if (!titleNode) { + return null; + } + + const title = titleNode.text; + + return title; + } + + function extractMetaTitleWithRegex(content: string) { + const regex = /]*\btitle=["']([^"']+)["'][^>]*>/; + const match = content.match(regex); + return match ? match[1] : null; + } +} + +function getStoryGroup( + tree: Tree, + entry: { + title: string; + project: ProjectConfiguration; + }, +) { + if (entry.title.startsWith('Concepts')) { + return; + } + if (entry.project.name?.includes('react-charts')) { + return; + } + if (entry.project.tags?.includes('tools')) { + return; + } + if (entry.project.projectType === 'application' && entry.project.name !== 'public-docsite-v9') { + return; + } + + const titleTree = entry.title.split('/'); + const mainGroup = titleTree[0]; + const secondaryGroup = titleTree[1]; + + return { + name: mainGroup, + children: titleTree.slice(1), + githubLabel: secondaryGroup, + }; +} + +function unique(arr: string[]) { + return Array.from(new Set(arr)); +} diff --git a/tools/workspace-plugin/src/generators/stories-map/schema.d.ts b/tools/workspace-plugin/src/generators/stories-map/schema.d.ts new file mode 100644 index 0000000000000..0fb6c2788876c --- /dev/null +++ b/tools/workspace-plugin/src/generators/stories-map/schema.d.ts @@ -0,0 +1 @@ +export interface StoriesMapGeneratorSchema {} diff --git a/tools/workspace-plugin/src/generators/stories-map/schema.json b/tools/workspace-plugin/src/generators/stories-map/schema.json new file mode 100644 index 0000000000000..7d0eef024d189 --- /dev/null +++ b/tools/workspace-plugin/src/generators/stories-map/schema.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://json-schema.org/schema", + "$id": "StoriesMap", + "title": "", + "type": "object", + "properties": {}, + "required": [] +} diff --git a/yarn.lock b/yarn.lock index 778a15f50d30c..ca33164c2ff84 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,30 +2,51 @@ # yarn lockfile v1 -"@actions/core@1.9.1": - version "1.9.1" - resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.9.1.tgz#97c0201b1f9856df4f7c3a375cdcdb0c2a2f750b" - integrity sha512-5ad+U2YGrmmiw6du20AQW5XuWo7UKN2052FjSV7MX+Wfjf8sCqcsZe62NfgHys4QI4/Y+vQvLKYL8jWtA1ZBTA== +"@actions/core@1.11.1", "@actions/core@^1.10.1", "@actions/core@^1.9.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.11.1.tgz#ae683aac5112438021588030efb53b1adb86f172" + integrity sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A== dependencies: + "@actions/exec" "^1.1.1" "@actions/http-client" "^2.0.1" - uuid "^8.3.2" -"@actions/github@5.0.3": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@actions/github/-/github-5.0.3.tgz#b305765d6173962d113451ea324ff675aa674f35" - integrity sha512-myjA/pdLQfhUGLtRZC/J4L1RXOG4o6aYdiEq+zr5wVVKljzbFld+xv10k1FX6IkIJtNxbAq44BdwSNpQ015P0A== +"@actions/exec@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@actions/exec/-/exec-1.1.1.tgz#2e43f28c54022537172819a7cf886c844221a611" + integrity sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w== dependencies: - "@actions/http-client" "^2.0.1" - "@octokit/core" "^3.6.0" - "@octokit/plugin-paginate-rest" "^2.17.0" - "@octokit/plugin-rest-endpoint-methods" "^5.13.0" + "@actions/io" "^1.0.1" -"@actions/http-client@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-2.0.1.tgz#873f4ca98fe32f6839462a6f046332677322f99c" - integrity sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw== +"@actions/github@6.0.0", "@actions/github@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@actions/github/-/github-6.0.0.tgz#65883433f9d81521b782a64cc1fd45eef2191ea7" + integrity sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g== + dependencies: + "@actions/http-client" "^2.2.0" + "@octokit/core" "^5.0.1" + "@octokit/plugin-paginate-rest" "^9.0.0" + "@octokit/plugin-rest-endpoint-methods" "^10.0.0" + +"@actions/glob@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@actions/glob/-/glob-0.4.0.tgz#b169b1c1c72f41e5df7b3d9349539c88fa68403c" + integrity sha512-+eKIGFhsFa4EBwaf/GMyzCdWrXWymGXfFmZU3FHQvYS8mPcHtTtZONbkcqqUMzw9mJ/pImEBFET1JNifhqGsAQ== + dependencies: + "@actions/core" "^1.9.1" + minimatch "^3.0.4" + +"@actions/http-client@^2.0.1", "@actions/http-client@^2.2.0": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-2.2.3.tgz#31fc0b25c0e665754ed39a9f19a8611fc6dab674" + integrity sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA== dependencies: tunnel "^0.0.6" + undici "^5.25.4" + +"@actions/io@^1.0.1", "@actions/io@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@actions/io/-/io-1.1.3.tgz#4cdb6254da7962b07473ff5c335f3da485d94d71" + integrity sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q== "@adobe/css-tools@^4.0.1": version "4.3.2" @@ -1887,6 +1908,11 @@ resolved "https://registry.yarnpkg.com/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz#c05ed35ad82df8e6ac616c68b92c2282bd083ba4" integrity sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ== +"@fastify/busboy@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== + "@floating-ui/core@^1.6.0": version "1.6.8" resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.8.tgz#aa43561be075815879305965020f492cdb43da12" @@ -3019,7 +3045,12 @@ dependencies: "@octokit/types" "^6.0.3" -"@octokit/core@^3.5.1", "@octokit/core@^3.6.0": +"@octokit/auth-token@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7" + integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== + +"@octokit/core@^3.5.1": version "3.6.0" resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.6.0.tgz#3376cb9f3008d9b3d110370d90e0a1fcd5fe6085" integrity sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q== @@ -3032,6 +3063,19 @@ before-after-hook "^2.2.0" universal-user-agent "^6.0.0" +"@octokit/core@^5.0.1": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.2.0.tgz#ddbeaefc6b44a39834e1bb2e58a49a117672a7ea" + integrity sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg== + dependencies: + "@octokit/auth-token" "^4.0.0" + "@octokit/graphql" "^7.1.0" + "@octokit/request" "^8.3.1" + "@octokit/request-error" "^5.1.0" + "@octokit/types" "^13.0.0" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + "@octokit/endpoint@^6.0.1": version "6.0.12" resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.12.tgz#3b4d47a4b0e79b1027fb8d75d4221928b2d05658" @@ -3041,6 +3085,14 @@ is-plain-object "^5.0.0" universal-user-agent "^6.0.0" +"@octokit/endpoint@^9.0.1": + version "9.0.5" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.5.tgz#e6c0ee684e307614c02fc6ac12274c50da465c44" + integrity sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw== + dependencies: + "@octokit/types" "^13.1.0" + universal-user-agent "^6.0.0" + "@octokit/graphql@^4.5.8": version "4.8.0" resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.8.0.tgz#664d9b11c0e12112cbf78e10f49a05959aa22cc3" @@ -3050,24 +3102,62 @@ "@octokit/types" "^6.0.3" universal-user-agent "^6.0.0" +"@octokit/graphql@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.1.0.tgz#9bc1c5de92f026648131f04101cab949eeffe4e0" + integrity sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ== + dependencies: + "@octokit/request" "^8.3.0" + "@octokit/types" "^13.0.0" + universal-user-agent "^6.0.0" + "@octokit/openapi-types@^12.11.0": version "12.11.0" resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-12.11.0.tgz#da5638d64f2b919bca89ce6602d059f1b52d3ef0" integrity sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ== -"@octokit/plugin-paginate-rest@^2.16.8", "@octokit/plugin-paginate-rest@^2.17.0": +"@octokit/openapi-types@^20.0.0": + version "20.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-20.0.0.tgz#9ec2daa0090eeb865ee147636e0c00f73790c6e5" + integrity sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA== + +"@octokit/openapi-types@^22.2.0": + version "22.2.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-22.2.0.tgz#75aa7dcd440821d99def6a60b5f014207ae4968e" + integrity sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg== + +"@octokit/plugin-paginate-rest@^2.16.8": version "2.21.3" resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz#7f12532797775640dbb8224da577da7dc210c87e" integrity sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw== dependencies: "@octokit/types" "^6.40.0" +"@octokit/plugin-paginate-rest@^9.0.0": + version "9.2.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz#2e2a2f0f52c9a4b1da1a3aa17dabe3c459b9e401" + integrity sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw== + dependencies: + "@octokit/types" "^12.6.0" + "@octokit/plugin-request-log@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== -"@octokit/plugin-rest-endpoint-methods@^5.12.0", "@octokit/plugin-rest-endpoint-methods@^5.13.0": +"@octokit/plugin-request-log@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz#98a3ca96e0b107380664708111864cb96551f958" + integrity sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA== + +"@octokit/plugin-rest-endpoint-methods@^10.0.0": + version "10.4.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz#41ba478a558b9f554793075b2e20cd2ef973be17" + integrity sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg== + dependencies: + "@octokit/types" "^12.6.0" + +"@octokit/plugin-rest-endpoint-methods@^5.12.0": version "5.16.2" resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz#7ee8bf586df97dd6868cf68f641354e908c25342" integrity sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw== @@ -3075,6 +3165,15 @@ "@octokit/types" "^6.39.0" deprecation "^2.3.1" +"@octokit/plugin-retry@^6.0.1": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-6.1.0.tgz#cf5b92223246327ca9c7e17262b93ffde028ab0a" + integrity sha512-WrO3bvq4E1Xh1r2mT9w6SDFg01gFmP81nIG77+p/MqW1JeXXgL++6umim3t6x0Zj5pZm3rXAN+0HEjmmdhIRig== + dependencies: + "@octokit/request-error" "^5.0.0" + "@octokit/types" "^13.0.0" + bottleneck "^2.15.3" + "@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": version "2.1.0" resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.1.0.tgz#9e150357831bfc788d13a4fd4b1913d60c74d677" @@ -3084,6 +3183,15 @@ deprecation "^2.0.0" once "^1.4.0" +"@octokit/request-error@^5.0.0", "@octokit/request-error@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.1.0.tgz#ee4138538d08c81a60be3f320cd71063064a3b30" + integrity sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q== + dependencies: + "@octokit/types" "^13.1.0" + deprecation "^2.0.0" + once "^1.4.0" + "@octokit/request@^5.6.0", "@octokit/request@^5.6.3": version "5.6.3" resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.3.tgz#19a022515a5bba965ac06c9d1334514eb50c48b0" @@ -3096,6 +3204,16 @@ node-fetch "^2.6.7" universal-user-agent "^6.0.0" +"@octokit/request@^8.3.0", "@octokit/request@^8.3.1": + version "8.4.0" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.4.0.tgz#7f4b7b1daa3d1f48c0977ad8fffa2c18adef8974" + integrity sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw== + dependencies: + "@octokit/endpoint" "^9.0.1" + "@octokit/request-error" "^5.1.0" + "@octokit/types" "^13.1.0" + universal-user-agent "^6.0.0" + "@octokit/rest@18.12.0", "@octokit/rest@^16.43.0 || ^17.11.0 || ^18.12.0", "@octokit/rest@^18.12.0": version "18.12.0" resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.12.0.tgz#f06bc4952fc87130308d810ca9d00e79f6988881" @@ -3106,6 +3224,20 @@ "@octokit/plugin-request-log" "^1.0.4" "@octokit/plugin-rest-endpoint-methods" "^5.12.0" +"@octokit/types@^12.6.0": + version "12.6.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.6.0.tgz#8100fb9eeedfe083aae66473bd97b15b62aedcb2" + integrity sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw== + dependencies: + "@octokit/openapi-types" "^20.0.0" + +"@octokit/types@^13.0.0", "@octokit/types@^13.1.0": + version "13.6.2" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.6.2.tgz#e10fc4d2bdd65d836d1ced223b03ad4cfdb525bd" + integrity sha512-WpbZfZUcZU77DrSW4wbsSgTPfKcp286q3ItaIgvSbBpZJlu6mnYXAkjZz6LVZPXkEvLIM8McanyZejKTYUHipA== + dependencies: + "@octokit/openapi-types" "^22.2.0" + "@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.39.0", "@octokit/types@^6.40.0": version "6.41.0" resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.41.0.tgz#e58ef78d78596d2fb7df9c6259802464b5f84a04" @@ -5295,6 +5427,20 @@ dependencies: "@types/node" "*" +"@types/github-script@github:actions/github-script#v7.0.1": + version "7.0.1" + resolved "https://codeload.github.com/actions/github-script/tar.gz/60a0d83039c74a4aee543508d2ffcb1c3799cdea" + dependencies: + "@actions/core" "^1.10.1" + "@actions/exec" "^1.1.1" + "@actions/github" "^6.0.0" + "@actions/glob" "^0.4.0" + "@actions/io" "^1.1.3" + "@octokit/core" "^5.0.1" + "@octokit/plugin-request-log" "^4.0.0" + "@octokit/plugin-retry" "^6.0.1" + "@types/node" "^20.9.0" + "@types/glob-stream@*": version "6.1.0" resolved "https://registry.yarnpkg.com/@types/glob-stream/-/glob-stream-6.1.0.tgz#7ede8a33e59140534f8d8adfb8ac9edfb31897bc" @@ -5575,7 +5721,7 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@20.12.12": +"@types/node@*", "@types/node@20.12.12", "@types/node@^20.9.0": version "20.12.12" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.12.tgz#7cbecdf902085cec634fdb362172dfe12b8f2050" integrity sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw== @@ -7722,6 +7868,11 @@ boolbase@^1.0.0, boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= +bottleneck@^2.15.3: + version "2.19.5" + resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91" + integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw== + boundary@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/boundary/-/boundary-1.0.1.tgz#4d67dc2602c0cc16dd9bce7ebf87e948290f5812" @@ -23080,6 +23231,13 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici@^5.25.4: + version "5.28.4" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068" + integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g== + dependencies: + "@fastify/busboy" "^2.0.0" + unfetch@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-3.1.2.tgz#dc271ef77a2800768f7b459673c5604b5101ef77"