Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
000a1d6
wip
adrians5j Nov 7, 2025
02e5f6a
Initial plan
Copilot Nov 7, 2025
fb009d0
Refactor GetApp feature to use GetAppService
Copilot Nov 7, 2025
2a188e4
wip
adrians5j Nov 7, 2025
5a903bf
wip
adrians5j Nov 7, 2025
d85c820
wip
adrians5j Nov 7, 2025
9b27f25
Merge remote-tracking branch 'origin/next' into adrian/remove-webiny-…
adrians5j Nov 8, 2025
6279bab
wip
adrians5j Nov 8, 2025
a8d53a0
wip
adrians5j Nov 8, 2025
77dc798
wip
adrians5j Nov 8, 2025
7bd8e2a
Merge remote-tracking branch 'origin/next' into adrian/webiny-pkg
adrians5j Nov 8, 2025
139ae27
wip
adrians5j Nov 8, 2025
9def374
wip
adrians5j Nov 8, 2025
3a8c35d
wip
adrians5j Nov 8, 2025
2434e8f
wip
adrians5j Nov 8, 2025
b442103
Merge branch 'next' into adrian/webiny-pkg
adrians5j Nov 8, 2025
97ac3f3
fix: update admin logo extension and adjust logging params
adrians5j Nov 8, 2025
4680018
wip
adrians5j Nov 10, 2025
358b2e6
wip
adrians5j Nov 10, 2025
b0bc3a7
wip
adrians5j Nov 10, 2025
03449b0
wip
adrians5j Nov 10, 2025
171a36a
wip
adrians5j Nov 10, 2025
7aeeb8b
wip
adrians5j Nov 11, 2025
f7bcd9a
wip
adrians5j Nov 11, 2025
90d5ef3
wip
adrians5j Nov 11, 2025
edc5f8c
wip
adrians5j Nov 11, 2025
9f8df83
wip
adrians5j Nov 11, 2025
8fed28e
wip
adrians5j Nov 11, 2025
e372006
wip
adrians5j Nov 11, 2025
a03a56f
wip
adrians5j Nov 11, 2025
b8b7c08
Merge branch 'next' into adrian/tailwindcss-cfg-tools-fix
adrians5j Nov 11, 2025
43346f5
Merge remote-tracking branch 'origin/next' into adrian/webiny-pkg
adrians5j Nov 11, 2025
a5403d6
wipwip
adrians5j Nov 11, 2025
a7d4f85
wipwip
adrians5j Nov 11, 2025
9907d43
wipwip
adrians5j Nov 11, 2025
920aeca
wip
adrians5j Nov 11, 2025
67b8b5b
wip
adrians5j Nov 13, 2025
933b0a7
wip
adrians5j Nov 13, 2025
690d962
wip
adrians5j Nov 13, 2025
09f56e9
wip
adrians5j Nov 13, 2025
4f245dd
Merge remote-tracking branch 'origin/next' into adrian/webiny-pkg
adrians5j Nov 13, 2025
d11fef7
Merge remote-tracking branch 'origin/adrian/tailwindcss-cfg-tools-fix…
adrians5j Nov 13, 2025
4fb2c81
Merge remote-tracking branch 'origin/copilot/refactor-getapp-to-servi…
adrians5j Nov 13, 2025
de26f9d
wip
adrians5j Nov 13, 2025
c25164c
wip
adrians5j Nov 13, 2025
793b684
wip: simplify abstraction API
Pavel910 Nov 13, 2025
8871f0e
wip
adrians5j Nov 13, 2025
6df9639
wip
adrians5j Nov 13, 2025
1119df1
wip
adrians5j Nov 13, 2025
275c368
Merge remote-tracking branch 'origin/adrian/webiny-pkg' into adrian/w…
adrians5j Nov 13, 2025
c06edb6
wip
adrians5j Nov 13, 2025
92da685
wip
adrians5j Nov 13, 2025
66f21b0
wip
adrians5j Nov 13, 2025
89fabd6
createAbs impl
adrians5j Nov 13, 2025
5a58d6b
wip
adrians5j Nov 13, 2025
80b26a1
wip
adrians5j Nov 14, 2025
207af61
wip
adrians5j Nov 14, 2025
14819d8
wip
adrians5j Nov 14, 2025
8c362d6
wip
adrians5j Nov 14, 2025
bee2193
wip
adrians5j Nov 14, 2025
6fe790e
wip
adrians5j Nov 14, 2025
30008a3
wip
adrians5j Nov 16, 2025
6d2d3bb
wip
adrians5j Nov 16, 2025
3379cf8
wip
adrians5j Nov 16, 2025
773ce7f
wip
adrians5j Nov 16, 2025
82ede6a
wip
adrians5j Nov 16, 2025
ba4302c
Merge remote-tracking branch 'origin/next' into adrian/webiny-pkg
adrians5j Nov 18, 2025
ed46697
wip
adrians5j Nov 19, 2025
96dc887
wip
adrians5j Nov 20, 2025
8245660
wip
adrians5j Nov 20, 2025
6957f77
wip
adrians5j Nov 20, 2025
50b8f8c
wip
adrians5j Nov 20, 2025
7b5e5b7
wip
adrians5j Nov 20, 2025
a02a1e9
wip
adrians5j Nov 20, 2025
1ab7678
wip
adrians5j Nov 20, 2025
90cfe26
wip
adrians5j Nov 20, 2025
4ee2355
wip
adrians5j Nov 21, 2025
09aa6c5
wip
adrians5j Nov 21, 2025
7edb8ae
wip
adrians5j Nov 21, 2025
e754778
wip
adrians5j Nov 21, 2025
d9b58b3
wip
adrians5j Nov 21, 2025
de64db5
wip
adrians5j Nov 21, 2025
695178f
wip
adrians5j Nov 21, 2025
90d63ee
wipwip
adrians5j Nov 21, 2025
7c157ad
wipwip
adrians5j Nov 21, 2025
22e8290
wipwip
adrians5j Nov 21, 2025
a29a2f6
wipwip
adrians5j Nov 21, 2025
451701a
wipwip
adrians5j Nov 21, 2025
b722f74
wipwip
adrians5j Nov 21, 2025
899d455
wip
adrians5j Nov 21, 2025
08beada
wip
adrians5j Nov 21, 2025
d933ba7
wip
adrians5j Nov 21, 2025
b417e6b
wip
adrians5j Nov 21, 2025
7edad04
wip
adrians5j Nov 21, 2025
ae605e9
wip
adrians5j Nov 21, 2025
4861d1b
wip
adrians5j Nov 21, 2025
c3dda19
wip
adrians5j Nov 21, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
18 changes: 18 additions & 0 deletions extensions/AdminLogo.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import React from "react";
import { AdminConfig } from "webiny/admin/configs";
import logo from "./logo.png";

