Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion analysis/file-types.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,6 @@ Fallow analyzes more than `.js` and `.ts` files. It extracts imports and exports
How fallow builds the module graph and detects unused code.
</Card>
<Card title="Built-in plugins" icon="puzzle-piece" href="/frameworks/built-in">
123 framework plugins for automatic entry point detection.
Built-in framework plugins for automatic entry point detection.
</Card>
</CardGroup>
4 changes: 2 additions & 2 deletions cli/list.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ icon: "terminal"
Inspect what fallow discovered in your project. Use this command to debug configuration issues or verify that the right files, entry points, plugins, and boundary zones are being picked up.

<Tip>
Use `fallow list --plugins` to verify which of the 123 built-in plugins are active for your project.
Use `fallow list --plugins` to verify which built-in plugins are active for your project.
</Tip>

```bash
Expand Down Expand Up @@ -166,7 +166,7 @@ Each entry point shows how it was discovered. The plugin name tells you which fr

<CardGroup cols={2}>
<Card title="Built-in plugins" icon="puzzle-piece" href="/frameworks/built-in">
Full list of fallow's 123 built-in framework plugins.
Full list of fallow's built-in framework plugins.
</Card>
<Card title="Custom plugins" icon="plug" href="/frameworks/custom-plugins">
Create plugins for frameworks fallow doesn't cover yet.
Expand Down
2 changes: 1 addition & 1 deletion explanations/fallow-vs-linters.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ This page compares fallow to linters. For a comparison with knip (which operates
Full guide for GitHub Actions, GitLab CI, and other pipelines.
</Card>
<Card title="Dead code explained" icon="skull-crossbones" href="/explanations/dead-code">
All 15 issue types fallow detects, with examples.
Fallow's dead code and dependency findings, with examples.
</Card>
<Card title="Configuration" icon="gear" href="/configuration/overview">
Entry points, ignore patterns, severity rules.
Expand Down
4 changes: 2 additions & 2 deletions frameworks/built-in.mdx
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
---
title: "Built-in plugins"
description: "Fallow ships with 123 built-in plugins for Next.js, Vite, Jest, Tailwind, ESLint, and more. Auto-detected framework conventions for accurate analysis."
description: "Built-in plugins for Next.js, Vite, Jest, Tailwind, ESLint, and more. Auto-detected framework conventions for accurate analysis."
keywords: ["plugins", "frameworks", "Next.js", "Vite", "Jest", "Tailwind", "ESLint", "auto-detect"]
icon: "puzzle-piece"
---

Fallow ships with 123 built-in plugins for the most popular TypeScript and JavaScript tools. Each plugin teaches fallow about framework-specific conventions: entry points, config files, used exports, and tooling dependencies. Analysis is accurate out of the box.
Fallow ships with built-in plugins for popular TypeScript and JavaScript tools. Each plugin teaches fallow about framework-specific conventions: entry points, config files, used exports, and tooling dependencies. Analysis is accurate out of the box.

<Info>
Most plugins activate automatically when the relevant package is in your `package.json`. Some plugins (ESLint, Vitest) also activate when a config file is present in the workspace root, even without the package. This covers monorepos where the tool is installed at the root but workspace packages have their own config files.
Expand Down
2 changes: 1 addition & 1 deletion frameworks/custom-plugins.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ Then reference it in your plugin file:

<CardGroup cols={2}>
<Card title="Built-in plugins" icon="puzzle-piece" href="/frameworks/built-in">
Browse the 123 built-in framework plugins.
Browse the built-in framework and tooling plugins.
</Card>
<Card title="fallow list" icon="list" href="/cli/list">
Verify active plugins and inspect project metadata.
Expand Down
26 changes: 13 additions & 13 deletions public-content-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"visibility": "public-only"
},
"content": {
"sha256": "d03d1879614f4121d68dc53e4741c7634303d0cd893b0b310817d9e4a82c1f65",
"sha256": "1aafc525f4eca77b68d05a92968ddbf2c42e04eb4fed8040a4b213ffecadbdce",
"files": [
{
"path": ".mintignore",
Expand Down Expand Up @@ -51,8 +51,8 @@
},
{
"path": "analysis/file-types.mdx",
"bytes": 13669,
"sha256": "1639607fd94f64d07b66ded784a895d56f8f59baac2bff13776920964b358f97"
"bytes": 13674,
"sha256": "ef9360427d4092bbc0a7b2f2de081f4f424d5d52ae83f13d80e7a7837b056bc2"
},
{
"path": "analysis/index.mdx",
Expand Down Expand Up @@ -151,8 +151,8 @@
},
{
"path": "cli/list.mdx",
"bytes": 7367,
"sha256": "e6a3c8805620c4cb8f95d525eaa07adedcdacd142ea70badc09a4cf023dbed3a"
"bytes": 7352,
"sha256": "1ab27749c71ebbb6b24310b8236aedd559063345a2a7fdae7a42b70af7efe24b"
},
{
"path": "cli/migrate.mdx",
Expand Down Expand Up @@ -276,8 +276,8 @@
},
{
"path": "explanations/fallow-vs-linters.mdx",
"bytes": 14162,
"sha256": "2687fe40a9be14f2f0dc9b52407eb2ce9365d2342e773abc469daf43dd7f5858"
"bytes": 14171,
"sha256": "943e4995863ba5238b46f2242d565af191d7bd8cc9f681d863519ffc662ef75f"
},
{
"path": "explanations/health.mdx",
Expand Down Expand Up @@ -306,13 +306,13 @@
},
{
"path": "frameworks/built-in.mdx",
"bytes": 11860,
"sha256": "24362a926d721f046adc54dd768ff115b1d4dfc1207fe685cb349c2c9cb958dd"
"bytes": 11825,
"sha256": "13e615841e97e7e7e227bb476241c97e406f38a82e67ce8a4b124782d10d384b"
},
{
"path": "frameworks/custom-plugins.mdx",
"bytes": 12441,
"sha256": "a1f273c3c2dd1d384f1051d49249d1f5f6fa98c823ad1b88554d25b7716e0983"
"bytes": 12449,
"sha256": "53c1155d268ee89a301b9926633c6421877b0afa34142dd749d667ee46028984"
},
{
"path": "frameworks/react.mdx",
Expand Down Expand Up @@ -431,8 +431,8 @@
},
{
"path": "quickstart.mdx",
"bytes": 6598,
"sha256": "d2617700651f2b49ee78ab82ffdac0bbc61ba59cef07a3f13416d5289d1f23f9"
"bytes": 6594,
"sha256": "f37ac024b0e48a30d9c69e3d7ecba6b621e7af052e3abbe6c650189ec469e009"
}
]
}
Expand Down
2 changes: 1 addition & 1 deletion quickstart.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ That runs three analyses in one pass:
- **Health**: complexity hotspots and refactor targets

<Tip>
123 built-in plugins cover Next.js, Vite, Ember, Wuchale, Jest, Tailwind, PandaCSS, Contentlayer, tap, tsd, and more. No configuration needed for the first run.
Built-in plugins cover Next.js, Vite, Ember, Wuchale, Jest, Tailwind, PandaCSS, Contentlayer, tap, tsd, and more. No configuration needed for the first run.
</Tip>

## 2. Run the focused commands you'll use most
Expand Down
6 changes: 5 additions & 1 deletion scripts/public-content.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,14 @@ const LEAK_MARKERS = [
label: "private documentation alias",
pattern: /(?:^|[^\w-])\.internal\//u,
},
{
label: "plain private documentation root",
pattern: /(?:^|[\s([{"'=`])internal\//u,
},
{
label: "private cloud repository link",
pattern:
/(?:^|[^A-Za-z0-9-])github\.com\.?(?::\d+)?(?::|\/)+fallow-rs\/fallow-cloud(?:\.git)?(?=$|[^A-Za-z0-9._-])/iu,
/(?:^|[^A-Za-z0-9-])github\.com\.?(?::\d+)?(?::|\/)+fallow-rs\/fallow-cloud(?:\.git)?(?=$|[/?#:\s`),.])/iu,
},
{
label: "non-public Fallow decision link",
Expand Down
13 changes: 13 additions & 0 deletions scripts/public-content.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,19 @@ test("public content rejects private documentation markers", async () => {
);
});

test("public content rejects a backtick-wrapped plain private root", async () => {
const root = await createFixture();
await writeFile(
join(root, "analysis", "health.mdx"),
"Read `internal/runbook.md`\n",
);

await assert.rejects(
buildManifest(root),
/Found plain private documentation root/u,
);
});

test("public content rejects private repository links", async () => {
const root = await createFixture();
await writeFile(
Expand Down