# core/resolvers/package.resolver.ts

> 60 lines of code and 17 definitions.

Tree: GovLab Quality
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/quality#file-quality-core-resolvers-package-resolver-ts
Source text: https://banes-lab.com/source/quality/core/resolvers/package.resolver.ts.txt

Listed in [core/resolvers](https://banes-lab.com/api/source/quality/core/resolvers.md), after [core/resolvers/layer.resolver.ts](https://banes-lab.com/source/quality/core/resolvers/layer.resolver.ts.md) and before [core/resolvers/plan.resolver.ts](https://banes-lab.com/source/quality/core/resolvers/plan.resolver.ts.md).

## Definitions

- `findPackageRoot` (lexical_declaration, line 18, exported)
- `parentDir` (lexical_declaration, line 10)
- `packageRelOf` (lexical_declaration, line 60, exported)
- `packageRootOf` (lexical_declaration, line 52, exported)
- `withinPackage` (lexical_declaration, line 65, exported)
- `relFromRoot` (lexical_declaration, line 44, exported)
- `enclosingPackages` (lexical_declaration, line 34, exported)
- `PACKAGE_MANIFEST` (lexical_declaration, line 6)
- `PACKAGE_ROOT_CACHE` (lexical_declaration, line 7)
- `NORMALIZED_ROOT` (lexical_declaration, line 8)
- `slash` (lexical_declaration, line 11)
- `cached` (lexical_declaration, line 19, exported)
- `dir` (lexical_declaration, line 23, exported)
- `out` (lexical_declaration, line 35, exported)
- `rel` (lexical_declaration, line 48, exported)
- `found` (lexical_declaration, line 56, exported)
- `root` (lexical_declaration, line 66, exported)

## Contained in

- [core/resolvers](https://banes-lab.com/anatomy/quality/folder-quality-core-resolvers.md)

## Uses

- [core/converters/filename.converter.ts](https://banes-lab.com/source/quality/core/converters/filename.converter.ts.md)

## Used by

- [core/loaders/coverage.loader.ts](https://banes-lab.com/source/quality/core/loaders/coverage.loader.ts.md)
- [core/quality/eslint/no-platform-coupling.eslint.rule.ts](https://banes-lab.com/source/quality/core/quality/eslint/no-platform-coupling.eslint.rule.ts.md)
- [core/quality/eslint/no-wildcard-exports.eslint.rule.ts](https://banes-lab.com/source/quality/core/quality/eslint/no-wildcard-exports.eslint.rule.ts.md)
- [core/quality/eslint/require-central-config.eslint.rule.ts](https://banes-lab.com/source/quality/core/quality/eslint/require-central-config.eslint.rule.ts.md)
- [core/quality/eslint/require-private-package.eslint.rule.ts](https://banes-lab.com/source/quality/core/quality/eslint/require-private-package.eslint.rule.ts.md)

## Linked from

- [core/converters](https://banes-lab.com/anatomy/quality/folder-quality-core-converters.md)
- [core/loaders](https://banes-lab.com/anatomy/quality/folder-quality-core-loaders.md)
- [core/quality/eslint](https://banes-lab.com/anatomy/quality/folder-quality-core-quality-eslint.md)
- [core/resolvers](https://banes-lab.com/anatomy/quality/folder-quality-core-resolvers.md)

## Source

```typescript
import { dirOf, forwardSlashed } from "#core/converters/filename.converter";
import { ROOT } from "@ssot/paths/anchor";
import fs from "node:fs";
import path from "node:path";

const PACKAGE_MANIFEST = "package.json";
const PACKAGE_ROOT_CACHE = new Map<string, string | null>();
const NORMALIZED_ROOT = forwardSlashed(ROOT);

const parentDir = function parentDir(dir: string): string | null {
    const slash = dir.lastIndexOf("/");
    if (dir === NORMALIZED_ROOT || slash <= 0) {
        return null;
    }
    return dir.slice(0, slash);
};

export const findPackageRoot = function findPackageRoot(startDir: string): string | null {
    const cached = PACKAGE_ROOT_CACHE.get(startDir);
    if (typeof cached === "string") {
        return cached;
    }
    let dir: string | null = startDir;
    while (dir !== null) {
        if (fs.existsSync(path.join(dir, PACKAGE_MANIFEST))) {
            break;
        }
        dir = parentDir(dir);
    }
    PACKAGE_ROOT_CACHE.set(startDir, dir);
    return dir;
};

export const enclosingPackages = function enclosingPackages(pkg: string): string[] {
    const out: string[] = [];
    let found = findPackageRoot(parentDir(pkg) ?? NORMALIZED_ROOT);
    while (found !== null && found !== NORMALIZED_ROOT) {
        out.push(found);
        found = findPackageRoot(parentDir(found) ?? NORMALIZED_ROOT);
    }
    return out;
};

export const relFromRoot = function relFromRoot(filename: string): string | null {
    if (filename.length === 0) {
        return null;
    }
    const rel = forwardSlashed(path.relative(ROOT, forwardSlashed(filename)));
    return rel.startsWith("..") || rel.length === 0 ? null : rel;
};

export const packageRootOf = function packageRootOf(filename: string): string | null {
    if (relFromRoot(filename) === null) {
        return null;
    }
    const found = findPackageRoot(dirOf(filename));
    return found === null || found === NORMALIZED_ROOT ? null : found;
};

export const packageRelOf = function packageRelOf(filename: string): string | null {
    const root = packageRootOf(filename);
    return root === null ? null : root.slice(NORMALIZED_ROOT.length + 1);
};

export const withinPackage = function withinPackage(filename: string): string | null {
    const root = packageRootOf(filename);
    return root === null ? null : forwardSlashed(filename).slice(root.length + 1);
};
```
