1.9 KiB
1.9 KiB
description
| description |
|---|
| Shared code comes through |
# aliases
Shared code is imported through Node subpath imports declared in
package.json imports, never by a relative path that climbs out of a
directory:
"imports": {
"#helpers": "./src/helpers/index.ts",
"#components/*": "./src/components/*"
}
import { typeNameTail } from "#helpers"; // yes
import { typeNameTail } from "../helpers/ast.ts"; // no: import/no-relative-parent-imports
Node, TypeScript, Vite, Vite+'s config bundler, and Oxlint's plugin loader
all resolve them natively, so .ts source runs unbuilt. vp pack inlines them,
so they never reach package consumers.
- Deno's trailing-slash mappings (
"#components/") don't exist in Node; they become patterns,"#components/*": "./src/components/*". - Aliases point at
.tsfiles only. There is no#packagealias (ts-only-files-and-imports). - In repos linted by import-check, the key order of
importsis the layer orderenforce-layer-orderchecks; add a new alias at the right layer. - Keep test-only helpers in their own alias (e.g.
#testing) so they never land in a bundle.
index.ts entries and barrels
- Every directory's entry file is
index.ts, nevermod.ts(decided 2026-10-12; import-check'senforce-mod-filenow requiresindex.ts). - A directory used from outside exposes its API through its
index.tsbarrel, and callers import the barrel (#ui), not files inside it (no-barrel-bypass). - Barrels are also the standard fix for
import/max-dependencies: one barrel import replaces many direct ones (lint-overrides-policy). import/no-cycleis on; a barrel must not create a cycle.
Relative imports inside one directory (./sibling.ts) are fine, with the
.ts extension written out.