diff --git a/packages/pulumi/src/constants.ts b/packages/pulumi/src/constants.ts new file mode 100644 index 00000000000..5fd254b181f --- /dev/null +++ b/packages/pulumi/src/constants.ts @@ -0,0 +1 @@ +export const DEFAULT_PROD_ENV_NAMES = ["prod", "production"]; diff --git a/packages/pulumi/src/createPulumiApp.ts b/packages/pulumi/src/createPulumiApp.ts index 1d11bdceda2..64c56b477be 100644 --- a/packages/pulumi/src/createPulumiApp.ts +++ b/packages/pulumi/src/createPulumiApp.ts @@ -23,6 +23,7 @@ import { } from "~/types"; import { PulumiAppRemoteResource } from "~/PulumiAppRemoteResource"; import cloneDeep from "lodash/cloneDeep"; +import { DEFAULT_PROD_ENV_NAMES } from "./constants"; export function createPulumiApp>( params: CreatePulumiAppParams @@ -64,6 +65,10 @@ export function createPulumiApp>( create: params.config || {}, run: {} }, + env: { + name: "", + isProduction: false + }, decorateProgram: cb => { programDecorators.push(cb); }, @@ -71,6 +76,16 @@ export function createPulumiApp>( async run(config) { app.params.run = config; + // Add environment-related variables. + const productionEnvironments = + app.params.create.productionEnvironments || DEFAULT_PROD_ENV_NAMES; + const isProduction = productionEnvironments.includes(app.params.run.env); + + app.env = { + name: app.params.run.env, + isProduction + }; + const programOutput = programDecorators.reduce>>( (program, decorator) => { return app => decorator(program, app); diff --git a/packages/pulumi/src/types.ts b/packages/pulumi/src/types.ts index 574f3253386..55c49274411 100644 --- a/packages/pulumi/src/types.ts +++ b/packages/pulumi/src/types.ts @@ -25,6 +25,7 @@ export interface CreatePulumiAppParams; } @@ -49,6 +50,16 @@ export interface PulumiApp> { create: CreateConfig; run: RunConfig; }; + env: { + name: string; + + // Set to `true` if the environment into which the application is being deployed + // is considered a production environment. The list of environment names + // that are considered production environments is defined via the + // `productionEnvironments` parameter. Learn more: + // https://www.webiny.com/docs/infrastructure/basics/modify-cloud-infrastructure#defining-multiple-production-environments + isProduction: boolean; + }; run(params: RunConfig): Record; @@ -62,19 +73,23 @@ export interface PulumiApp> { addRemoteResource(name: string, getter: () => Promise): PulumiAppRemoteResource; addOutput(name: string, output: T): void; + addOutputs(outputs: Record): void; addModule(def: PulumiAppModuleDefinition): TModule; + addModule( def: PulumiAppModuleDefinition, config: TConfig ): TModule; getModule(def: PulumiAppModuleDefinition): TModule; + getModule( def: PulumiAppModuleDefinition, opts: { optional: false } ): TModule; + getModule( def: PulumiAppModuleDefinition, opts: { optional: true }