# core/adapters/remote.adapter.ts

> 33 lines of code and 6 definitions.

Tree: Code Parse
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/code-parse#file-code-parse-core-adapters-remote-adapter-ts
Source text: https://banes-lab.com/source/code-parse/core/adapters/remote.adapter.ts.txt

Listed in [core/adapters](https://banes-lab.com/api/source/code-parse/core/adapters.md), before [core/adapters/shell.adapter.ts](https://banes-lab.com/source/code-parse/core/adapters/shell.adapter.ts.md).

## Definitions

- `fetchNpm` (lexical_declaration, line 16)
- `fetchPackageRoot` (lexical_declaration, line 27)
- `fetchGit` (lexical_declaration, line 22)
- `firstTarball` (lexical_declaration, line 8)
- `fetchGrammarPackage` (lexical_declaration, line 32, exported)
- `tarball` (lexical_declaration, line 9)

## Contained in

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

## Uses

- [core/adapters/shell.adapter.ts](https://banes-lab.com/source/code-parse/core/adapters/shell.adapter.ts.md)

## Linked from

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

## Source

```typescript
import { CLONED_FOLDER, PACKED_FOLDER, TARBALL_SUFFIX } from "#configuration/constants/grammar.constants";
import type { FetchOutcome, GrammarSource } from "#types/grammar.types";
import { mkdirSync, readdirSync } from "node:fs";
import { NO_TARBALL } from "#configuration/strings/grammar.strings";
import { join } from "node:path";
import { runCommand } from "#core/adapters/shell.adapter";

const firstTarball = function firstTarball(dir: string): string {
    const tarball = readdirSync(dir).find((name) => name.endsWith(TARBALL_SUFFIX));
    if (typeof tarball !== "string") {
        throw new TypeError(NO_TARBALL);
    }
    return tarball;
};

const fetchNpm = function fetchNpm(pkg: string, dir: string): string {
    runCommand("npm", ["pack", pkg], dir);
    runCommand("tar", ["xzf", firstTarball(dir)], dir);
    return join(dir, PACKED_FOLDER);
};

const fetchGit = function fetchGit(repo: string, dir: string): string {
    runCommand("git", ["clone", "--depth", "1", repo, CLONED_FOLDER], dir);
    return join(dir, CLONED_FOLDER);
};

const fetchPackageRoot = function fetchPackageRoot(source: GrammarSource, dir: string): string {
    mkdirSync(dir, { recursive: true });
    return typeof source.git === "string" ? fetchGit(source.git, dir) : fetchNpm(source.npm ?? "", dir);
};

export const fetchGrammarPackage = function fetchGrammarPackage(source: GrammarSource, dir: string): FetchOutcome {
    try {
        return { root: fetchPackageRoot(source, dir) };
    } catch (error) {
        return { error: error instanceof Error ? error.message : String(error) };
    }
};
```
