{"id":51243042,"url":"https://github.com/vinicq/falsegreen-js","last_synced_at":"2026-06-29T02:00:50.882Z","repository":{"id":366659597,"uuid":"1277275490","full_name":"vinicq/falsegreen-js","owner":"vinicq","description":"Find JS/TS tests that pass green without protecting anything. Deterministic AST scanner for js/ts/tsx/jsx/mts/cts. Sibling of falsegreen (Python).","archived":false,"fork":false,"pushed_at":"2026-06-22T20:21:37.000Z","size":112,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-22T20:24:52.622Z","etag":null,"topics":["false-positive","javascript","jest","static-analysis","test-smells","testing","typescript","vitest"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vinicq.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-22T18:41:27.000Z","updated_at":"2026-06-22T20:22:19.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/vinicq/falsegreen-js","commit_stats":null,"previous_names":["vinicq/falsegreen-js"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/vinicq/falsegreen-js","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vinicq%2Ffalsegreen-js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vinicq%2Ffalsegreen-js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vinicq%2Ffalsegreen-js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vinicq%2Ffalsegreen-js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vinicq","download_url":"https://codeload.github.com/vinicq/falsegreen-js/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vinicq%2Ffalsegreen-js/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34910177,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-29T02:00:05.398Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["false-positive","javascript","jest","static-analysis","test-smells","testing","typescript","vitest"],"created_at":"2026-06-29T02:00:29.311Z","updated_at":"2026-06-29T02:00:50.866Z","avatar_url":"https://github.com/vinicq.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# falsegreen-js\n\n[![CI](https://github.com/vinicq/falsegreen-js/actions/workflows/ci.yml/badge.svg)](https://github.com/vinicq/falsegreen-js/actions/workflows/ci.yml)\n[![npm](https://img.shields.io/npm/v/falsegreen-js.svg)](https://www.npmjs.com/package/falsegreen-js)\n[![Node](https://img.shields.io/node/v/falsegreen-js.svg)](https://www.npmjs.com/package/falsegreen-js)\n[![Downloads](https://img.shields.io/npm/dm/falsegreen-js.svg)](https://www.npmjs.com/package/falsegreen-js)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)\n[![Docs](https://img.shields.io/badge/docs-online-blue.svg)](https://vinicq.github.io/falsegreen-docs/)\n\nFind JavaScript/TypeScript unit tests that give false positives: green tests that\nprotect nothing, and tests that pass while asserting the wrong thing. Deterministic\nAST scan, no code execution. Sibling of [`falsegreen`](https://github.com/vinicq/falsegreen)\n(the Python scanner); same contract, JS/TS rule set.\n\nCovers `.js`, `.jsx`, `.ts`, `.tsx`, `.mjs`, `.cjs`, `.mts`, `.cts`.\n\n**The falsegreen family** (install the one for your stack):\n\n| Tool | Stack | Install | Package |\n|---|---|---|---|\n| [falsegreen](https://github.com/vinicq/falsegreen) | Python / pytest | `pip install falsegreen` | [PyPI](https://pypi.org/project/falsegreen/) |\n| **falsegreen-js** | JS / TS | `npm i -D falsegreen-js` (`npx falsegreen-js`) | [npm](https://www.npmjs.com/package/falsegreen-js) |\n| [robotframework-falsegreen](https://github.com/vinicq/robotframework-falsegreen) | Robot Framework | `pip install robotframework-falsegreen` | [PyPI](https://pypi.org/project/robotframework-falsegreen/) |\n| [falsegreen-skill](https://github.com/vinicq/falsegreen-skill) | semantic LLM pass | `npx falsegreen-skill analyze \u003cpath\u003e` | [npm](https://www.npmjs.com/package/falsegreen-skill) |\n\n## Why\n\nA test can be green and still protect nothing: an empty body, an assertion that is\nnever reached, `expect(x).toBe(x)`, `expect(value)` with no matcher, a focused\n`it.only` that silently parks the rest of the suite, a `findByText` that is never\nawaited. AI-generated tests produce these in bulk. This tool flags the mechanical\npatterns a parser can prove, before they reach review.\n\n## Install\n\n```bash\nnpm install -D falsegreen-js\n```\n\n## Usage\n\n```bash\nnpx falsegreen-js                 # scan cwd\nnpx falsegreen-js src test        # scan paths\nnpx falsegreen-js --staged        # only test files staged in git (pre-commit)\nnpx falsegreen-js --json          # machine-readable output (alias for --format json)\nnpx falsegreen-js --format sarif  # SARIF 2.1.0 for GitHub code scanning\nnpx falsegreen-js --format junit  # JUnit XML for CI test reporters\nnpx falsegreen-js --output report.json   # write to a file\nnpx falsegreen-js --output .falsegreen/  # write report.\u003cext\u003e into a directory\nnpx falsegreen-js --config-audit  # audit Jest/Vitest config (project-layer PL codes)\nnpx falsegreen-js --disable C7,JS3\nnpx falsegreen-js --enable D8,M2   # re-activate off/opt-in codes at catalog severity\n```\n\nEach finding is reported with its pyramid level (unit / integration / e2e, read from the file's imports) and a one-line fix hint, and the summary breaks the findings down by level and lists the most common fixes. `--output` takes a file or a directory: an extension-less or trailing-slash path (e.g. `.falsegreen/`) receives `report.\u003cext\u003e` for the chosen format. Reports are run artifacts; keep the output directory gitignored.\n\n### Output formats\n\n`--format text|json|sarif|junit` (default `text`; `--json` stays as an alias for `--format json`). These match the [Python sibling](https://github.com/vinicq/falsegreen) byte-for-concept, so a pipeline can swap one scanner for the other.\n\n- **`sarif`**: SARIF 2.1.0. One rule per code present, one result per finding, with `error` for high-severity findings, `warning` for low, and `note` for off. Result tags carry the judgment (J1-J6), the risk group (`risk:effectiveness`...), and the level (`level:high`). Upload it to GitHub code scanning to see findings inline on the PR.\n- **`junit`**: JUnit XML. High-severity findings become `\u003cfailure\u003e`, everything else `\u003cskipped\u003e`, so a CI test reporter surfaces them as a failing suite.\n\n### Baseline (ratchet)\n\nAdopting the scanner on a large codebase without fixing every legacy finding at once:\n\n```bash\nnpx falsegreen-js --write-baseline   # record current findings to .falsegreen-baseline.json, exit 0\nnpx falsegreen-js --baseline         # report and fail only on findings not in the baseline\n```\n\n`--baseline [PATH]` and `--write-baseline [PATH]` default to `.falsegreen-baseline.json`. A finding's identity is a content fingerprint (`sha1` of relative path + code + detail, no line number), so it survives unrelated line shifts in the file. Commit the baseline, then let CI block only on net-new findings. (The fingerprint omits the source snippet the Python scanner folds in, since the js scanner does not carry one; two findings with the same code and detail in one file share an id.)\n\n`--config-audit` is a separate mode: instead of scanning test files, it reads the Jest/Vitest config (`package.json` `jest` field, `jest.config.*`, `vitest.config.*`) and reports the project-layer ways a suite stays green by configuration: `PL10` (`passWithNoTests` passes an empty or filtered-to-nothing run), `PL7` (no `coverageThreshold` / `coverage.thresholds`), `PL8` (`bail` stops the run early). The per-file scan cannot see config.\n\nFor the layer no static scan reaches (does a green test fail when the code is wrong?), run a **mutation tester** like [Stryker](https://stryker-mutator.io/). falsegreen-js is the cheap pre-filter on every commit; mutation testing is the deeper audit.\n\nExit code: `0` clean, `10` low-confidence only, `20` high-confidence present. Wire it\ninto CI or a pre-commit hook and let exit `20` block the commit.\n\nSuppress a single finding inline:\n\n```ts\nexpect(user.id).toBe(user.id); // falsegreen: ignore[C7]\nexpect(x);                     // falsegreen: ignore\n```\n\n## Runner coverage\n\nRunner-agnostic. The assertion and test vocabulary spans Jest, Vitest, Mocha + Chai,\nJasmine, AVA, `node:test`, tap, Cypress, Playwright, Testing Library\n(`@testing-library/*` with `jest-dom` / `jasmine-dom` matchers and `user-event`),\nand Vue Test Utils (`mount`/`wrapper.find`/`flushPromises`/`nextTick`).\n`expect().matcher()`, chai `expect().to`, `assert`, `x.should`, and AVA `t.is` all\ncount as real assertions, so a Mocha or AVA test is not mistaken for one that never\nchecks anything.\n\nNote: component files (`.vue`, `.svelte`, `.astro`, `.marko`) and templates (`.html`)\nare not test files. Tests for those frameworks are written in `.spec`/`.test` files in\nthe eight extensions above, which is what the scanner reads.\n\n## Test levels (the pyramid)\n\nfalsegreen-js scans tests at every level of the pyramid. Discovery is level-agnostic - it\nreads any test file - but a few codes are read in light of the level, so a valid pattern at\none level is not flagged at another.\n\n- **Unit:** a function or component with its boundaries doubled. The oracle is `expect`.\n- **Integration (API and database):** API tests through supertest / chai-http\n  (`request(app).get(\"/\").expect(200)`, recognized as an assertion) or `fetch`, and database\n  tests through Prisma / TypeORM / Knex against a real datastore. These cross the I/O\n  boundary on purpose, so the response or row IS the verification at that level.\n- **E2E:** Cypress (`.cy.*`) and Playwright (`.e2e.*`). `cy.get().should(...)` and\n  `expect(page).toHaveURL(...)` are the oracle; a visible element is a real check here, not a\n  weak one.\n\nA real API or database call inside a test that claims to be a unit test is itself the smell\n(mystery guest, environment coupling), not the level of the test. C23 flags the hard-coded\nfile path or URL form.\n\n## Case catalog\n\nCodes shared with `falsegreen` (Python) keep the same id, so cross-language results\nline up in the research. `JS*` codes are ecosystem-specific.\n\n| Code | Confidence | What it flags |\n|---|---|---|\n| C2  | high | test with no check at all (empty body) |\n| C2b | low  | test calls code but asserts nothing |\n| C5  | high | always-true check (`expect(true).toBe(true)`, `assert(1)`) |\n| C6  | low  | weak check — only verifies something came back (`toBeTruthy`/`toBeDefined`, `length \u003e 0`) |\n| C7  | high | compares a thing to itself (`expect(x).toBe(x)`) |\n| C44 | high | numeric tautology — a length compared so the result is always true (`x.length \u003e= 0`) |\n| C20 | high | assertion in unreachable code (after a `return`/`throw`/`process.exit`, a `break`, a both-arms-terminating `if`, or an exhaustive `switch`) — it never runs |\n| C23 | low  | reads a real file at a literal path, or a hard-coded URL (mystery guest) |\n| C8  | low  | exact equality on a float (use `toBeCloseTo`) |\n| C9  | low  | `toThrow()` with no error type or message — accepts any error |\n| C16 | low  | result depends on `Date.now`, `Math.random`, or a fixed timer |\n| C18 | low  | compares `String(x)` / `JSON.stringify(x)` / `` `${x}` `` to a literal (formatting, not value) |\n| C21 | low  | every assertion is conditional — none runs unconditionally |\n| C37 | low  | duplicate case in `it.each`/`test.each` — the same scenario runs twice |\n| C48 | low  | dark patch — the test flips a test-mode flag (`process.env.NODE_ENV = \"test\"`, `process.env.TESTING`, a `TESTING` flag) then asserts, exercising the product's test-only branch |\n| CC  | low  | commented-out assertion |\n| JS1 | high | focused test (`it.only` / `fit`) silently skips the rest of the suite |\n| JS2 | high | `expect(x)` with no matcher — the assertion never runs |\n| JS3 | low  | snapshot is the only assertion |\n| JS4 | low  | skipped test (`it.skip` / `xit` / `it.todo`) never runs |\n| JS5 | low  | async query/event not awaited (`findBy*` / `waitFor` / `user-event`) |\n| JS6 | high | empty `describe`/`suite` — the suite is green but runs nothing |\n| JS7 | low  | assertion inside a non-awaited `setTimeout`/`then` callback — may run after the test ends |\n| JS8 | low  | mocks the unit under test (`jest.mock`/`vi.mock` of an imported module asserted directly) |\n| JS9 | high | assertion in a dead branch (`if(false)` / `if(true){}else`) — never runs |\n| JS11 | low | `try/catch` swallows the assertion — a failing `expect` is caught, test stays green |\n| JS13 | low | query (`getBy*`/`queryBy*`) as a loose statement — its result is never asserted |\n| JS15 | low | inappropriate assertion — comparison wrapped in a boolean (`expect(a===b).toBe(true)`), blind failure message |\n| JS17 | low | commented-out test block (`// it(...)` / `// test(...)`) — disabled, no longer runs |\n| JS18 | low | test takes a `done` callback instead of async/await — a mistimed `done` passes early |\n| JS21 | high | matcher referenced but never called (`expect(x).toBe` with no `()`) — the assertion never runs |\n| JS22 | high | empty `it.each`/`test.each` table — generated with zero cases, never runs |\n| JS23 | high | `expect.assertions(N)` with fewer unconditional `expect()` calls than N — the guard can never be met |\n| JS24 | low  | Cypress query (`cy.get`/`cy.find`/`cy.contains`) as a loose statement with no terminating `.should`/`.and` and no `expect` in `.then` — its result is never asserted |\n\nEach code carries a judgment tag (J1-J6) shared with the\n[falsegreen-skill](https://github.com/vinicq/falsegreen-skill) semantic framework.\n\n### Opt-in: maintainability group (default off)\n\nThese are **not** false-green - the test still protects something - so they are off by\ndefault. Enable them with `--diagnostics`, or per code via config `severity`. They are a\n\"plus\" for test-code health, mirroring falsegreen's diagnostic/coupling groups.\n\n| Code | Group | What it flags |\n|---|---|---|\n| D1 | diagnostic | assertion roulette — many assertions in one test |\n| D3 | diagnostic | duplicate assert — the same assertion repeated |\n| D4 | diagnostic | `it.each`/`test.each` without titled cases (index-only) |\n| D6 | diagnostic | `console.*` in a test body |\n| D7 | diagnostic | anonymous test — empty or missing description |\n| D8 | diagnostic | magic number — a bare numeric literal as the expected value |\n| M2 | coupling | test body exceeds the line-count threshold |\n\n```bash\nnpx falsegreen-js --diagnostics      # include D*/M* as warnings\n```\n\n### Deliberately not implemented\n\nSome catalog codes were reviewed and left out, on purpose:\n\n- **JS19** (`toBe` on an object/array literal): `expect(x).toBe({...})` compares by reference,\n  so it always fails. That is the false-red axis (a test that always fails), the opposite of\n  what this scanner looks for, and out of scope on principle.\n- **JS20** (a Promise compared without `resolves`/`rejects`): telling that a value is a\n  Promise needs type information the AST does not carry, so it would be too noisy.\n- **JS12** (a floating promise whose `expect` is never returned): already covered by JS7.\n- **JS16** (`async` test with no `expect.assertions(n)`): the *absence* of a guard is not a\n  smell on its own; flagging it would fire on most async tests. The implemented sibling is\n  `JS23`, which fires on a present-but-unsatisfiable guard: `expect.assertions(N)` with a\n  numeric `N` higher than the unconditional `expect()` calls that can run, so the count can\n  never be met.\n- **JS14** (a giant inline snapshot): a readability and review-noise concern, not a\n  false-green one. The snapshot still protects, so it belongs to the diagnostic group and is\n  better served by `eslint-plugin-jest` (`no-large-snapshots`) as an opt-in lint rule.\n- **JS10** (any conditional in a test body): handled by `eslint-plugin-jest`\n  (`no-conditional-in-test`); JS9 and C21 already cover the false-green subset.\n- **C1** (an assertion under an `if`/`for` that may not run): redundant once C21 and JS9\n  exist, and high-FP on its own. C21 already fires the actual false-green case, where\n  *every* assertion is conditional and the test can pass with nothing checked. A test that\n  mixes a conditional assertion with an unconditional one is not false-green: the\n  unconditional assertion still protects. JS9 covers the dead-branch form (`if(false)`).\n  Flagging every conditional assertion (C1's full scope) is the linter concern JS10 already\n  names (`no-conditional-in-test`), so C1 would add noise without a new false-green signal.\n\n### What carries over from falsegreen, what does not\n\nPorted (same concept): C2, C2b, C5, C7, C8, C16, C44, C48, CC.\n\nPython-only, not applicable to JS/TS: pytest collection rules (C4 family), `pytest.raises`\nbreadth (C9/C19/C27/C28), fixtures and `os.environ`/global-state codes (C23/C24/C29),\nsklearn/torch/tensorflow metric and seed codes (C33, parts of C16), xfail (C25), and the\nxunit/`self.assert*` codes. These have no JS equivalent or need a different signal.\n\nJS/TS-only (new here): JS1-JS5 above. The `describe.only`/skip, snapshot, no-matcher,\nand not-awaited patterns are specific to the JS test runners and Testing Library.\n\n## Configuration\n\nOptional. `falsegreen.json`, `.falsegreenrc.json`, or a `\"falsegreen\"` key in\n`package.json`:\n\n```json\n{\n  \"disable\": [\"C8\"],\n  \"exclude\": [\"**/legacy/**\"],\n  \"severity\": { \"JS3\": \"off\", \"C16\": \"high\" }\n}\n```\n\nPrecedence: CLI `--disable` \u003e CLI `--enable` \u003e config `disable`/`severity` \u003e catalog default. `--enable \u003ccodes\u003e` re-activates listed off or opt-in codes at their catalog severity (it flips a default-off code on; it cannot raise a code above catalog). A code passed to both `--enable` and `--disable` stays off — `--disable` wins.\n\n## Scope and honesty\n\nThis is a static scanner. It owns what the structure proves. Two things it does not\ndecide: whether the expected value contradicts the intended behavior, and whether the\ntest re-implements the production logic. Those are semantic and belong to the\n`falsegreen-skill` LLM pass. Precision over recall: a softened heuristic that misses a\ncase is preferred to one that flags correct code.\n\nMeasured against the [Open Catalog of Test Smells](https://test-smell-catalog.readthedocs.io/) (517 documented smells), only the false-green slice is in scope. What stays out, on purpose: **brittleness / false-red** (sensitive equality, brittle assertions - the opposite axis), **hygiene / maintainability** (assertion roulette, magic numbers, long tests - linter territory, a few surfaced as opt-in diagnostics), and **slow, design, naming, duplication, runtime/culture** (none about whether the test protects). The boundary is deliberate: where a smell has a statically provable false-green form, that form is a code here - uncontrolled `Date.now`/`Math.random` is `C16`, a hard-coded path or URL is `C23`, an assertion that may never run is `C21`/`C20`, and JS-specific forms (focused tests, missing matchers) are the `JS*` codes. See [CREDITS.md](CREDITS.md) for the full cross-walk.\n\n## References\n\nThe catalog is grounded in the test-smell literature. Direct influences: the\nrotten-green-test work that names this whole family (Delplanque et al., ICSE 2019),\nthe founding test-smell refactoring catalog (van Deursen et al., XP 2001), the\nJS/TS empirical studies (Jorge, UFCG 2023; Silva, PUC Minas 2022 - the academic\nprecedent for the focused-test and snapshot codes; Oliveira et al., SBES 2024/2025),\nand the detection-tool baselines (tsDetect, Peruma et al., 2020). Full list and the\ncode-to-source mapping in [CREDITS.md](CREDITS.md).\n\n## Status\n\nThe rule set is a deterministic core; the full JS/TS smell catalog is tracked as\nresearch in the private audit hub. See [STATUS.md](STATUS.md) for the current version\nand rule coverage. Issues and PRs welcome.\n\n## License\n\nMIT, Vinicius Queiroz.\n\n## Contributors ✨\n\nThanks to the people who keep false-green tests out of real suites ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --\u003e\n[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors-)\n\u003c!-- ALL-CONTRIBUTORS-BADGE:END --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://vinicq.github.io/md-bridge/\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/78210890?v=4?s=100\" width=\"100px;\" alt=\"Vinicius Queiroz\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eVinicius Queiroz\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/vinicq/falsegreen-js/commits?author=vinicq\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/vinicq/falsegreen-js/commits?author=vinicq\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"#ideas-vinicq\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"#maintenance-vinicq\" title=\"Maintenance\"\u003e🚧\u003c/a\u003e \u003ca href=\"#infra-vinicq\" title=\"Infrastructure (Hosting, Build-Tools, etc)\"\u003e🚇\u003c/a\u003e \u003ca href=\"https://github.com/vinicq/falsegreen-js/commits?author=vinicq\" title=\"Tests\"\u003e⚠️\u003c/a\u003e \u003ca href=\"#research-vinicq\" title=\"Research\"\u003e🔬\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/homesellerq-coder\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/294912019?v=4?s=100\" width=\"100px;\" alt=\"Home Seller\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eHome Seller\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/vinicq/falsegreen-js/commits?author=homesellerq-coder\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/vinicq/falsegreen-js/commits?author=homesellerq-coder\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"https://github.com/vinicq/falsegreen-js/commits?author=homesellerq-coder\" title=\"Tests\"\u003e⚠️\u003c/a\u003e \u003ca href=\"#infra-homesellerq-coder\" title=\"Infrastructure (Hosting, Build-Tools, etc)\"\u003e🚇\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nNew contributors are added automatically; the table also recognizes non-code work (docs, ideas, infrastructure, tests, research) via the [all-contributors](https://allcontributors.org) spec.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvinicq%2Ffalsegreen-js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvinicq%2Ffalsegreen-js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvinicq%2Ffalsegreen-js/lists"}