import type { Artifacts, EnvVars, GitlabJobImage } from "../types";
import type { Services } from "../types/gitlab-ci-yml";
import type { CatladderJob, CatladderJobCache } from "../types/jobs";
export type CacheConfigAdvanced = Omit<CatladderJobCache, "paths" | "key"> & {
    /**
     * if you set a key, the cache is scoped to the key. Be aware that there is a limit in gitlab of 4 caches.
     *
     * see https://gitlab.com/gitlab-org/gitlab/-/issues/421962
     */
    key: Required<CatladderJobCache>["key"];
    /**
     * whether the cache is scoped to the context (component or workspace) or the build directory.
     *
     * defaults to context
     */
    scope?: "context" | "buildDir" | "global";
} & CacheConfigSimple;
export type CacheConfigSimple = {
    /**
     * paths to cache. All Paths are relative to the context dir.
     */
    paths: string[];
    /**
     * whether paths are relative to the base dir. defaults to relative.
     */
    pathMode?: "relative" | "absolute";
    /**
     * custom base dir
     */
    baseDir?: string;
};
export type CacheConfig = CacheConfigSimple | CacheConfigAdvanced;
export type BuildConfigArtifactsReports = {
    /**
     * The junit report collects JUnit report format XML files.
     * The collected Unit test reports upload to GitLab as an artifact.
     * Paths are prefixed with component's root folder.
     * eg. `["dist/test-results/TEST-*.xml", "dist/rspec.xml", ...]`
     */
    junit?: string[];
};
export type WithCacheConfig = {
    cache?: CacheConfig | CacheConfig[];
    /**
     * customize cache for the job
     *
     * @deprecated use cache
     */
    jobCache?: CatladderJob["cache"];
};
export type TestJobCustom = {
    command?: string | string[];
    jobImage?: GitlabJobImage;
    /**
     * additional CI/CD artifacts reports,
     * use to display information in merge requests, pipeline views and security dashboards.
     */
    artifactsReports?: BuildConfigArtifactsReports;
    /**
     * GitLab {@link Artifacts} configuration.
     *
     * {@link TestJobCustom.artifacts}.reports.junit is merged with {@link TestJobCustom.artifactsReports} in case both given.
     */
    artifacts?: Artifacts;
};
export type BuildConfigBase = {
    /**
     * command to run on the image to start the app (e.g. yarn start)
     */
    startCommand?: string;
    /**
     * vars that only exist in the build jobs.
     * Can curently not reference other variables from other components
     */
    jobVars?: EnvVars;
    /**
     * additional vars only for the runner.
     * Also if you use services: that require env vars, you need to set them here.
     *
     */
    runnerVariables?: Record<string, string>;
    /**
     * define the build command
     */
    buildCommand?: string | string[] | null;
    /**
     * customize lint, set false to disable
     */
    lint?: false | TestJobCustom;
    /**
     * customize test, set false to disable
     */
    test?: false | TestJobCustom;
    /**
     * customize audit, set false to disable
     */
    audit?: false | TestJobCustom;
    /**
     * additional paths for artifacts,
     * by default "dist" and ".next" are allways included
     */
    artifactsPaths?: string[];
    /**
     * additional CI/CD artifacts reports,
     * use to display information in merge requests, pipeline views and security dashboards.
     */
    artifactsReports?: BuildConfigArtifactsReports;
    /**
     * customize cache for the job
     *
     * @deprecated use cache
     */
    jobCache?: CatladderJob["cache"];
    /**
     * tags for the underlying job runner (e.g gitlab)
     */
    jobTags?: string[];
    /**
     * custom image to use
     */
    jobImage?: GitlabJobImage;
} & WithCacheConfig;
export type BuildConfigNodeBase = BuildConfigBase & {
    /**
     * runs a command after yarn install. postinstall in package.json won't work for yarn plug and play.
     * the command will be invoked in the component dir.
     */
    postInstall?: string | string[];
};
export type BuildConfigNode = {
    type: "node";
    docker?: Omit<BuildConfigDockerBuiltInNode, "type"> | BuildConfigDocker;
} & BuildConfigNodeBase;
export type BuildConfigNodeStatic = BuildConfigNodeBase & {
    /**
     * @deprecated use `type: "node", startCommand: "", docker: { type: "nginx" }` instead
     */
    type: "node-static";
    startCommand?: never;
    docker?: Omit<BuildConfigDockerBuiltInNgninx, "type"> | BuildConfigDocker;
};
export type BuildConfigMeteor = BuildConfigNodeBase & {
    type: "meteor";
    /**
     * whether to run yarn install inside the source folder in the docker image.
     * This is only required if you have custom scripts in your image
     */
    installScripts?: boolean;
    docker?: Omit<BuildConfigDockerBuiltInMeteor, "type"> | BuildConfigDocker;
};
export type BuildConfigNodeLike = BuildConfigNode | BuildConfigNodeStatic | BuildConfigStorybook | BuildConfigMeteor;
type BuildConfigDockerWithAdditions = {
    /**
     * Custom Dockerfile lines integrated in the generated Dockerfile before the standard build steps.
     *
     */
    additionsBegin?: string[];
    /**
     * Custom Dockerfile lines integrated in the generated Dockerfile after the standard build steps.
     *
     */
    additionsEnd?: string[];
};
type BuildConfigDockerBuiltInNode = {
    type: "node";
} & BuildConfigDockerWithAdditions;
type BuildConfigDockerBuiltInMeteor = {
    type: "meteor";
} & BuildConfigDockerWithAdditions;
type BuildConfigDockerBuiltInNgninx = {
    /**
     * use the built-in nginx image for simple static apps
     */
    type: "nginx";
} & BuildConfigDockerWithAdditions;
type BuildConfigDockerBuiltIn = BuildConfigDockerBuiltInNgninx | BuildConfigDockerBuiltInNode | BuildConfigDockerBuiltInMeteor;
type BuildConfigDockerCustom = {
    /**
     * custom docker build, expect that a Dockerfile in your directory
     */
    type: "custom";
    /**
     * where to run the docker build, defaults to the root of the repo.
     *
     * Depending on your Dockerfile you may want to change it to "component"
     */
    buildContextLocation?: "root" | "component";
};
export type BuildConfigDocker = BuildConfigDockerBuiltIn | BuildConfigDockerCustom;
export type BuildConfigCustom = Omit<BuildConfigBase, "lint" | "test" | "audit"> & {
    type: "custom";
    jobImage: GitlabJobImage;
    /**
     * {@link Services}s used in lint, test, audit, and build jobs.
     */
    jobServices?: Services;
    docker: BuildConfigDocker;
    /**
     * custom lint, disabled when not set
     */
    lint?: TestJobCustom;
    /**
     * custom test, disabled when not set
     */
    test?: TestJobCustom;
    /**
     * custom audit, disabled when not set
     */
    audit?: TestJobCustom;
    /**
     * custom sbom (software bill of materials), set false to disable
     */
    sbom?: false | {
        /**
         * needs to create a file at `/__sbom.json` in CycloneDX format
         */
        command: string | string[];
        jobImage: GitlabJobImage;
    };
};
export type BuildConfigRails = BuildConfigBase & {
    type: "rails";
    test?: Pick<BuildConfigBase, "test"> & {
        /**
         * The container image to use as the database.
         * Currently only supports PostgreSQL.
         * Defaults to `docker.io/postgres:latest`
         */
        databaseImage?: string;
    };
    /**
     * The [Cloud Native Buildpacks](https://buildpacks.io/) builder configuration.
     *
     * Only applies when there is no `Dockerfile`.
     */
    cnbBuilder?: {
        /**
         * The Cloud Native Buildpacks builder image to use.
         * See e.g. https://github.com/heroku/builder or others.
         * Default: heroku/buildpacks:20
         */
        image?: string;
        /**
         * The version of the Cloud Native Buildpacks pack command to use.
         * See https://buildpacks.io/docs/tools/pack/
         * Default: 0.28.0
         */
        packVersion?: string;
        /**
         * Additional command arguments passed to the pack command.
         * See https://buildpacks.io/docs/tools/pack/
         */
        packExtraArgs?: string[];
        /**
         * Variables needed for Bundler and Rails asset precompilation.
         *
         * Specify a key with the value `undefined` to inherit it from the EnvVars.
         *
         * See https://github.com/rails/rails/issues/32947
         */
        buildVars?: Record<string, string | undefined>;
    };
};
export type BuildConfigStorybook = BuildConfigNodeBase & {
    /**
     * @deprecated use type: "node" and docker: { type: "nginx" } instead
     */
    type: "storybook";
    startCommand?: never;
};
export type BuildConfigFromWorkspace = {
    from: string;
    docker?: BuildConfigDocker;
    startCommand?: string;
    /**
     * additional paths for artifacts,
     * by default "dist" and ".next" are allways included
     */
    artifactsPaths?: string[];
} & WithCacheConfig;
export type BuildConfigStandalone = BuildConfigNode | BuildConfigNodeStatic | BuildConfigStorybook | BuildConfigMeteor | BuildConfigCustom | BuildConfigRails;
export type BuildConfig = BuildConfigFromWorkspace | BuildConfigStandalone;
export type BuildConfigStandaloneType = BuildConfigStandalone["type"];
export type BuildConfigGeneric<T extends BuildConfigStandaloneType> = Extract<BuildConfig, {
    type: T;
}>;
export declare const isStandaloneBuildConfig: (t: BuildConfig | false) => t is BuildConfigStandalone;
export declare const isOfBuildType: <T extends ("custom" | "rails" | "node" | "node-static" | "meteor" | "storybook")[]>(t: BuildConfig, ...types: T) => t is Extract<BuildConfigNode, {
    type: T[number];
}> | Extract<BuildConfigNodeStatic, {
    type: T[number];
}> | Extract<BuildConfigStorybook, {
    type: T[number];
}> | Extract<BuildConfigMeteor, {
    type: T[number];
}> | Extract<BuildConfigCustom, {
    type: T[number];
}> | Extract<BuildConfigRails, {
    type: T[number];
}>;
export type WorkspaceBuildConfigBase = {
    dir?: string;
    /**
     * customize lint, set false to disable
     */
    lint?: false | TestJobCustom;
    /**
     * customize test, set false to disable
     */
    test?: false | TestJobCustom;
    /**
     * customize audit, set false to disable
     */
    audit?: false | TestJobCustom;
    /**
     * additional vars only for the runner.
     * Also if you use services: that require env vars, you need to set them here.
     *
     */
    runnerVariables?: Record<string, string>;
    /**
     * additional CI/CD artifacts reports,
     * use to display information in merge requests, pipeline views and security dashboards.
     */
    artifactsReports?: BuildConfigArtifactsReports;
    jobImage?: GitlabJobImage;
    /**
     * tags for the underlying job runner (e.g gitlab)
     */
    jobTags?: string[];
} & WithCacheConfig;
export type WorkspaceBuildConfigNode = {
    type: "node";
    buildCommand?: string | string[];
} & WorkspaceBuildConfigBase;
export type WorkspaceBuildConfig = WorkspaceBuildConfigNode;
export {};
