Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
e217828
wip:1 (jp6ng)
adrians5j May 12, 2026
15312c8
Merge branch 'next' into adrian/pulumi-custom-domain-abstractions-202…
adrians5j May 12, 2026
a587dd1
chore: ai fix static analysis
adrians5j May 12, 2026
f35b727
wip:2 (7eqal)
adrians5j May 12, 2026
5f88496
Merge branch 'adrian/pulumi-custom-domain-abstractions-2026-05-12' of…
adrians5j May 12, 2026
a581ada
chore: ai fix static analysis
adrians5j May 12, 2026
550d7e8
Merge branch 'adrian/pulumi-custom-domain-abstractions-2026-05-12' of…
adrians5j May 12, 2026
a67e716
wip:5 (57tlf)
adrians5j May 12, 2026
59ae11f
wip:6 (icp34)
adrians5j May 12, 2026
615d580
Merge branch 'next' into adrian/pulumi-custom-domain-abstractions-202…
adrians5j May 13, 2026
6ab29c9
Merge branch 'adrian/pulumi-custom-domain-abstractions-2026-05-12' of…
adrians5j May 13, 2026
6d66ae2
wip:8 (fo4ct)
adrians5j May 13, 2026
33de54f
Merge remote-tracking branch 'refs/remotes/origin/next' into adrian/p…
adrians5j May 13, 2026
ec7dd14
wip:10 (9jpmz)
adrians5j May 13, 2026
8328dbf
wip:11 (a6l6r)
adrians5j May 13, 2026
f32fb6e
Merge branch 'next' into adrian/pulumi-custom-domain-abstractions-202…
adrians5j May 13, 2026
f50bf78
ci:run workflows
adrians5j May 13, 2026
0550775
Merge branch 'adrian/pulumi-custom-domain-abstractions-2026-05-12' of…
adrians5j May 13, 2026
c027fa6
Merge branch 'next' into adrian/pulumi-custom-domain-abstractions-202…
adrians5j May 13, 2026
4e4a445
Merge branch 'next' into adrian/pulumi-custom-domain-abstractions-202…
adrians5j May 13, 2026
6436edc
wip:15 (ybga9)
adrians5j May 14, 2026
6e24828
Merge branch 'adrian/pulumi-custom-domain-abstractions-2026-05-12' of…
adrians5j May 14, 2026
83a2dd8
wip:20 (13x3b)
adrians5j May 14, 2026
c680139
wip:21 (5alfe)
adrians5j May 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions extensions/MyAdminPulumiHandler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { Ui } from "webiny/infra";
import { AdminPulumi, SetAdminCustomDomains } from "webiny/infra/admin";

class MyAdminPulumiHandlerImpl implements AdminPulumi.Interface {
constructor(
private ui: Ui.Interface,
private setAdminCustomDomains: SetAdminCustomDomains.Interface
) {}

execute(app: any) {
this.setAdminCustomDomains.execute(app.resources.cloudfront, {
domains: ["webiny.adriaweb.xyz"],
sslMethod: "sni-only",
certificateArn:
"arn:aws:acm:us-east-1:674320871285:certificate/6c45daa6-a531-4ce8-97b0-477e77dc68f5"
});
this.ui.info("🔮 Executing MyAdminPulumiHandler with environment:", app.env);
}
}

