@snailicid3/config
v0.1.3
Published
Shared linting, formatting, and TypeScript config utilities for the snailicid3 monorepo
Maintainers
Readme
@snailicid3/config 🐌
Shared ESLint, Prettier, markdownlint, commitlint, and TypeScript base configurations for the snailicid3 monorepo.
Repository
- Github:
@snailicid3/config•snailicid3
Author
👤 Gillian Tunney
Recommended package manager is pnpm
@snailicid3/config 🐌
This package provides shareable configuration files for common tooling used across the snailicid3 monorepo. It includes ESLint flat configs, Prettier options, markdownlint rules, commitlint conventions, TypeScript base configs, and utility shell scripts.
@snailicid3/config contains:
- eslint • Flat config with TypeScript, import, jsdoc, and sort rules
- prettier • Shared Prettier options
- markdownlint-cli2 • Markdown linting rules
- commitlint • Conventional commit configuration
- api-extractor • API report and declaration rollup config
- typedoc • TypeDoc config builders for standard, markdown, VitePress, and material-theme docs
- typescript • Base tsconfig presets:
base,library,typecheck,docs
Installation
#pnpm
$ pnpm add @snailicid3/config -D
#yarn
$ yarn add @snailicid3/config -D
#npm
$ npm install @snailicid3/config --save-devExamples
All TypeScript config builders require cwd. Pass import.meta from the config file when the
configuration should resolve paths relative to that file.
ESLint
Basic Config
/* @file eslint.config.ts */
import { EsLint } from '@snailicid3/config'
const config = EsLint.config({ cwd: import.meta })
export default EsLint.defineConfig(config)Overriding Config
This example appends an extra ignore pattern.
/* @file eslint.config.ts */
import { EsLint } from '@snailicid3/config'
const config = EsLint.config({
cwd: import.meta,
ignores: ['packages/**/docs/**/*'],
})
export default EsLint.defineConfig(config)Overriding Rules
This example appends a custom flat-config entry.
/* @file eslint.config.ts */
import { EsLint, type EsLintConfig, expandExtensions, TS_FILE_EXTENSIONS } from '@snailicid3/config'
const overrideExample: EsLintConfig[number] = {
/** Expands a list of file extensions by appending them to a normalized base pattern. */
files: expandExtensions(TS_FILE_EXTENSIONS, '**/src/**/*'),
name: 'Naming: allow ids for parameters',
rules: {
'@typescript-eslint/naming-convention': [
'error',
{
custom: {
match: true,
regex: '^([a-zA-Z][a-zA-Z0-9_]{2,}|id|db|fs|ctx|req|res)$',
},
format: ['camelCase'],
selector: 'parameter',
},
],
},
}
const config = EsLint.config({ cwd: import.meta, overrides: [overrideExample] })
export default EsLint.defineConfig(config)Prettier
Standard Config
/* @file prettier.config.ts */
import { Prettier } from '@snailicid3/config'
export default Prettier.defineConfig(Prettier.config({ cwd: import.meta }))Overriding Config
/* @file prettier.config.ts */
import { Prettier } from '@snailicid3/config'
export default Prettier.defineConfig(
Prettier.config({
cwd: import.meta,
options: {
endOfLine: 'lf',
printWidth: 100,
semi: false,
singleQuote: true,
tabWidth: 4,
trailingComma: 'all',
},
overrides: [
{
files: '**/*.json',
options: {
tabWidth: 4,
},
},
],
}),
)JSON File Config
Use configFile when generating a .prettierrc.json artifact. It keeps plugins as package-name
strings instead of resolved plugin objects.
import { Prettier } from '@snailicid3/config'
const prettierrc = Prettier.configFile({ cwd: import.meta })Markdownlint
/* @file .markdownlint-cli2.mts */
import { Markdownlint } from '@snailicid3/config'
export default Markdownlint.defineConfig(Markdownlint.config({ cwd: import.meta }))Lint-Staged
/* @file .lintstagedrc.mts */
import { LintStaged } from '@snailicid3/config'
export default LintStaged.defineConfig(LintStaged.config({ cwd: import.meta }))Commitlint
/* @file commitlint.config.ts */
import { Commitlint } from '@snailicid3/config'
export default Commitlint.defineConfig(
Commitlint.config({
cwd: import.meta,
scopeOptions: { mergeScopes: ['my-package'] },
}),
)TypeDoc
/* @file typedoc.config.ts */
import { Typedoc } from '@snailicid3/config'
export default Typedoc.materialTheme.config({ cwd: import.meta })/* @file typedoc.config.ts */
import { Typedoc } from '@snailicid3/config'
export default Typedoc.markdown.config({ cwd: import.meta })/* @file typedoc.config.ts */
import { Typedoc } from '@snailicid3/config'
export default Typedoc.vitepress.config({ cwd: import.meta })Api-Extractor
Generate or copy the package base config to dist/.api-extractor-base.json, then extend it from the
package API Extractor config.
{
extends: './dist/.api-extractor-base.json',
}The TypeScript builder has the same required cwd contract.
import { ApiExtractor } from '@snailicid3/config'
const config = ApiExtractor.config({ cwd: import.meta })TypeScript
Type Check
Does not emit js files, checks all files in package including .test.ts files.
// @file tsconfig.json
{
extends: '@snailicid3/config/tsconfig.typecheck',
exclude: ['./node_modules'],
files: ['package.json'],
include: [
'./*.ts',
'./*.cts',
'./*.mts',
'./src/**/*.ts',
'./src/**/*.cts',
'./src/**/*.mts',
'./**/*.test.ts',
'./**/*.test.mts',
'./**/*.test.cts',
],
}Library
Creates a folder of declarations and js files in <configDir>/types, suitable for a library
package.
/* @file tsconfig.build.json */
{
extends: '@snailicid3/config/tsconfig.library',
include: ['./src/**/*.ts', './src/**/*.cts', './src/**/*.mts'],
exclude: ['**/*.test.ts', '**/*.test.mts', '**/*.test.cts'],
}Change outDir to <configDir>/dist if not using a bundler. This example overrides the
compilerOptions to create a dist folder of js files.
/* @file tsconfig.build.json */
{
extends: '@snailicid3/config/tsconfig.library',
include: ['./src/**/*.ts', './src/**/*.cts', './src/**/*.mts'],
exclude: ['**/*.test.ts', '**/*.test.mts', '**/*.test.cts'],
compilerOptions: {
outDir: './dist',
},
}Shell Completions
The shell completion install helper can be called through pnpm:
pnpm exec gbt-setup