# core/factories/server.factory.ts

> 46 lines of code and 5 definitions.

Tree: Bane's Lab Build Scripts
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/build-scripts#file-build-scripts-core-factories-server-factory-ts
Source text: https://banes-lab.com/source/build-scripts/core/factories/server.factory.ts.txt

Listed in [core/factories](https://banes-lab.com/api/source/build-scripts/core/factories.md), after [core/factories/reference.factory.ts](https://banes-lab.com/source/build-scripts/core/factories/reference.factory.ts.md) and before [core/factories/step.factory.ts](https://banes-lab.com/source/build-scripts/core/factories/step.factory.ts.md).

## Definitions

- `withModuleServer` (lexical_declaration, line 33, exported)
- `releaseServer` (lexical_declaration, line 26, exported)
- `VITE_CONFIG` (lexical_declaration, line 7)
- `devServers` (lexical_declaration, line 9, exported)
- `server` (lexical_declaration, line 37, exported)

## Contained in

- [core/factories](https://banes-lab.com/anatomy/build-scripts/folder-build-scripts-core-factories.md)

## Used by

- [core/coordinators/graph.coordinator.ts](https://banes-lab.com/source/build-scripts/core/coordinators/graph.coordinator.ts.md)
- [core/coordinators/link.coordinator.ts](https://banes-lab.com/source/build-scripts/core/coordinators/link.coordinator.ts.md)
- [core/coordinators/page.coordinator.ts](https://banes-lab.com/source/build-scripts/core/coordinators/page.coordinator.ts.md)

## Linked from

- [core/coordinators](https://banes-lab.com/anatomy/build-scripts/folder-build-scripts-core-coordinators.md)
- [core/factories](https://banes-lab.com/anatomy/build-scripts/folder-build-scripts-core-factories.md)

## Source

```typescript
import { SITE_SERVER_LABEL, SOCIAL_SERVER_LABEL } from "#configuration/strings/server.strings";
import { type ViteDevServer, createServer } from "vite";
import type { DevServer } from "#types/server.types";
import { absolutePath } from "@ssot/paths";
import { portOf } from "@ssot/secrets";

const VITE_CONFIG = "vite.config.ts";

export const devServers = function devServers(): readonly DevServer[] {
    return [
        {
            args: ["--host"],
            config: absolutePath("app.member", VITE_CONFIG),
            label: SITE_SERVER_LABEL,
            port: portOf("SITE_DEV_PORT"),
        },
        {
            args: [],
            config: absolutePath("app.social", VITE_CONFIG),
            label: SOCIAL_SERVER_LABEL,
            port: portOf("SOCIAL_DEV_PORT"),
        },
    ];
};

export const releaseServer = async function releaseServer(server: ViteDevServer): Promise<void> {
    for (const environment of Object.values(server.environments)) {
        environment.moduleGraph.invalidateAll();
    }
    await server.close();
};

export const withModuleServer = async function withModuleServer<Result>(
    root: string,
    work: (server: ViteDevServer) => Promise<Result>,
): Promise<Result> {
    const server = await createServer({
        appType: "custom",
        cacheDir: absolutePath("viteCache.modules"),
        configFile: false,
        logLevel: "error",
        root,
        server: { hmr: false, middlewareMode: true, ws: false },
    });
    try {
        return await work(server);
    } finally {
        await releaseServer(server);
    }
};
```