export default AdminPulumi.createImplementation({
implementation: MyAdminPulumiHandlerImpl,
dependencies: [Ui, SetAdminCustomDomains]
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { createAbstraction } from "@webiny/project/abstractions/createAbstraction.js";
import type * as aws from "@pulumi/aws";
import type { PulumiAppResource } from "@webiny/pulumi";
import type { CustomDomainParams } from "~/pulumi/apps/customDomain.js";

export interface ISetAdminCustomDomains {
execute(
cloudfront: PulumiAppResource<typeof aws.cloudfront.Distribution>,
params: CustomDomainParams
): void;
}

export const SetAdminCustomDomains =
createAbstraction<ISetAdminCustomDomains>("SetAdminCustomDomains");

export namespace SetAdminCustomDomains {
export type Interface = ISetAdminCustomDomains;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { createAbstraction } from "@webiny/project/abstractions/createAbstraction.js";
import type * as aws from "@pulumi/aws";
import type { PulumiAppResource } from "@webiny/pulumi";
import type { CustomDomainParams } from "~/pulumi/apps/customDomain.js";

export interface ISetApiCustomDomains {
execute(
cloudfront: PulumiAppResource<typeof aws.cloudfront.Distribution>,
params: CustomDomainParams
): void;
}

export const SetApiCustomDomains = createAbstraction<ISetApiCustomDomains>("SetApiCustomDomains");

export namespace SetApiCustomDomains {
export type Interface = ISetApiCustomDomains;
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
export * from "./CorePulumi.js";
export * from "./ApiPulumi.js";
export * from "./AdminPulumi.js";
export * from "./SetAdminCustomDomains.js";
export * from "./SetApiCustomDomains.js";
1 change: 1 addition & 0 deletions packages/project-aws/src/exports/infra/admin.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export { AdminPulumi } from "~/abstractions/features/pulumi/AdminPulumi.js";
export { AdminStackOutputService as GetAdminStackOutput } from "~/abstractions/services/AdminStackOutputService.js";
export { SetAdminCustomDomains } from "~/abstractions/features/pulumi/SetAdminCustomDomains.js";
1 change: 1 addition & 0 deletions packages/project-aws/src/exports/infra/api.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export { ApiPulumi } from "~/abstractions/features/pulumi/ApiPulumi.js";
export { ApiStackOutputService as GetApiStackOutput } from "~/abstractions/services/ApiStackOutputService.js";
export { SetApiCustomDomains } from "~/abstractions/features/pulumi/SetApiCustomDomains.js";
10 changes: 10 additions & 0 deletions packages/project-aws/src/extensions/ProjectAws.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,16 @@ export const ProjectAws = () => {
<ProjectImplementation src={p("../features/InvokeLambdaFunction.js")} singleton />
<ProjectImplementation src={p("../features/ApiGqlClient.js")} singleton />

{/* Default custom domain services */}
<ProjectImplementation
src={p("../pulumi/features/SetAdminCustomDomains/DefaultSetAdminCustomDomains.js")}
singleton
/>
<ProjectImplementation
src={p("../pulumi/features/SetApiCustomDomains/DefaultSetApiCustomDomains.js")}
singleton
/>

<AdminAfterDeploy src={p("ProjectAws/UploadAdminAppToS3.js")} />

<ApiAfterDeploy src={p("ProjectAws/AutoInstall/AutoInstallAfterApiDeploy.js")} />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@ import { createReactPulumiApp } from "~/pulumi/apps/index.js";
import { getProjectSdk } from "@webiny/project";
import { AdminPulumi } from "~/abstractions/features/pulumi/index.js";
import { adminPulumi } from "~/pulumi/features/AdminPulumi/index.js";
import { AdminCustomDomains as adminCustomDomainsExt } from "~/pulumi/extensions/AdminCustomDomains.js";
import { withServiceManifest } from "~/pulumi/index.js";
import { AdminCustomDomains as adminCustomDomainsExt } from "~/pulumi/extensions/AdminCustomDomains.js";

export type AdminPulumiApp = ReturnType<typeof createReactPulumiApp>;

export const createAdminPulumiApp = async () => {
const sdk = await getProjectSdk();
const projectConfig = await sdk.getProjectConfig();

const baseApp = createReactPulumiApp({
name: "admin",
folder: "apps/admin",
Expand All @@ -20,22 +21,19 @@ export const createAdminPulumiApp = async () => {
const { domains, sslMethod, certificateArn } = adminDomains.params;
return {
domains,
sslSupportMethod: sslMethod,
acmCertificateArn: certificateArn
sslMethod,
certificateArn
};
}

return undefined;
},
pulumi: async app => {
// Overrides must be applied via a handler, registered at the very start of the program.
// By doing this, we're ensuring user's adjustments are not applied to late.
sdk.getContainer().registerComposite(adminPulumi);
const pulumiHandlers = sdk.getContainer().resolve(AdminPulumi);

app.addHandler(() => {
return pulumiHandlers.execute(app as AdminPulumiApp);
});
// Execute directly so implementations run before the CloudFront resource is created.
await pulumiHandlers.execute(app as AdminPulumiApp);
}
});

Expand Down
20 changes: 6 additions & 14 deletions packages/project-aws/src/pulumi/apps/api/createApiPulumiApp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -139,15 +139,6 @@ export const createApiPulumiApp = () => {
});
// <-------------------- Enterprise end -------------------->

// Overrides must be applied via a handler, registered at the very start of the program.
// By doing this, we're ensuring user's adjustments are not applied to late.
sdk.getContainer().registerComposite(apiPulumi);
const pulumiHandlers = sdk.getContainer().resolve(ApiPulumi);

app.addHandler(() => {
return pulumiHandlers.execute(app as ApiPulumiApp);
});

const isProduction = app.env.isProduction;

// Register core output as a module available to all the other modules
Expand Down Expand Up @@ -248,13 +239,14 @@ export const createApiPulumiApp = () => {
const [apiCustomDomains] = projectConfig.extensionsByType(apiCustomDomainsExt);
if (apiCustomDomains) {
const { domains, sslMethod, certificateArn } = apiCustomDomains.params;
applyCustomDomain(cloudfront, {
domains,
sslSupportMethod: sslMethod,
acmCertificateArn: certificateArn
});
applyCustomDomain(cloudfront, { domains, sslMethod, certificateArn });
}

// Execute directly so implementations run before the CloudFront resource is created.
sdk.getContainer().registerComposite(apiPulumi);
const pulumiHandlers = sdk.getContainer().resolve(ApiPulumi);
await pulumiHandlers.execute(app as ApiPulumiApp);

app.addOutputs({
awsAccountId: getAwsAccountId(app),
region: aws.config.region,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@ export function createBlueGreenPulumiApp() {

applyCustomDomain(cloudfront.cloudFront, {
domains: domainNames,
sslSupportMethod: attachedDomains.sslSupportMethod,
acmCertificateArn: attachedDomains.acmCertificateArn
sslMethod: attachedDomains.sslSupportMethod,
certificateArn: attachedDomains.acmCertificateArn
});

attachDomainsToOutput({
Expand Down
8 changes: 4 additions & 4 deletions packages/project-aws/src/pulumi/apps/customDomain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import { type PulumiAppResource } from "@webiny/pulumi";

export interface CustomDomainParams {
domains: Input<string[]>;
acmCertificateArn: Input<string>;
sslSupportMethod?: Input<string>;
certificateArn: Input<string>;
sslMethod?: Input<string>;
}

export function applyCustomDomain(
Expand All @@ -15,7 +15,7 @@ export function applyCustomDomain(
cloudfront.config.aliases(params.domains);

cloudfront.config.viewerCertificate({
acmCertificateArn: params.acmCertificateArn,
sslSupportMethod: params.sslSupportMethod ?? "sni-only"
acmCertificateArn: params.certificateArn,
sslSupportMethod: params.sslMethod ?? "sni-only"
});
}
1 change: 0 additions & 1 deletion packages/project-aws/src/pulumi/extensions/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import { BlueGreenDeployments } from "~/pulumi/extensions/BlueGreenDeployments.j
import { CorePulumi } from "./CorePulumi.js";
import { ApiPulumi } from "./ApiPulumi.js";
import { AdminPulumi } from "./AdminPulumi.js";

export { AwsTags };
export { Vpc };
export { OpenSearch };
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import type * as aws from "@pulumi/aws";
import type { PulumiAppResource } from "@webiny/pulumi";
import { SetAdminCustomDomains } from "~/abstractions/features/pulumi/index.js";
import { applyCustomDomain, type CustomDomainParams } from "~/pulumi/apps/customDomain.js";

class DefaultSetAdminCustomDomainsImpl implements SetAdminCustomDomains.Interface {
execute(
cloudfront: PulumiAppResource<typeof aws.cloudfront.Distribution>,
params: CustomDomainParams
): void {
applyCustomDomain(cloudfront, params);
}
}

export const DefaultSetAdminCustomDomains = SetAdminCustomDomains.createImplementation({
implementation: DefaultSetAdminCustomDomainsImpl,
dependencies: []
});
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./DefaultSetAdminCustomDomains.js";
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import type * as aws from "@pulumi/aws";
import type { PulumiAppResource } from "@webiny/pulumi";
import { SetApiCustomDomains } from "~/abstractions/features/pulumi/index.js";
import { applyCustomDomain, type CustomDomainParams } from "~/pulumi/apps/customDomain.js";

class DefaultSetApiCustomDomainsImpl implements SetApiCustomDomains.Interface {
execute(
cloudfront: PulumiAppResource<typeof aws.cloudfront.Distribution>,
params: CustomDomainParams
): void {
applyCustomDomain(cloudfront, params);
}
}

export const DefaultSetApiCustomDomains = SetApiCustomDomains.createImplementation({
implementation: DefaultSetApiCustomDomainsImpl,
dependencies: []
});
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./DefaultSetApiCustomDomains.js";
2 changes: 2 additions & 0 deletions packages/project-aws/src/pulumi/features/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
export * from "./CorePulumi/index.js";
export * from "./ApiPulumi/index.js";
export * from "./AdminPulumi/index.js";
export * from "./SetAdminCustomDomains/index.js";
export * from "./SetApiCustomDomains/index.js";
2 changes: 1 addition & 1 deletion packages/webiny/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -138,5 +138,5 @@
"./extensions": "./extensions.js",
"./api/tenant-manager": "./api/tenant-manager.js"
},
"exportGenerationHash": "f117d5544b5f3f9ffe3bacaad79a372d4690fdd5f960980f452385e740e06d6a"
"exportGenerationHash": "38f9725bf3c7c9891f5716e57fb0c190dc9ff4b1d44effb201de7f281e223538"
}
1 change: 1 addition & 0 deletions packages/webiny/src/infra/admin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ export { AdminBeforeDeploy as AdminBeforeDeployHook } from "@webiny/project/abst
export { AdminBeforeWatch as AdminBeforeWatchHook } from "@webiny/project/abstractions/features/hooks/AdminBeforeWatch.js";
export { AdminPulumi } from "@webiny/project-aws/abstractions/features/pulumi/AdminPulumi.js";
export { AdminStackOutputService as GetAdminStackOutput } from "@webiny/project-aws/abstractions/services/AdminStackOutputService.js";
export { SetAdminCustomDomains } from "@webiny/project-aws/abstractions/features/pulumi/SetAdminCustomDomains.js";
1 change: 1 addition & 0 deletions packages/webiny/src/infra/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ export { ApiBeforeDeploy as ApiBeforeDeployHook } from "@webiny/project/abstract
export { ApiBeforeWatch as ApiBeforeWatchHook } from "@webiny/project/abstractions/features/hooks/ApiBeforeWatch.js";
export { ApiPulumi } from "@webiny/project-aws/abstractions/features/pulumi/ApiPulumi.js";
export { ApiStackOutputService as GetApiStackOutput } from "@webiny/project-aws/abstractions/services/ApiStackOutputService.js";
export { SetApiCustomDomains } from "@webiny/project-aws/abstractions/features/pulumi/SetApiCustomDomains.js";
1 change: 1 addition & 0 deletions webiny.config.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ export const Extensions = () => {
<Infra.PulumiResourceNamePrefix prefix={"myproj-"} />
<Infra.ProductionEnvironments environments={["prod", "staging"]} />
<Infra.Core.Pulumi src={"/extensions/MyCorePulumiHandler.ts"} />
{/*<Infra.Admin.Pulumi src={"/extensions/MyAdminPulumiHandler.ts"} />*/}
<Infra.Vpc enabled={false} />
<Infra.OpenSearch enabled={false} />

Expand Down
Loading