# test.govlab/docs/core/loaders/package.loader.test.ts

> 31 lines of code and 0 definitions.

Tree: Codebase Testing
Language: typescript
Canonical: https://banes-lab.com/anatomy/testing#file-testing-test-govlab-docs-core-loaders-package-loader-test-ts
Source text: https://banes-lab.com/source/testing/test.govlab/docs/core/loaders/package.loader.test.ts.txt

Listed in [test.govlab/docs/core/loaders](https://banes-lab.com/api/source/testing/test.govlab/docs/core/loaders.md), after [test.govlab/docs/core/loaders/manifest.loader.test.ts](https://banes-lab.com/source/testing/test.govlab/docs/core/loaders/manifest.loader.test.ts.md) and before [test.govlab/docs/core/loaders/plugin.loader.test.ts](https://banes-lab.com/source/testing/test.govlab/docs/core/loaders/plugin.loader.test.ts.md).

## Contained in

- [test.govlab/docs/core/loaders](https://banes-lab.com/anatomy/testing/folder-testing-test-govlab-docs-core-loaders.md)

## Source

```typescript
import { afterEach, beforeEach, describe, expect, it } from "vitest";
import { membersWithoutManifest, workspaceMembers } from "@govlab/docs/core/loaders/package.loader.ts";
import { mkdirSync, mkdtempSync, rmSync } from "node:fs";
import { join } from "node:path";
import { tmpdir } from "node:os";
import { writeVerbatim } from "@govlab/canonical-write";

const state = { root: "" };

const fixture = function fixture(dir: string, name: string, content: string): void {
    const target = join(state.root, ...dir.split("/"));
    mkdirSync(target, { recursive: true });
    writeVerbatim(join(target, name), content);
};

beforeEach(() => {
    state.root = mkdtempSync(join(tmpdir(), "govlab-workspaces-"));
    fixture("", "package.json", '{ "name": "root", "workspaces": ["apps/*", "tools/lint"] }');
    for (const member of ["apps/web", "apps/api", "tools/lint"]) {
        fixture(member, "package.json", '{ "name": "member" }');
    }
    fixture("apps/web", "_manifest.json", '{ "label": "member" }');
    fixture("tools/lint", "_manifest.json", '{ "label": "member" }');
    mkdirSync(join(state.root, "apps", "notes"), { recursive: true });
});

afterEach(() => {
    rmSync(state.root, { force: true, recursive: true });
});

describe("workspaceMembers and membersWithoutManifest", () => {
    it("expand the declared globs to folders with a package file, and name those without a manifest", () => {
        expect(workspaceMembers(state.root)).toStrictEqual(["apps/api", "apps/web", "tools/lint"]);
        expect(membersWithoutManifest(state.root)).toStrictEqual(["apps/api"]);
    });
});
```