const { Tenant } = AdminConfig;

export const Extension = () => {
return (
<>
<AdminConfig>
<Tenant>
<Tenant.Name value={"My Tenant X"} />
<Tenant.Logo element={<img src={logo} alt={"Webiny"} />} />
</Tenant>
</AdminConfig>
</>
);
};
12 changes: 12 additions & 0 deletions extensions/MyApiKeyAfterUpdate.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { ApiKeyAfterUpdateHandler } from "webiny/api/security/features/UpdateApiKey";

class MyApiKeyAfterUpdateImpl implements ApiKeyAfterUpdateHandler.Interface {
async handle() {
console.log("An API key was updated!");
}
}

export const MyApiKeyAfterUpdate = ApiKeyAfterUpdateHandler.createImplementation({
implementation: MyApiKeyAfterUpdateImpl,
dependencies: []
});
15 changes: 15 additions & 0 deletions extensions/MyCorePulumiHandler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { CorePulumi } from "webiny/infra/features/CorePulumi";
import { UiService } from "webiny/infra/features/UiService";

class MyCorePulumiHandlerImpl implements CorePulumi.Interface {
constructor(private ui: UiService.Interface) {}

execute(app: any) {
this.ui.info("🔮 Executing MyCorePulumiHandler with environment:", app.env);
}
}

export const MyCorePulumiHandler = CorePulumi.createImplementation({
implementation: MyCorePulumiHandlerImpl,
dependencies: [UiService]
});
11 changes: 5 additions & 6 deletions extensions/myCustomCommand.ts → extensions/MyCustomCommand.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import { createImplementation } from "@webiny/di";
import { Command, UiService } from "@webiny/extensions/cli";
import { Command } from "webiny/cli/features/Command";
import { UiService } from "webiny/cli/features/Ui";

export interface IMyCustomCommandParams {
name: string;
}

