# core/adapters/release.adapter.ts

> 25 lines of code and 4 definitions.

Tree: Bane's Lab Deploy
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/deploy#file-deploy-core-adapters-release-adapter-ts
Source text: https://banes-lab.com/source/deploy/core/adapters/release.adapter.ts.txt

Listed in [core/adapters](https://banes-lab.com/api/source/deploy/core/adapters.md), after [core/adapters/package.adapter.ts](https://banes-lab.com/source/deploy/core/adapters/package.adapter.ts.md) and before [core/adapters/search.adapter.ts](https://banes-lab.com/source/deploy/core/adapters/search.adapter.ts.md).

## Definitions

- `packFolder` (lexical_declaration, line 6, exported)
- `args` (lexical_declaration, line 7, exported)
- `buildRelease` (lexical_declaration, line 19, exported)
- `child` (lexical_declaration, line 21, exported)

## Contained in

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

## Used by

- [core/steps/release.step.ts](https://banes-lab.com/source/deploy/core/steps/release.step.ts.md)

## Grounds

- [Adapter Pattern](https://banes-lab.com/records/architecture/adapter-pattern.md)

## Linked from

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

## Source

```typescript
import { ARCHIVE_BINARY, BUILD_ARGUMENTS, BUILD_BINARY } from "#configuration/constants/deployment.constants";
import { basename, dirname } from "node:path";
import { execFile, spawn } from "node:child_process";
import type { ChildExit } from "#types/deployment.types";

export const packFolder = async function packFolder(source: string, archive: string): Promise<void> {
    const args = ["-czf", basename(archive), "-C", source, "."];
    await new Promise<void>((resolve, reject) => {
        execFile(ARCHIVE_BINARY, args, { cwd: dirname(archive) }, (error) => {
            if (error instanceof Error) {
                reject(error);
                return;
            }
            resolve();
        });
    });
};

export const buildRelease = async function buildRelease(member: string): Promise<ChildExit> {
    return new Promise<ChildExit>((resolve, reject) => {
        const child = spawn(BUILD_BINARY, [...BUILD_ARGUMENTS, member], { stdio: "inherit" });
        child.on("error", reject);
        child.on("exit", (code, signal) => {
            resolve({ code, signal });
        });
    });
};
```
