Add .editorconfig and update biome f6d1e094
Biome can use .editorconfig, so use consistent settings. Also refactors biome.json to use ubiquitously in the project.

Unfortunately, markdown files - which we can hopefully associate .mdx files with - aren't supported yet. See https://github.com/biomejs/biome/issues/3718.
Heath Stewart · 2026-02-21 16:12 11 file(s) · +101 −83
.editorconfig (added) +14 −0
1 +
root = true
2 +
3 +
[*]
4 +
indent_style = tab
5 +
insert_final_newline = true
6 +
trim_trailing_whitespace = true
7 +
8 +
[*.html]
9 +
indent_size = 2
10 +
indent_style = space
11 +
12 +
[*.{md,mdx}]
13 +
indent_size = 2
14 +
indent_style = space
README.md +2 −2
2 2
3 3
![cover](https://sequoia.pub/og.png)
4 4
5 -
A CLI for publishing [Standard.site](https://standard.site) documents to the [AT Protocol](https://atproto.com). 
5 +
A CLI for publishing [Standard.site](https://standard.site) documents to the [AT Protocol](https://atproto.com).
6 6
7 7
> [!NOTE]
8 8
> [Visit the docs for more info](https://sequoia.pub)
60 60
bun dev
61 61
```
62 62
63 -
## License 
63 +
## License
64 64
65 65
MIT
66 66
biome.json (added) +38 −0
1 +
{
2 +
	"$schema": "https://biomejs.dev/schemas/2.3.13/schema.json",
3 +
	"root": true,
4 +
	"vcs": {
5 +
		"enabled": true,
6 +
		"clientKind": "git",
7 +
		"useIgnoreFile": true
8 +
	},
9 +
	"files": {
10 +
		"includes": ["**"]
11 +
	},
12 +
	"formatter": {
13 +
		"enabled": true,
14 +
		"useEditorconfig": true
15 +
	},
16 +
	"linter": {
17 +
		"enabled": true,
18 +
		"rules": {
19 +
			"recommended": true,
20 +
			"style": {
21 +
				"noNonNullAssertion": "off"
22 +
			}
23 +
		}
24 +
	},
25 +
	"javascript": {
26 +
		"formatter": {
27 +
			"quoteStyle": "double"
28 +
		}
29 +
	},
30 +
	"assist": {
31 +
		"enabled": true,
32 +
		"actions": {
33 +
			"source": {
34 +
				"organizeImports": "on"
35 +
			}
36 +
		}
37 +
	}
38 +
}
bun.lock +1 −0
22 22
        "vocs": "latest",
23 23
      },
24 24
      "devDependencies": {
25 +
        "@biomejs/biome": "^2.3.13",
25 26
        "@cloudflare/workers-types": "latest",
26 27
        "@types/react": "latest",
27 28
        "typescript": "latest",
docs/docs/public/sequoia-comments.js +1 −2
588 588
		this.commentsContainer = container;
589 589
		this.state = { type: "loading" };
590 590
		this.abortController = null;
591 -
592 591
	}
593 592
594 593
	static get observedAttributes() {
701 700
					</div>
702 701
				`;
703 702
				if (this.hide) {
704 -
					this.commentsContainer.style.display = 'none';
703 +
					this.commentsContainer.style.display = "none";
705 704
				}
706 705
				break;
707 706
docs/package.json +2 −0
4 4
	"version": "0.0.0",
5 5
	"type": "module",
6 6
	"scripts": {
7 +
		"format": "biome format --write",
7 8
		"dev": "vocs dev",
8 9
		"dev:api": "wrangler dev",
9 10
		"build": "vocs build && bun inject-og-tags.ts",
20 21
		"vocs": "latest"
21 22
	},
22 23
	"devDependencies": {
24 +
		"@biomejs/biome": "^2.3.13",
23 25
		"@cloudflare/workers-types": "latest",
24 26
		"@types/react": "latest",
25 27
		"typescript": "latest"
docs/sequoia.json +16 −18
1 1
{
2 -
  "siteUrl": "https://sequoia.pub",
3 -
  "contentDir": "docs/pages/blog",
4 -
  "imagesDir": "docs/public",
5 -
  "publicDir": "docs/public",
6 -
  "outputDir": "docs/dist",
7 -
  "pathPrefix": "/blog",
8 -
  "publicationUri": "at://did:plc:kq6bvkw4sxof3vdinuitehn5/site.standard.publication/3mdnzt4rqr42v",
9 -
  "pdsUrl": "https://andromeda.social",
10 -
  "frontmatter": {
11 -
    "publishDate": "date"
12 -
  },
13 -
  "ignore": [
14 -
    "index.mdx"
15 -
  ],
16 -
  "ui": {
17 -
    "components": "docs/components"
18 -
  }
19 -
}
2 +
	"siteUrl": "https://sequoia.pub",
3 +
	"contentDir": "docs/pages/blog",
4 +
	"imagesDir": "docs/public",
5 +
	"publicDir": "docs/public",
6 +
	"outputDir": "docs/dist",
7 +
	"pathPrefix": "/blog",
8 +
	"publicationUri": "at://did:plc:kq6bvkw4sxof3vdinuitehn5/site.standard.publication/3mdnzt4rqr42v",
9 +
	"pdsUrl": "https://andromeda.social",
10 +
	"frontmatter": {
11 +
		"publishDate": "date"
12 +
	},
13 +
	"ignore": ["index.mdx"],
14 +
	"ui": {
15 +
		"components": "docs/components"
16 +
	}
17 +
}
docs/src/lib/kv-stores.ts +2 −8
10 10
	dpopJwk: Record<string, unknown>;
11 11
};
12 12
13 -
type SerializedSession = Omit<
14 -
	Parameters<SessionStore["set"]>[1],
15 -
	"dpopKey"
16 -
> & {
13 +
type SerializedSession = Omit<Parameters<SessionStore["set"]>[1], "dpopKey"> & {
17 14
	dpopJwk: Record<string, unknown>;
18 15
};
19 16
27 24
	return JoseKey.fromJWK(jwk);
28 25
}
29 26
30 -
export function createStateStore(
31 -
	kv: KVNamespace,
32 -
	ttl = 600,
33 -
): StateStore {
27 +
export function createStateStore(kv: KVNamespace, ttl = 600): StateStore {
34 28
	return {
35 29
		async set(key, { dpopKey, ...rest }) {
36 30
			const data: SerializedStateData = {
docs/tsconfig.json +21 −21
1 1
{
2 -
  "compilerOptions": {
3 -
    "target": "ES2020",
4 -
    "useDefineForClassFields": true,
5 -
    "lib": ["ES2020", "DOM", "DOM.Iterable"],
6 -
    "module": "ESNext",
7 -
    "skipLibCheck": true,
2 +
	"compilerOptions": {
3 +
		"target": "ES2020",
4 +
		"useDefineForClassFields": true,
5 +
		"lib": ["ES2020", "DOM", "DOM.Iterable"],
6 +
		"module": "ESNext",
7 +
		"skipLibCheck": true,
8 8
9 -
    /* Bundler mode */
10 -
    "moduleResolution": "bundler",
11 -
    "allowImportingTsExtensions": true,
12 -
    "resolveJsonModule": true,
13 -
    "isolatedModules": true,
14 -
    "noEmit": true,
15 -
    "jsx": "react-jsx",
9 +
		/* Bundler mode */
10 +
		"moduleResolution": "bundler",
11 +
		"allowImportingTsExtensions": true,
12 +
		"resolveJsonModule": true,
13 +
		"isolatedModules": true,
14 +
		"noEmit": true,
15 +
		"jsx": "react-jsx",
16 16
17 -
    /* Linting */
18 -
    "strict": true,
19 -
    "noUnusedLocals": true,
20 -
    "noUnusedParameters": true,
21 -
    "noFallthroughCasesInSwitch": true,
22 -
    "types": ["@cloudflare/workers-types"]
23 -
  },
24 -
  "include": ["**/*.ts", "**/*.tsx"]
17 +
		/* Linting */
18 +
		"strict": true,
19 +
		"noUnusedLocals": true,
20 +
		"noUnusedParameters": true,
21 +
		"noFallthroughCasesInSwitch": true,
22 +
		"types": ["@cloudflare/workers-types"]
23 +
	},
24 +
	"include": ["**/*.ts", "**/*.tsx"]
25 25
}
package.json +3 −1
6 6
		"docs"
7 7
	],
8 8
	"scripts": {
9 -
	  "dev:cli": "cd packages/cli && bun run dev",
9 +
		"format:cli": "cd packages/cli && bun run format",
10 +
		"format:docs": "cd docs && bun run format",
11 +
		"dev:cli": "cd packages/cli && bun run dev",
10 12
		"dev:docs": "cd docs && bun run dev",
11 13
		"build:docs": "cd docs && bun run build",
12 14
		"build:cli": "cd packages/cli && bun run build",
packages/cli/biome.json +1 −31
1 1
{
2 2
	"$schema": "https://biomejs.dev/schemas/2.3.13/schema.json",
3 -
	"vcs": {
4 -
		"enabled": true,
5 -
		"clientKind": "git",
6 -
		"useIgnoreFile": true
7 -
	},
3 +
	"extends": ["../../biome.json"],
8 4
	"files": {
9 5
		"includes": ["**", "!!**/dist"]
10 -
	},
11 -
	"formatter": {
12 -
		"enabled": true,
13 -
		"indentStyle": "tab"
14 -
	},
15 -
	"linter": {
16 -
		"enabled": true,
17 -
		"rules": {
18 -
			"recommended": true,
19 -
			"style": {
20 -
				"noNonNullAssertion": "off"
21 -
			}
22 -
		}
23 -
	},
24 -
	"javascript": {
25 -
		"formatter": {
26 -
			"quoteStyle": "double"
27 -
		}
28 -
	},
29 -
	"assist": {
30 -
		"enabled": true,
31 -
		"actions": {
32 -
			"source": {
33 -
				"organizeImports": "on"
34 -
			}
35 -
		}
36 6
	}
37 7
}