diff --git a/.github/scripts/lint-ecosystem.js b/.github/scripts/lint-ecosystem.js index 395fb97afc..033c5a4c51 100644 --- a/.github/scripts/lint-ecosystem.js +++ b/.github/scripts/lint-ecosystem.js @@ -4,28 +4,41 @@ const path = require('path') const fs = require('fs') const readline = require('readline') -const ecosystemDocFile = path.join(__dirname, '..', '..', 'docs', 'Guides', 'Ecosystem.md') +const basePathEcosystemDocFile = path.join('docs', 'Guides', 'Ecosystem.md') +const ecosystemDocFile = path.join(__dirname, '..', '..', basePathEcosystemDocFile) +const failureTypes = { + improperFormat: 'improperFormat', + outOfOrderItem: 'outOfOrderItem' +} module.exports = async function ({ core }) { + const results = await runCheck() + await handleResults({ core }, results) +} + +async function runCheck () { const stream = await fs.createReadStream(ecosystemDocFile) const rl = readline.createInterface({ input: stream, crlfDelay: Infinity - }); + }) + const failures = [] + const successes = [] const moduleNameRegex = /^\- \[\`(.+)\`\]/ - let hasOutOfOrderItem = false let lineNumber = 0 let modules = [] - let hasImproperFormat = false + let grouping = 'core' for await (const line of rl) { lineNumber += 1 if (line.startsWith('#### [Community]')) { + grouping = 'community' modules = [] } if (line.startsWith('#### [Community Tools]')) { + grouping = 'community-tools' modules = [] } @@ -34,37 +47,94 @@ module.exports = async function ({ core }) { } const moduleNameTest = moduleNameRegex.exec(line) - - if (moduleNameTest === null) - { - core.error(`line ${lineNumber}: improper pattern, module name should be enclosed with backticks`) - hasImproperFormat = true + + if (moduleNameTest === null) { + failures.push({ + lineNumber, + grouping, + moduleName: 'unknown', + type: failureTypes.improperFormat + }) continue } const moduleName = moduleNameTest[1] if (modules.length > 0) { if (compare(moduleName, modules.at(-1)) > 0) { - core.error(`line ${lineNumber}: ${moduleName} not listed in alphabetical order`) - hasOutOfOrderItem = true + failures.push({ + lineNumber, + moduleName, + grouping, + type: failureTypes.outOfOrderItem + }) + } else { + successes.push({ moduleName, lineNumber, grouping }) } + } else { + // We have to push the first item found or we are missing items from the list + successes.push({ moduleName, lineNumber, grouping }) } modules.push(moduleName) } - if (hasOutOfOrderItem === true) { - core.setFailed('Some ecosystem modules are not in alphabetical order.') - } + return { failures, successes } +} + +async function handleResults (scriptLibs, results) { + const { core } = scriptLibs + const { failures, successes } = results; + const isError = !!failures.length; + + await core.summary + .addHeading(isError ? `❌ Ecosystem.md Lint (${failures.length} error${failures.length === 1 ? '' : 's' })` : '✅ Ecosystem Lint (no errors found)') + .addTable([ + [ + { data: 'Status', header: true }, + { data: 'Section', header: true }, + { data: 'Module', header: true }, + { data: 'Details', header: true }], + ...failures.map((failure) => [ + '❌', + failure.grouping, + failure.moduleName, + `Line Number: ${failure.lineNumber.toString()} - ${failure.type}` + ]), + ...successes.map((success) => [ + '✅', + success.grouping, + success.moduleName, + '-' + ]) + ]) + .write() + + if (isError) { + failures.forEach((failure) => { + if (failure.type === failureTypes.improperFormat) { + core.error('The module name should be enclosed with backticks', { + title: 'Improper format', + file: basePathEcosystemDocFile, + startLine: failure.lineNumber + }) + } else if (failure.type === failureTypes.outOfOrderItem) { + core.error(`${failure.moduleName} not listed in alphabetical order`, { + title: 'Out of Order', + file: basePathEcosystemDocFile, + startLine: failure.lineNumber + }) + } else { + core.error('Unknown error') + } + }) - if (hasImproperFormat === true) { - core.setFailed('Some ecosystem modules are improperly formatted.') + core.setFailed('Failed when linting Ecosystem.md') } } -function compare(current, previous) { +function compare (current, previous) { return previous.localeCompare( current, 'en', - {sensitivity: 'base'} + { sensitivity: 'base' } ) } diff --git a/.github/workflows/lint-ecosystem-order.yml b/.github/workflows/lint-ecosystem-order.yml index e93e37422b..4fdcdb6ea4 100644 --- a/.github/workflows/lint-ecosystem-order.yml +++ b/.github/workflows/lint-ecosystem-order.yml @@ -1,12 +1,6 @@ name: Lint Ecosystem Order on: - push: - branches-ignore: - - master - - main - paths: - - "**/Ecosystem.md" pull_request: branches: - master @@ -28,7 +22,7 @@ jobs: - name: Lint Doc uses: actions/github-script@v6 with: + github-token: ${{ secrets.GITHUB_TOKEN }} script: | const script = require('./.github/scripts/lint-ecosystem.js') await script({ core }) -