import type { OASDocument } from 'oas/dist/rmoas.types';
import Fetcher from '../fetcher';
export default class Storage {
    static dir: string;
    static lockfile: false | Lockfile;
    /**
     * This is the original source that the file came from (relative/absolute file path, URL, ReadMe
     * registry UUID, etc.).
     */
    source: string;
    identifier: string;
    fetcher: Fetcher;
    constructor(source: string, identifier?: string);
    static getLockfilePath(): string;
    static getAPIsDir(): string;
    static setStorageDir(dir?: string): void;
    /**
     * Reset the state of the entire storage system.
     *
     * This will completely destroy the contents of the `.api/` directory!
     */
    static reset(): Promise<void>;
    static getDefaultLockfile(): Lockfile;
    static generateIntegrityHash(definition: OASDocument): string;
    static getLockfile(): Lockfile;
    static isInLockFile(search: {
        identifier?: string;
        source?: string;
    }): false | LockfileAPI;
    setIdentifier(identifier: string): void;
    /**
     * Determine if the current spec + identifier we're working with is already in the lockfile.
     */
    isInLockfile(): boolean;
    /**
     * Retrieve the lockfile record for the current spec + identifier if it exists in the lockfile.
     */
    getFromLockfile(): LockfileAPI;
    getIdentifierStorageDir(): string;
    getAPIDefinition(): any;
    saveSourceFiles(files: Record<string, string>): Promise<unknown>;
    load(): Promise<OASDocument>;
    /**
     * @example <caption>Storage directory structure</caption>
     * .api/
     * ├── api.json             // The `package-lock.json` equivalent that records everything that's
     * |                        // installed, when it was installed, what the original source was,
     * |                        // and what version of `api` was used.
     * └── apis/
     *     ├── readme/
     *     |   ├── node_modules/
     *     │   ├── index.js     // We may offer the option to export a raw TS file for folks who want
     *     |   |                // that, but for now it'll be a compiled JS file.
     *     │   ├── index.d.ts   // All types for their SDK, ready to use in an IDE.
     *     │   |── openapi.json
     *     │   └── package.json
     *     └── petstore/
     *         ├── node_modules/
     *         ├── index.js
     *         ├── index.d.ts
     *         ├── openapi.json
     *         └── package.json
     *
     * @param spec
     */
    save(spec: OASDocument): OASDocument;
}
export interface Lockfile {
    /**
     * The `api.json` schema version. This will only ever change if we introduce breaking changes to
     * this store.
     */
    version: '1.0';
    apis: LockfileAPI[];
}
export interface LockfileAPI {
    /**
     * A unique identifier of the API. This'll be used to do requires on `@api/<identifier>` and also
     * where the SDK code will be located in `.api/apis/<identifier>`.
     *
     * @example petstore
     */
    identifier: string;
    /**
     * The original source that was used to generate the SDK with.
     *
     * @example https://raw.githubusercontent.com/readmeio/oas-examples/main/3.0/json/petstore-simple.json
     * @example ./petstore.json
     * @example @developers/v2.0#nysezql0wwo236
     */
    source: string;
    /**
     * An integrity hash that will be used to determine on `npx api update` calls if the API has
     * changed since the SDK was last generated.
     *
     * @example sha512-ld+djZk8uRWmzXC+JYla1PTBScg0NjP/8x9vOOKRW+DuJ3NNMRjrpfbY7T77Jgnc87dZZsU49robbQfYe3ukug==
     */
    integrity: string;
    /**
     * The version of `api` that was used to install this SDK.
     *
     * @example 5.0.0
     */
    installerVersion: string;
}
