Skip to content

Commit 9206ec1

Browse files
authored
feat(app-website-builder-workflows): connect workflows to wb (#4779)
1 parent 6116d59 commit 9206ec1

File tree

458 files changed

+5553
-4455
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

458 files changed

+5553
-4455
lines changed

ai-context/backend-developer-guide.md

Lines changed: 149 additions & 148 deletions
Large diffs are not rendered by default.

ai-context/core-features-reference.md

Lines changed: 95 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,23 @@ This document provides the correct import paths and type definitions for commonl
1212
## Features
1313

1414
### TenantContext
15-
- **Import:** `import { TenantContext } from "@webiny/api-tenancy/features/TenantContext"`
16-
- **Interface Type:** See `packages/api-tenancy/src/features/TenantContext/abstractions.ts`
15+
- **Import:** `import { TenantContext } from "@webiny/api-core/features/TenantContext"`
16+
- **Interface Type:** See `packages/api-core/src/features/TenantContext/abstractions.ts`
1717
- **Usage:** Access current tenant information
1818

1919
### IdentityContext
20-
- **Import:** `import { IdentityContext } from "@webiny/api-security/features/IdentityContext"`
21-
- **Interface Type:** See `packages/api-security/src/features/IdentityContext/abstractions.ts`
20+
- **Import:** `import { IdentityContext } from "@webiny/api-core/features/IdentityContext"`
21+
- **Interface Type:** See `packages/api-core/src/features/IdentityContext/abstractions.ts`
2222
- **Usage:** Access current user identity and permissions
2323

2424
### EventPublisher
25-
- **Import:** `import { EventPublisher } from "@webiny/api-core"`
25+
- **Import:** `import { EventPublisher } from "@webiny/api-core/features/EventPublisher"`
2626
- **Interface Type:** See `packages/api-core/src/event-publisher/abstractions.ts`
2727
- **Usage:** Publish domain events
2828

2929
### WcpContext
30-
- **Import:** `import { WcpContext } from "@webiny/api-wcp/features/WcpContext"`
31-
- **Interface Type:** See `packages/api-wcp/src/features/WcpContext/abstractions.ts`
30+
- **Import:** `import { WcpContext } from "@webiny/api-core/features/WcpContext"`
31+
- **Interface Type:** See `packages/api-core/src/features/WcpContext/abstractions.ts`
3232
- **Usage:** WCP (Webiny Control Panel) integration for seats/tenants management
3333

3434
### GetSettings
@@ -43,6 +43,94 @@ This document provides the correct import paths and type definitions for commonl
4343

4444
---
4545

46+
## Headless CMS Features
47+
48+
### Content Entry Features
49+
50+
#### GetEntryById
51+
- **Import:** `import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntryById"`
52+
- **Interface Type:** See `packages/api-headless-cms/src/features/contentEntry/GetEntryById/abstractions.ts`
53+
- **Usage:** Fetch single entry by exact revision ID
54+
55+
#### GetEntry
56+
- **Import:** `import { GetEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntry"`
57+
- **Interface Type:** See `packages/api-headless-cms/src/features/contentEntry/GetEntry/abstractions.ts`
58+
- **Usage:** Get single entry by query parameters (where + sort)
59+
60+
#### ListLatestEntries
61+
- **Import:** `import { ListLatestEntriesUseCase } from "@webiny/api-headless-cms/features/contentEntry/ListEntries"`
62+
- **Interface Type:** See `packages/api-headless-cms/src/features/contentEntry/ListEntries/abstractions.ts`
63+
- **Usage:** List latest entries (manage API)
64+
65+
#### ListPublishedEntries
66+
- **Import:** `import { ListPublishedEntriesUseCase } from "@webiny/api-headless-cms/features/contentEntry/ListEntries"`
67+
- **Interface Type:** See `packages/api-headless-cms/src/features/contentEntry/ListEntries/abstractions.ts`
68+
- **Usage:** List published entries (read API)
69+
70+
#### ListDeletedEntries
71+
- **Import:** `import { ListDeletedEntriesUseCase } from "@webiny/api-headless-cms/features/contentEntry/ListEntries"`
72+
- **Interface Type:** See `packages/api-headless-cms/src/features/contentEntry/ListEntries/abstractions.ts`
73+
- **Usage:** List deleted entries (manage API)
74+
75+
#### CreateEntry
76+
- **Import:** `import { CreateEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/CreateEntry"`
77+
- **Interface Type:** See `packages/api-headless-cms/src/features/contentEntry/CreateEntry/abstractions.ts`
78+
- **Usage:** Create new content entry
79+
80+
#### UpdateEntry
81+
- **Import:** `import { UpdateEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntry"`
82+
- **Interface Type:** See `packages/api-headless-cms/src/features/contentEntry/UpdateEntry/abstractions.ts`
83+
- **Usage:** Update existing content entry
84+
85+
#### DeleteEntry
86+
- **Import:** `import { DeleteEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry"`
87+
- **Interface Type:** See `packages/api-headless-cms/src/features/contentEntry/DeleteEntry/abstractions.ts`
88+
- **Usage:** Delete content entry
89+
90+
#### ListEntriesRepository
91+
- **Import:** `import { ListEntriesRepository } from "@webiny/api-headless-cms/features/contentEntry/ListEntries"`
92+
- **Interface Type:** See `packages/api-headless-cms/src/features/contentEntry/ListEntries/abstractions.ts`
93+
- **Usage:** Repository for fetching entries from storage
94+
95+
### Content Model Features
96+
97+
#### GetModel
98+
- **Import:** `import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel"`
99+
- **Interface Type:** See `packages/api-headless-cms/src/features/contentModel/GetModel/abstractions.ts`
100+
- **Usage:** Retrieve single model by ID with access control
101+
102+
#### ListModels
103+
- **Import:** `import { ListModelsUseCase } from "@webiny/api-headless-cms/features/contentModel/ListModels"`
104+
- **Interface Type:** See `packages/api-headless-cms/src/features/contentModel/ListModels/abstractions.ts`
105+
- **Usage:** List all accessible content models
106+
107+
#### GetModelRepository
108+
- **Import:** `import { GetModelRepository } from "@webiny/api-headless-cms/features/contentModel/GetModel"`
109+
- **Interface Type:** See `packages/api-headless-cms/src/features/contentModel/GetModel/abstractions.ts`
110+
- **Usage:** Fetch model from cache (plugin + DB models)
111+
112+
#### ListModelsRepository
113+
- **Import:** `import { ListModelsRepository } from "@webiny/api-headless-cms/features/contentModel/ListModels"`
114+
- **Interface Type:** See `packages/api-headless-cms/src/features/contentModel/ListModels/abstractions.ts`
115+
- **Usage:** Fetch all models from cache
116+
117+
#### ModelsFetcher
118+
- **Import:** `import { ModelsFetcher } from "@webiny/api-headless-cms/features/contentModel/shared"`
119+
- **Interface Type:** See `packages/api-headless-cms/src/features/contentModel/shared/abstractions.ts`
120+
- **Usage:** Centralized model fetching with caching and access control
121+
122+
#### ModelCache
123+
- **Import:** `import { ModelCache } from "@webiny/api-headless-cms/features/contentModel/shared"`
124+
- **Interface Type:** See `packages/api-headless-cms/src/features/contentModel/shared/abstractions.ts`
125+
- **Usage:** Cache for content models
126+
127+
#### PluginModelsProvider
128+
- **Import:** `import { PluginModelsProvider } from "@webiny/api-headless-cms/features/contentModel/shared"`
129+
- **Interface Type:** See `packages/api-headless-cms/src/features/contentModel/shared/abstractions.ts`
130+
- **Usage:** Access to plugin-defined models
131+
132+
---
133+
46134
## Notes
47135

48136
- Always import abstractions from the feature path (not from package root)

ai-context/di-container.md

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,61 @@
11
```ts
22
// Abstraction.ts
3+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
4+
import type { Constructor, Dependencies, GetInterface, MapDependencies } from "./types.js";
5+
import { Metadata } from "./Metadata.js";
6+
7+
type DropLast<T> = T extends [...infer P, any] ? [...P] : never;
8+
9+
type Implementation<A extends Abstraction<any>, I extends Constructor> = I & {
10+
__abstraction: A;
11+
};
12+
313
// eslint-disable-next-line @typescript-eslint/no-unused-vars
414
export class Abstraction<T> {
515
public readonly token: symbol;
616

717
constructor(name: string) {
8-
this.token = Symbol.for(name);
18+
this.token = Symbol(name);
919
}
1020

1121
toString(): string {
1222
return this.token.description || this.token.toString();
1323
}
24+
25+
createImplementation<I extends Constructor<GetInterface<this>>>(params: {
26+
implementation: I;
27+
dependencies: Dependencies<I>;
28+
}): Implementation<this, I> {
29+
const metadata = new Metadata(params.implementation);
30+
metadata.setAbstraction(this);
31+
metadata.setDependencies(params.dependencies);
32+
33+
return params.implementation as Implementation<this, I>;
34+
}
35+
36+
createDecorator<I extends Constructor>(params: {
37+
decorator: I;
38+
dependencies: MapDependencies<DropLast<ConstructorParameters<I>>>;
39+
}): Implementation<this, I> {
40+
const metadata = new Metadata(params.decorator);
41+
metadata.setAbstraction(this);
42+
metadata.setDependencies(params.dependencies as any);
43+
metadata.setAttribute("IS_DECORATOR", true);
44+
45+
return params.decorator as Implementation<this, I>;
46+
}
47+
48+
createComposite<I extends Constructor<GetInterface<this>>>(params: {
49+
implementation: I;
50+
dependencies: Dependencies<I>;
51+
}): Implementation<this, I> {
52+
const metadata = new Metadata(params.implementation);
53+
metadata.setAbstraction(this);
54+
metadata.setDependencies(params.dependencies);
55+
metadata.setAttribute("IS_COMPOSITE", true);
56+
57+
return params.implementation as Implementation<this, I>;
58+
}
1459
}
1560
```
1661

ai-context/event-publisher.md

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export class EventPublisher implements Abstraction.Interface {
2424
```ts
2525
// __tests__/EventPublisher.test.ts
2626
import { describe, it, expect, beforeEach } from "vitest";
27-
import { Container, Abstraction, createImplementation } from "@webiny/di";
27+
import { Container, Abstraction } from "@webiny/di";
2828
import { EventPublisherFeature } from "../feature";
2929
import { EventPublisher as EventPublisherAbstraction } from "../abstractions";
3030
import type { DomainEvent, IEventHandler } from "../abstractions";
@@ -123,8 +123,7 @@ class SendNotificationHandler implements IEventHandler<PagePublishedEvent> {
123123
}
124124
}
125125

126-
export const SendNotificationHandlerImpl = createImplementation({
127-
abstraction: PagePublishedHandler,
126+
export const SendNotificationHandlerImpl = PagePublishedHandler.createImplementation({
128127
implementation: SendNotificationHandler,
129128
dependencies: []
130129
});
@@ -138,8 +137,7 @@ class UpdateSearchIndexHandler implements IEventHandler<PagePublishedEvent> {
138137
}
139138
}
140139

141-
export const UpdateSearchIndexHandlerImpl = createImplementation({
142-
abstraction: PagePublishedHandler,
140+
export const UpdateSearchIndexHandlerImpl = PagePublishedHandler.createImplementation({
143141
implementation: UpdateSearchIndexHandler,
144142
dependencies: []
145143
});
@@ -155,8 +153,7 @@ class LogPagePublishedHandler implements IEventHandler<PagePublishedEvent> {
155153
}
156154
}
157155

158-
export const LogPagePublishedHandlerImpl = createImplementation({
159-
abstraction: PagePublishedHandler,
156+
export const LogPagePublishedHandlerImpl = PagePublishedHandler.createImplementation({
160157
implementation: LogPagePublishedHandler,
161158
dependencies: []
162159
});
@@ -174,8 +171,7 @@ class SendWelcomeEmailHandler implements IEventHandler<UserRegisteredEvent> {
174171
}
175172
}
176173

177-
export const SendWelcomeEmailHandlerImpl = createImplementation({
178-
abstraction: UserRegisteredHandler,
174+
export const SendWelcomeEmailHandlerImpl = UserRegisteredHandler.createImplementation({
179175
implementation: SendWelcomeEmailHandler,
180176
dependencies: []
181177
});
@@ -189,8 +185,7 @@ class CreateUserProfileHandler implements IEventHandler<UserRegisteredEvent> {
189185
}
190186
}
191187

192-
export const CreateUserProfileHandlerImpl = createImplementation({
193-
abstraction: UserRegisteredHandler,
188+
export const CreateUserProfileHandlerImpl = UserRegisteredHandler.createImplementation({
194189
implementation: CreateUserProfileHandler,
195190
dependencies: []
196191
});
@@ -204,8 +199,7 @@ class TrackUserRegistrationHandler implements IEventHandler<UserRegisteredEvent>
204199
}
205200
}
206201

207-
export const TrackUserRegistrationHandlerImpl = createImplementation({
208-
abstraction: UserRegisteredHandler,
202+
export const TrackUserRegistrationHandlerImpl = UserRegisteredHandler.createImplementation({
209203
implementation: TrackUserRegistrationHandler,
210204
dependencies: []
211205
});
@@ -223,8 +217,7 @@ class ProcessPaymentHandler implements IEventHandler<OrderPlacedEvent> {
223217
}
224218
}
225219

226-
export const ProcessPaymentHandlerImpl = createImplementation({
227-
abstraction: OrderPlacedHandler,
220+
export const ProcessPaymentHandlerImpl = OrderPlacedHandler.createImplementation({
228221
implementation: ProcessPaymentHandler,
229222
dependencies: []
230223
});
@@ -238,8 +231,7 @@ class SendOrderConfirmationHandler implements IEventHandler<OrderPlacedEvent> {
238231
}
239232
}
240233

241-
export const SendOrderConfirmationHandlerImpl = createImplementation({
242-
abstraction: OrderPlacedHandler,
234+
export const SendOrderConfirmationHandlerImpl = OrderPlacedHandler.createImplementation({
243235
implementation: SendOrderConfirmationHandler,
244236
dependencies: []
245237
});
@@ -253,8 +245,7 @@ class UpdateInventoryHandler implements IEventHandler<OrderPlacedEvent> {
253245
}
254246
}
255247

256-
export const UpdateInventoryHandlerImpl = createImplementation({
257-
abstraction: OrderPlacedHandler,
248+
export const UpdateInventoryHandlerImpl = OrderPlacedHandler.createImplementation({
258249
implementation: UpdateInventoryHandler,
259250
dependencies: []
260251
});
@@ -541,8 +532,7 @@ describe("EventPublisher", () => {
541532
}
542533
}
543534

544-
const FailingHandlerImpl = createImplementation({
545-
abstraction: PagePublishedHandler,
535+
const FailingHandlerImpl = PagePublishedHandler.createImplementation({
546536
implementation: FailingHandler,
547537
dependencies: []
548538
});

ai-context/simple-models.md

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
```ts
22
// Page/PageModelBuilder.ts
33
import { ModelBuilder as Builder } from "~/models/ModelBuilder.js";
4-
import { createImplementation } from "@webiny/di";
54
import { PageSchema, PageModelBuilder as BuilderAbstraction, type IPage } from "./abstractions";
65

76
class PageModelBuilderImpl implements BuilderAbstraction.Interface {
@@ -15,16 +14,14 @@ class PageModelBuilderImpl implements BuilderAbstraction.Interface {
1514
}
1615
}
1716

18-
export const PageModelBuilder = createImplementation({
19-
abstraction: BuilderAbstraction,
17+
export const PageModelBuilder = BuilderAbstraction.createImplementation({
2018
implementation: PageModelBuilderImpl,
2119
dependencies: []
2220
});
2321
```
2422

2523
```ts
2624
// Page/PageModelFactory.ts
27-
import { createImplementation } from "@webiny/di";
2825
import {
2926
PageModelFactory as FactoryAbstraction,
3027
PageModelBuilder,
@@ -49,16 +46,14 @@ class PageModelFactoryImpl implements FactoryAbstraction.Interface {
4946
}
5047
}
5148

52-
export const PageModelFactory = createImplementation({
53-
abstraction: FactoryAbstraction,
49+
export const PageModelFactory = FactoryAbstraction.createImplementation({
5450
implementation: PageModelFactoryImpl,
5551
dependencies: [PageModelBuilder]
5652
});
5753
```
5854

5955
```ts
6056
// Page/__tests__/PageModelBuilderDecorator.ts
61-
import { createDecorator } from "@webiny/di";
6257
import { PageModelBuilder as BuilderAbstraction } from "../abstractions";
6358

6459
class PageModelBuilderDecoratorImpl implements BuilderAbstraction.Interface {
@@ -81,8 +76,7 @@ class PageModelBuilderDecoratorImpl implements BuilderAbstraction.Interface {
8176
}
8277
}
8378

84-
export const PageModelBuilderDecorator = createDecorator({
85-
abstraction: BuilderAbstraction,
79+
export const PageModelBuilderDecorator = BuilderAbstraction.createDecorator({
8680
decorator: PageModelBuilderDecoratorImpl,
8781
dependencies: []
8882
});
@@ -100,7 +94,6 @@ declare module "~/simple/Page/abstractions.js" {
10094

10195
```ts
10296
// Page/__tests__/PageModelBuilderDecorator2.ts
103-
import { createDecorator } from "@webiny/di";
10497
import { PageModelBuilder as BuilderAbstraction } from "../abstractions";
10598

10699
class PageModelBuilderDecorator2Impl implements BuilderAbstraction.Interface {
@@ -117,8 +110,7 @@ class PageModelBuilderDecorator2Impl implements BuilderAbstraction.Interface {
117110
}
118111
}
119112

120-
export const PageModelBuilderDecorator2 = createDecorator({
121-
abstraction: BuilderAbstraction,
113+
export const PageModelBuilderDecorator2 = BuilderAbstraction.createDecorator({
122114
decorator: PageModelBuilderDecorator2Impl,
123115
dependencies: []
124116
});

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@
258258
"packageManager": "yarn@4.10.2",
259259
"dependencies": {
260260
"@types/hoist-non-react-statics": "^3.3.7",
261-
"@webiny/di": "^0.2.1"
261+
"@webiny/di": "^0.2.3"
262262
},
263263
"engines": {
264264
"node": ">=22.0.0"

packages/admin-ui/src/DataTable/DataTable.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,10 @@ const defineColumns = <T,>(
206206
...firstColumn,
207207
accessorKey: firstColumn.id as string,
208208
header: props => {
209+
if (!props) {
210+
return null;
211+
}
212+
209213
return (
210214
<div className={"flex items-center gap-xl"}>
211215
<CheckboxPrimitive
@@ -223,6 +227,9 @@ const defineColumns = <T,>(
223227
);
224228
},
225229
cell: props => {
230+
if (!props) {
231+
return null;
232+
}
226233
return (
227234
<div className={"flex items-center gap-xl"}>
228235
<CheckboxPrimitive

0 commit comments

Comments
 (0)