class MyCustomCommand implements Command.Interface<IMyCustomCommandParams> {
class MyCustomCommandImpl implements Command.Interface<IMyCustomCommandParams> {
constructor(private ui: UiService.Interface) {}

execute(): Command.CommandDefinition<IMyCustomCommandParams> {
Expand All @@ -29,8 +29,7 @@ class MyCustomCommand implements Command.Interface<IMyCustomCommandParams> {
}
}

export default createImplementation({
abstraction: Command,
implementation: MyCustomCommand,
export const MyCustomCommand = Command.createImplementation({
implementation: MyCustomCommandImpl,
dependencies: [UiService]
});
13 changes: 8 additions & 5 deletions extensions/README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
## The `extensions` Folder

The `extensions` folder serves as the central location for creating Webiny extensions.
The extensions folder is the dedicated home for all extension implementations in your project.
While webiny.config.tsx (located in the project root) is responsible for registering extensions, the actual implementation code always lives inside this folder.

To quickly start working on a new extension, in your terminal, simply run the
`yarn webiny extension` command. Once ready, from the list of available scaffolds,
choose **New Extension** and then proceed by answering the rest of the questions.
This structure keeps your project organized by separating:
• Extension registration → in webiny.config.tsx
Extension implementation → in ./extensions

For more information, please visit https://webiny.link/extensions.
By keeping all implementations in one place, it becomes easier to maintain, share, and scale your custom logic across the project.

Learn more: https://webiny.link/extensions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { createImplementation } from "@webiny/di";
import { OnEntryBeforeCreate } from "@webiny/extensions/api";
import { OnEntryBeforeCreate } from "webiny/api/cms/features";

class MyOnEntryBeforeCreate implements OnEntryBeforeCreate.Interface {
execute({ model, entry }: OnEntryBeforeCreate.Params) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { createImplementation } from "@webiny/di";
import { ApiBeforeBuild, UiService } from "@webiny/extensions/project";
import { ApiBeforeBuild, UiService } from "webiny/infra";
import type Okta from "@webiny/okta";

class MyOktaIdentityProvider implements Okta.Admin.Interface {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { createImplementation } from "@webiny/di";
import { ApiBeforeBuild, UiService } from "@webiny/extensions/project";
import { ApiBeforeBuild, UiService } from "webiny/infra";
import type Okta from "@webiny/okta";

class MyOktaIdentityProvider implements Okta.Backend.Interface {
Expand Down
7 changes: 0 additions & 7 deletions extensions/myAdminExtension.tsx

This file was deleted.

16 changes: 0 additions & 16 deletions extensions/myApiAfterBuild.ts

This file was deleted.

16 changes: 0 additions & 16 deletions extensions/myApiAfterDeploy.ts

This file was deleted.

16 changes: 0 additions & 16 deletions extensions/myApiBeforeBuild.ts

This file was deleted.

16 changes: 0 additions & 16 deletions extensions/myApiBeforeDeploy.ts

This file was deleted.

16 changes: 0 additions & 16 deletions extensions/myCorePulumiHandler.ts

This file was deleted.

16 changes: 0 additions & 16 deletions extensions/myCorePulumiHandler2.ts

This file was deleted.

5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"extensions/theme",
"scripts/buildPackages",
"scripts/prepublishOnly",
"scripts/cli",
"scripts/cjsToEsm"
]
},
Expand Down Expand Up @@ -117,7 +118,6 @@
"tsx": "^4.20.5",
"type-fest": "^5.2.0",
"typescript": "5.9.3",
"typescript-transform-paths": "^3.5.5",
"validator": "^13.15.23",
"verdaccio": "^6.2.1",
"vite-tsconfig-paths": "^5.1.4",
Expand Down Expand Up @@ -160,6 +160,7 @@
"cy:ts": "yarn cypress:ts",
"cy:setup": "yarn setup-cypress",
"webiny-versions": "node ./scripts/webinyVersions.js",
"webiny-scripts": "tsx ./scripts/cli/src/bin.ts",
"trigger-release": "node ./scripts/release/triggerRelease.js",
"dispatch-github-event": "node ./scripts/dispatchGitHubEvent.js",
"link-workspaces": "node ./scripts/linkWorkspaces.js",
Expand Down Expand Up @@ -260,7 +261,7 @@
"packageManager": "[email protected]",
"dependencies": {
"@types/hoist-non-react-statics": "^3.3.7",
"@webiny/di": "^0.1.1"
"@webiny/di": "^0.2.0"
},
"engines": {
"node": ">=22.0.0"
Expand Down
2 changes: 1 addition & 1 deletion packages/api-aco/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
"@webiny/api-headless-cms": "0.0.0",
"@webiny/aws-sdk": "0.0.0",
"@webiny/db-dynamodb": "0.0.0",
"@webiny/di": "^0.1.1",
"@webiny/di": "^0.2.0",
"@webiny/error": "0.0.0",
"@webiny/feature": "0.0.0",
"@webiny/handler": "0.0.0",
Expand Down
50 changes: 49 additions & 1 deletion packages/api-core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,16 +57,64 @@
"./features/ExternalIdpUserSync": "./features/users/ExternalIdpUserSync/index.js",
"./*": "./*"
},
"webiny": {
"exports": {
"./features/eventPublisher/index.ts": "./api/features/eventPublisher",
"./features/security/IdentityContext/index.ts": "./api/security/features/IdentityContext",
"./features/wcp/WcpContext/index.ts": "./api/wcp/WcpContext",
"./features/settings/GetSettings/index.ts": "./api/features/GetSettings",
"./features/settings/UpdateSettings/index.ts": "./api/features/UpdateSettings",
"./features/settings/DeleteSettings/index.ts": "./api/features/DeleteSettings",
"./features/security/apiKeys/CreateApiKey/index.ts": "./api/security/features/CreateApiKey",
"./features/security/apiKeys/DeleteApiKey/index.ts": "./api/security/features/DeleteApiKey",
"./features/security/apiKeys/GetApiKey/index.ts": "./api/security/features/GetApiKey",
"./features/security/apiKeys/GetApiKeyByToken/index.ts": "./api/security/features/GetApiKeyByToken",
"./features/security/apiKeys/ListApiKeys/index.ts": "./api/security/features/ListApiKeys",
"./features/security/apiKeys/UpdateApiKey/index.ts": "./api/security/features/UpdateApiKey",
"./features/security/authentication/AuthenticationContext/index.ts": "./api/security/features/AuthenticationContext",
"./features/security/authentication/Authenticator/index.ts": "./api/security/features/Authenticator",
"./features/security/authorization/AuthorizationContext/index.ts": "./api/security/features/AuthorizationContext",
"./features/security/authorization/Authorizer/index.ts": "./api/security/features/Authorizer",
"./features/security/groups/CreateGroup/index.ts": "./api/security/features/CreateGroup",
"./features/security/groups/DeleteGroup/index.ts": "./api/security/features/DeleteGroup",
"./features/security/groups/GetGroup/index.ts": "./api/security/features/GetGroup",
"./features/security/groups/ListGroups/index.ts": "./api/security/features/ListGroups",
"./features/security/groups/UpdateGroup/index.ts": "./api/security/features/UpdateGroup",
"./features/security/teams/CreateTeam/index.ts": "./api/security/features/CreateTeam",
"./features/security/teams/DeleteTeam/index.ts": "./api/security/features/DeleteTeam",
"./features/security/teams/GetTeam/index.ts": "./api/security/features/GetTeam",
"./features/security/teams/ListTeams/index.ts": "./api/security/features/ListTeams",
"./features/security/teams/UpdateTeam/index.ts": "./api/security/features/UpdateTeam",
"./features/security/tenantLinks/CreateTenantLinks/index.ts": "./api/security/features/CreateTenantLinks",
"./features/security/tenantLinks/DeleteTenantLinks/index.ts": "./api/security/features/DeleteTenantLinks",
"./features/security/tenantLinks/GetTenantLinkByIdentity/index.ts": "./api/security/features/GetTenantLinkByIdentity",
"./features/security/tenantLinks/ListTenantLinksByIdentity/index.ts": "./api/security/features/ListTenantLinksByIdentity",
"./features/security/tenantLinks/ListTenantLinksByTenant/index.ts": "./api/security/features/ListTenantLinksByTenant",
"./features/security/tenantLinks/ListTenantLinksByType/index.ts": "./api/security/features/ListTenantLinksByType",
"./features/security/tenantLinks/UpdateTenantLinks/index.ts": "./api/security/features/UpdateTenantLinks",
"./features/system/InstallSystem/index.ts": "./api/features/InstallSystem",
"./features/tenancy/InstallTenant/index.ts": "./api/tenancy/features/InstallTenant",
"./features/tenancy/TenantContext/index.ts": "./api/tenancy/features/TenantContext",
"./features/users/CreateUser/index.ts": "./api/security/features/CreateUser",
"./features/users/DeleteUser/index.ts": "./api/security/features/DeleteUser",
"./features/users/UpdateUser/index.ts": "./api/security/features/UpdateUser",
"./features/users/GetUser/index.ts": "./api/security/features/GetUser",
"./features/users/ListUsers/index.ts": "./api/security/features/ListUsers",
"./features/users/ListUserTeams/index.ts": "./api/security/features/ListUserTeams",
"./features/users/ExternalIdpUserSync/index.ts": "./api/security/features/ExternalIdpUserSync"
}
},
"license": "MIT",
"dependencies": {
"@webiny/api": "0.0.0",
"@webiny/di": "^0.1.1",
"@webiny/di": "^0.2.0",
"@webiny/error": "0.0.0",
"@webiny/feature": "0.0.0",
"@webiny/handler": "0.0.0",
"@webiny/handler-db": "0.0.0",
"@webiny/handler-graphql": "0.0.0",
"@webiny/plugins": "0.0.0",
"@webiny/project": "0.0.0",
"@webiny/utils": "0.0.0",
"@webiny/wcp": "0.0.0",
"dataloader": "^2.2.3",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { defineApiExtension } from "@webiny/project/defineExtension";
import { AfterAuthenticationHandler } from "~/features/security/authentication/AuthenticationContext/index.js";

export const AfterAuthentication = defineApiExtension({
type: "Security/AfterAuthentication",
description: "Add custom logic to be executed after authentication.",
abstraction: AfterAuthenticationHandler
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { defineApiExtension } from "@webiny/project/defineExtension";
import { ApiKeyAfterCreateHandler } from "~/features/security/apiKeys/CreateApiKey/index.js";

export const ApiKeyAfterCreate = defineApiExtension({
type: "Security/ApiKeyAfterCreate",
description: "Add custom logic to be executed after an API key is created.",
abstraction: ApiKeyAfterCreateHandler
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { defineApiExtension } from "@webiny/project/defineExtension";
import { ApiKeyAfterDeleteHandler } from "~/features/security/apiKeys/DeleteApiKey/index.js";

export const ApiKeyAfterDelete = defineApiExtension({
type: "Security/ApiKeyAfterDelete",
description: "Add custom logic to be executed after an API key is deleted.",
abstraction: ApiKeyAfterDeleteHandler
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { defineApiExtension } from "@webiny/project/defineExtension";
import { ApiKeyAfterUpdateHandler } from "~/features/security/apiKeys/UpdateApiKey/index.js";

export const ApiKeyAfterUpdate = defineApiExtension({
type: "Security/ApiKeyAfterUpdate",
description: "Add custom logic to be executed after an API key is updated.",
abstraction: ApiKeyAfterUpdateHandler
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { defineApiExtension } from "@webiny/project/defineExtension";
import { ApiKeyBeforeCreateHandler } from "~/features/security/apiKeys/CreateApiKey/index.js";

export const ApiKeyBeforeCreate = defineApiExtension({
type: "Security/ApiKeyBeforeCreate",
description: "Add custom logic to be executed before an API key is created.",
abstraction: ApiKeyBeforeCreateHandler
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { defineApiExtension } from "@webiny/project/defineExtension";
import { ApiKeyBeforeDeleteHandler } from "~/features/security/apiKeys/DeleteApiKey/index.js";

export const ApiKeyBeforeDelete = defineApiExtension({
type: "Security/ApiKeyBeforeDelete",
description: "Add custom logic to be executed before an API key is deleted.",
abstraction: ApiKeyBeforeDeleteHandler
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { defineApiExtension } from "@webiny/project/defineExtension";
import { ApiKeyBeforeUpdateHandler } from "~/features/security/apiKeys/UpdateApiKey/index.js";

export const ApiKeyBeforeUpdate = defineApiExtension({
type: "Security/ApiKeyBeforeUpdate",
description: "Add custom logic to be executed before an API key is updated.",
abstraction: ApiKeyBeforeUpdateHandler
});
Loading
Loading