Ecosystem ci#24
Draft
johanrd wants to merge 109 commits into
Draft
Conversation
Pinned-snapshot validation against 10 public Ember repos (super-rentals, ember-website, ember-power-select, ember-modifier, ember-simple-auth, aria-voyager, ember-a11y-testing, hashicorp/design-system, ember-primitives, NullVoxPopuli/limber). Each target lives in `ecosystem/targets.json` with a pinned SHA, glob, and per-target Glint flag. The runner clones, installs deps (best-effort, lockfile-driven), validates with the same `:gts-recommended` config that `validate-gts` uses, and diffs against committed baselines. A non-empty diff fails the workflow. `ecosystem/run.ts` is single-file, runs via `tsx`, no heavy deps. Glint extraction is gated by `glint` flag per target (default true) and falls back to no-Glint when install fails so the run continues. Per-target triage docs live under `ecosystem/triage/`: - `<name>/triage.md` — every finding classified - `<name>/issue.md` — draft to file upstream when warranted - `FP-FIX-REPORT.md` — aggregate FPs across targets - `STYLISTIC-FINDINGS.md` — input for default-policy review super-rentals triaged. 11 TP, 2 FP-plugin (img splat → required-attr missing), 0 FP-rule. The 2 FPs are the first entry in FP-FIX-REPORT. `vitest.config.ts` scopes test discovery to `test/**` so cloned repos' test files don't get picked up. `tsconfig.test.json` typechecks `ecosystem/**`.
ember-modifier has a single trivial template (`{{outlet}}`) — no
findings; kept as a smoke target.
ember-simple-auth surfaces 6 real findings in the demo test-app, all
a11y-related: 3× anchor-as-button (`<a role='button' href='#'>`
pattern), 1× missing autocomplete on password input, 1× form without
submit, 1× implicit button type. No FPs.
The demo app contains deliberate a11y fixtures (`violations.gts`,
`ignored-image-alt.gts`); html-validate's reports on those are correct
but by-design — marked TP-intentional, no upstream issue.
The 4 element-permitted-content findings are all one root cause:
`ViolationsGridItem` is a TOC declared via
`<template>...</template> satisfies TOC<{ Element: HTMLLIElement }>`
which our Glint resolver doesn't recognize (works for `class extends
Component<Sig>` but not the TOC `satisfies` form). Without resolution,
the children float to <ul> instead of being correctly seen as inside
<li>.
New entry in FP-FIX-REPORT for the TOC-Element-resolution gap.
13 findings on 58 files.
Real bugs (3): non-semantic heading `<div role="heading">` should be
`<h*>`; non-semantic `<div role="progressbar">` should be `<progress>`;
`readonly` on `<input type="radio">` is invalid (use `disabled`).
Stylistic (5): inline styles in docs landing, region-as-div in
accordion content. Tracked in STYLISTIC-FINDINGS for default-policy
review.
Strictness (1): `<style>` inside `<fieldset>` for SR-only CSS;
debatable per spec.
FP-plugin (4): wcag/h32 on `<form ...attributes>{{yield}}</form>` and
wcag/h71 on `<fieldset ...attributes>{{yield ...}}</fieldset>`. The
plugin blanks the yield and html-validate sees empty body. At runtime
the consumer provides the required submit-button / legend. New entry
in FP-FIX-REPORT — same shape as multipass yield-only-branch but for
non-multipass templates.
All 13 findings are prefer-native-element on `<div role="listbox">` patterns in rendering tests. The addon's whole purpose is providing listbox/menu/tablist keyboard+ARIA behavior on non-native elements; replacing with <select> would defeat the tests. No issue to file, no plugin fix. Triage doc notes this is an applicability question (not FP, not stylistic-default) — addons that enhance ARIA-pattern widgets should disable prefer-native-element in their tests. Worth a "recommended overrides per project type" section in the plugin README.
34 findings on 114 files. Three real-bug clusters: - 12× <div role="button"> tabs in code-example.gts (anchor/div-as- button anti-pattern, or arguably should be role="tab" since they're inside <nav class="code-example-tabs">). - 14× misnested <p> containing <ul>/<dl> (7 implicit-close + 7 stray-</p> pairs, same root cause). - 1× <br> inside <ol> for visual spacing (should be CSS). 6× no-inline-style in demo placeholders — tracked stylistic. 1× FP-plugin-suspect: html-validate reports <div> not permitted under <abbr> at power-select.gts:1443 but the file has no literal <abbr>. A component's Signature['Element'] = HTMLElement (the generic) is likely being resolved by our plugin to "abbr" via a fallthrough in the element-class → tag mapping. Added to FP-FIX-REPORT for scoped investigation.
39 findings on 67 files. No new FP-plugin patterns — all real bugs or stylistic. Real bugs (28): - 20× misnested <p> containing <ul>/<dl> (10 blocks, two findings each — same root cause as ember-power-select's docs). - 2× aria-label on <span> with no role (silently ignored by ATs). - 2× unlabeled <footer> landmarks in same component (unique-landmark). - 2× <input> missing type, 1× <button> missing type, 1× wcag/h32 form without submit. Stylistic (10): no-inline-style across repl/components and templates. no-inline-style is now 20 across 3 targets — strong default-off candidate per STYLISTIC-FINDINGS. Strictness (1): <style> inside <label> in apps/tutorial selection.gts. Same shape as ember-primitives <style>-in-<fieldset>; defensible in practice (component-scoped CSS).
279 findings on 73 files; the largest target after HDS. Stylistic cluster (163) dominated by 153× void-style — the site's .hbs templates use omitted void-element form (<br>) over self-closing (<br />). Plugin's :gts-recommended forces selfclosing. After this target void-style is the largest stylistic cluster across all ecosystem targets — strong default-off candidate. Real bugs (17): <image> typo for <img>, 6× form-dup-name on commission form, 4× obsolete IE conditional comments, 2× deprecated attrs (frameborder, align), 1× misnested <p> with <ul>, 1× aria-labelledby on element that doesn't accept it, 1× <pre> in <code>, 1× ad-hoc inline style. FP-plugin (98): classic Ember addon component <EsCard> from ember-styleguide renders <li> but our plugin can't resolve the root tag without JS-side type info — its template is .hbs (no Signature, no `satisfies TOC`). Transparent-blanking floats children to the parent <ul> and element-permitted-content fires. New entry in FP-FIX-REPORT for the classic-addon-template-resolution gap. Substantial extension of existing splatted-root resolution to walk .hbs files.
303 findings on 859 files. Per-finding triage at this scale is infeasible; classified by-rule + by-pattern. By far the largest cluster is plugin-side limitations (~70%): - 107× <option> under <div> — yielded curried sub-components like `<HdsFormSelectBase as |C|><C.Options>...</C.Options>` lose Glint resolution. New entry in FP-FIX-REPORT for yielded-curried-component resolution. - 39× <iframe> missing title — `<ShwFrame @Label={{...}}>` provides title via arg-binding; plugin's splatted-root extractor only handles literal values. New entry for arg-bound-attribute resolution. - 25× <div> under <ul> — same EsCard-class addon-list-item pattern as ember-website (now bumped on existing entry). - 8× <div> under <abbr> + cascading abbr-flagged children — bumps the ember-power-select abbr-mystery entry significantly. - 10× wcag/h32 + wcag/h71 on yield-only HdsForm/HdsFormFieldset (bumps the ember-primitives form/fieldset entry). Real bugs (~52): 14× <div> in <button>, 5× <input> in <a>, 2× nested <a>, 28× prefer-native-element, 6× implicit button-type, 8× aria-label misuse warnings, plus misc. Notable defensive pattern: 15× role="list" on <ul> — html-validate flags as redundant but it's a deliberate Safari/VoiceOver fallback for when list-style:none strips the implicit list role. Marked TP-rule- context (correct per spec, intentional in practice). issue.md is selective — filing 303 on HDS is unrealistic; surfaces the ~10 highest-value real findings.
# Conflicts: # lib/glint.ts
# Conflicts: # lib/glint.ts # test/glint.test.ts
…ixes # Conflicts: # test/glint.test.ts
…tl, vertical-collection, ember-resources, cardstack-ui-components, discourse)
Merged combined-fp-fixes into ecosystem-ci, reseeded all 17 baselines against the latest plugin so the diff isolates the FP-fix impact. Existing 10 targets: super-rentals -1 element-required-attributes (img splat FP, PR #13) ember-primitives -2 wcag/h32 (yield-only form FP, PR #17) hds-design-system -2 wcag/h71 (yield-only fieldset FP, PR #17) +1 prefer-native-element (newly visible after other fixes resolve a previously-blanked region) others (7) unchanged 7 new targets seeded (file count / finding count): ember-concurrency 56 / 32 (element-permitted, no-inline-style) warp-drive 8 / 0 ember-intl 79 / 0 vertical-collection 14 / 10 (no-implicit-button-type) ember-resources 3 / 0 cardstack-ui-components 31 / 21 (void-style, no-implicit-button-type) discourse 1309 / 495 (Glint disabled — too heavy to install; mostly TPs in legacy .hbs) Baselines reflect current findings; CI guards against future regressions.
Re-baseline after the comma-vs-space fix in transform.ts. The HDS
`form/index.gts:81` wcag/h32 was the canonical multipass case that
exposed the bug — both arms of `{{#if (eq this.tag "form")}}` carry
yield, so multipass injects a directive carrying both
`no-unused-disable` and `wcag/h32`. With space-separated rules only
the first was disabled and h32 leaked through; comma-separated now
suppresses both correctly.
No other baselines moved.
Goal: ":recommended" should give "pure value" — content-model bugs,
a11y issues, missing required attributes — not pedantic style
preferences. Trim the html-validate-recommended noise that fires on
legitimate Ember/Glimmer patterns:
- `no-inline-style: off` — bans `style=` attribute. Breaks legitimate
runtime style-binding (`<div style={{this.computedStyle}}>`). Use a
separate stylelint pipeline for inline-style policy if needed.
- `void-style: off` — html-validate defaults to omit, Ember/Glimmer
convention is selfclosing, mixing is harmless. Previously the
`:gts-recommended` preset overrode to `selfclosing`, which fought
projects using the omit form. Now disabled entirely; teams enforce
via `ember-template-lint` if they want that policy.
- `prefer-native-element: warn` — kept on but demoted from error.
Real a11y signal (`<div role="button">` should usually be
`<button>`), but design systems intentionally wrap generic elements
with role+keyboard handling. Surfaced as a warning so it doesn't
fail builds; teams can promote back to error per-project.
`:recommended` and `:gts-recommended` now resolve to identical rule
sets. The alias stays for backwards compatibility — existing
consumers' `extends` keep working.
151/151 pass.
Removed 329 baseline entries across 11 targets (0 new findings) by
disabling stylistic rules from html-validate's recommended preset that
fire on legitimate Ember/Glimmer code without catching real bugs:
void-style -170 (disabled — Ember mixes both styles)
no-inline-style -87 (disabled — runtime style-binding pattern)
prefer-native-element -72 (demoted to warn — surfaces in lint
output, doesn't fail builds, design
systems can intentionally wrap divs)
The 5 already-removed FPs from the plugin fix-branches (super-rentals
img splat, ember-primitives 2x wcag/h32, hds 2x wcag/h71) plus the
hds form/index.gts:81 wcag/h32 cleared by the directive comma fix
all stayed cleared.
The runner previously skipped any file where `report.valid === true`,
which silently dropped warning-only files from the baseline — every
`prefer-native-element` warning on an otherwise-clean file was
invisible to CI, and the next run that introduced a warning to such
a file wouldn't show in the diff.
Changes:
- `Finding` interface gains a `severity: 'error' | 'warning'` field
derived from html-validate's numeric `m.severity` (1=warn, 2=error).
- Drop the `if (report.valid) continue;` early-out so warning-only
files reach the recording loop.
- `findingKey` and the sort comparator include severity, so a finding
whose severity flips between runs counts as a real diff.
- Per-target stderr summary now reads
`findings: N (errors: X, warnings: Y)`.
- `summarizeFindings` prefixes each line with `[severity]`.
All 17 baselines re-seeded. Net delta vs the previous baselines:
aria-voyager +13 warnings (previously fully skipped:
0 errors → report.valid → file dropped)
cardstack-ui-components +1
discourse +33 (49 warnings now; 16 were on
mixed-error files and already recorded)
ember-concurrency +1
ember-power-select +12 (warnings on previously-clean files)
ember-primitives +3
ember-simple-auth +3
hds-design-system +10 (29 warnings now; 19 previously on
mixed-error files)
No error-severity findings changed (the rule trim already settled
those). Warnings-only files now visible to baseline diffs.
…ber-intl, warp-drive)
These four were noise-only against the trimmed ruleset:
aria-voyager 13 warnings, all `<div role="listbox">` patterns
— intentional ARIA wrappers, not bugs
ember-resources 0 errors, 0 warnings
ember-intl 0 errors, 0 warnings
warp-drive 0 errors, 0 warnings
Three were always-clean (no signal to guard against), one is
intentionally-different (signal we'd never want to fix). Removing
them shrinks the per-PR CI runtime, focuses the baseline diff on
targets where regressions actually matter, and removes the
"baseline at zero forever" noise from PR review.
Down from 17 → 13 targets.
…hbs' into ecosystem-ci
…hbs' into ecosystem-ci
…hbs' into ecosystem-ci
…hbs' into ecosystem-ci
…hbs' into ecosystem-ci
…hbs' into ecosystem-ci
…hbs' into ecosystem-ci
…hbs' into ecosystem-ci
…hbs' into ecosystem-ci # Conflicts: # lib/cache.ts
…hbs' into ecosystem-ci
…hbs' into ecosystem-ci
…hbs' into ecosystem-ci
…hbs' into ecosystem-ci # Conflicts: # .gitignore
HDS (258 → 248):
Cleared:
- 8 element-permitted-content '<div> under <h1>' on flex/sub-sections/
display.gts — old Glint-TS-side union pick of HTMLHeadingElement
for <HdsTextBody @tag="p"> superseded by polymorphic-chain trace.
- 4 element-permitted-content '<div> under <h1>' on form/layout/
sub-sections/containers.gts (same root cause via <FORM.HeaderTitle>).
- 5 element-permitted-content '<div> under <h1>' on rich-tooltip/
sub-sections/options.gts + states.gts (same).
- 4 element-permitted-content '<h1> under <span>' on radio-card/
sub-sections/base-control.gts (same union-pick FP, different shape).
- 6 element-permitted-content '<div> under <span>'/'<button>' on
HDS source (tag/index.gts, advanced-table/th-selectable.gts) and
advanced-table/sub-sections/base-elements.gts — cleared by yield-
ancestor preference now correctly tracking the inner wrapper.
- 2 aria-label-misuse 'aria-labelledby cannot be used' on flyout/
modal — canonical resolver now reaches the <dialog> outer.
- 8 aria-label-misuse 'aria-label not recommended on this element' on
breadcrumb/page-header/stepper-list/focus-ring consumers — cleared
by the yield-ancestor + aria-* strip (lands on the actual splat
target at runtime).
- 4 wcag/h32 '<form> must have a submit button' on form/layout/
within-containers.gts — chain resolution surfaced submit buttons.
- 8 element-permitted-content position-shifts (added/removed pairs
where the substituted output's line numbers shifted by a column).
- 1 attribute-misuse 'target requires href' — chain href injection.
Newly surfaced (real HTML5 violations in HDS showcase code, not FPs):
- 4 containers.gts no-implicit-close/close-order on <p> from
HdsFormHeaderDescription (@tag='p') containing <ShwPlaceholder>
(<div>) — <p> can't contain block content.
- 6 radio-card element-permitted-content '<div> under <span>' —
HdsFormRadioCard yields inside <span class="content"> at runtime
and consumers put <R.Badge> (<div>) there.
- 2 super-select no-implicit-close/close-order on <li> —
HdsFormSuperSelectOptionGroup renders <li role="group"> with
sibling <li> children inside (no <ul> between).
- 8 page-header unique-landmark — showcase has 3+ <HdsPageHeader>
(= <header>) on one page without distinct aria-labels.
- several rich-tooltip/focus-ring no-implicit-close on <p>.
limber (28 → 34):
Newly surfaced (real HTML5 violations in docs/embedding.gts):
- 6 no-implicit-close/close-order on <p> containing <ul>/<div>.
Also: bring back HVE_FULL_DIFF=1 env var on summarizeFindings to
print the complete added/removed lists without truncation (used
during this triage to enumerate every cluster).
…hbs' into ecosystem-ci
…hbs' into ecosystem-ci
…dotted resolution Same findings (8 prefer-tbody + 1 prefer-native-element), just at slightly earlier line positions. The previous baseline pre-dated the fix that lets buildConsumerInfo + walkMapping process dotted invocations through lowercase-headed block-params (`<dd.Interactive>` in HDS dropdown showcases — `<HdsDropdown as |dd|><dd.Interactive>`). Resolving those now substitutes them in the blanked output, which shifts downstream substitution offsets and reports the same TPs at new line numbers. No findings added or removed in substance; net change is 0 findings. The 8 +/- diff is purely positional.
…hbs' into ecosystem-ci
On a first run, the Glint summary reported Glint: 311 analyzed, 3 from cache even though the cache was empty for every file — those 3 were `.gts` files with no `<template>` block (rewriteEmpty). We write a tombstone for them AFTER the run so they show up as literal cache hits on the NEXT run, but at summary-print time none of them are actually cached. Tighten the message to report only real disk-cache hits in the "from cache" number. When some `.gts` files had no template, surface the count in a parenthetical instead of folding it into "from cache". Read / rewrite errors continue to surface via HVE_DEBUG=1 only. before: Glint: 311 analyzed, 3 from cache after: Glint: 311 analyzed, 0 from cache (3 .gts files had no <template>)
Contributor
There was a problem hiding this comment.
Pull request overview
This PR introduces an “ecosystem CI” harness to run html-validate-ember against pinned snapshots of real Ember repositories, diff results against committed baselines, and fail CI on unexpected output changes. It also adjusts the plugin presets to reduce stylistic noise (e.g. disables void-style and turns prefer-native-element into a warning), and adds supporting docs/triage notes.
Changes:
- Add an ecosystem runner (
ecosystem/run.ts) + targets list (ecosystem/targets.json) + committed baselines, plus a GitHub Actions workflow to execute it. - Add a Vitest config to avoid accidentally executing tests inside
ecosystem/.cacheclones. - Update preset rule defaults to reduce stylistic false-noise; add documentation and triage artifacts.
Reviewed changes
Copilot reviewed 41 out of 43 changed files in this pull request and generated 13 comments.
Show a summary per file
| File | Description |
|---|---|
| vitest.config.ts | Restricts Vitest’s test glob to repo tests (avoids running tests from cached third-party clones). |
| tsconfig.test.json | Includes ecosystem/**/*.ts in test typechecking; excludes ecosystem/.cache. |
| test/cache.test.ts | Adds an additional cache staleness test around pluginSourceSha. |
| README.md | Adds a section describing where this plugin fits among Ember linting/formatting tools. |
| package.json | Adds ecosystem:check / ecosystem:update scripts. |
| index.ts | Adjusts presets to disable or soften noisy stylistic rules; keeps gts-recommended as an alias. |
| ecosystem/triage/super-rentals/triage.md | Captures triage notes/findings for the super-rentals target. |
| ecosystem/triage/super-rentals/issue.md | Draft upstream issue text for super-rentals findings. |
| ecosystem/triage/STYLISTIC-FINDINGS.md | Tracks stylistic-rule finding counts to inform default policy. |
| ecosystem/triage/limber/triage.md | Captures triage notes/findings for the limber target. |
| ecosystem/triage/limber/issue.md | Draft upstream issue text for limber findings. |
| ecosystem/triage/hds-design-system/triage.md | Captures triage notes/findings for the HDS target. |
| ecosystem/triage/hds-design-system/issue.md | Draft upstream issue text for HDS findings. |
| ecosystem/triage/FP-FIX-REPORT.md | Aggregates plugin-side FP patterns discovered during ecosystem runs. |
| ecosystem/triage/ember-website/triage.md | Captures triage notes/findings for the ember-website target. |
| ecosystem/triage/ember-website/issue.md | Draft upstream issue text for ember-website findings. |
| ecosystem/triage/ember-simple-auth/triage.md | Captures triage notes/findings for ember-simple-auth target. |
| ecosystem/triage/ember-simple-auth/issue.md | Draft upstream issue text for ember-simple-auth findings. |
| ecosystem/triage/ember-primitives/triage.md | Captures triage notes/findings for ember-primitives target. |
| ecosystem/triage/ember-primitives/issue.md | Draft upstream issue text for ember-primitives findings. |
| ecosystem/triage/ember-power-select/triage.md | Captures triage notes/findings for ember-power-select target. |
| ecosystem/triage/ember-power-select/issue.md | Draft upstream issue text for ember-power-select findings. |
| ecosystem/triage/ember-modifier/triage.md | Captures triage notes/findings for ember-modifier target. |
| ecosystem/triage/ember-a11y-testing/triage.md | Captures triage notes/findings for ember-a11y-testing target. |
| ecosystem/triage/aria-voyager/triage.md | Captures triage notes/findings for aria-voyager target. |
| ecosystem/targets.json | Defines pinned target repos + SHAs + include/exclude globs (+ Glint toggles). |
| ecosystem/run.ts | Implements cloning, dependency install, validation, diffing, and baseline updates. |
| ecosystem/README.md | Documents ecosystem CI workflow and local usage. |
| ecosystem/baselines/vertical-collection.json | Adds a pinned baseline snapshot for the vertical-collection target. |
| ecosystem/baselines/super-rentals.json | Adds a pinned baseline snapshot for the super-rentals target. |
| ecosystem/baselines/limber.json | Adds a pinned baseline snapshot for the limber target. |
| ecosystem/baselines/hds-design-system.json | Adds a pinned baseline snapshot for the HDS target. |
| ecosystem/baselines/ember-website.json | Adds a pinned baseline snapshot for the ember-website target. |
| ecosystem/baselines/ember-simple-auth.json | Adds a pinned baseline snapshot for the ember-simple-auth target. |
| ecosystem/baselines/ember-primitives.json | Adds a pinned baseline snapshot for the ember-primitives target. |
| ecosystem/baselines/ember-power-select.json | Adds a pinned baseline snapshot for the ember-power-select target. |
| ecosystem/baselines/ember-modifier.json | Adds a pinned baseline snapshot for the ember-modifier target. |
| ecosystem/baselines/ember-concurrency.json | Adds a pinned baseline snapshot for the ember-concurrency target. |
| ecosystem/baselines/cardstack-ui-components.json | Adds a pinned baseline snapshot for the cardstack-ui-components target. |
| ECOSYSTEM-OVERLAP.md | Documents overlap between eslint-plugin-ember template rules and html-validate/html-eslint. |
| .gitignore | Ignores ecosystem/.cache/. |
| .github/workflows/ecosystem.yml | Adds a dedicated workflow to run ecosystem checks on PRs. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
- ecosystem.yml: switch to pnpm to fix failing CI (setup-node was looking for package-lock.json that doesn't exist); also swap the paths filter from package-lock.json to pnpm-lock.yaml - ecosystem/run.ts: fix three stale comments (the void-style note in makeValidator, the "Glint intentionally not enabled" paragraph, and the false "fall back to plain yarn install" claim) - test/cache.test.ts: drop the duplicate pluginSourceSha-mismatch test - ECOSYSTEM-OVERLAP.md: replace local /Users/... paths with upstream repo URLs; reflect that gts-recommended now leaves void-style off - README.md: rewrite the preset descriptions to match index.ts (void-style off, prefer-native-element warn; gts-recommended is now a backwards-compat alias of recommended) - ecosystem/triage/*.md: mark the void-style triage docs as historical
Comment on lines
+163
to
+167
| execFileSync(cmd, args, { | ||
| cwd: repoDir, | ||
| stdio: 'inherit', | ||
| timeout: 5 * 60 * 1000, | ||
| }); |
- tsconfig.json: exclude vitest.config.ts from the build (it was being compiled into dist/ and would ship via files=["dist/"]) - ecosystem.yml: drop the redundant explicit pnpm-store cache step; setup-node's cache: pnpm already handles it, and the hard-coded ~/.pnpm-store path didn't match the runner's actual store - ecosystem/run.ts: refuse to baseline transformer crashes — a __transformer-crash__ finding now skips writeBaseline for that target and forces a non-zero exit at end of run. The existing comment claimed this behavior; this commit makes it true. Surfaced as NOT SURE (see not-sure.md): hard-coded 5-min install timeout. No evidence of flake yet; deferred.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.