Catalog npm
Back to packageRELEASE DETAILS

0.4.4

npm

@021.is/spine-lint

Spine-specific AST checks that biome can't express: enum-over-string, ResponseDto enforcement, endpoint documentation, i18n key parity, no raw SQL. Runs in CI as the spine-lint job + locally via `spine-lint .`.

Published1 Oct 2026
Direct dependencies4
Transitive dependenciesNot calculated

README

Current package documentation

@021.is/spine-lint

Spine-specific AST checks that biome can't express. Runs in CI as the spine-lint job in the quality gate; also runs locally via spine-lint ..

Rules

RuleSeverityWhat
spine/enum-over-stringerror / warningForbids inline string-literal unions (: "a" | "b" | "c"). Warns on repeated string-literal comparisons (x === "foo" ≥2 times). Locked.
spine/route-returns-response-dtoerrorEvery Next.js route handler must go through withErrorHandling from @021.is/spine-errors/next OR explicitly call ok() / err().
spine/endpoint-documentedwarningEvery route handler must have a JSDoc block above it.
spine/i18n-key-parityerrorEvery t("namespace.key") exists in every locale catalog under src/i18n/. Prevents the silent UX bug where production renders raw keys in foreign locales.
spine/no-raw-sqlerrorBlocks $queryRawUnsafe / $executeRawUnsafe. Use Prisma or $queryRaw\…`` tagged-template.

CLI

spine-lint .                           # run all rules on src/**
spine-lint src/feature/event          # narrow to one path
spine-lint --rule spine/enum-over-string .
spine-lint --github .                   # emit GitHub Actions annotations
spine-lint --list-rules

Exit code 1 on any error-level violation. Used as a required check in the spine-quality-gate workflow.

Disabling for a single line

// spine-lint-disable-next-line spine/no-raw-sql — needed for the pg_stat query
await prisma.$queryRawUnsafe(`SELECT * FROM pg_stat_activity`);

(Disables ALL rules on the next line if no rule id given.) You must always include the WHY comment. PR reviewers + future-you will look there first.

Enum pattern (the rule you'll hit most)

// ❌ inline union
function setStatus(s: "active" | "inactive" | "deleted") { ... }

// ✓ const-as-object enum
export const STATUS = { ACTIVE: "active", INACTIVE: "inactive", DELETED: "deleted" } as const;
export type Status = (typeof STATUS)[keyof typeof STATUS];

function setStatus(s: Status) { ... }

Why const-as-object instead of enum:

  • Tree-shakable (TS enum compiles to runtime objects).
  • Pure values; no class machinery.
  • Plays nice with as const and Object.values().
  • Industry standard (TanStack, Next.js codebase, Vercel SDK).

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Declared dependencies 4

Native requirements
4 direct targetsNot calculated transitive count
Package / targetRequirementRelationship
cac
Environment
{
  "local_name": "cac",
  "alias": false,
  "peer_metadata": null
}
^6.7.14runtime
kleur
Environment
{
  "local_name": "kleur",
  "alias": false,
  "peer_metadata": null
}
^4.1.5runtime
fast-glob
Environment
{
  "local_name": "fast-glob",
  "alias": false,
  "peer_metadata": null
}
^3.3.2runtime
@typescript-eslint/typescript-estree
Environment
{
  "local_name": "@typescript-eslint/typescript-estree",
  "alias": false,
  "peer_metadata": null
}
^8.10.0runtime

Distribution files

1 collected
Distribution 1

Source distribution

Source file
Checksums from source
{
  "shasum": "2d4acd587aff3af028be2229d7edf97b52282e68",
  "tarball": "https://registry.npmjs.org/@021.is/spine-lint/-/spine-lint-0.4.4.tgz",
  "fileCount": 8,
  "integrity": "sha512-SMF0VHS/T4FkOgH/1+30gt09I6UAqJoAasCj43IBkUB2cWWikt24F0bCaGhpEOz5EWjXOmhzq6SlTJ3ZDtPeFg==",
  "signatures": [
    {
      "sig": "MEUCIG7JVbwswKOQNGVobBs5NwQ7LyMt/O9EahOSXA/+cUs3AiEApaY58HNovIFLMYoBmSUuv5pFGcHhSr4EVFf66G75eCI=",
      "keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"
    },
    {
      "keyid": "SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U",
      "sig": "MEYCIQCnxKBKVyquw5sSI9PfSxotEPO05hecytTqE200FyQsDAIhAK9jwDky2gJwaoiEjPJKaVL4Tr8dmSqkAAIvSnjbCsyS"
    }
  ],
  "attestations": {
    "url": "https://registry.npmjs.org/-/npm/v1/attestations/@021.is%2fspine-lint@0.4.4",
    "provenance": {
      "predicateType": "https://slsa.dev/provenance/v1"
    }
  },
  "unpackedSize": 25704
}

Repository

PENDING
021is/spine-ts

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 22:00 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package_version:46b92408d930079769eeb004fa4b00a22d615056f6b3bf2927fdb6094020b1e1

Other collected versions

0.4.328 May0.4.228 MayView all collected versions →