# core/converters/snapshot.converter.ts

> 30 lines of code and 8 definitions.

Tree: Project Scripts
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/scripts#file-scripts-core-converters-snapshot-converter-ts
Source text: https://banes-lab.com/source/scripts/core/converters/snapshot.converter.ts.txt

Listed in [core/converters](https://banes-lab.com/api/source/scripts/core/converters.md), after [core/converters/route.converter.ts](https://banes-lab.com/source/scripts/core/converters/route.converter.ts.md) and before [core/converters/viewport.converter.ts](https://banes-lab.com/source/scripts/core/converters/viewport.converter.ts.md).

## Definitions

- `CLICK_PAIR` (lexical_declaration, line 7)
- `CLICK_SEPARATOR` (lexical_declaration, line 8)
- `readOptions` (lexical_declaration, line 10, exported)
- `address` (lexical_declaration, line 11, exported)
- `out` (lexical_declaration, line 12, exported)
- `log` (lexical_declaration, line 13, exported)
- `click` (lexical_declaration, line 17, exported)
- `spot` (lexical_declaration, line 18, exported)

## Contained in

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

## Source

```typescript
import { flagValue, hasFlag, numberFlag } from "@govlab/argv";
import type { ParsedArgv } from "@govlab/argv";
import { SNAPSHOT_DEFAULTS } from "#configuration/configs/snapshot.config";
import type { SnapshotOptions } from "#types/snapshot.types";
import { resolve } from "node:path";

const CLICK_PAIR = 2;
const CLICK_SEPARATOR = ",";

export const readOptions = function readOptions(argv: ParsedArgv): SnapshotOptions | null {
    const address = flagValue(argv, "--url");
    const out = flagValue(argv, "--out");
    const log = flagValue(argv, "--log");
    if (address === undefined || (out === undefined && log === undefined)) {
        return null;
    }
    const click = flagValue(argv, "--click");
    const spot = click === undefined ? null : click.split(CLICK_SEPARATOR).map(Number);
    return {
        browser: flagValue(argv, "--browser") ?? null,
        clickAfterMs: numberFlag(argv, "--click-after", SNAPSHOT_DEFAULTS.clickAfterMs),
        clickAt: spot?.length === CLICK_PAIR && spot.every((value) => Number.isFinite(value)) ? spot : null,
        height: numberFlag(argv, "--height", SNAPSHOT_DEFAULTS.height),
        log: log === undefined ? null : resolve(log),
        out: out === undefined ? null : resolve(out),
        settleMs: numberFlag(argv, "--settle", SNAPSHOT_DEFAULTS.settleMs),
        software: !hasFlag(argv, "--gpu"),
        timeoutMs: numberFlag(argv, "--timeout", SNAPSHOT_DEFAULTS.timeoutMs),
        url: address,
        width: numberFlag(argv, "--width", SNAPSHOT_DEFAULTS.width),
    };
};
```
