Skip to content

Releases: wellmade-studio/standards-js

@wellmade/eslint-config@0.4.0

Choose a tag to compare

@github-actions github-actions released this 29 May 07:43
a7a9b5f

Minor Changes

  • 318e238: Two rule defaults relaxed, both driven by the bedrock-js dogfooding
    round (F8 in the field-adoption findings):

    vitest/consistent-test-it and jest/consistent-test-it no longer
    have a default.
    Vitest and Jest treat test() and it() as
    aliases — preference, not correctness. Bedrock-js used test()
    consistently while the preset defaulted to it() 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-undef is now off on TypeScript files (still on for JS). TS
    itself is the authority on scope checking and catches undefined-
    identifier references natively. ESLint's no-undef can'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's noImplicitAny + strict-mode
    checks plus import-x/no-unresolved from importsPreset. This
    matches typescript-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 own eslint.config.js.

@wellmade/stylelint-config@0.2.0

Choose a tag to compare

@github-actions github-actions released this 28 May 10:38
7a3a732

Minor Changes

  • 5e94bd0: @wellmade/stylelint-config/tailwind now disables import-notation.

    Field adoption report F10: the base config inherits import-notation: url
    from stylelint-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 the url()
    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 @theme tokens), no error.

    The fix scope is intentionally narrow: only the tailwind sub-path
    disables the rule. Vanilla CSS projects still get import-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 the nestjs / vitest
    tsconfig presets in 0.2.x of @wellmade/tsconfig.

    Migration: if your project relied on the previous behavior (i.e.
    you wanted @import rewritten to url() 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

Choose a tag to compare

@github-actions github-actions released this 28 May 10:38
7a3a732

Patch Changes

  • 3596131: Bump eslint-plugin-sort-destructure-keys from ^2.0.0 to ^3.0.0
    for full ESLint v10 support.

    Plugin v2.x used the removed context.getSourceCode() API; consumers
    on ESLint 10 hit TypeError: 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 the eslint-plugin-importeslint-plugin-import-x swap
    that landed in 0.2.0; same fix pattern.

    Surfaced by bedrock-js being the first repo to dogfood
    @wellmade/eslint-config against ESLint 10 with object-destructuring
    present in source.

    No rule changes; consumers on ESLint 9 unaffected.

@wellmade/tsconfig@0.2.0

Choose a tag to compare

@github-actions github-actions released this 27 May 14:57
990b6b5

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 — extends node.json,
      pre-applies the nine overrides NestJS needs to run at all
      (CommonJS module mode, decorator metadata, noEmit: false,
      incremental: false to avoid the silent empty-dist failure with
      nest-cli.json's deleteOutDir, strictPropertyInitialization: false for the @IsString() name: string DTO pattern).

    • @wellmade/tsconfig/nestjs-spec.json — extends nestjs.json,
      adds the resolvePackageJsonExports: false override ts-jest
      needs (its resolver doesn't honor package.json#exports).

    • @wellmade/tsconfig/react.json — extends dom.json. Aliased
      for now; gives React projects a discoverable name and a stable
      hook for future React-specific overrides.

    • @wellmade/tsconfig/vitest.json — extends node.json, adds
      vitest/globals to 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.json

      Removed exactOptionalPropertyTypes: true from 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.json is strictly
      more permissive (no existing valid code breaks); the four new
      presets are additive sub-paths.

    • NestJS consumers — switch tsconfig.json from
      @wellmade/tsconfig/node.json to @wellmade/tsconfig/nestjs.json
      (and tsconfig.spec.json to @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.json to
      the framework-specific names; identical behavior for react.json
      today, vitest.json adds the globals types convenience.

@wellmade/eslint-config@0.3.0

Choose a tag to compare

@github-actions github-actions released this 27 May 14:57
990b6b5

Minor Changes

  • feea326: reactPreset: allow PascalCase as well as kebab-case for .jsx /
    .tsx files.

    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 reactPreset overrides unicorn/filename-case to
    { cases: { kebabCase: true, pascalCase: true } } — but only for
    JSX/TSX files (the preset's files glob narrows it). Hooks, utils,
    services typically live in .ts / .js and keep kebab-case.

    No migration needed for projects using reactPreset — PascalCase
    filenames stop being lint errors automatically.

@wellmade/commitlint-config@0.2.0

Choose a tag to compare

@github-actions github-actions released this 27 May 14:57
990b6b5

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-enum from 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's feat(api): … would fail because
    api isn'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
    own commitlint.config.js; the README documents the pattern.

    Removed subject-case from 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-blank from 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

Choose a tag to compare

@github-actions github-actions released this 26 May 15:15
85cbb99

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

Choose a tag to compare

@github-actions github-actions released this 26 May 15:15
85cbb99

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

Choose a tag to compare

@github-actions github-actions released this 26 May 15:15
85cbb99

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

Choose a tag to compare

@github-actions github-actions released this 22 May 08:14
be6b73b

Patch Changes

  • 440c305: Enable allowImportingTsExtensions in base.json. The base sets
    noEmit: true (type-only), so writing .ts extensions 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: false to actually emit JS need to set
    rewriteRelativeImportExtensions: true (TS 5.7+) themselves — that
    choice is project-specific.