@catladder/cli
Version:
Panter cli tool for cloud CI/CD and DevOps
198 lines (197 loc) • 6.63 kB
TypeScript
import type { BuildConfig } from "../build/types";
import type { DeployConfig } from "../deploy/types";
import type { CatladderJob } from "./jobs";
import type { ComponentContext } from "./context";
import type { PartialDeep } from "./utils";
import type { PipelineType, WorkspaceBuildConfig } from "..";
import type { AgentConfig } from "./agent";
import type { Hooks } from "./hooks";
import type { ReleaseConfig } from "./release";
export declare const ALL_PIPELINE_TRIGGERS: readonly ["mainBranch", "mr", "taggedRelease"];
export type PipelineTrigger = (typeof ALL_PIPELINE_TRIGGERS)[number];
/**
* all env types with their trigger.
* Each env type has a default env with the same name which is always included
*/
export declare const ENV_TYPES: {
readonly dev: {
readonly triggers: readonly ["mainBranch"];
};
readonly review: {
readonly triggers: readonly ["mr"];
};
readonly stage: {
readonly triggers: readonly ["taggedRelease"];
};
readonly prod: {
readonly triggers: readonly ["taggedRelease"];
};
readonly local: {
readonly triggers: readonly [];
};
};
/**
*
* @param trigger a trigger
* @returns array of env types for that trigger. this is also the list of default envs
*/
export declare const getEnvTypesByTrigger: (trigger: PipelineTrigger) => ("stage" | "dev" | "review" | "prod" | "local")[];
export declare const DEFAULT_ENVS: string[];
export declare const DEFAULT_ENV_TYPES: ("stage" | "dev" | "review" | "prod" | "local")[];
export type EnvType = keyof typeof ENV_TYPES;
export declare const isKnowEnvType: (env: string) => env is "stage" | "dev" | "review" | "prod" | "local";
export type EnvVars = {
/**
* public env vars (means: they are checked in the repo).
*
* You can reuse env vars in other vars using ${OTHER_VAR}.
* You an reuse other public env vars, or secret env vars
*
* EXAMPLE: A_VAR: "the other var is ${OTHER_VAR}"
*
* You can reuse vars from other components in the same project using ${componentName:variableName}
* EXAMPLE: A_VAR: "the other var is ${api:OTHER_VAR}"
*/
public?: Record<string, any>;
/**
* secret env vars. These vars can be managed with catladder/cli
*/
secret?: string[];
};
export type DefaultEnvConfig = {
/**
* how the app is deployed
*/
deploy: DeployConfig | false;
/**
* how the app is built and its runtime
*/
build: BuildConfig | false;
/**
* environment variables
*/
vars?: EnvVars;
};
export type DevLocalEnvConfig = {
vars?: EnvVars;
port?: number;
};
type AddOverrideFunction<T> = {
[K in keyof T]: T[K] | ((defaultValue: T[K]) => T[K]) | (T[K] extends Record<string, unknown> | undefined ? AddOverrideFunction<T[K]> : never);
};
type EnvConfigWithOverride<E extends EnvType = EnvType> = AddOverrideFunction<EnvConfig<E>>;
export type EnvConfig<E extends EnvType = EnvType> = {
/**
* type of the env (stage, prod, review, dev)
*/
type?: E;
/**
* host that is used. If not set, a "canonical" url is created
*/
host?: string;
} & PartialDeep<DefaultEnvConfig>;
export type EnvConfigWithComponent = EnvConfig<EnvType> & ComponentConfig;
export type CustomEnv = EnvConfigWithOverride & {
type: EnvType;
};
export type Env<C extends ConfigProps = never> = {
/**
* local is a special env that is only used in local development
*/
local?: AddOverrideFunction<DevLocalEnvConfig>;
dev?: EnvConfigWithOverride<"dev"> | false;
stage?: EnvConfigWithOverride<"stage"> | false;
review?: EnvConfigWithOverride<"review"> | false;
prod?: EnvConfigWithOverride<"prod"> | false;
} & Record<C["CustomEnvs"], CustomEnv> & Record<string, any>;
export type ComponentConfig<C extends ConfigProps = never> = {
/**
* specify environment configurations
*/
env?: Env<C>;
/**
* the directory of the component (e.g. where the package.json or similar is located). You can set "." if you only have one app.
*/
dir: string;
/**
* add custom jobs. Can be an array or a function that receives the context and returns an array of jobs.
* For convenience, all env vars are injectd as variables
*
* Please raise an issue on https://git.panter.ch/catladder/catladder
* to let us know about why you need to use custom jobs.
* This feedback will help us to generalize use cases
*/
customJobs?: CatladderJob[] | ((context: Omit<ComponentContext, "customJobs">) => CatladderJob[]);
/**
* whether to create a .env
*
* Be careful, this will overwrite any existing .env file!
*
* if set to true it will create .env locally and during build.
* Be careful: the .env file usually ends up in the build artifacts.
* Use this for apps and clients where env does not contain any secrets
*
*
* if set to "local" it will only create .env file locally.
* Use this in combination with @dotenvx/dotenvx or node 20 to start apps locally with .env files
* During build and runtime, it relies on the env vars set in the environment
*
* @defaultValue true
*
*/
dotEnv?: boolean | "local";
/**
* whether to create a env.d.ts localy and during build jobs
*
* @defaultValue true
*/
envDTs?: boolean;
} & DefaultEnvConfig;
export type ConfigProps = {
CustomEnvs: string;
};
export type Config<C extends ConfigProps = never> = {
/**
* the pipeline type to generate, defaults to gitlab
*/
pipelineType?: PipelineType;
/**
* name of the customer or group
*/
customerName: string;
/**
* name of the app / project
*/
appName: string;
/**
* if a env does not define a host, it will generate a canonical one (e.g. for review, dev and stage).
* This prop specifies the domain that is used for these urls.
*
*/
domainCanonical?: string;
agents?: Record<string, AgentConfig>;
builds?: Record<string, WorkspaceBuildConfig>;
/**
* components (sub apps)
*/
components: Record<string, ComponentConfig<C>>;
/**
* additional meta data (only for organisational purposes)
*/
meta?: {
labels?: Record<string, string>;
};
/**
* additional vars only for the runner in all jobs.
*/
runnerVariables?: Record<string, string>;
/**
* hook into catladder generation
*/
hooks?: Hooks;
/**
* configure tagged releases
*/
releases?: ReleaseConfig;
};
export {};