Releases: wellmade-studio/standards-js
Release list
@wellmade/eslint-config@0.4.0
Minor Changes
-
318e238: Two rule defaults relaxed, both driven by the bedrock-js dogfooding
round (F8 in the field-adoption findings):vitest/consistent-test-itandjest/consistent-test-itno longer
have a default. Vitest and Jest treattest()andit()as
aliases — preference, not correctness. Bedrock-js usedtest()
consistently while the preset defaulted toit()inside describes;
auto-fix produced 137 rewrites that cascaded into 280+ no-undef and
no-unsafe-call errors because the imports weren't updated. Teams
pick a convention and stick with it — that's the only thing that
matters. Projects that want enforcement can re-enable in their own
config:'vitest/consistent-test-it': ['error', { fn: 'test', withinDescribe: 'it' }]
no-undefis now off on TypeScript files (still on for JS). TS
itself is the authority on scope checking and catches undefined-
identifier references natively. ESLint'sno-undefcan't see TS
type-only globals (e.g.NodeJS.ErrnoException, ambient module
declarations) and produces false positives — bedrock hit 8+ such
cases on first lint. The AI-hallucination intent (catch made-up
imports) is already covered by TS'snoImplicitAny+ strict-mode
checks plusimport-x/no-unresolvedfromimportsPreset. This
matchestypescript-eslint's own recommended setup.Migration: none required. Both changes are strictly more
permissive; no consumer-side code stops compiling. If you actively
relied on either rule firing in your test files or TS source, add
it back in your owneslint.config.js.
@wellmade/stylelint-config@0.2.0
Minor Changes
-
5e94bd0:
@wellmade/stylelint-config/tailwindnow disablesimport-notation.Field adoption report F10: the base config inherits
import-notation: url
fromstylelint-config-standard, which auto-rewrites
@import 'tailwindcss'to@import url('tailwindcss')on--fix.
Tailwind v4's Vite plugin only recognises the bare-string form when
deciding whether to inject preflight + utilities. With theurl()
wrapper, the build succeeds but the entire utility layer is
silently skipped — bundle drops from ~80 KB (correct tree-shaken
output) to ~19 KB (just@themetokens), no error.The fix scope is intentionally narrow: only the
tailwindsub-path
disables the rule. Vanilla CSS projects still getimport-notation: url,
which is the modern recommendation. You opted into a framework
whose convention conflicts with the vanilla rule; the framework
wins inside its own preset — same shape as thenestjs/vitest
tsconfig presets in 0.2.x of@wellmade/tsconfig.Migration: if your project relied on the previous behavior (i.e.
you wanted@importrewritten tourl()even in tailwind files),
re-enable the rule in your own stylelint config. Unlikely — the
old behavior was silently broken.
@wellmade/eslint-config@0.3.1
Patch Changes
-
3596131: Bump
eslint-plugin-sort-destructure-keysfrom^2.0.0to^3.0.0
for full ESLint v10 support.Plugin v2.x used the removed
context.getSourceCode()API; consumers
on ESLint 10 hitTypeError: context.getSourceCode is not a function
the moment any object-destructure was linted. v3.x adopted the new
context API. Same shape as the
eslint-plugin-eslint-comments→@eslint-community/eslint-plugin-eslint-comments
swap and theeslint-plugin-import→eslint-plugin-import-xswap
that landed in 0.2.0; same fix pattern.Surfaced by bedrock-js being the first repo to dogfood
@wellmade/eslint-configagainst ESLint 10 with object-destructuring
present in source.No rule changes; consumers on ESLint 9 unaffected.
@wellmade/tsconfig@0.2.0
Minor Changes
-
5b39ec3: Add four framework presets and relax one base default.
New presets
Four sub-path exports added, each documenting in its file header
exactly which overrides it applies and why:-
@wellmade/tsconfig/nestjs.json— extendsnode.json,
pre-applies the nine overrides NestJS needs to run at all
(CommonJS module mode, decorator metadata,noEmit: false,
incremental: falseto avoid the silent empty-dist failure with
nest-cli.json'sdeleteOutDir,strictPropertyInitialization: falsefor the@IsString() name: stringDTO pattern). -
@wellmade/tsconfig/nestjs-spec.json— extendsnestjs.json,
adds theresolvePackageJsonExports: falseoverride ts-jest
needs (its resolver doesn't honorpackage.json#exports). -
@wellmade/tsconfig/react.json— extendsdom.json. Aliased
for now; gives React projects a discoverable name and a stable
hook for future React-specific overrides. -
@wellmade/tsconfig/vitest.json— extendsnode.json, adds
vitest/globalsto types. Vitest itself uses esbuild, so unlike
Jest it works fine with the base.json strict defaults; the only
thing it really needs is the globals types.One change to
base.jsonRemoved
exactOptionalPropertyTypes: truefrom the default
strictness set. Field adoption surfaced 165 + 18 violations on a
single NestJS + Vite-React monorepo — the rule mis-fires on the
idiomatic{ key: cond ? value : undefined }pattern used
everywhere in HTTP/DB-shaped code and React conditional props. The
bugs it catches (serialization edge cases distinguishing
absent-key from set-to-undefined) are narrow; the friction is
everywhere. Teams that want it can opt in per-project.The other strict flag the field report relaxed
(noUncheckedIndexedAccess) stays on — the bugs it catches are
real and the friction is concentrated in ORM patterns that a
targeted preset can address later.Migration
-
Plain consumers — nothing required.
base.jsonis strictly
more permissive (no existing valid code breaks); the four new
presets are additive sub-paths. -
NestJS consumers — switch
tsconfig.jsonfrom
@wellmade/tsconfig/node.jsonto@wellmade/tsconfig/nestjs.json
(andtsconfig.spec.jsonto@wellmade/tsconfig/nestjs-spec.json).
This replaces the per-project override pile that the field report
documented. -
React/Vitest consumers — optional rename from
@wellmade/tsconfig/dom.json/@wellmade/tsconfig/node.jsonto
the framework-specific names; identical behavior forreact.json
today,vitest.jsonadds the globals types convenience.
-
@wellmade/eslint-config@0.3.0
Minor Changes
-
feea326:
reactPreset: allow PascalCase as well as kebab-case for.jsx/
.tsxfiles.Driven by field adoption report #9. The base unicorn rule enforces
kebab-case for filenames, which produces 100+ violations on any
non-greenfield React codebase (the React community convention is
App.tsx,BookDetailPage.tsx,<ButtonGroup />). Renaming every
component file isn't realistic and breaks every import.Now
reactPresetoverridesunicorn/filename-caseto
{ cases: { kebabCase: true, pascalCase: true } }— but only for
JSX/TSX files (the preset'sfilesglob narrows it). Hooks, utils,
services typically live in.ts/.jsand keep kebab-case.No migration needed for projects using
reactPreset— PascalCase
filenames stop being lint errors automatically.
@wellmade/commitlint-config@0.2.0
Minor Changes
-
3313a80: Make the default config friendly to consumer projects.
Three changes, driven by the first field-adoption report and a round
of dogfooding the config in this repo:Removed
scope-enumfrom the default config. The previous
default enumerated wellmade-internal package names (bedrock,
cli,gh-actions, the per-config names) as the only allowed
scopes — which meant every commit with a scope was rejected on
any consumer project (a consumer'sfeat(api): …would fail because
apiisn't a Wellmade package). Consumers want their own service
names as scopes. The config no longer presumes to know what those
are. Wellmade-internal repos opt into the strict allow-list in their
owncommitlint.config.js; the README documents the pattern.Removed
subject-casefrom the default config. The previous
default required['sentence-case', 'lower-case']on subjects to
catch AI-generated Title Case spam. In real-world dogfooding it
mis-fired constantly on proper nouns and acronyms (Rekor,
PascalCase,NestJS,TypeScript,JSON). The Conventional
Commits type prefix (feat:,chore:) already signals
intentionality, and PR review catches the AI-spam case well enough.
Teams that want the strict version back can add the rule to their
own config (README shows how).Demoted
footer-leading-blankfrom error to warning. The
conventional-changelog parser treats any blank line in the body
as the body→footer boundary, then fails the trailing line (e.g.
Co-Authored-By:) against a missing-leading-blank check. This
mis-fires routinely on perfectly valid markdown commit bodies that
group bullets with blank lines, and is a particular foot-gun for
AI-generated messages. Keeping it as a warning preserves the signal
without blocking the commit.Migration: if your project relied on either rule (very unlikely
on any non-Wellmade repo), copy the rule into your own
commitlint.config.js— see the README for the pattern. No other
changes needed; bumping picks up the friendlier defaults.
@wellmade/tsconfig@0.1.4
Patch Changes
-
32c53a9: Re-bump after Rekor transparency-log conflict on prior publish.
A previous release run for these three packages signed their tarballs
in sigstore's transparency log (Rekor) but failed to upload the
tarballs to npm. Retrying the same versions hit a 409 from Rekor,
which de-duplicates entries by(tarball-hash, signer-identity).A version bump produces a fresh tarball, which gets a fresh
signature, which sidesteps the duplicate. No source code changed —
these are pure re-release bumps so provenance stays enabled across
all@wellmade/*packages going forward.
@wellmade/lint-staged-config@0.1.3
Patch Changes
-
32c53a9: Re-bump after Rekor transparency-log conflict on prior publish.
A previous release run for these three packages signed their tarballs
in sigstore's transparency log (Rekor) but failed to upload the
tarballs to npm. Retrying the same versions hit a 409 from Rekor,
which de-duplicates entries by(tarball-hash, signer-identity).A version bump produces a fresh tarball, which gets a fresh
signature, which sidesteps the duplicate. No source code changed —
these are pure re-release bumps so provenance stays enabled across
all@wellmade/*packages going forward.
@wellmade/commitlint-config@0.1.3
Patch Changes
-
32c53a9: Re-bump after Rekor transparency-log conflict on prior publish.
A previous release run for these three packages signed their tarballs
in sigstore's transparency log (Rekor) but failed to upload the
tarballs to npm. Retrying the same versions hit a 409 from Rekor,
which de-duplicates entries by(tarball-hash, signer-identity).A version bump produces a fresh tarball, which gets a fresh
signature, which sidesteps the duplicate. No source code changed —
these are pure re-release bumps so provenance stays enabled across
all@wellmade/*packages going forward.
@wellmade/tsconfig@0.1.2
Patch Changes
-
440c305: Enable
allowImportingTsExtensionsinbase.json. The base sets
noEmit: true(type-only), so writing.tsextensions on relative
imports is safe and matches our ESLint rule
import/extensions: ['error', 'ignorePackages']. Without this flag,
typecheck failed even though lint passed.Projects that override
noEmit: falseto actually emit JS need to set
rewriteRelativeImportExtensions: true(TS 5.7+) themselves — that
choice is project-specific.