diff --git a/.gitignore b/.gitignore index f73571726..5ca94b9cb 100644 --- a/.gitignore +++ b/.gitignore @@ -123,6 +123,11 @@ build /src/data/ /src/pages/docs/ /public/algolia/sitemap.xml - +/public/docs-static/raw/ # Mac files .DS_Store + +# Bruno +v6 +remote +.claude/settings.local.json diff --git a/.mdx-validation.json b/.mdx-validation.json new file mode 100644 index 000000000..efac83d63 --- /dev/null +++ b/.mdx-validation.json @@ -0,0 +1,11 @@ +{ + "targetDir": "docs/developer-docs/6.0.x", + "exceptions": [ + "get-started/welcome.mdx", + "get-started/install-webiny.mdx", + "overview/pricing.mdx", + "overview/features/security.mdx", + "tenant-manager/manage-tenants.mdx", + "tenant-manager/extend-tenant-model.mdx" + ] +} diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 000000000..3783821bd --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,226 @@ +# Project Instructions + +## Critical Project Conventions + +### Package Manager +- **ALWAYS use `yarn`, NEVER use `npm`** - This project exclusively uses Yarn +- All script execution: `yarn ` +- All package operations: `yarn add`, `yarn install`, etc. + +### Validation and Quality +- **MDX/.ai.txt Pairing**: Every `.mdx` file must have a corresponding `.ai.txt` companion file +- Run `yarn validate:mdx` to verify pairing before commits/PRs +- Exceptions are defined in `.mdx-validation.json` (supports exact paths and glob patterns) +- The validation script (`scripts/validate-mdx-pairing.ts`) checks bidirectionally + +### Project Structure +- Documentation: `docs/developer-docs/6.0.x/` +- Plans/design docs: `plans/` (project root) +- Scripts: `scripts/` (TypeScript scripts executed via `tsx`) +- Validation config: `.mdx-validation.json` (project root) + +## Documentation Structure +- Documentation files live in `docs/developer-docs/6.0.x/` +- `.mdx` files are the documentation pages +- `.ai.txt` files are AI companion context files — read them to understand the corresponding `.mdx` file (sources, decisions, patterns, tone guidelines) + +### Directory Layout +``` +docs/developer-docs/6.0.x/ +├── basic/ # Foundational patterns: DI (createAbstraction/createImplementation/createDecorator), Result pattern +├── get-started/ # Welcome + installation guide +├── graphql/ # GraphQL schema building with factory pattern +├── headless-cms/ # Largest section — all CMS extensibility +│ ├── builder/ # ModelBuilder, GroupBuilder, FieldBuilder APIs +│ ├── event-handler/ # Entry/model/group lifecycle events +│ ├── examples/ # Private model, single-entry model +│ ├── ui/ # Field renderers +│ └── use-case/ # Entry/model/group business logic +├── overview/ # Pricing, security features +│ └── features/ +├── tasks/ # Background task system (Runner, Context, Controller) +└── website-builder/ # Website Builder extensibility + ├── event-handler/ # Page/redirect lifecycle events + └── use-case/ # Page/redirect business logic +``` + +### Key Patterns +- Each major system follows a consistent taxonomy: **builder** (define structure) / **event-handler** (react to events) / **use-case** (custom business logic) +- `basic/di.mdx` and `basic/result.mdx` are foundational — referenced by all other sections +- `.ai.txt` files contain: source info, key decisions, understanding, code patterns, related docs, and tone guidelines +- Tone is calibrated per doc type: conceptual (about), technical (reference), practical (examples) + +### MDX/.ai.txt Pairing Exceptions +Current exceptions (defined in `.mdx-validation.json`): +- `get-started/welcome.mdx` - introductory page +- `get-started/install-webiny.mdx` - installation guide +- `overview/pricing.mdx` - pricing overview +- `overview/features/security.mdx` - security features + +## MDX Writing Conventions + +### Frontmatter +Every `.mdx` file uses exactly three required fields: +```yaml +--- +id: <8-char-alphanumeric> # e.g., "kp9m2xnf" — short, random, lowercase +title: +description: <One-line description> +--- +``` +Optional fields (rare, only for special pages like welcome): `pageHeader: false`, `fullWidth: true`. + +### Page Structure +Every page follows this order: +1. Frontmatter +2. Component imports +3. `<Alert type="success" title="WHAT YOU'LL LEARN">` block with bullet list of questions +4. `## Overview` — always the first H2, 1-3 paragraphs of prose +5. Content sections as H2 (`##`) with H3 (`###`) subsections as needed +6. No H1 headings in the body — the page title comes from frontmatter + +### Components +Only one MDX component is used: `<Alert>` from `@/components/Alert`. +```mdx +import {Alert} from "@/components/Alert"; +``` + +Alert types: +- `type="success"` — "WHAT YOU'LL LEARN" opener (every page) +- `type="info"` — supplemental links or context (inline, overview pages) +- `type="warning"` — important cautions (inline, overview pages) + +No other custom components are used (no `<Tabs>`, `<Steps>`, etc.). + +### Code Blocks +- Language tag is always specified: ` ```typescript ` or ` ```graphql ` +- **File path annotations** go after the language tag: ` ```typescript extensions/cms/group/eventHandler/create/beforeCreate.ts ` +- Use ` ```tsx ` for `webiny.config.tsx` files +- GraphQL SDL in TypeScript uses `/* GraphQL */` tag: `builder.addTypeDefs(/* GraphQL */ \`...\`)` +- Minimal comments in code — only for pedagogical correct/wrong comparisons using `// ✅ Correct` / `// ❌ Wrong` +- No shell/bash code blocks + +### Import Paths in Code Examples +```typescript +// Webiny v6 API imports — use "webiny/" prefix, NOT "@webiny/" +import { ModelFactory } from "webiny/api/cms/model"; +import { CreateEntryUseCase } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; +import { Api } from "webiny/extensions"; +import { Result } from "webiny/api"; + +// Local file imports use .js extensions (ESM) +import { BookRepository } from "./abstractions/BookRepository.js"; + +// Type-only imports +import type { CmsEntry } from "webiny/api"; +``` + +### Text Formatting +- Backticks for: code, class names, method names, type names, package names +- **Bold** for key labels: `**Naming Convention:**`, `**Key Point:**` +- Bullet lists use `-`, not numbered lists (even for sequential steps) +- No emojis in prose +- Inline links use standard markdown: `[text](/docs/path)` +- "Webiny" always capitalized + +## Tone and Voice + +### General Rules +- Concise and technical — no filler, no marketing language in developer docs +- Direct and instructional — "Use `createAbstraction()` to create one" +- Address the reader as "you" +- Explain "why" briefly before showing "how" +- Avoid "we" statements — use "The system provides/offers" instead +- No analogies in published docs (save those for `.ai.txt` context) +- Accessible to junior developers while remaining technically complete + +### Per Doc Type +| Doc Type | Tone | Focus | +|---|---|---| +| `about.mdx` | Conceptual, accessible | Why and what, link to reference for how | +| `reference.mdx` | Simple, concise, API-focused | Method signatures, minimal examples | +| `example.mdx` | Practical, production-ready | Complete working code, copy-paste friendly | +| `event-handler/*.mdx` | Production-ready examples | When/why to use each event, real-world scenarios | +| `use-case/*.mdx` | Technical and complete | Full abstraction + implementation patterns | +| `builder/*.mdx` | Technical reference | Complete method docs, practical examples per type | +| `management.mdx` | Practical, operation-focused | Complete examples, error handling | +| `get-started/`, `overview/` | Conversational, welcoming | High-level survey, no code | + +## TypeScript Code Patterns + +### DI Pattern (used in all implementations) +```typescript +import { SomeAbstraction } from "webiny/api/cms/entity"; +import { Logger } from "webiny/api/logger"; + +// Implementation class with Impl suffix +class SomeAbstractionImpl implements SomeAbstraction.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(event: SomeAbstraction.Event): Promise<void> { + // implementation + } +} + +// Factory registration — MUST be default export +const SomeAbstractionConst = SomeAbstraction.createImplementation({ + implementation: SomeAbstractionImpl, + dependencies: [Logger] +}); + +export default SomeAbstractionConst; +``` + +### Result Pattern (used in all use cases) +```typescript +const result = await someUseCase.execute(params); +if (result.isFail()) { + // handle error — return early (guard clause) + return { error: result.error, data: null }; +} +const value = result.value; +``` + +### Namespace Export Pattern (abstractions) +```typescript +export namespace MyAbstraction { + export type Interface = IMyAbstraction; + export type Params = IMyAbstractionParams; + export type Return = IMyAbstractionReturn; +} +``` + +### Registration in webiny.config.tsx +```tsx +import React from "react"; +import { Api } from "webiny/extensions"; + +export const Extensions = () => { + return ( + <> + {/* ... all your other extensions */} + <Api.Extension src={"/extensions/cms/entity/path/to/file.ts"} /> + </> + ); +}; +``` + +### Event Handler Naming +- Class names: `On[Resource][Before|After][Operation]Handler` (e.g., `OnPageBeforeCreateHandler`) +- Abstraction tokens: `[Resource][Before|After][Operation]Handler` (without "On" prefix) +- "Before" handlers receive `payload.input`; "After" handlers receive the completed entity (e.g., `payload.page`) + +## .ai.txt File Format +Each `.ai.txt` companion file contains these sections: +1. `AI Context: [Page Title] ([filename])` — header +2. `Source of Information:` — numbered list of research sources +3. `Key Documentation Decisions:` — editorial choices made +4. `[Topic-specific understanding]` — detailed domain knowledge +5. `[Code patterns/snippets]` — verified TypeScript templates +6. `Related Documents:` — cross-references to sibling docs +7. `Key Code Locations:` — source code paths in the Webiny repo +8. `Tone Guidelines:` — explicit style instructions for the page + +### Maintenance +- When new documentation files (`.mdx` or `.ai.txt`) are added, update the directory layout and notes in this AGENTS.md to reflect the changes. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 000000000..80cca7430 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,3 @@ +## Startup +- Always read `~/.claude/settings.json` at the start of every conversation. +- Read `./AGENTS.md" diff --git a/docs.config.ts b/docs.config.ts index e7d77f652..4bc92e264 100644 --- a/docs.config.ts +++ b/docs.config.ts @@ -34,27 +34,78 @@ const linkWhitelist: string[] = [...redirects.map(r => r.source), "/forms/produc */ const whitelistedVersions: string[] = []; +/** + * Only build versions at or above this version (e.g., "5.40.x"). + * Set via MIN_VERSION environment variable or modify here. + * Set to empty string to build all versions. + */ +const minVersionToBuild = process.env.MIN_VERSION || ""; + const filterByEnvironment = (version: Version) => { // In `preview`, if there are specific versions whitelisted for deployment, those are the only ones we'll output. if (preview && whitelistedVersions.length > 0) { return whitelistedVersions.includes(version.getValue()); } + // If minVersionToBuild is set, only build versions >= minVersion or `latest`. + if (minVersionToBuild) { + if (minVersionToBuild === "latest") { + return version.isLatest(); + } + const versionNum = parseFloat(version.getValue().replace(/[^\d.]/g, "")); + const minVersionNum = parseFloat(minVersionToBuild.replace(/[^\d.]/g, "")); + return versionNum >= minVersionNum; + } + // Build everything. return true; }; +const filterFilePathByVersion = (filePath: string): boolean => { + // Extract version from file path (e.g., /docs/developer-docs/5.40.x/... or /docs/user-guides/5.40.x/...) + const versionMatch = filePath.match(/\/(\d+\.\d+\.x)\//); + + if (!versionMatch) { + // If no version in path, include the file (e.g., non-versioned docs) + return true; + } + + const versionString = versionMatch[1]; + + // Use the same filtering logic as filterByEnvironment + if (preview && whitelistedVersions.length > 0) { + return whitelistedVersions.includes(versionString); + } + + if (minVersionToBuild) { + if (minVersionToBuild === "latest") { + // For file paths, we can't determine if it's "latest" without more context + // So we'll include all versioned files when minVersionToBuild is "latest" + return true; + } + const versionNum = parseFloat(versionString.replace(/[^\d.]/g, "")); + const minVersionNum = parseFloat(minVersionToBuild.replace(/[^\d.]/g, "")); + return versionNum >= minVersionNum; + } + + return true; +}; + const existsInDocs = (link: string) => { return fs.pathExists(path.join(__dirname, `src/pages/${link}.js`)); }; export default { projectRootDir: __dirname, - cleanOutputDir: path.resolve("src/pages/docs"), + cleanOutputDir: [path.resolve("src/pages/docs"), path.resolve("public/raw/docs")], sitemapOutputPath: path.resolve("public/algolia/sitemap.xml"), - linkValidator: new LinkValidator(linkWhitelist, link => { - return existsInDocs(link); - }), + linkValidator: new LinkValidator( + linkWhitelist, + link => { + return existsInDocs(link); + }, + filterFilePathByVersion + ), documentRoots: [ /* Developer Docs */ new VersionedDocumentRootConfig({ diff --git a/docs/developer-docs/5.28.x/core-development-concepts/scaffolding/react-application.mdx b/docs/developer-docs/5.28.x/core-development-concepts/scaffolding/react-application.mdx index 7be617254..556767825 100644 --- a/docs/developer-docs/5.28.x/core-development-concepts/scaffolding/react-application.mdx +++ b/docs/developer-docs/5.28.x/core-development-concepts/scaffolding/react-application.mdx @@ -227,7 +227,7 @@ import { createWatchApp, createBuildApp } from "@webiny/project-utils"; // Exports fundamental watch and build commands. // Need to inject environment variables or link your application with an existing GraphQL API? -// See https://www.webiny.com/docs/core-development-concepts/scaffolding/full-stack-application/webiny-config. +// See https://www.webiny.com/docs/{version}/core-development-concepts/scaffolding/full-stack-application/webiny-config. export default { commands: { async watch(options, context) { diff --git a/docs/developer-docs/5.28.x/custom-app-tutorial/adding-user-pools/adding-user-pool-and-user-pool-domain.mdx b/docs/developer-docs/5.28.x/custom-app-tutorial/adding-user-pools/adding-user-pool-and-user-pool-domain.mdx index 60571f521..60475728c 100644 --- a/docs/developer-docs/5.28.x/custom-app-tutorial/adding-user-pools/adding-user-pool-and-user-pool-domain.mdx +++ b/docs/developer-docs/5.28.x/custom-app-tutorial/adding-user-pools/adding-user-pool-and-user-pool-domain.mdx @@ -124,7 +124,7 @@ import Cloudfront from "./cloudfront"; const DEBUG = String(process.env.DEBUG); // Enables logs forwarding. -// https://www.webiny.com/docs/core-development-concepts/basics/watch-command#enabling-logs-forwarding +// https://www.webiny.com/docs/{version}/core-development-concepts/basics/watch-command#enabling-logs-forwarding const WEBINY_LOGS_FORWARD_URL = String(process.env.WEBINY_LOGS_FORWARD_URL); export default () => { diff --git a/docs/developer-docs/5.28.x/custom-app-tutorial/securing-graphql-api/initial-setup.mdx b/docs/developer-docs/5.28.x/custom-app-tutorial/securing-graphql-api/initial-setup.mdx index ffdcdc68b..165e13065 100644 --- a/docs/developer-docs/5.28.x/custom-app-tutorial/securing-graphql-api/initial-setup.mdx +++ b/docs/developer-docs/5.28.x/custom-app-tutorial/securing-graphql-api/initial-setup.mdx @@ -73,7 +73,7 @@ import Cognito from "./cognito"; import S3 from "./s3"; // Among other things, this determines the amount of information we reveal on runtime errors. -// https://www.webiny.com/docs/core-development-concepts/environment-variables/#debug-environment-variable +// https://www.webiny.com/docs/{version}/core-development-concepts/environment-variables/#debug-environment-variable const DEBUG = String(process.env.DEBUG); // Enables logs forwarding. diff --git a/docs/developer-docs/5.28.x/get-started/install-webiny.mdx b/docs/developer-docs/5.28.x/get-started/install-webiny.mdx index 049740a6f..7550025bb 100644 --- a/docs/developer-docs/5.28.x/get-started/install-webiny.mdx +++ b/docs/developer-docs/5.28.x/get-started/install-webiny.mdx @@ -27,7 +27,7 @@ Before proceeding, make sure you have the following: - Webiny works with both yarn versions [1 (classic)](https://yarnpkg.com/en/docs/install) and [>=2 (berry)](https://yarnpkg.com/) - for version 1 - **1.22.0** or later is required 3. **AWS account and user credentials** - - in order to deploy Webiny, you must have a valid [AWS account and user credentials](/docs/infrastructure/aws/configure-aws-credentials) set up on your system + - in order to deploy Webiny, you must have a valid [AWS account and user credentials](/docs/{version}/infrastructure/aws/configure-aws-credentials) set up on your system ## Project Setup diff --git a/docs/developer-docs/5.28.x/infrastructure/basics/environments.mdx b/docs/developer-docs/5.28.x/infrastructure/basics/environments.mdx index 2f31c9fd1..ba0cd3270 100644 --- a/docs/developer-docs/5.28.x/infrastructure/basics/environments.mdx +++ b/docs/developer-docs/5.28.x/infrastructure/basics/environments.mdx @@ -67,6 +67,6 @@ In certain cases, this might be reasonable. For example, you can reduce developm <Alert type="info"> -Depending on the environment, the **API** project application is deployed as two different sets of cloud infrastructure resources - development and production. Visit the [API Overview - Default VPC](/docs/architecture/deployment-modes/development) key topic to learn more. +Depending on the environment, the **API** project application is deployed as two different sets of cloud infrastructure resources - development and production. Visit the [API Overview - Default VPC](/docs/{version}/architecture/deployment-modes/development) key topic to learn more. </Alert> diff --git a/docs/developer-docs/5.28.x/infrastructure/pulumi-iac/iac-with-pulumi.mdx b/docs/developer-docs/5.28.x/infrastructure/pulumi-iac/iac-with-pulumi.mdx index eea2919a5..294945626 100644 --- a/docs/developer-docs/5.28.x/infrastructure/pulumi-iac/iac-with-pulumi.mdx +++ b/docs/developer-docs/5.28.x/infrastructure/pulumi-iac/iac-with-pulumi.mdx @@ -174,7 +174,7 @@ Currently, Webiny is not using the [Automation API](https://www.pulumi.com/blog/ Switching to a different infrastructure-as-code (IaC) solution would require a significant amount of work as it would involve rewriting almost all of the Webiny IaC code from scratch for a different IaC solution. **Therefore, we do not recommend it.** However, if you want to experiment with it, you would need to create a custom CLI plugin similar to the [Webiny CLI plugin for Pulumi](https://github.com/webiny/webiny-js/tree/next/packages/cli-plugin-deploy-pulumi). This plugin is responsible for creating the deploy, destroy, watch, and other commands. -To use your custom plugin, you would then need to import it into the `webiny.project.ts` file and remove the Pulumi plugin. The most challenging part would be transforming all of the Pulumi code into respective IaC code (i.e. transforming all Pulumi code to [CloudFormation](https://aws.amazon.com/cloudformation/), [Terraform](https://www.terraform.io/), or other IaC). You can refer to the Pulumi code to see the resources Webiny deploys and the [Cloud Infrastructure documentation](https://www.webiny.com/docs/architecture/introduction) for more information. +To use your custom plugin, you would then need to import it into the `webiny.project.ts` file and remove the Pulumi plugin. The most challenging part would be transforming all of the Pulumi code into respective IaC code (i.e. transforming all Pulumi code to [CloudFormation](https://aws.amazon.com/cloudformation/), [Terraform](https://www.terraform.io/), or other IaC). You can refer to the Pulumi code to see the resources Webiny deploys and the [Cloud Infrastructure documentation](https://www.webiny.com/docs/{version}/architecture/introduction) for more information. **Please keep in mind that this process will require a significant amount of effort, and it's recommended to stick with Pulumi unless your organization has strict policies that require using a different IaC solution.** diff --git a/docs/developer-docs/5.29.x/admin-area/new-app-tutorial/scaffolding.mdx b/docs/developer-docs/5.29.x/admin-area/new-app-tutorial/scaffolding.mdx index 693ffae43..cbf6a76ca 100644 --- a/docs/developer-docs/5.29.x/admin-area/new-app-tutorial/scaffolding.mdx +++ b/docs/developer-docs/5.29.x/admin-area/new-app-tutorial/scaffolding.mdx @@ -28,7 +28,7 @@ Note that, when we say GraphQL HTTP API, by default, we're referring to the one <Alert type="info"> -Learn more about the **API** project application on the cloud infrastructure level in the [Cloud Infrastructure](/docs/architecture/introduction) key topics section. +Learn more about the **API** project application on the cloud infrastructure level in the [Cloud Infrastructure](/docs/{version}/architecture/introduction) key topics section. </Alert> diff --git a/docs/developer-docs/5.29.x/core-development-concepts/scaffolding/extend-graphql-api.mdx b/docs/developer-docs/5.29.x/core-development-concepts/scaffolding/extend-graphql-api.mdx index 7758a334a..9c4e14ab8 100644 --- a/docs/developer-docs/5.29.x/core-development-concepts/scaffolding/extend-graphql-api.mdx +++ b/docs/developer-docs/5.29.x/core-development-concepts/scaffolding/extend-graphql-api.mdx @@ -223,7 +223,7 @@ You are free to create new tests in the similar fashion, or amend the existing o Please note that, by default, the authentication and authorization logic isn't included in the generated code. In other words, all of the generated GraphQL query and mutation operations can be performed by anonymous (not logged-in) users, which is in most cases not the desired behavior. -Luckily, with a couple of built-in utilities, this can be relatively easily added. Please check out the [existing tutorials](/docs/admin-area/new-app-tutorial/security) to learn how to implement these on your own. +Luckily, with a couple of built-in utilities, this can be relatively easily added. Please check out the [existing tutorials](/docs/{version}/admin-area/new-app-tutorial/security) to learn how to implement these on your own. ### I need more flexibility when it comes to data querying. Can I bring in a different database, for example ElasticSearch? diff --git a/docs/developer-docs/5.29.x/infrastructure/basics/modify-cloud-infrastructure.mdx b/docs/developer-docs/5.29.x/infrastructure/basics/modify-cloud-infrastructure.mdx index 9b6a5c1bd..0db0f0116 100644 --- a/docs/developer-docs/5.29.x/infrastructure/basics/modify-cloud-infrastructure.mdx +++ b/docs/developer-docs/5.29.x/infrastructure/basics/modify-cloud-infrastructure.mdx @@ -197,7 +197,7 @@ export default createCoreApp({ ### Defining Multiple Production Environments -Upon running the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command, when `prod` is passed as the environment name, a Webiny project is deployed in the so-called [production deployment mode](https://www.webiny.com/docs/architecture/deployment-modes/production). +Upon running the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command, when `prod` is passed as the environment name, a Webiny project is deployed in the so-called [production deployment mode](https://www.webiny.com/docs/{version}/architecture/deployment-modes/production). On order to use the production deployment mode for environments other than `prod`, we can use the `productionEnvironments` parameter. The following example shows how we can use the production mode for the `staging` environment: diff --git a/docs/developer-docs/5.30.x/wcp/link-a-project.mdx b/docs/developer-docs/5.30.x/wcp/link-a-project.mdx index d6c1dcc37..b8947994c 100644 --- a/docs/developer-docs/5.30.x/wcp/link-a-project.mdx +++ b/docs/developer-docs/5.30.x/wcp/link-a-project.mdx @@ -84,7 +84,7 @@ And all it's left to do is to select a project from the list. **Note**: if you h ![WCP - Link project inside personal development environment - Step 4](./assets/link-a-project/link-personal-step4.png) -Once you select your project, you are pretty much done, all you need to do, is to [deploy it](/docs/core-development-concepts/basics/project-deployment). +Once you select your project, you are pretty much done, all you need to do, is to [deploy it](/docs/{version}/core-development-concepts/basics/project-deployment). <Alert type="info" title="Project already defined"> diff --git a/docs/developer-docs/5.30.x/wcp/overview.mdx b/docs/developer-docs/5.30.x/wcp/overview.mdx index 3cadad8b2..6be36e6d8 100644 --- a/docs/developer-docs/5.30.x/wcp/overview.mdx +++ b/docs/developer-docs/5.30.x/wcp/overview.mdx @@ -70,7 +70,7 @@ A WCP user with an access to a specific WCP project can retrieve the license for <Alert type="info" title="Learn more"> -To learn how to retrieve a license inside your own personal development environment, [check this guide](/docs/wcp/link-a-project#personal-development-environment). +To learn how to retrieve a license inside your own personal development environment, [check this guide](/docs/{version}/wcp/link-a-project#personal-development-environment). </Alert> @@ -86,7 +86,7 @@ Every WCP project you create will have a CI/CD environment called `production` b <Alert type="info" title="Learn more"> -To learn how to retrieve a license inside CI/CD environment, [check this guide](/docs/wcp/link-a-project#ci-cd-environment). +To learn how to retrieve a license inside CI/CD environment, [check this guide](/docs/{version}/wcp/link-a-project#ci-cd-environment). </Alert> diff --git a/docs/developer-docs/5.33.x/headless-cms/extending/content-models-via-code.mdx b/docs/developer-docs/5.33.x/headless-cms/extending/content-models-via-code.mdx index ec421b422..075f87811 100644 --- a/docs/developer-docs/5.33.x/headless-cms/extending/content-models-via-code.mdx +++ b/docs/developer-docs/5.33.x/headless-cms/extending/content-models-via-code.mdx @@ -41,7 +41,7 @@ In the following sections, we cover a couple of examples that show how to define Note that we **NEVER** set the `storageId` property value as it is created automatically out of the field `id` and `type` property values. -To find out more about the `storageId` property, and understand why it exists, please read [this](/docs/headless-cms/extending/content-models-via-code-storage-id) article. +To find out more about the `storageId` property, and understand why it exists, please read [this](/docs/{version}/headless-cms/extending/content-models-via-code-storage-id) article. </Alert> @@ -151,7 +151,7 @@ Once plugins are registered successfully, we should be able to see the following <Alert type="success"> -With the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command up and running, the performed application code changes should be automatically rebuilt and redeployed into the cloud. +With the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command up and running, the performed application code changes should be automatically rebuilt and redeployed into the cloud. </Alert> @@ -263,7 +263,7 @@ export default [ ] ``` -With the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command up and running, +With the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command up and running, the performed application code changes should be automatically rebuilt and redeployed into the cloud. And you should be able to see the following Product model. diff --git a/docs/developer-docs/5.34.x/core-development-concepts/development/local-development.mdx b/docs/developer-docs/5.34.x/core-development-concepts/development/local-development.mdx index 8a84b25d6..2ffeee449 100644 --- a/docs/developer-docs/5.34.x/core-development-concepts/development/local-development.mdx +++ b/docs/developer-docs/5.34.x/core-development-concepts/development/local-development.mdx @@ -25,7 +25,7 @@ To do local development in Webiny, the API or any infrastructure changes must be In summary, changes made to API and infrastructure must be deployed to the cloud during local development. However, for changes made to only UI, deploying to the cloud is not necessary. Once the UI changes are finalised, these changes can be pushed to the cloud. If you're wondering how to push changes to the cloud during development, don't worry. As previously mentioned, we have developed various CLI tools, such as the `watch` command, to make deploying changes to the cloud during development easy. The `watch` command allows you to continuously rebuild and redeploy your code, making the development process seamless. -For detailed information, please refer to the [`watch command`](/docs/core-development-concepts/basics/watch-command) documentation. +For detailed information, please refer to the [`watch command`](/docs/{version}/core-development-concepts/basics/watch-command) documentation. Now let's learn more about local development with the frequently asked questions related to Webiny development. diff --git a/docs/developer-docs/5.34.x/core-development-concepts/extending-and-customizing/customizing-the-error-output.mdx b/docs/developer-docs/5.34.x/core-development-concepts/extending-and-customizing/customizing-the-error-output.mdx index aa1a948f1..2bc2699aa 100644 --- a/docs/developer-docs/5.34.x/core-development-concepts/extending-and-customizing/customizing-the-error-output.mdx +++ b/docs/developer-docs/5.34.x/core-development-concepts/extending-and-customizing/customizing-the-error-output.mdx @@ -15,7 +15,7 @@ import { Alert } from "@/components/Alert"; ## Introduction -In the `5.34.0` version we added a possibility for users to modify our `Fastify` handler instance, via the `ModifyFastifyPlugin`. To find our more on how and why we use `Fastify`, please read this [article](/docs/core-development-concepts/basics/routes-and-events). +In the `5.34.0` version we added a possibility for users to modify our `Fastify` handler instance, via the `ModifyFastifyPlugin`. To find our more on how and why we use `Fastify`, please read this [article](/docs/{version}/core-development-concepts/basics/routes-and-events). With the given plugin user can change and add anything to the `Fastify` instance, including the error handler. diff --git a/docs/developer-docs/5.34.x/enterprise/use-existing-amazon-vpc.mdx b/docs/developer-docs/5.34.x/enterprise/use-existing-amazon-vpc.mdx index 161cc6ebf..f1d506467 100644 --- a/docs/developer-docs/5.34.x/enterprise/use-existing-amazon-vpc.mdx +++ b/docs/developer-docs/5.34.x/enterprise/use-existing-amazon-vpc.mdx @@ -89,10 +89,10 @@ Note that, if the Webiny project is being deployed into the production environme <Alert type={"info"}> -Production deployment means deploying your Webiny project into `prod` environment, via the [`webiny deploy`](https://www.webiny.com/docs/core-development-concepts/basics/project-deployment) command: `yarn webiny deploy --env prod`. +Production deployment means deploying your Webiny project into `prod` environment, via the [`webiny deploy`](https://www.webiny.com/docs/{version}/core-development-concepts/basics/project-deployment) command: `yarn webiny deploy --env prod`. More on the development and production modes can be found here: -[https://www.webiny.com/docs/architecture/deployment-modes/introduction](https://www.webiny.com/docs/architecture/deployment-modes/introduction) +[https://www.webiny.com/docs/{version}/architecture/deployment-modes/introduction](https://www.webiny.com/docs/{version}/architecture/deployment-modes/introduction) </Alert> @@ -196,7 +196,7 @@ Note that for a Webiny project to work as expected, an Amazon VPC must have an [ 1. **Amazon Cognito** - Webiny's application code interacts with Amazon Cognito via AWS SDK. May not be needed if the organization doesn't plan to rely on Amazon Cognito as their identity provider. 2. **Amazon CloudFront** - Webiny's application code interacts with Amazon CloudFront via AWS SDK -3. **Webiny Control Panel (WCP)** - [Webiny Control Panel (WCP)](/docs/wcp/overview)-linked Webiny projects also frequently interact with app's public HTTP API (`api.webiny.com`) +3. **Webiny Control Panel (WCP)** - [Webiny Control Panel (WCP)](/docs/{version}/wcpoverview)-linked Webiny projects also frequently interact with app's public HTTP API (`api.webiny.com`) 4. **Webiny's Prerendering Service** - for website performance reasons, whenever a user publishes a page created with Webiny’s Page Builder application, behind the scenes, an AWS Lambda function is triggered, which issues HTTP requests to published page’s URL (a public CloudFront URL). May not be needed if the organization doesn't plan to use the Page Builder application. ### VPC Endpoints diff --git a/docs/developer-docs/5.34.x/headless-cms/basics/using-graphql-api-filtering.mdx b/docs/developer-docs/5.34.x/headless-cms/basics/using-graphql-api-filtering.mdx index 91d991f79..a459ca6c1 100644 --- a/docs/developer-docs/5.34.x/headless-cms/basics/using-graphql-api-filtering.mdx +++ b/docs/developer-docs/5.34.x/headless-cms/basics/using-graphql-api-filtering.mdx @@ -249,4 +249,4 @@ query { ## Conditional Filtering -The article [`Using the GraphQL API Advanced Filtering`](/docs/headless-cms/basics/using-graphql-api-advanced-filtering) will cover the conditional (advanced) filtering, where we will show you how to use the `AND` and `OR` conditionals. +The article [`Using the GraphQL API Advanced Filtering`](/docs/{version}/headless-cms/basics/using-graphql-api-advanced-filtering) will cover the conditional (advanced) filtering, where we will show you how to use the `AND` and `OR` conditionals. diff --git a/docs/developer-docs/5.35.x/core-development-concepts/extending-and-customizing/customizing-the-error-output.mdx b/docs/developer-docs/5.35.x/core-development-concepts/extending-and-customizing/customizing-the-error-output.mdx index 5702c6b01..88cda93c2 100644 --- a/docs/developer-docs/5.35.x/core-development-concepts/extending-and-customizing/customizing-the-error-output.mdx +++ b/docs/developer-docs/5.35.x/core-development-concepts/extending-and-customizing/customizing-the-error-output.mdx @@ -15,7 +15,7 @@ import { Alert } from "@/components/Alert"; ## Introduction -In the `5.34.0` version we added a possibility for users to modify our `Fastify` handler instance, via the `ModifyFastifyPlugin`. To find our more on how and why we use `Fastify`, please read this [article](/docs/core-development-concepts/basics/routes-and-events). +In the `5.34.0` version we added a possibility for users to modify our `Fastify` handler instance, via the `ModifyFastifyPlugin`. To find our more on how and why we use `Fastify`, please read this [article](/docs/{version}/core-development-concepts/basics/routes-and-events). With the given plugin user can change and add anything to the `Fastify` instance, including the error handler. diff --git a/docs/developer-docs/5.35.x/headless-cms/basics/using-graphql-api-filtering.mdx b/docs/developer-docs/5.35.x/headless-cms/basics/using-graphql-api-filtering.mdx index 91d991f79..a459ca6c1 100644 --- a/docs/developer-docs/5.35.x/headless-cms/basics/using-graphql-api-filtering.mdx +++ b/docs/developer-docs/5.35.x/headless-cms/basics/using-graphql-api-filtering.mdx @@ -249,4 +249,4 @@ query { ## Conditional Filtering -The article [`Using the GraphQL API Advanced Filtering`](/docs/headless-cms/basics/using-graphql-api-advanced-filtering) will cover the conditional (advanced) filtering, where we will show you how to use the `AND` and `OR` conditionals. +The article [`Using the GraphQL API Advanced Filtering`](/docs/{version}/headless-cms/basics/using-graphql-api-advanced-filtering) will cover the conditional (advanced) filtering, where we will show you how to use the `AND` and `OR` conditionals. diff --git a/docs/developer-docs/5.35.x/headless-cms/extending/content-models-via-code.mdx b/docs/developer-docs/5.35.x/headless-cms/extending/content-models-via-code.mdx index 8c0a91954..0c00faa5c 100644 --- a/docs/developer-docs/5.35.x/headless-cms/extending/content-models-via-code.mdx +++ b/docs/developer-docs/5.35.x/headless-cms/extending/content-models-via-code.mdx @@ -41,7 +41,7 @@ In the following sections, we cover a couple of examples that show how to define Note that we **NEVER** set the `storageId` property value as it is created automatically out of the field `id` and `type` property values. -To find out more about the `storageId` property, and understand why it exists, please read [this](/docs/headless-cms/extending/content-models-via-code-storage-id) article. +To find out more about the `storageId` property, and understand why it exists, please read [this](/docs/{version}/headless-cms/extending/content-models-via-code-storage-id) article. </Alert> @@ -151,7 +151,7 @@ Once plugins are registered successfully, we should be able to see the following <Alert type="success"> -With the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command up and running, the performed application code changes should be automatically rebuilt and redeployed into the cloud. +With the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command up and running, the performed application code changes should be automatically rebuilt and redeployed into the cloud. </Alert> @@ -263,7 +263,7 @@ export default [ ] ``` -With the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command up and running, +With the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command up and running, the performed application code changes should be automatically rebuilt and redeployed into the cloud. And you should be able to see the following Product model. @@ -388,7 +388,7 @@ renderer: { (...) ``` -With the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command up and running, +With the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command up and running, the performed application code changes should be automatically rebuilt and redeployed into the cloud. And you should be able to see the following Product Review model. diff --git a/docs/developer-docs/5.36.x/infrastructure/basics/modify-cloud-infrastructure.mdx b/docs/developer-docs/5.36.x/infrastructure/basics/modify-cloud-infrastructure.mdx index d1df19beb..a15073364 100644 --- a/docs/developer-docs/5.36.x/infrastructure/basics/modify-cloud-infrastructure.mdx +++ b/docs/developer-docs/5.36.x/infrastructure/basics/modify-cloud-infrastructure.mdx @@ -197,7 +197,7 @@ export default createCoreApp({ ### Defining Multiple Production Environments -Upon running the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command, when `prod` is passed as the environment name, a Webiny project is deployed in the so-called [production deployment mode](https://www.webiny.com/docs/architecture/deployment-modes/production). +Upon running the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command, when `prod` is passed as the environment name, a Webiny project is deployed in the so-called [production deployment mode](https://www.webiny.com/docs/{version}/architecture/deployment-modes/production). On order to use the production deployment mode for environments other than `prod`, we can use the `productionEnvironments` parameter. The following example shows how we can use the production mode for the `staging` environment: diff --git a/docs/developer-docs/5.37.x/enterprise/teams.mdx b/docs/developer-docs/5.37.x/enterprise/teams.mdx index de670a193..4d5ea3774 100644 --- a/docs/developer-docs/5.37.x/enterprise/teams.mdx +++ b/docs/developer-docs/5.37.x/enterprise/teams.mdx @@ -32,7 +32,7 @@ Trying to select **Custom Access** will result in an alert message being shown, <Image src={aaclCustomAccessUpgrade} title={"Selecting Custom Access Level on Open Source Tier"} /> -To upgrade to **Business** tier, users [link their project](/docs/wcp/link-a-project) with [Webiny Control Panel (WCP)](/docs/wcp/overview), from where they can activate the Advanced Access Control Layer (AACL) for their project. By doing this, users will be able to define fine-grained permissions for individual Webiny apps. +To upgrade to **Business** tier, users [link their project](/docs/{version}/wcplink-a-project) with [Webiny Control Panel (WCP)](/docs/{version}/wcpoverview), from where they can activate the Advanced Access Control Layer (AACL) for their project. By doing this, users will be able to define fine-grained permissions for individual Webiny apps. <Image src={aaclCustomAccess} @@ -59,7 +59,7 @@ This feature is especially useful for larger organizations, where it's common to ## Enabling Teams and Feature Overview -For Webiny Enterprise users, apart from [linking their Webiny project](/docs/wcp/link-a-project) with Webiny Control Panel (WCP), there are no additional steps required to enable Teams. +For Webiny Enterprise users, apart from [linking their Webiny project](/docs/{version}/wcp/link-a-project) with Webiny Control Panel (WCP), there are no additional steps required to enable Teams. Once linked, Teams will be automatically enabled and the module can be accessed from the main menu: diff --git a/docs/developer-docs/5.37.x/headless-cms/extending/customize-entry-list-filters.mdx b/docs/developer-docs/5.37.x/headless-cms/extending/customize-entry-list-filters.mdx index 4b16ef369..94bd0fd2c 100644 --- a/docs/developer-docs/5.37.x/headless-cms/extending/customize-entry-list-filters.mdx +++ b/docs/developer-docs/5.37.x/headless-cms/extending/customize-entry-list-filters.mdx @@ -121,7 +121,7 @@ const DeluxeFilter = () => { Under the hood, filters are handled via a regular form component: this means we can hook into the form to set new filter values. We're using the `useBind` hook and give it a name. This `name` will become a key within the form data object, which will be passed to the GraphQL query. To unset a filter, we set `undefined`. -You can write any filtering logic based on [Headless CMS's built-in GraphQL API filtering](/docs/headless-cms/basics/using-graphql-api-advanced-filtering). +You can write any filtering logic based on [Headless CMS's built-in GraphQL API filtering](/docs/{version}/headless-cms/basics/using-graphql-api-advanced-filtering). <Image src={hcmsToggleFilter} title="Toggle Filter in Action" /> diff --git a/docs/developer-docs/5.38.x/enterprise/aacl/teams.mdx b/docs/developer-docs/5.38.x/enterprise/aacl/teams.mdx index 049556599..30943c043 100644 --- a/docs/developer-docs/5.38.x/enterprise/aacl/teams.mdx +++ b/docs/developer-docs/5.38.x/enterprise/aacl/teams.mdx @@ -35,7 +35,7 @@ This feature is especially useful for larger organizations, where it's common to ## Enabling Teams and Feature Overview -For Webiny Enterprise users, apart from [linking their Webiny project](/docs/wcp/link-a-project) with Webiny Control Panel (WCP), there are no additional steps required to enable Teams. +For Webiny Enterprise users, apart from [linking their Webiny project](/docs/{version}/wcp/link-a-project) with Webiny Control Panel (WCP), there are no additional steps required to enable Teams. Once linked, Teams will be automatically enabled and the module can be accessed from the main menu: diff --git a/docs/developer-docs/5.38.x/get-started/install-webiny.mdx b/docs/developer-docs/5.38.x/get-started/install-webiny.mdx index feabdab17..62c53c74f 100644 --- a/docs/developer-docs/5.38.x/get-started/install-webiny.mdx +++ b/docs/developer-docs/5.38.x/get-started/install-webiny.mdx @@ -27,7 +27,7 @@ Before proceeding, make sure you have the following: - Webiny works with both yarn versions [1 (classic)](https://yarnpkg.com/en/docs/install) and [>=2 (berry)](https://yarnpkg.com/) - for version 1 - **1.22.21** or later is required 3. **AWS account and user credentials** - - in order to deploy Webiny, you must have a valid [AWS account and user credentials](/docs/infrastructure/aws/configure-aws-credentials) set up on your system + - in order to deploy Webiny, you must have a valid [AWS account and user credentials](/docs/{version}/infrastructure/aws/configure-aws-credentials) set up on your system ## Project Setup diff --git a/docs/developer-docs/5.39.x/admin-area/extending/environment-variables.mdx b/docs/developer-docs/5.39.x/admin-area/extending/environment-variables.mdx index 869e45521..eac5a7fce 100644 --- a/docs/developer-docs/5.39.x/admin-area/extending/environment-variables.mdx +++ b/docs/developer-docs/5.39.x/admin-area/extending/environment-variables.mdx @@ -19,7 +19,7 @@ import { WhatYouWillLearn } from "@/components/WhatYouWillLearn"; Admin app relies on several environment variables that get injected into React apps at build time using Pulumi state files. Sometimes, you might want to inject new variables, relevant to your project, and in this article we show you how to do just that. -Note that the naming convention for environment variables is explained in a dedicated article on [Environment Variables](/docs/core-development-concepts/basics/environment-variables). +Note that the naming convention for environment variables is explained in a dedicated article on [Environment Variables](/docs/{version}/core-development-concepts/basics/environment-variables). ## Inject Variables from Pulumi State diff --git a/docs/developer-docs/5.39.x/architecture/api/overview.mdx b/docs/developer-docs/5.39.x/architecture/api/overview.mdx index 8175024e2..c3953f16a 100644 --- a/docs/developer-docs/5.39.x/architecture/api/overview.mdx +++ b/docs/developer-docs/5.39.x/architecture/api/overview.mdx @@ -102,7 +102,7 @@ For background tasks (jobs)-related requirements, Webiny relies on [AWS Step Fun Note that background tasks are triggered via an Amazon EventBridge event. Amazon EventBridge is deployed as part of the **Core** project application (not shown on the diagram). -For more information on how to create and execute background tasks, check out the [Background Tasks](/docs/core-development-concepts/background-tasks/about-background-tasks) article. +For more information on how to create and execute background tasks, check out the [Background Tasks](/docs/{version}/core-development-concepts/background-tasks/about-background-tasks) article. ## FAQ diff --git a/docs/developer-docs/5.39.x/core-development-concepts/development/local-development.mdx b/docs/developer-docs/5.39.x/core-development-concepts/development/local-development.mdx index 612ac8fa4..753dc216d 100644 --- a/docs/developer-docs/5.39.x/core-development-concepts/development/local-development.mdx +++ b/docs/developer-docs/5.39.x/core-development-concepts/development/local-development.mdx @@ -25,7 +25,7 @@ To do local development in Webiny, the API or any infrastructure changes must be In summary, changes made to API and infrastructure must be deployed to the cloud during local development. However, for changes made to only UI, deploying to the cloud is not necessary. Once the UI changes are finalised, these changes can be pushed to the cloud. -If you're wondering how to push changes to the cloud during development, don't worry. As previously mentioned, we have developed various CLI tools, such as the [`watch command`](/docs/core-development-concepts/basics/watch-command) command, to make deploying changes to the cloud during development easy. The command allows you to continuously rebuild and redeploy your code, making the development process seamless. +If you're wondering how to push changes to the cloud during development, don't worry. As previously mentioned, we have developed various CLI tools, such as the [`watch command`](/docs/{version}/core-development-concepts/basics/watch-command) command, to make deploying changes to the cloud during development easy. The command allows you to continuously rebuild and redeploy your code, making the development process seamless. Now let's learn more about local development with the frequently asked questions related to Webiny development. @@ -43,7 +43,7 @@ With that in mind, we don't recommend using tools like [LocalStack](https://www. ## What is the potential cost associated with using an AWS account for development? -Webiny supports [two database setups](/docs/architecture/introduction#different-database-setups) at the moment: +Webiny supports [two database setups](/docs/{version}/architecture/introduction#different-database-setups) at the moment: 1. Amazon DynamoDB 2. Amazon DynamoDB + Amazon OpenSearch @@ -52,7 +52,7 @@ The Amazon DynamoDB database setup fully utilizes serverless services, which mea On the other hand, with the Amazon DynamoDB + Amazon OpenSearch version, [Amazon OpenSearch Service](https://aws.amazon.com/opensearch-service/) is the only non-serverless service used by Webiny, which is not priced on a pay-per-use basis. This means that you will be charged for the time the service is running, regardless of whether you are using it or not. -To mitigate costs, you can have one Amazon OpenSearch Service domain that's used by the entire team. This way, you can share the cost of the service among the team members. For more information on how to set this up, please refer to the [Using a Shared Amazon OpenSearch Service Domain](/docs/infrastructure/basics/modify-cloud-infrastructure#using-a-shared-amazon-open-search-service-domain) article. +To mitigate costs, you can have one Amazon OpenSearch Service domain that's used by the entire team. This way, you can share the cost of the service among the team members. For more information on how to set this up, please refer to the [Using a Shared Amazon OpenSearch Service Domain](/docs/{version}/infrastructure/basics/modify-cloud-infrastructure#using-a-shared-amazon-open-search-service-domain) article. ## Working with team on a Webiny project diff --git a/docs/developer-docs/5.39.x/enterprise/use-existing-amazon-vpc.mdx b/docs/developer-docs/5.39.x/enterprise/use-existing-amazon-vpc.mdx index 64f617cca..a8404c82f 100644 --- a/docs/developer-docs/5.39.x/enterprise/use-existing-amazon-vpc.mdx +++ b/docs/developer-docs/5.39.x/enterprise/use-existing-amazon-vpc.mdx @@ -91,10 +91,10 @@ Note that, if the Webiny project is being deployed into the production environme <Alert type={"info"}> -Production deployment means deploying your Webiny project into `prod` environment, via the [`webiny deploy`](https://www.webiny.com/docs/core-development-concepts/basics/project-deployment) command: `yarn webiny deploy --env prod`. +Production deployment means deploying your Webiny project into `prod` environment, via the [`webiny deploy`](https://www.webiny.com/docs/{version}/core-development-concepts/basics/project-deployment) command: `yarn webiny deploy --env prod`. More on the development and production modes can be found here: -[https://www.webiny.com/docs/architecture/deployment-modes/introduction](https://www.webiny.com/docs/architecture/deployment-modes/introduction) +[https://www.webiny.com/docs/{version}/architecture/deployment-modes/introduction](https://www.webiny.com/docs/{version}/architecture/deployment-modes/introduction) </Alert> @@ -198,7 +198,7 @@ Note that for a Webiny project to work as expected, an Amazon VPC must have an [ 1. **Amazon Cognito** - Webiny's application code interacts with Amazon Cognito via AWS SDK. May not be needed if the organization doesn't plan to rely on Amazon Cognito as their identity provider. 2. **Amazon CloudFront** - Webiny's application code interacts with Amazon CloudFront via AWS SDK -3. **Webiny Control Panel (WCP)** - [Webiny Control Panel (WCP)](/docs/wcp/overview)-linked Webiny projects also frequently interact with app's public HTTP API (`api.webiny.com`) +3. **Webiny Control Panel (WCP)** - Webiny Control Panel (WCP)-linked Webiny projects also frequently interact with app's public HTTP API (`api.webiny.com`) 4. **Webiny's Prerendering Service** - for website performance reasons, whenever a user publishes a page created with Webiny’s Page Builder application, behind the scenes, an AWS Lambda function is triggered, which issues HTTP requests to published page’s URL (a public CloudFront URL). May not be needed if the organization doesn't plan to use the Page Builder application. ### VPC Endpoints diff --git a/docs/developer-docs/5.39.x/get-started/install-webiny.mdx b/docs/developer-docs/5.39.x/get-started/install-webiny.mdx index 0e01de93d..7217b97ac 100644 --- a/docs/developer-docs/5.39.x/get-started/install-webiny.mdx +++ b/docs/developer-docs/5.39.x/get-started/install-webiny.mdx @@ -31,7 +31,7 @@ Before proceeding, make sure you have the following: 3. **AWS account and user credentials** -- in order to deploy Webiny, you must have a valid [AWS account and user credentials](/docs/infrastructure/aws/configure-aws-credentials) set up on your system +- in order to deploy Webiny, you must have a valid [AWS account and user credentials](/docs/{version}/infrastructure/aws/configure-aws-credentials) set up on your system ## Project Setup @@ -133,4 +133,4 @@ To install Webiny, you will need a basic understanding of Node, Yarn, JavaScript ### Which AWS regions are supported by Webiny? -Webiny supports all AWS regions except the China regions (Beijing and Ningxia) because Webiny relies on Amazon CloudFront and Amazon Cognito services, which are not available in [Beijing and Ningxia regions](https://www.amazonaws.cn/en/about-aws/regional-product-services/) respectively. \ No newline at end of file +Webiny supports all AWS regions except the China regions (Beijing and Ningxia) because Webiny relies on Amazon CloudFront and Amazon Cognito services, which are not available in [Beijing and Ningxia regions](https://www.amazonaws.cn/en/about-aws/regional-product-services/) respectively. diff --git a/docs/developer-docs/5.39.x/get-started/welcome.mdx b/docs/developer-docs/5.39.x/get-started/welcome.mdx index b8e8ad877..e5239d076 100644 --- a/docs/developer-docs/5.39.x/get-started/welcome.mdx +++ b/docs/developer-docs/5.39.x/get-started/welcome.mdx @@ -86,7 +86,7 @@ import { ReactComponent as CommunityIcon } from "./assets/resources-icons/commun categoryTitle="Products" /> <SectionRow> - <SectionBox title="Headless CMS" Icon={HeadlessCmsIcon} learnMoreLink="/docs/headless-cms/overview"> + <SectionBox title="Headless CMS" Icon={HeadlessCmsIcon} learnMoreLink="/docs/{version}/headless-cms/overview"> <p> Learn how to create plugins and customize the Headless CMS experience to your content needs. From extending the built-in GraphQL capabilities to modifying the editorial experience. </p> @@ -108,7 +108,7 @@ import { ReactComponent as CommunityIcon } from "./assets/resources-icons/commun In this section, you'll learn how to customize the layout and visual aspects of your forms. </p> </SectionBox> - <SectionBox title="Admin Area" Icon={AdminIcon} learnMoreLink="/docs/admin-area/basics/framework"> + <SectionBox title="Admin Area" Icon={AdminIcon} learnMoreLink="/docs/{version}/admin-area/basics/framework"> <p> The Admin Area is an app inside which all other apps live. You can white-label the UI to match the brand of your customer, introduce new apps into the menu, modify the start page, and more. </p> @@ -130,7 +130,7 @@ import { ReactComponent as CommunityIcon } from "./assets/resources-icons/commun For developers just getting started with Webiny, we've prepared a short onboarding video course to help you take your first step in development with Webiny. </p> </SectionBox> - <SectionBox title="Core development concepts" Icon={ConceptsIcon} learnMoreLink="/docs/core-development-concepts/basics/tools-and-libraries"> + <SectionBox title="Core development concepts" Icon={ConceptsIcon} learnMoreLink="/docs/{version}/core-development-concepts/basics/tools-and-libraries"> <p> Once you're past the basics of how to develop with Webiny, this category of articles is a good next step. </p> @@ -138,24 +138,24 @@ import { ReactComponent as CommunityIcon } from "./assets/resources-icons/commun You'll learn about the core concepts such as the watch command, project organization, the CLI utility and more. </p> </SectionBox> - <SectionBox title="Customize and extend" Icon={CustomizeIcon} learnMoreLink="/docs/core-development-concepts/extending-and-customizing/extend-graphql-api"> + <SectionBox title="Customize and extend" Icon={CustomizeIcon} learnMoreLink="/docs/{version}/core-development-concepts/extending-and-customizing/extend-graphql-api"> <p> Learn how to extend the GraphQL API, CLI utility, add custom routes to the Lambda function, intercept requests or customize the built-in Lexical editor. </p> </SectionBox> </SectionRow> <SectionRow> - <SectionBox title="CI/CD setup" Icon={CiCdIcon} learnMoreLink="/docs/core-development-concepts/ci-cd/introduction"> + <SectionBox title="CI/CD setup" Icon={CiCdIcon} learnMoreLink="/docs/{version}/core-development-concepts/ci-cd/introduction"> <p> If you need to configure and deploy Webiny from a CI/CD environment, follow this guide. </p> </SectionBox> - <SectionBox title="Security Framework" Icon={SecurityFrameworkIcon} learnMoreLink="/docs/core-development-concepts/security-framework/introduction"> + <SectionBox title="Security Framework" Icon={SecurityFrameworkIcon} learnMoreLink="/docs/{version}/core-development-concepts/security-framework/introduction"> <p> Webiny has a simple, but powerful security framework that allows you to integrate with different SSO systems as well as customize the authentication and authorization flows. </p> </SectionBox> - <SectionBox title="Background tasks" Icon={BgTasksIcon} learnMoreLink="/docs/core-development-concepts/background-tasks/about-background-tasks"> + <SectionBox title="Background tasks" Icon={BgTasksIcon} learnMoreLink="/docs/{version}/core-development-concepts/background-tasks/about-background-tasks"> <p> Webiny supports long-running tasks that are executed in the background. In this set of articles, you'll learn how to leverage this mechanism inside your own custom plugins and apps built inside Webiny. </p> @@ -172,7 +172,7 @@ import { ReactComponent as CommunityIcon } from "./assets/resources-icons/commun categoryTitle="Resources" /> <SectionRow> - <SectionBox title="User guides" Icon={UserGuidesIcon} learnMoreLink="/docs/user-guides/overview"> + <SectionBox title="User guides" Icon={UserGuidesIcon} learnMoreLink="/docs/{version}/user-guides/overview"> <p> Guides to help non-technical users master Webiny and many of its features. </p> diff --git a/docs/developer-docs/5.39.x/headless-cms/extending/content-models-via-code.mdx b/docs/developer-docs/5.39.x/headless-cms/extending/content-models-via-code.mdx index 60cfede45..7046625f5 100644 --- a/docs/developer-docs/5.39.x/headless-cms/extending/content-models-via-code.mdx +++ b/docs/developer-docs/5.39.x/headless-cms/extending/content-models-via-code.mdx @@ -42,7 +42,7 @@ In the following sections, we cover a couple of examples that show how to define Note that we **NEVER** set the `storageId` property value as it is created automatically out of the field `id` and `type` property values. -To find out more about the `storageId` property, and understand why it exists, please read [this](/docs/headless-cms/extending/content-models-via-code-storage-id) article. +To find out more about the `storageId` property, and understand why it exists, please read [this](/docs/{version}/headless-cms/extending/content-models-via-code-storage-id) article. </Alert> @@ -152,7 +152,7 @@ Once plugins are registered successfully, we should be able to see the following <Alert type="success"> -With the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command up and running, the performed application code changes should be automatically rebuilt and redeployed into the cloud. +With the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command up and running, the performed application code changes should be automatically rebuilt and redeployed into the cloud. </Alert> @@ -264,7 +264,7 @@ export default [ ] ``` -With the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command up and running, +With the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command up and running, the performed application code changes should be automatically rebuilt and redeployed into the cloud. And you should be able to see the following Product model. @@ -389,7 +389,7 @@ renderer: { (...) ``` -With the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command up and running, +With the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command up and running, the performed application code changes should be automatically rebuilt and redeployed into the cloud. And you should be able to see the following Product Review model. @@ -401,7 +401,7 @@ With this [5.39.2 release](/docs/release-notes/5.39.2/changelog#content-models-d <Image src={securityPermissions} alt="Security Permissions Defined via the Security Application" /> -Additionally, in case the [Folder Level Permissions](/docs/enterprise/aacl/folder-level-permissions) feature is enabled in your Webiny project, the content model entries will not be subject to folder level permissions. +Additionally, in case the [Folder Level Permissions](/docs/{version}/enterprise/aacl/folder-level-permissions) feature is enabled in your Webiny project, the content model entries will not be subject to folder level permissions. The following example demonstrates how to disable authorization for a content model and its entries. @@ -456,7 +456,7 @@ new CmsModelPlugin({ }); ``` -With the `authorization` property set to `false`, base authorization checks are disabled for the content model and its entries. Furthermore, in case the [Folder Level Permissions](/docs/enterprise/aacl/folder-level-permissions) feature is enabled in your Webiny project, the content model entries will not be subject to folder level permissions. +With the `authorization` property set to `false`, base authorization checks are disabled for the content model and its entries. Furthermore, in case the [Folder Level Permissions](/docs/{version}/enterprise/aacl/folder-level-permissions) feature is enabled in your Webiny project, the content model entries will not be subject to folder level permissions. ### Define a Content Model Only for a Specific Locale diff --git a/docs/developer-docs/5.39.x/headless-cms/extending/lexical-editor.mdx b/docs/developer-docs/5.39.x/headless-cms/extending/lexical-editor.mdx index c4c108f98..393841872 100644 --- a/docs/developer-docs/5.39.x/headless-cms/extending/lexical-editor.mdx +++ b/docs/developer-docs/5.39.x/headless-cms/extending/lexical-editor.mdx @@ -22,7 +22,7 @@ In this article, we'll cover the Lexical Editor configuration for the Headless C ### Toolbar -Headless CMS uses a static toolbar, which is always visible, unlike the [Page Builder](/docs/page-builder/extending/lexical-editor), which uses a floating toolbar. Webiny ships with a set of default actions, but you can add new actions, replace existing actions, or remove them completely. +Headless CMS uses a static toolbar, which is always visible. Webiny ships with a set of default actions, but you can add new actions, replace existing actions, or remove them completely. <Image src={staticToolbar} title="Static Rich Text Editor Toolbar" /> diff --git a/docs/developer-docs/5.39.x/headless-cms/extending/private-models.mdx b/docs/developer-docs/5.39.x/headless-cms/extending/private-models.mdx index f5dc87259..f2292c71d 100644 --- a/docs/developer-docs/5.39.x/headless-cms/extending/private-models.mdx +++ b/docs/developer-docs/5.39.x/headless-cms/extending/private-models.mdx @@ -32,7 +32,7 @@ Let's delve into the details of both public and private models and explore how y Public models in Webiny are those content models that are visible within the admin app. These models come with a generated navigation menu, allowing easy access to content entries through the user interface. Creating public models involves the conventional process of logging into the admin app and using the user interface to create a content model or you can also define public content model via code. The result is the automatic generation of an API, including a GraphQL type and a set of resolvers for seamless data interaction. -Alternatively, you can also build public models through code using a [plugin](/docs/headless-cms/extending/content-models-via-code-storage-id). +Alternatively, you can also build public models through code using a [plugin](/docs/{version}/headless-cms/extending/content-models-via-code-storage-id). ## Private Models Private models, in contrast, remain hidden from the admin app UI. These models are defined programmatically through a plugin. While the schema and resolvers aren't auto-generated, developers have the freedom to design them on the backend or API. diff --git a/docs/developer-docs/5.39.x/headless-cms/overview.mdx b/docs/developer-docs/5.39.x/headless-cms/overview.mdx index 5feba1f28..9a09a7c8e 100644 --- a/docs/developer-docs/5.39.x/headless-cms/overview.mdx +++ b/docs/developer-docs/5.39.x/headless-cms/overview.mdx @@ -25,17 +25,17 @@ Below you'll find a few core articles that we recommend every engineer to go thr /> <SectionRow> - <SectionBox title="GraphQL API Overview" learnMoreLink="/docs/headless-cms/basics/graphql-api"> + <SectionBox title="GraphQL API Overview" learnMoreLink="/docs/{version}/headless-cms/basics/graphql-api"> <p> Learn what is the Headless CMS GraphQL API, what are its main characteristics, and how to access it. </p> </SectionBox> - <SectionBox title="Using the GraphQL API" learnMoreLink="/docs/headless-cms/basics/using-graphql-api"> + <SectionBox title="Using the GraphQL API" learnMoreLink="/docs/{version}/headless-cms/basics/using-graphql-api"> <p> Learn how to use the Headless CMS's built-in GraphQL API. </p> </SectionBox> - <SectionBox title="Advanced Filtering via API" learnMoreLink="/docs/headless-cms/basics/using-graphql-api-advanced-filtering"> + <SectionBox title="Advanced Filtering via API" learnMoreLink="/docs/{version}/headless-cms/basics/using-graphql-api-advanced-filtering"> <p> Learn how to use the Headless CMS's built-in GraphQL API advanced filter. </p> @@ -52,17 +52,17 @@ Below you'll find a few core articles that we recommend every engineer to go thr /> <SectionRow> - <SectionBox title="Extend the GraphQL API" learnMoreLink="/docs/headless-cms/extending/extend-graphql-api"> + <SectionBox title="Extend the GraphQL API" learnMoreLink="/docs/{version}/headless-cms/extending/extend-graphql-api"> <p> Learn how to extend the Headless CMS-related GraphQL types and operations. </p> </SectionBox> - <SectionBox title="Define Content Models via Code" learnMoreLink="/docs/headless-cms/extending/content-models-via-code"> + <SectionBox title="Define Content Models via Code" learnMoreLink="/docs/{version}/headless-cms/extending/content-models-via-code"> <p> Learn how to define content models and content model groups through code. </p> </SectionBox> - <SectionBox title="Customize Entry List Table Columns" learnMoreLink="/docs/headless-cms/extending/customize-entry-list-table-columns"> + <SectionBox title="Customize Entry List Table Columns" learnMoreLink="/docs/{version}/headless-cms/extending/customize-entry-list-table-columns"> <p> Learn how to add, replace, or remove columns in the Entry List Table. </p> @@ -79,17 +79,17 @@ Below you'll find a few core articles that we recommend every engineer to go thr /> <SectionRow> - <SectionBox title="Building a Frontend With NextJS" learnMoreLink="/docs/headless-cms/integrations/nextjs"> + <SectionBox title="Building a Frontend With NextJS" learnMoreLink="/docs/{version}/headless-cms/integrations/nextjs"> <p> Learn how to build a frontend for Webiny Headless CMS with NextJS </p> </SectionBox> - <SectionBox title="Lifecycle Events" learnMoreLink="/docs/headless-cms/references/lifecycle-events"> + <SectionBox title="Lifecycle Events" learnMoreLink="/docs/{version}/headless-cms/references/lifecycle-events"> <p> Learn about Headless CMS lifecycle events, how they work and how to subscribe to a lifecycle event. </p> </SectionBox> - <SectionBox title="Date/Time and Identity Meta Fields" learnMoreLink="/docs/headless-cms/references/date-time-and-identity-meta-fields"> + <SectionBox title="Date/Time and Identity Meta Fields" learnMoreLink="/docs/{version}/headless-cms/references/date-time-and-identity-meta-fields"> <p> Learn about the date/time and identity-related meta fields that are available for content entries. </p> diff --git a/docs/developer-docs/5.39.x/headless-cms/references/date-time-and-identity-meta-fields.mdx b/docs/developer-docs/5.39.x/headless-cms/references/date-time-and-identity-meta-fields.mdx index 30c4a327f..8c062009c 100644 --- a/docs/developer-docs/5.39.x/headless-cms/references/date-time-and-identity-meta-fields.mdx +++ b/docs/developer-docs/5.39.x/headless-cms/references/date-time-and-identity-meta-fields.mdx @@ -23,7 +23,7 @@ Apart from the fields that are defined in a content model by the user, all conte These meta fields are automatically populated by the system, and they can be used to display information about the entry, such as when it was created, modified, or published, and by whom. -Developers can use these fields when querying entries, for example via the [Headless CMS GraphQL API](/docs/headless-cms/basics/graphql-api): +Developers can use these fields when querying entries, for example via the [Headless CMS GraphQL API](/docs/{version}/headless-cms/basics/graphql-api): ```graphql query { @@ -49,7 +49,7 @@ query { } ``` -They can also use them in their custom JavaScript (TypeScript) code, for example, when hooking onto [lifecycle events](/docs/headless-cms/references/lifecycle-events): +They can also use them in their custom JavaScript (TypeScript) code, for example, when hooking onto [lifecycle events](/docs/{version}/headless-cms/references/lifecycle-events): ```typescript new ContextPlugin<CmsContext>(async context => { diff --git a/docs/developer-docs/5.39.x/infrastructure/basics/modify-cloud-infrastructure.mdx b/docs/developer-docs/5.39.x/infrastructure/basics/modify-cloud-infrastructure.mdx index d306ac316..f017d86d3 100644 --- a/docs/developer-docs/5.39.x/infrastructure/basics/modify-cloud-infrastructure.mdx +++ b/docs/developer-docs/5.39.x/infrastructure/basics/modify-cloud-infrastructure.mdx @@ -197,7 +197,7 @@ export default createCoreApp({ ### Defining Multiple Production Environments -Upon running the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command, when `prod` is passed as the environment name, a Webiny project is deployed in the so-called [production deployment mode](https://www.webiny.com/docs/architecture/deployment-modes/production). +Upon running the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command, when `prod` is passed as the environment name, a Webiny project is deployed in the so-called [production deployment mode](https://www.webiny.com/docs/{version}/architecture/deployment-modes/production). On order to use the production deployment mode for environments other than `prod`, we can use the `productionEnvironments` parameter. The following example shows how we can use the production mode for the `staging` environment: diff --git a/docs/developer-docs/5.40.x/admin-area/basics/framework.mdx b/docs/developer-docs/5.40.x/admin-area/basics/framework.mdx index e739508bc..ded21ccc5 100644 --- a/docs/developer-docs/5.40.x/admin-area/basics/framework.mdx +++ b/docs/developer-docs/5.40.x/admin-area/basics/framework.mdx @@ -73,9 +73,9 @@ export const App = () => { }; ``` -The `AddRoute` component is described in the dedicated [Custom Routes](/docs/admin-area/extending/custom-routes) article. +The `AddRoute` component is described in the dedicated [Custom Routes](/docs/{version}/admin-area/extending/custom-routes) article. -The `AddMenu` component is described in the dedicated [Customize Navigation](/docs/admin-area/extending/customize-navigation) article. +The `AddMenu` component is described in the dedicated [Customize Navigation](/docs/{version}/admin-area/extending/customize-navigation) article. Let's see a more advanced example, and demonstrate a real-life example of menus, routes, and permissions: @@ -120,7 +120,7 @@ export const App = () => { <Alert type={"info"} title={"Extensions"}> - We highly recommend using our [Extensions](/docs/core-development-concepts/basics/extensions) to organize your code in a scalable and portable manner. + We highly recommend using our [Extensions](/docs/{version}/core-development-concepts/basics/extensions) to organize your code in a scalable and portable manner. </Alert> diff --git a/docs/developer-docs/5.40.x/architecture/api/overview.mdx b/docs/developer-docs/5.40.x/architecture/api/overview.mdx index 5519d9e5b..7174f7c46 100644 --- a/docs/developer-docs/5.40.x/architecture/api/overview.mdx +++ b/docs/developer-docs/5.40.x/architecture/api/overview.mdx @@ -102,7 +102,7 @@ For background tasks (jobs)-related requirements, Webiny relies on [AWS Step Fun Note that background tasks are triggered via an Amazon EventBridge event. Amazon EventBridge is deployed as part of the **Core** project application (not shown on the diagram). -For more information on how to create and execute background tasks, check out the [Background Tasks](/docs/core-development-concepts/background-tasks/about-background-tasks) article. +For more information on how to create and execute background tasks, check out the [Background Tasks](/docs/{version}/core-development-concepts/background-tasks/about-background-tasks) article. ## Additional Information diff --git a/docs/developer-docs/5.40.x/core-development-concepts/basics/extensions.mdx b/docs/developer-docs/5.40.x/core-development-concepts/basics/extensions.mdx index 772708731..dd36026b8 100644 --- a/docs/developer-docs/5.40.x/core-development-concepts/basics/extensions.mdx +++ b/docs/developer-docs/5.40.x/core-development-concepts/basics/extensions.mdx @@ -23,7 +23,7 @@ There are a couple of types of extensions in Webiny, but the most common ones ar - **API** - used to extend Webiny's backend functionality (for example its GraphQL API) - **Cloud Infrastructure** - used to extend the cloud infrastructure Webiny deploys -For example, via an Admin extension, we can change the [layout of the dashboard](/docs/admin-area/extending/custom-dashboard) or [change the logo](/docs/admin-area/extending/change-logo) that's shown in the header and the main menu. On the other hand, via an API extension, we can introduce new GraphQL queries or mutations, [content models](/docs/headless-cms/extending/content-models-via-code), or [hook into lifecycle events](/docs/headless-cms/references/lifecycle-events). +For example, via an Admin extension, we can change the [layout of the dashboard](/docs/{version}/admin-area/extending/custom-dashboard) or [change the logo](/docs/{version}/admin-area/extending/change-logo) that's shown in the header and the main menu. On the other hand, via an API extension, we can introduce new GraphQL queries or mutations, [content models](/docs/{version}/headless-cms/extending/content-models-via-code), or [hook into lifecycle events](/docs/{version}/headless-cms/references/lifecycle-events). ## Getting Started @@ -41,7 +41,7 @@ Ultimately, the scaffold creates the base code for the new extension in the `ext <Alert type="info"> - There are a couple of cases where the extension code is placed outside of the `extensions` folder. For example, when [modifying cloud infrastructure](/docs/infrastructure/basics/modify-cloud-infrastructure), the code is placed in different `webiny.application.ts` files, located in the `apps` folder. + There are a couple of cases where the extension code is placed outside of the `extensions` folder. For example, when [modifying cloud infrastructure](/docs/{version}/infrastructure/basics/modify-cloud-infrastructure), the code is placed in different `webiny.application.ts` files, located in the `apps` folder. </Alert> diff --git a/docs/developer-docs/5.40.x/core-development-concepts/extending-and-customizing/extend-graphql-api.mdx b/docs/developer-docs/5.40.x/core-development-concepts/extending-and-customizing/extend-graphql-api.mdx index e07442382..3e9abbf9c 100644 --- a/docs/developer-docs/5.40.x/core-development-concepts/extending-and-customizing/extend-graphql-api.mdx +++ b/docs/developer-docs/5.40.x/core-development-concepts/extending-and-customizing/extend-graphql-api.mdx @@ -91,7 +91,7 @@ With this code in place, we should be able to run the following GraphQL query: -The easiest way to test it is by using the [API Playground](https://www.webiny.com/docs/admin-area/basics/api-playground) in the Admin app: +The easiest way to test it is by using the [API Playground](https://www.webiny.com/docs/{version}/admin-area/basics/api-playground) in the Admin app: <Image src={listBooksQuery} title={<>Testing the <code>listBooks</code> query in the API Playground</>} /> diff --git a/docs/developer-docs/5.40.x/core-development-concepts/security-framework/api-security.mdx b/docs/developer-docs/5.40.x/core-development-concepts/security-framework/api-security.mdx index 0198f8c66..15559ef84 100644 --- a/docs/developer-docs/5.40.x/core-development-concepts/security-framework/api-security.mdx +++ b/docs/developer-docs/5.40.x/core-development-concepts/security-framework/api-security.mdx @@ -17,7 +17,7 @@ In this article, we cover how Webiny Security Framework (_WSF_ for short) works <Alert type="info"> -This article uses terms like authentication, authorization, identity, and permissions extensively. These terms are described in details in the [Introduction](/docs/core-development-concepts/security-framework/introduction) article. If you're not familiar with these terms, make sure you read that article first. +This article uses terms like authentication, authorization, identity, and permissions extensively. These terms are described in details in the [Introduction](/docs/{version}/core-development-concepts/security-framework/introduction) article. If you're not familiar with these terms, make sure you read that article first. </Alert> diff --git a/docs/developer-docs/5.40.x/core-development-concepts/security-framework/react-security.mdx b/docs/developer-docs/5.40.x/core-development-concepts/security-framework/react-security.mdx index 1e3131857..f8865afad 100644 --- a/docs/developer-docs/5.40.x/core-development-concepts/security-framework/react-security.mdx +++ b/docs/developer-docs/5.40.x/core-development-concepts/security-framework/react-security.mdx @@ -14,7 +14,7 @@ import { Alert } from "@/components/Alert"; <Alert type="warning" title="Important"> -This article is a continuation of the previous two articles about Webiny Security Framework. If you haven't already, please do read the [Introduction](/docs/core-development-concepts/security-framework/introduction) and [API Security](/docs/core-development-concepts/security-framework/api-security) articles before continuing. +This article is a continuation of the previous two articles about Webiny Security Framework. If you haven't already, please do read the [Introduction](/docs/{version}/core-development-concepts/security-framework/introduction) and [API Security](/docs/{version}/core-development-concepts/security-framework/api-security) articles before continuing. </Alert> @@ -28,7 +28,7 @@ Let's use the following diagram to analyze the order of operations that are goin Once your application has started, it will render a login form (this can be your custom form or the one provided by your IdP's React SDK). A user submits their credentials to the IdP (`1`). If credentials are valid, IdP will return some basic identity information and a JSON Web Token (JWT) (`2`). -Now that you want to communicate with the Webiny API, you will attach that JWT to every request you make (`3`). The Webiny API will then run the authentication process (`4`) described in the [API Security](/docs/core-development-concepts/security-framework/api-security) article, and verify the JWT (remember, how you implement your authentication plugin is up to you). +Now that you want to communicate with the Webiny API, you will attach that JWT to every request you make (`3`). The Webiny API will then run the authentication process (`4`) described in the [API Security](/docs/{version}/core-development-concepts/security-framework/api-security) article, and verify the JWT (remember, how you implement your authentication plugin is up to you). If the identity is valid and is authorized to perform the requested operation, the React application will receive the expected response from the API. diff --git a/docs/developer-docs/5.40.x/enterprise/advanced-tenant-management.mdx b/docs/developer-docs/5.40.x/enterprise/advanced-tenant-management.mdx index c13d7dfa1..8c75cdd1f 100644 --- a/docs/developer-docs/5.40.x/enterprise/advanced-tenant-management.mdx +++ b/docs/developer-docs/5.40.x/enterprise/advanced-tenant-management.mdx @@ -23,7 +23,7 @@ import customTenantTHeme from "./assets/tenant-management/custom-tenant-theme.pn ## Overview -Out of the box, Webiny provides a very basic module to manage tenants, called Tenant Manager. We've talked about this module in the article on [Multi-Tenancy](/docs/enterprise/multi-tenancy). This module allows you to create tenants, tag them, and assign custom domains for website routing (assuming you're using our Page Builder to build your website). This works well for managing of a small number of tenants. However, if you need to manage hundreds, or even thousands of tenants, that UI will quickly become unsuitable for the task. +Out of the box, Webiny provides a very basic module to manage tenants, called Tenant Manager. We've talked about this module in the article on [Multi-Tenancy](/docs/{version}/enterprise/multi-tenancy). This module allows you to create tenants, tag them, and assign custom domains for website routing (assuming you're using our Page Builder to build your website). This works well for managing of a small number of tenants. However, if you need to manage hundreds, or even thousands of tenants, that UI will quickly become unsuitable for the task. Building a tenant management system to satisfy a wide variety of business use cases is difficult, because every business domain has its own definition of a tenant. In some projects, a tenant would be represented by a "Company", in other projects, tenant would be a "Brand", etc. Webiny allows you to use the tenancy API to closely integrate its tenants (used for data separation), with your business domain, and have a flawless tenant management experience, which follows your business rules. @@ -62,7 +62,7 @@ in the Webiny Examples repository, and only describing the process and the outco ## Tenant Content Model -To begin, we need to [create a content model](https://github.com/webiny/webiny-examples/blob/master/cms-tenant-management/5.40.x/extensions/api/src/companyModel.ts) which represents a business tenant in our system, which we'll use to create the low-level tenants within Webiny. We've created a content model plugin via code, as described in the [Define Content Models via Code](/docs/headless-cms/extending/content-models-via-code) article. +To begin, we need to [create a content model](https://github.com/webiny/webiny-examples/blob/master/cms-tenant-management/5.40.x/extensions/api/src/companyModel.ts) which represents a business tenant in our system, which we'll use to create the low-level tenants within Webiny. We've created a content model plugin via code, as described in the [Define Content Models via Code](/docs/{version}/headless-cms/extending/content-models-via-code) article. In our example, we named our model _Company_, and created a few basic attributes: `name`, `description`, `theme` (with `primaryColor`, `secondaryColor`, and `logo` attributes), and a hidden boolean attribute called `isInstalled`. @@ -91,13 +91,13 @@ This is just one way of running a use case; you could achieve the same by implem <Alert type="info" title="Seeding a Tenant"> -Keep in mind that, if you plan to seed your new tenant with data, depending on the amount of data you're seeding, you will most likely want to move that logic to a [background task](/docs/core-development-concepts/background-tasks/about-background-tasks), since it's not limited by a 30 seconds API Gateway request timeout. Tenant creation and installation could still be executed as described in this example, but to seed a tenant, you would invoke an asynchronous background task. +Keep in mind that, if you plan to seed your new tenant with data, depending on the amount of data you're seeding, you will most likely want to move that logic to a [background task](/docs/{version}/core-development-concepts/background-tasks/about-background-tasks), since it's not limited by a 30 seconds API Gateway request timeout. Tenant creation and installation could still be executed as described in this example, but to seed a tenant, you would invoke an asynchronous background task. </Alert> ## Table Column to Install and Access a Tenant -Now we need to [add a piece of UI](https://github.com/webiny/webiny-examples/blob/master/cms-tenant-management/5.40.x/extensions/admin/src/CompanyEntryList.tsx), in our example it will be a button, to trigger tenant installation. The table customization API is documented in the [Customize Entry List Table Columns](/docs/headless-cms/extending/customize-entry-list-table-columns) article. +Now we need to [add a piece of UI](https://github.com/webiny/webiny-examples/blob/master/cms-tenant-management/5.40.x/extensions/admin/src/CompanyEntryList.tsx), in our example it will be a button, to trigger tenant installation. The table customization API is documented in the [Customize Entry List Table Columns](/docs/{version}/headless-cms/extending/customize-entry-list-table-columns) article. <Image src={companiesList} title={"Company Entries"} /> diff --git a/docs/developer-docs/5.40.x/get-started/welcome.mdx b/docs/developer-docs/5.40.x/get-started/welcome.mdx index d8f5f9124..24567ad4f 100644 --- a/docs/developer-docs/5.40.x/get-started/welcome.mdx +++ b/docs/developer-docs/5.40.x/get-started/welcome.mdx @@ -86,7 +86,7 @@ import { ReactComponent as CommunityIcon } from "./assets/resources-icons/commun categoryTitle="Products" /> <SectionRow> - <SectionBox title="Headless CMS" Icon={HeadlessCmsIcon} learnMoreLink="/docs/headless-cms/overview"> + <SectionBox title="Headless CMS" Icon={HeadlessCmsIcon} learnMoreLink="/docs/{version}/headless-cms/overview"> <p> Learn how to create plugins and customize the Headless CMS experience to your content needs. From extending the built-in GraphQL capabilities to modifying the editorial experience. </p> @@ -108,7 +108,7 @@ import { ReactComponent as CommunityIcon } from "./assets/resources-icons/commun In this section, you'll learn how to customize the layout and visual aspects of your forms. </p> </SectionBox> - <SectionBox title="Admin Area" Icon={AdminIcon} learnMoreLink="/docs/admin-area/basics/framework"> + <SectionBox title="Admin Area" Icon={AdminIcon} learnMoreLink="/docs/{version}/admin-area/basics/framework"> <p> The Admin Area is an app inside which all other apps live. You can white-label the UI to match the brand of your customer, introduce new apps into the menu, modify the start page, and more. </p> @@ -130,7 +130,7 @@ import { ReactComponent as CommunityIcon } from "./assets/resources-icons/commun For developers just getting started with Webiny, we've prepared a short onboarding video course to help you take your first step in development with Webiny. </p> </SectionBox> - <SectionBox title="Core development concepts" Icon={ConceptsIcon} learnMoreLink="/docs/core-development-concepts/basics/tools-and-libraries"> + <SectionBox title="Core development concepts" Icon={ConceptsIcon} learnMoreLink="/docs/{version}/core-development-concepts/basics/tools-and-libraries"> <p> Once you're past the basics of how to develop with Webiny, this category of articles is a good next step. </p> @@ -138,24 +138,24 @@ import { ReactComponent as CommunityIcon } from "./assets/resources-icons/commun You'll learn about the core concepts such as the watch command, project organization, the CLI utility and more. </p> </SectionBox> - <SectionBox title="Customize and extend" Icon={CustomizeIcon} learnMoreLink="/docs/core-development-concepts/extending-and-customizing/extend-graphql-api"> + <SectionBox title="Customize and extend" Icon={CustomizeIcon} learnMoreLink="/docs/{version}/core-development-concepts/extending-and-customizing/extend-graphql-api"> <p> Learn how to extend the GraphQL API, CLI utility, add custom routes to the Lambda function, intercept requests or customize the built-in Lexical editor. </p> </SectionBox> </SectionRow> <SectionRow> - <SectionBox title="CI/CD setup" Icon={CiCdIcon} learnMoreLink="/docs/core-development-concepts/ci-cd/introduction"> + <SectionBox title="CI/CD setup" Icon={CiCdIcon} learnMoreLink="/docs/{version}/core-development-concepts/ci-cd/introduction"> <p> If you need to configure and deploy Webiny from a CI/CD environment, follow this guide. </p> </SectionBox> - <SectionBox title="Security Framework" Icon={SecurityFrameworkIcon} learnMoreLink="/docs/core-development-concepts/security-framework/introduction"> + <SectionBox title="Security Framework" Icon={SecurityFrameworkIcon} learnMoreLink="/docs/{version}/core-development-concepts/security-framework/introduction"> <p> Webiny has a simple, but powerful security framework that allows you to integrate with different SSO systems as well as customize the authentication and authorization flows. </p> </SectionBox> - <SectionBox title="Background tasks" Icon={BgTasksIcon} learnMoreLink="/docs/core-development-concepts/background-tasks/about-background-tasks"> + <SectionBox title="Background tasks" Icon={BgTasksIcon} learnMoreLink="/docs/{version}/core-development-concepts/background-tasks/about-background-tasks"> <p> Webiny supports long-running tasks that are executed in the background. In this set of articles, you'll learn how to leverage this mechanism inside your own custom plugins and apps built inside Webiny. </p> @@ -172,7 +172,7 @@ import { ReactComponent as CommunityIcon } from "./assets/resources-icons/commun categoryTitle="Resources" /> <SectionRow> - <SectionBox title="User guides" Icon={UserGuidesIcon} learnMoreLink="/docs/user-guides/overview"> + <SectionBox title="User guides" Icon={UserGuidesIcon} learnMoreLink="/docs/{version}/user-guides/overview"> <p> Guides to help non-technical users master Webiny and many of its features. </p> diff --git a/docs/developer-docs/5.40.x/headless-cms/extending/content-entry-live-preview.mdx b/docs/developer-docs/5.40.x/headless-cms/extending/content-entry-live-preview.mdx index 21ecb2011..4370d1a9f 100644 --- a/docs/developer-docs/5.40.x/headless-cms/extending/content-entry-live-preview.mdx +++ b/docs/developer-docs/5.40.x/headless-cms/extending/content-entry-live-preview.mdx @@ -68,7 +68,7 @@ in the Webiny Examples repository, and only describing the process and the outco ## Content Model -To begin, we need to create an Article content model which represents a website article, which we want to create a Live Preview for. We've provided [an export of the model](https://github.com/webiny/webiny-examples/blob/master/cms-live-preview/5.40.x/article-model.json) which you can simply [import into your own project](/docs/user-guides/headless-cms/advanced/import-export-content-models#importing-content-models). +To begin, we need to create an Article content model which represents a website article, which we want to create a Live Preview for. We've provided [an export of the model](https://github.com/webiny/webiny-examples/blob/master/cms-live-preview/5.40.x/article-model.json) which you can simply [import into your own project](/docs/{version}/user-guides/headless-cms/advanced/import-export-content-models#importing-content-models). The `content` field of the Article content model is built using the _Dynamic Zone_ field type, which allows you to define templates that represent your frontend components (blocks of data), which the content creator can then use to write the content within the constraints of the content model. diff --git a/docs/developer-docs/5.40.x/headless-cms/extending/content-models-via-code.mdx b/docs/developer-docs/5.40.x/headless-cms/extending/content-models-via-code.mdx index 15edd2fdc..ef2d5b109 100644 --- a/docs/developer-docs/5.40.x/headless-cms/extending/content-models-via-code.mdx +++ b/docs/developer-docs/5.40.x/headless-cms/extending/content-models-via-code.mdx @@ -407,7 +407,7 @@ With this [5.39.2 release](/docs/release-notes/5.39.2/changelog#content-models-d <Image src={securityPermissions} alt="Security Permissions Defined via the Security Application" /> -Additionally, in case the [Folder Level Permissions](/docs/enterprise/aacl/folder-level-permissions) feature is enabled in your Webiny project, the content model entries will not be subject to folder level permissions. +Additionally, in case the [Folder Level Permissions](/docs/{version}/enterprise/aacl/folder-level-permissions) feature is enabled in your Webiny project, the content model entries will not be subject to folder level permissions. The following example demonstrates how to disable authorization for a content model and its entries. @@ -425,7 +425,7 @@ createCmsModelPlugin({ }); ``` -With the `authorization` property set to `false`, base authorization checks are disabled for the content model and its entries. Furthermore, in case the [Folder Level Permissions](/docs/enterprise/aacl/folder-level-permissions) feature is enabled in your Webiny project, the content model entries will not be subject to folder level permissions. +With the `authorization` property set to `false`, base authorization checks are disabled for the content model and its entries. Furthermore, in case the [Folder Level Permissions](/docs/{version}/enterprise/aacl/folder-level-permissions) feature is enabled in your Webiny project, the content model entries will not be subject to folder level permissions. ### Define a Content Model Only for a Specific Locale @@ -637,7 +637,7 @@ export const createExtension = () => { ### Can I modify the Singular API Name and Plural API Name of a model? -Modifying the Singular API Name and Plural API Name of a model cannot be done via the UI due to the potential risks involved. However, you can achieve this through the API by using the `updateContentModel` mutation in the [Headless CMS Manage GraphQL API](/docs/headless-cms/basics/graphql-api#manage), accessible in the API Playground. +Modifying the Singular API Name and Plural API Name of a model cannot be done via the UI due to the potential risks involved. However, you can achieve this through the API by using the `updateContentModel` mutation in the [Headless CMS Manage GraphQL API](/docs/{version}/headless-cms/basics/graphql-api#manage), accessible in the API Playground. Please be extra caution when using the `updateContentModel` mutation. You must pass the entire content model object, including all fields, during the update. To get all the details about a model, you can use the `getContentModel` API. The reason for passing the complete object is to avoid ambiguity in partial updates, where it is unclear whether you intend to remove a value or keep it unchanged. diff --git a/docs/developer-docs/5.40.x/headless-cms/extending/private-models.mdx b/docs/developer-docs/5.40.x/headless-cms/extending/private-models.mdx index 00a11636a..12dc952dc 100644 --- a/docs/developer-docs/5.40.x/headless-cms/extending/private-models.mdx +++ b/docs/developer-docs/5.40.x/headless-cms/extending/private-models.mdx @@ -30,7 +30,7 @@ Let's delve into the details of both public and private models and explore how y Public models in Webiny are those content models that are visible within the admin app. These models come with a generated navigation menu, allowing easy access to content entries through the user interface. Creating public models involves the conventional process of logging into the admin app and using the user interface to create a content model or you can also define public content model via code. The result is the automatic generation of an API, including a GraphQL type and a set of resolvers for seamless data interaction. -Alternatively, you can also build public models through code using a [plugin](/docs/headless-cms/extending/content-models-via-code-storage-id). +Alternatively, you can also build public models through code using a [plugin](/docs/{version}/headless-cms/extending/content-models-via-code-storage-id). ## Private Models diff --git a/docs/developer-docs/5.40.x/headless-cms/notes-app/react-notes-app.mdx b/docs/developer-docs/5.40.x/headless-cms/notes-app/react-notes-app.mdx index 1c54a808b..022b9245d 100644 --- a/docs/developer-docs/5.40.x/headless-cms/notes-app/react-notes-app.mdx +++ b/docs/developer-docs/5.40.x/headless-cms/notes-app/react-notes-app.mdx @@ -268,7 +268,7 @@ First, create a `graphql` directory in the `src` folder, and then add a `client. <Alert type="info"> - The `uri` mentioned below is the Manage API URL for the Headless CMS. For more details on how to obtain the Manage API URL, refer to [this guide](/docs/headless-cms/basics/graphql-api#where-to-find-the-url-of-the-graph-ql-api). + The `uri` mentioned below is the Manage API URL for the Headless CMS. For more details on how to obtain the Manage API URL, refer to [this guide](/docs/{version}/headless-cms/basics/graphql-api#where-to-find-the-url-of-the-graph-ql-api). </Alert> diff --git a/docs/developer-docs/5.40.x/headless-cms/notes-app/webiny-infrastructure-setup.mdx b/docs/developer-docs/5.40.x/headless-cms/notes-app/webiny-infrastructure-setup.mdx index 7a0aa9af7..a2d73fb78 100644 --- a/docs/developer-docs/5.40.x/headless-cms/notes-app/webiny-infrastructure-setup.mdx +++ b/docs/developer-docs/5.40.x/headless-cms/notes-app/webiny-infrastructure-setup.mdx @@ -339,7 +339,7 @@ Additionally, under the Permissions/Content section, select "**All locales**" (a ### Create Note Model to Store User Notes -As the final step on the Webiny side, we'll create a Note Model to store user notes. If you're new to creating models in Webiny, refer to the [Create Content Model](/docs/user-guides/headless-cms/essentials/create-content-model) user guide. +As the final step on the Webiny side, we'll create a Note Model to store user notes. If you're new to creating models in Webiny, refer to the [Create Content Model](/docs/{version}/user-guides/headless-cms/essentials/create-content-model) user guide. We'll set up a Note content model with the following fields: diff --git a/docs/developer-docs/5.40.x/headless-cms/references/date-time-and-identity-meta-fields.mdx b/docs/developer-docs/5.40.x/headless-cms/references/date-time-and-identity-meta-fields.mdx index 4f7172798..02c4e0c37 100644 --- a/docs/developer-docs/5.40.x/headless-cms/references/date-time-and-identity-meta-fields.mdx +++ b/docs/developer-docs/5.40.x/headless-cms/references/date-time-and-identity-meta-fields.mdx @@ -23,7 +23,7 @@ Apart from the fields that are defined in a content model by the user, all conte These meta fields are automatically populated by the system, and they can be used to display information about the entry, such as when it was created, modified, or published, and by whom. -Developers can use these fields when querying entries, for example via the [Headless CMS GraphQL API](/docs/headless-cms/basics/graphql-api): +Developers can use these fields when querying entries, for example via the [Headless CMS GraphQL API](/docs/{version}/headless-cms/basics/graphql-api): ```graphql query { @@ -49,7 +49,7 @@ query { } ``` -They can also use them in their custom JavaScript (TypeScript) code, for example, when hooking onto [lifecycle events](/docs/headless-cms/references/lifecycle-events): +They can also use them in their custom JavaScript (TypeScript) code, for example, when hooking onto [lifecycle events](/docs/{version}/headless-cms/references/lifecycle-events): ```typescript new ContextPlugin<CmsContext>(async context => { diff --git a/docs/developer-docs/5.40.x/infrastructure/basics/modify-cloud-infrastructure.mdx b/docs/developer-docs/5.40.x/infrastructure/basics/modify-cloud-infrastructure.mdx index a0fad6380..5d1b62584 100644 --- a/docs/developer-docs/5.40.x/infrastructure/basics/modify-cloud-infrastructure.mdx +++ b/docs/developer-docs/5.40.x/infrastructure/basics/modify-cloud-infrastructure.mdx @@ -195,7 +195,7 @@ export default createCoreApp({ ### Defining Multiple Production Environments -Upon running the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command, when `prod` is passed as the environment name, a Webiny project is deployed in the so-called [production deployment mode](https://www.webiny.com/docs/architecture/deployment-modes/production). +Upon running the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command, when `prod` is passed as the environment name, a Webiny project is deployed in the so-called [production deployment mode](https://www.webiny.com/docs/{version}/architecture/deployment-modes/production). On order to use the production deployment mode for environments other than `prod`, we can use the `productionEnvironments` parameter. The following example shows how we can use the production mode for the `staging` environment: diff --git a/docs/developer-docs/5.40.x/infrastructure/pulumi-iac/iac-with-pulumi.mdx b/docs/developer-docs/5.40.x/infrastructure/pulumi-iac/iac-with-pulumi.mdx index ccb266477..ab100367c 100644 --- a/docs/developer-docs/5.40.x/infrastructure/pulumi-iac/iac-with-pulumi.mdx +++ b/docs/developer-docs/5.40.x/infrastructure/pulumi-iac/iac-with-pulumi.mdx @@ -39,7 +39,7 @@ In the background, all of these applications are standalone [Pulumi projects](ht 1. every project application contains its own infrastructure-related code ([Pulumi program](https://www.pulumi.com/docs/intro/concepts/programming-model/#programs)), configuration, meta, and [state files](/docs/{version}/infrastructure/pulumi-iac/iac-with-pulumi#state-files) -2. upon fully deploying a Webiny project via the [`webiny deploy`](/docs/core-development-concepts/basics/project-deployment) command, applications are deployed separately, one by one, in the same order as listed above +2. upon fully deploying a Webiny project via the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command, applications are deployed separately, one by one, in the same order as listed above <Alert type="info" title="Cloud Infrastructure"> @@ -62,7 +62,7 @@ Still, in some cases, users may need to modify the cloud infrastructure code. Fo <Alert type="info"> To learn more about how to modify the cloud infrastructure code, please refer to the [Modify Cloud - Infrastructure](/docs/infrastructure/basics/modify-cloud-infrastructure) article. + Infrastructure](/docs/{version}/infrastructure/basics/modify-cloud-infrastructure) article. </Alert> diff --git a/docs/developer-docs/5.41.x/core-development-concepts/basics/extensions.mdx b/docs/developer-docs/5.41.x/core-development-concepts/basics/extensions.mdx index 39894b15d..d2291c5ca 100644 --- a/docs/developer-docs/5.41.x/core-development-concepts/basics/extensions.mdx +++ b/docs/developer-docs/5.41.x/core-development-concepts/basics/extensions.mdx @@ -23,7 +23,7 @@ There are a couple of types of extensions in Webiny, but the most common ones ar - **API** - used to extend Webiny's backend functionality (for example its GraphQL API) - **Cloud Infrastructure** - used to extend the cloud infrastructure Webiny deploys -For example, via an Admin extension, we can change the [layout of the dashboard](/docs/admin-area/extending/custom-dashboard) or [change the logo](/docs/admin-area/extending/change-logo) that's shown in the header and the main menu. On the other hand, via an API extension, we can introduce new GraphQL queries or mutations, [content models](/docs/headless-cms/extending/content-models-via-code), or [hook into lifecycle events](/docs/headless-cms/references/lifecycle-events). +For example, via an Admin extension, we can change the [layout of the dashboard](/docs/{version}/admin-area/extending/custom-dashboard) or [change the logo](/docs/{version}/admin-area/extending/change-logo) that's shown in the header and the main menu. On the other hand, via an API extension, we can introduce new GraphQL queries or mutations, [content models](/docs/{version}/headless-cms/extending/content-models-via-code), or [hook into lifecycle events](/docs/{version}/headless-cms/references/lifecycle-events). ## Getting Started @@ -41,7 +41,7 @@ Once all the questions are answered, the command creates the base code for the n <Alert type="info"> - There are a couple of cases where the extension code is placed outside of the `extensions` folder. For example, when [modifying cloud infrastructure](/docs/infrastructure/basics/modify-cloud-infrastructure), the code is placed in different `webiny.application.ts` files, located in the `apps` folder. + There are a couple of cases where the extension code is placed outside of the `extensions` folder. For example, when [modifying cloud infrastructure](/docs/{version}/infrastructure/basics/modify-cloud-infrastructure), the code is placed in different `webiny.application.ts` files, located in the `apps` folder. </Alert> diff --git a/docs/developer-docs/5.41.x/core-development-concepts/basics/watch-command.mdx b/docs/developer-docs/5.41.x/core-development-concepts/basics/watch-command.mdx index a91c5e6ac..ee888a969 100644 --- a/docs/developer-docs/5.41.x/core-development-concepts/basics/watch-command.mdx +++ b/docs/developer-docs/5.41.x/core-development-concepts/basics/watch-command.mdx @@ -45,7 +45,7 @@ yarn webiny watch website --env dev <Alert type="info"> - Extensions are the primary way to develop on top Webiny and extend it. To learn more, check out the [Extensions](/docs/core-development-concepts/basics/extensions) article. + Extensions are the primary way to develop on top Webiny and extend it. To learn more, check out the [Extensions](/docs/{version}/core-development-concepts/basics/extensions) article. </Alert> diff --git a/docs/developer-docs/5.41.x/enterprise/aacl/teams.mdx b/docs/developer-docs/5.41.x/enterprise/aacl/teams.mdx index 5f7e8e646..63af86cc9 100644 --- a/docs/developer-docs/5.41.x/enterprise/aacl/teams.mdx +++ b/docs/developer-docs/5.41.x/enterprise/aacl/teams.mdx @@ -33,11 +33,11 @@ And although this approach might work for some users, it can quickly become cumb This feature is especially useful for larger organizations, where it's common to have multiple teams working on different projects. Also, it's a great way to simplify the process of managing permissions for multiple users, as you can simply assign a role to a team, instead of assigning it to each individual user. -Additionally, the Teams feature can be used in conjunction with [Folder Level Permissions (FLP)](/docs/enterprise/aacl/folder-level-permissions) to further enhance the security of your Webiny project. Instead of just being able to define folder level permissions for individual users, you can now define them for teams as well. Make sure to check out the FLP documentation to learn more about this feature. +Additionally, the Teams feature can be used in conjunction with [Folder Level Permissions (FLP)](/docs/{version}/enterprise/aacl/folder-level-permissions) to further enhance the security of your Webiny project. Instead of just being able to define folder level permissions for individual users, you can now define them for teams as well. Make sure to check out the FLP documentation to learn more about this feature. ## Enabling Teams and Feature Overview -For Webiny Enterprise users, apart from [linking their Webiny project](/docs/wcp/link-a-project) with Webiny Control Panel (WCP), there are no additional steps required to enable Teams. +For Webiny Enterprise users, apart from [linking their Webiny project](/docs/{version}/wcp/link-a-project) with Webiny Control Panel (WCP), there are no additional steps required to enable Teams. Once linked, Teams will be automatically enabled and the module can be accessed from the main menu: diff --git a/docs/developer-docs/5.41.x/enterprise/auth0-integration.mdx b/docs/developer-docs/5.41.x/enterprise/auth0-integration.mdx index b9dc6c467..154ab43eb 100644 --- a/docs/developer-docs/5.41.x/enterprise/auth0-integration.mdx +++ b/docs/developer-docs/5.41.x/enterprise/auth0-integration.mdx @@ -136,7 +136,7 @@ export default ({ documentClient }: { documentClient: DocumentClient }) => [ + groups: [token["webiny_group"]] + + // With the Teams feature enabled, you can also assign teams to the user. -+ // Learn more: https://www.webiny.com/docs/enterprise/aacl/teams ++ // Learn more: https://www.webiny.com/docs/{version}/enterprise/aacl/teams + // teams: [token["webiny_team"]] + + // Assign any custom values you might need. diff --git a/docs/developer-docs/5.41.x/enterprise/okta-integration.mdx b/docs/developer-docs/5.41.x/enterprise/okta-integration.mdx index bd18cbebc..16b178576 100644 --- a/docs/developer-docs/5.41.x/enterprise/okta-integration.mdx +++ b/docs/developer-docs/5.41.x/enterprise/okta-integration.mdx @@ -134,7 +134,7 @@ export default ({ documentClient }: { documentClient: DocumentClient }) => [ + groups: [token["webiny_group"]] + + // With the Teams feature enabled, you can also assign teams to the user. -+ // Learn more: https://www.webiny.com/docs/enterprise/aacl/teams ++ // Learn more: https://www.webiny.com/docs/{version}/enterprise/aacl/teams + // teams: [token["webiny_team"]] + + // Assign any custom values you might need. diff --git a/docs/developer-docs/5.41.x/headless-cms/ai/smart-seo-open-ai.mdx b/docs/developer-docs/5.41.x/headless-cms/ai/smart-seo-open-ai.mdx index 93f117266..df18044b9 100644 --- a/docs/developer-docs/5.41.x/headless-cms/ai/smart-seo-open-ai.mdx +++ b/docs/developer-docs/5.41.x/headless-cms/ai/smart-seo-open-ai.mdx @@ -61,11 +61,11 @@ Details on this are covered in the sections below. For now, let’s deploy the A yarn webiny deploy api --env ENVIRONMENT_NAME ``` -Alternatively, you can use the watch command, which continuously rebuild and redeploy your code. Learn more about it [here](/docs/core-development-concepts/basics/watch-command). +Alternatively, you can use the watch command, which continuously rebuild and redeploy your code. Learn more about it [here](/docs/{version}/core-development-concepts/basics/watch-command). ## Run the Project -After downloading the extension to your project, run the [webiny watch](/docs/core-development-concepts/basics/watch-command) command to see the Smart SEO functionality in action. +After downloading the extension to your project, run the [webiny watch](/docs/{version}/core-development-concepts/basics/watch-command) command to see the Smart SEO functionality in action. ```bash yarn webiny watch admin --env ENVIRONMENT_NAME @@ -78,7 +78,7 @@ You’re now ready to generate SEO titles and tags for your articles using OpenA ## Code Walkthrough -Let’s walk through the code to understand how the Smart SEO extension operates. We’ve created a new [extension](/docs/core-development-concepts/basics/extensions) called [`smart-seo-open-ai`](https://github.com/webiny/webiny-examples/tree/master/headless-cms/smart-seo-open-ai/5.41.x/extensions/smartSeoOpenAi), and we’ll review each plugin used in this extension one by one. +Let’s walk through the code to understand how the Smart SEO extension operates. We’ve created a new [extension](/docs/{version}/core-development-concepts/basics/extensions) called [`smart-seo-open-ai`](https://github.com/webiny/webiny-examples/tree/master/headless-cms/smart-seo-open-ai/5.41.x/extensions/smartSeoOpenAi), and we’ll review each plugin used in this extension one by one. ### Field Tracker, ContentEntry Form Decorator In this example, we have an **Article - Smart SEO** Model with four fields: **Content**, **SEO - Title**, **SEO - Description**, and **SEO - Meta Tags**. We will track these fields. Once the Content field is populated, we will send it to OpenAI, which will generate SEO-friendly titles and tags for the article. The generated title and tags will then be set in the respective **Title**, **Description** and **Tags** fields of the model. @@ -102,7 +102,7 @@ Webiny leverages the [Lexical text editor](https://lexical.dev/) for Rich Text F ### Extend Headless CMS GraphQL API -In this example, we [extended the Headless CMS GraphQL API](/docs/headless-cms/extending/extend-graphql-api) to generate SEO data using the OpenAI API. The [`generateSeo` plugin](https://github.com/webiny/webiny-examples/blob/master/headless-cms/smart-seo-open-ai/5.41.x/extensions/smartSeoOpenAi/api/src/generateSeo.ts) integrates Webiny with OpenAI. We created a `generateSeo` query for the same. +In this example, we [extended the Headless CMS GraphQL API](/docs/{version}/headless-cms/extending/extend-graphql-api) to generate SEO data using the OpenAI API. The [`generateSeo` plugin](https://github.com/webiny/webiny-examples/blob/master/headless-cms/smart-seo-open-ai/5.41.x/extensions/smartSeoOpenAi/api/src/generateSeo.ts) integrates Webiny with OpenAI. We created a `generateSeo` query for the same. To prevent exposing our OpenAI API key to the public, we avoid calling the OpenAI API from the client side. Instead, we handle it server-side by creating this `generateSeo` plugin that extends the Headless CMS GraphQL API for secure SEO data generation. This plugin sends content to OpenAI and retrieves SEO-related information. diff --git a/docs/developer-docs/5.41.x/headless-cms/extending/customize-entry-list-bulk-actions.mdx b/docs/developer-docs/5.41.x/headless-cms/extending/customize-entry-list-bulk-actions.mdx index 3f4530867..19e5ee0a7 100644 --- a/docs/developer-docs/5.41.x/headless-cms/extending/customize-entry-list-bulk-actions.mdx +++ b/docs/developer-docs/5.41.x/headless-cms/extending/customize-entry-list-bulk-actions.mdx @@ -250,7 +250,7 @@ By declaring the `modelIds` prop, you can define in which Content Model Entry Li ### Bulk Action via Background Task -When working with large datasets, performing bulk actions in the background is essential for maintaining a smooth user experience. Webiny allows editors to perform bulk actions asynchronously in the background, eliminating the need for sequential processing on the client side. This functionality is powered by the [Webiny background task feature](/docs/core-development-concepts/background-tasks/about-background-tasks), which simplifies large-scale operations. +When working with large datasets, performing bulk actions in the background is essential for maintaining a smooth user experience. Webiny allows editors to perform bulk actions asynchronously in the background, eliminating the need for sequential processing on the client side. This functionality is powered by the [Webiny background task feature](/docs/{version}/core-development-concepts/background-tasks/about-background-tasks), which simplifies large-scale operations. In this tutorial, we'll walk you through creating a plugin to enable bulk actions in the background. You don't need to be familiar with the background task infrastructure, as Webiny provides simplified APIs that allow you to focus on your business logic. diff --git a/docs/developer-docs/5.41.x/page-builder/extending/create-a-page-element.mdx b/docs/developer-docs/5.41.x/page-builder/extending/create-a-page-element.mdx index bcfcdda47..5bc6d31df 100644 --- a/docs/developer-docs/5.41.x/page-builder/extending/create-a-page-element.mdx +++ b/docs/developer-docs/5.41.x/page-builder/extending/create-a-page-element.mdx @@ -181,7 +181,7 @@ export const SpaceX = createRenderer(() => { ``` -As we can see in the code, in order to be able to issue remote GraphQL queries, we're using the [`graphql-request`](https://www.npmjs.com/package/graphql-request) library, which we've specified as our extension's dependency upon running the [`webiny extension`](/docs/core-development-concepts/basics/webiny-cli#yarn-webiny-extension) command in the [Getting Started](#getting-started) section. +As we can see in the code, in order to be able to issue remote GraphQL queries, we're using the [`graphql-request`](https://www.npmjs.com/package/graphql-request) library, which we've specified as our extension's dependency upon running the [`webiny extension`](/docs/{version}/core-development-concepts/basics/webiny-cli#yarn-webiny-extension) command in the [Getting Started](#getting-started) section. Note that our GraphQL query is called within the `useLoader` React hook. This is important because, essentially, this enables proper data caching when the page is published. This way, the page element is rendered efficiently, without the need to re-fetch the data each time the page is loaded. diff --git a/docs/developer-docs/5.41.x/page-builder/extending/loading-data-in-page-elements.mdx b/docs/developer-docs/5.41.x/page-builder/extending/loading-data-in-page-elements.mdx index 0f117877d..3a2f01ce9 100644 --- a/docs/developer-docs/5.41.x/page-builder/extending/loading-data-in-page-elements.mdx +++ b/docs/developer-docs/5.41.x/page-builder/extending/loading-data-in-page-elements.mdx @@ -21,7 +21,7 @@ import dataLoadedWithoutLoader from "./assets/loading-data-in-page-elements/load It's not uncommon to have a custom page element that loads data from an external remote HTTP API and displays it on the page. -For example, you might want to display a list of products or a list of blog posts that are loaded from [Webiny's Headless CMS GraphQL API](/docs/headless-cms/basics/graphql-api). Another examples is listing rocket and dragon spacecrafts from an external SpaceX API, which is covered in the [Create a Custom Page Element](/docs/page-builder/extending/create-a-page-element) guide. +For example, you might want to display a list of products or a list of blog posts that are loaded from [Webiny's Headless CMS GraphQL API](/docs/{version}/headless-cms/basics/graphql-api). Another examples is listing rocket and dragon spacecrafts from an external SpaceX API, which is covered in the [Create a Custom Page Element](/docs/{version}/page-builder/extending/create-a-page-element) guide. In this guide, we show how to efficiently load data in Page Builder elements using the `useLoader` React hook. @@ -54,7 +54,7 @@ Let's analyze the code that was used to create the page element we saw in the vi <Alert> - If you're not familiar with creating custom page elements, you can learn more about it in the [Create a Custom Page Element](/docs/page-builder/extending/create-a-page-element) guide. + If you're not familiar with creating custom page elements, you can learn more about it in the [Create a Custom Page Element](/docs/{version}/page-builder/extending/create-a-page-element) guide. </Alert> diff --git a/docs/developer-docs/5.41.x/security/extensions/programmatically-create-roles-and-teams.mdx b/docs/developer-docs/5.41.x/security/extensions/programmatically-create-roles-and-teams.mdx index 4db204da5..97ac720d9 100644 --- a/docs/developer-docs/5.41.x/security/extensions/programmatically-create-roles-and-teams.mdx +++ b/docs/developer-docs/5.41.x/security/extensions/programmatically-create-roles-and-teams.mdx @@ -33,7 +33,7 @@ The most straightforward way to define roles and teams would be via the Admin Ar <Alert type="info"> - Note that the Teams feature is part of our enterprise offering. To learn more, please check out the [Teams](/docs/enterprise/aacl/teams) article. + Note that the Teams feature is part of our enterprise offering. To learn more, please check out the [Teams](/docs/{version}/enterprise/aacl/teams) article. </Alert> @@ -103,7 +103,7 @@ The easiest way to find out which permissions are available and to build roles w <Alert> - More info on security permissions can also be found in the [Security Framework - Introduction](/docs/security/security-framework/introduction#permission) article. + More info on security permissions can also be found in the [Security Framework - Introduction](/docs/{version}/security/security-framework/introduction#permission) article. </Alert> @@ -149,7 +149,7 @@ With this code in place, we should be able to see the following team in the Team <Alert type="info"> - Note that the Teams feature is part of our enterprise offering. To learn more, please check out the [Teams](/docs/enterprise/aacl/teams) article. + Note that the Teams feature is part of our enterprise offering. To learn more, please check out the [Teams](/docs/{version}/enterprise/aacl/teams) article. </Alert> diff --git a/docs/developer-docs/5.42.x/headless-cms/extending/content-models-via-code.mdx b/docs/developer-docs/5.42.x/headless-cms/extending/content-models-via-code.mdx index 9a3367010..c97c4a887 100644 --- a/docs/developer-docs/5.42.x/headless-cms/extending/content-models-via-code.mdx +++ b/docs/developer-docs/5.42.x/headless-cms/extending/content-models-via-code.mdx @@ -420,7 +420,7 @@ With this [5.39.2 release](/docs/release-notes/5.39.2/changelog#content-models-d <Image src={securityPermissions} alt="Security Permissions Defined via the Security Application" /> -Additionally, in case the [Folder Level Permissions](/docs/enterprise/aacl/folder-level-permissions) feature is enabled in your Webiny project, the content model entries will not be subject to folder level permissions. +Additionally, in case the [Folder Level Permissions](/docs/{version}/enterprise/aacl/folder-level-permissions) feature is enabled in your Webiny project, the content model entries will not be subject to folder level permissions. The following example demonstrates how to disable authorization for a content model and its entries. @@ -438,7 +438,7 @@ createModelPlugin({ }); ``` -With the `authorization` property set to `false`, base authorization checks are disabled for the content model and its entries. Furthermore, in case the [Folder Level Permissions](/docs/enterprise/aacl/folder-level-permissions) feature is enabled in your Webiny project, the content model entries will not be subject to folder level permissions. +With the `authorization` property set to `false`, base authorization checks are disabled for the content model and its entries. Furthermore, in case the [Folder Level Permissions](/docs/{version}/enterprise/aacl/folder-level-permissions) feature is enabled in your Webiny project, the content model entries will not be subject to folder level permissions. ### Define a Content Model Only for a Specific Locale @@ -660,7 +660,7 @@ export const createExtension = () => { ### Can I modify the Singular API Name and Plural API Name of a model? -Modifying the Singular API Name and Plural API Name of a model cannot be done via the UI due to the potential risks involved. However, you can achieve this through the API by using the `updateContentModel` mutation in the [Headless CMS Manage GraphQL API](/docs/headless-cms/basics/graphql-api#manage), accessible in the API Playground. +Modifying the Singular API Name and Plural API Name of a model cannot be done via the UI due to the potential risks involved. However, you can achieve this through the API by using the `updateContentModel` mutation in the [Headless CMS Manage GraphQL API](/docs/{version}/headless-cms/basics/graphql-api#manage), accessible in the API Playground. Please be extra caution when using the `updateContentModel` mutation. You must pass the entire content model object, including all fields, during the update. To get all the details about a model, you can use the `getContentModel` API. The reason for passing the complete object is to avoid ambiguity in partial updates, where it is unclear whether you intend to remove a value or keep it unchanged. diff --git a/docs/developer-docs/5.43.x/core-development-concepts/background-tasks/built-in-background-tasks.mdx b/docs/developer-docs/5.43.x/core-development-concepts/background-tasks/built-in-background-tasks.mdx index 97ba447dd..9d26d9d6f 100644 --- a/docs/developer-docs/5.43.x/core-development-concepts/background-tasks/built-in-background-tasks.mdx +++ b/docs/developer-docs/5.43.x/core-development-concepts/background-tasks/built-in-background-tasks.mdx @@ -25,7 +25,7 @@ The following is a list of background tasks that are included in Webiny by defau <Alert type="info"> - This task can be used with the Amazon DynamoDB + Amazon OpenSearch [database setup](/docs/architecture/introduction#different-database-setups). It can be also used with the legacy Amazon DynamoDB + Amazon Elasticsearch setup. + This task can be used with the Amazon DynamoDB + Amazon OpenSearch [database setup](/docs/{version}/architecture/introduction#different-database-setups). It can be also used with the legacy Amazon DynamoDB + Amazon Elasticsearch setup. </Alert> @@ -82,7 +82,7 @@ This is done to reduce the strain on the Elasticsearch/OpenSearch cluster as the <Alert type="info"> - This task can be used with the Amazon DynamoDB + Amazon OpenSearch [database setup](/docs/architecture/introduction#different-database-setups). It can be also used with the legacy Amazon DynamoDB + Amazon Elasticsearch setup. + This task can be used with the Amazon DynamoDB + Amazon OpenSearch [database setup](/docs/{version}/architecture/introduction#different-database-setups). It can be also used with the legacy Amazon DynamoDB + Amazon Elasticsearch setup. </Alert> diff --git a/docs/developer-docs/6.0.x/basic/di.ai.txt b/docs/developer-docs/6.0.x/basic/di.ai.txt new file mode 100644 index 000000000..77920587f --- /dev/null +++ b/docs/developer-docs/6.0.x/basic/di.ai.txt @@ -0,0 +1,118 @@ +AI Context: Dependency Injection (di.mdx) + +Source of Information: +1. Read the @webiny/di package README from the linked repository (https://github.com/webiny/di) +2. Analyzed the di-readme.md file that was provided in the 6.0.x folder +3. Examined existing examples in 6.0.x files to understand how abstractions and implementations are used in practice +4. Reviewed the CreateEntryUseCase abstraction example, which showed: + - How to use createAbstraction + - Interface definition patterns + - Namespace exports pattern + - Error type definitions + - Proper TypeScript typing + +Understanding Dependency Injection (DI): +DI is a pattern where you don't create dependencies directly in your code. Instead, you define what you need (interface/abstraction) and something else provides it (implementation). This makes code: +- Testable: Easy to swap real services with test doubles +- Flexible: Can change implementations without changing code +- Maintainable: Clear separation of "what" vs "how" + +Simple Analogy: +Think of ordering food at a restaurant. You say "I want a burger" (interface/abstraction). The kitchen decides how to make it (implementation). You don't care if they use oven A or oven B, you just want a burger. + +In the DI System: +1. Abstraction = The "what" (interface) - "I need something that can save users" +2. Implementation = The "how" (concrete code) - "Here's code that saves users to database" +3. Container = The system that connects requests to services + +External Package Used: +This system uses @webiny/di - a type-safe dependency injection library designed for TypeScript. + +Key Documentation Decisions: +- Focus on createAbstraction and createImplementation API +- Keep examples simple and generic (Book/Author/Category domain) +- Show the namespace pattern used throughout codebase +- Export everything users need from the namespace (types, interfaces, errors) +- Demonstrate the Result pattern integration +- Use the prefix pattern for abstraction names (e.g., "Library/CreateBook") +- Did not include automatic discovery or advanced topics +- Removed comments from example code except for pedagogical correct/wrong comparisons + +Example Pattern Used: +- Interface definition +- Error types definition +- createAbstraction call +- Namespace export with all necessary types +- const export of the abstraction +- createImplementation usage from the namespace + +The 5-Step Pattern: + +Step 1: Define the Interface (What you need) +```typescript +export interface ISaveBookUseCase { + execute(book: Book): Promise<Result<Book, Error>>; +} +``` + +Step 2: Define Error Types +```typescript +export interface ISaveBookUseCaseErrors { + validation: ValidationError; + database: DatabaseError; +} +type UseCaseError = ISaveBookUseCaseErrors[keyof ISaveBookUseCaseErrors]; +``` + +Step 3: Create the Abstraction (Register it) +```typescript +export const SaveBookUseCase = createAbstraction<ISaveBookUseCase>("Library/SaveBook"); +``` +The string "Library/SaveBook" is a unique name (like an ID) for this abstraction. + +Step 4: Export Everything in a Namespace +```typescript +export namespace SaveBookUseCase { + export type Interface = ISaveBookUseCase; + export type Error = UseCaseError; + // Export all types someone needs to use or implement this +} +``` +Why? So users have everything in one place: SaveBookUseCase.Interface, SaveBookUseCase.Error + +Step 5: Create Implementation (The actual code) +```typescript +export const saveBookUseCase = SaveBookUseCase.createImplementation({ + database: DatabaseService // Dependencies it needs +}, async ({ database }, book) => { + // Your actual logic here + await database.save(book); + return Result.ok(book); +}); +``` + +Related Documents: +- See headless-cms/use-case/*.mdx for real-world abstraction examples +- See headless-cms/event-handler/*.mdx for implementation examples +- See basic/result.mdx for the Result pattern (used with DI) + +Key Code Locations: +- @webiny/di package: https://github.com/webiny/di +- Example abstractions: Look in extensions/[module]/[feature]/abstraction/ +- Example implementations: Look in extensions/[module]/[feature]/useCase/ + +To examine source code implementations in detail, access to the Webiny project repository is needed. + +Common Patterns to Follow: +1. Always export both namespace and const +2. Use Result pattern for error handling +3. Prefix abstraction names (e.g., "Cms/CreateEntry") +4. Export all types users need from namespace +5. Keep examples generic (avoid CMS-specific examples in this doc) + +Tone Guidelines: +- Be concise and technical +- Focus on what's unique to this DI implementation +- Show complete patterns with all 5 steps +- Mention @webiny/di as the external package being used + diff --git a/docs/developer-docs/6.0.x/basic/di.mdx b/docs/developer-docs/6.0.x/basic/di.mdx new file mode 100644 index 000000000..2955c1637 --- /dev/null +++ b/docs/developer-docs/6.0.x/basic/di.mdx @@ -0,0 +1,267 @@ +--- +id: kp9m2xnf +title: Dependency Injection +description: Creating abstractions and implementations in Webiny +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to create an abstraction? +- How to create an implementation of an abstraction? +- How to declare dependencies? +- How to use the decorator pattern? + +</Alert> + +## Overview + +Webiny uses `@webiny/di`, a type-safe dependency injection container built for SOLID principles. The core concept is `Abstraction<T>`, which unifies tokens and types for compile-time safety. As a developer, you create implementations using `createImplementation()` and export them. + +## Creating an Abstraction + +An abstraction is a type-safe token that represents an interface. Use `createAbstraction()` to create one: + +```typescript +import { createAbstraction, Result } from "webiny/api"; +import type { IBook } from "~/types/index.js"; + +interface IBookRepository { + getById(id: string): Promise<Result<IBook, RepositoryError>>; + save(book: IBook): Promise<Result<void, RepositoryError>>; +} + +const BookRepository = createAbstraction<IBookRepository>("Library/BookRepository"); + +namespace BookRepository { + export type Interface = IBookRepository; + export type Book = IBook; +} + +export { BookRepository }; +``` + +**Naming Convention:** +- The abstraction name typically matches the interface name without the `I` prefix +- Use a prefix to organize abstractions by domain (e.g., `Library/BookRepository`, `Store/CreateOrder`) + +**Namespace Pattern:** Use a namespace with the same name as the abstraction to export related types. Export everything implementers will need - the interface, domain types, input/output types, etc. This allows consumers to use `BookRepository.Interface` and `BookRepository.Book` without additional imports. + +### Advanced Namespace Pattern + +For more complex abstractions like use cases, you can organize additional types in the namespace: + +```typescript +import { createAbstraction, Result } from "webiny/api"; +import type { IBook, IAuthor, ICategory } from "~/types/index.js"; + +interface ICreateBookUseCase { + execute(input: CreateBookInput): Promise<Result<IBook, CreateBookError>>; +} + +interface CreateBookInput { + title: string; + authorId: string; + categoryId: string; +} + +type CreateBookError = ValidationError | AuthorizationError; + +const CreateBookUseCase = createAbstraction<ICreateBookUseCase>("Library/CreateBook"); + +namespace CreateBookUseCase { + export type Interface = ICreateBookUseCase; + export type Input = CreateBookInput; + export type Error = CreateBookError; + export type Return = Promise<Result<IBook, CreateBookError>>; + export type Book = IBook; + export type Author = IAuthor; + export type Category = ICategory; +} + +export { CreateBookUseCase }; +``` + +This pattern allows consumers to reference all related types through the abstraction: +- `CreateBookUseCase.Interface` - for implementing the use case +- `CreateBookUseCase.Input` - for the input parameters +- `CreateBookUseCase.Error` - for error types +- `CreateBookUseCase.Return` - for the return type +- `CreateBookUseCase.Book`, `CreateBookUseCase.Author`, `CreateBookUseCase.Category` - domain types needed by implementers + +**Key Principle:** Export everything an implementer needs. This creates a complete, self-contained abstraction where consumers only need to import the abstraction itself. + +## Creating an Implementation + +Use `createImplementation()` from the abstraction to bind your class to it. This method is available on every abstraction and requires three properties: + +```typescript +import { BookRepository } from "./abstractions/BookRepository.js"; +import { Result } from "webiny/api"; + +class InMemoryBookRepository implements BookRepository.Interface { + private books = new Map<string, BookRepository.Book>(); + + public async getById(id: string): Promise<Result<BookRepository.Book, RepositoryError>> { + const book = this.books.get(id); + if (!book) { + return Result.fail(new NotFoundError("Book not found")); + } + return Result.ok(book); + } + + public async save(book: BookRepository.Book): Promise<Result<void, RepositoryError>> { + this.books.set(book.id, book); + return Result.ok(); + } +} + +const InMemoryBookRepositoryImpl = BookRepository.createImplementation({ + implementation: InMemoryBookRepository, + dependencies: [] +}); + +export default InMemoryBookRepositoryImpl; +``` + +### With Dependencies + +Dependencies are declared in the constructor and must match the `dependencies` array order: + +```typescript +import { CreateBookUseCase } from "./abstractions/CreateBookUseCase.js"; +import { BookRepository } from "./abstractions/BookRepository.js"; +import { AuthorRepository } from "./abstractions/AuthorRepository.js"; +import { CategoryRepository } from "./abstractions/CategoryRepository.js"; +import { Result } from "webiny/api"; + +class CreateBookUseCaseImpl implements CreateBookUseCase.Interface { + public constructor( + private bookRepository: BookRepository.Interface, + private authorRepository: AuthorRepository.Interface, + private categoryRepository: CategoryRepository.Interface + ) {} + + public async execute(input: CreateBookUseCase.Input): CreateBookUseCase.Return { + const authorResult = await this.authorRepository.getById(input.authorId); + if (authorResult.isFail()) { + return authorResult; + } + + const categoryResult = await this.categoryRepository.getById(input.categoryId); + if (categoryResult.isFail()) { + return categoryResult; + } + + const book: CreateBookUseCase.Book = { + id: generateId(), + title: input.title, + author: authorResult.value, + category: categoryResult.value + }; + + const saveResult = await this.bookRepository.save(book); + if (saveResult.isFail()) { + return saveResult; + } + + return Result.ok(book); + } +} + +const CreateBookUseCaseImplementation = CreateBookUseCase.createImplementation({ + implementation: CreateBookUseCaseImpl, + dependencies: [BookRepository, AuthorRepository, CategoryRepository] +}); + +export default CreateBookUseCaseImplementation; +``` + +## Using Decorators + +Decorators extend behavior without modifying the original implementation. Use `createDecorator()` from the abstraction to wrap existing functionality: + +```typescript +import { CreateBookUseCase } from "./abstractions/CreateBookUseCase.js"; +import { Logger } from "webiny/api/logger"; + +class LoggingCreateBookDecorator implements CreateBookUseCase.Interface { + public constructor( + private logger: Logger.Interface, + private decoratee: CreateBookUseCase.Interface + ) {} + + public async execute(input: CreateBookUseCase.Input): CreateBookUseCase.Return { + this.logger.info("Creating book", { title: input.title }); + + const result = await this.decoratee.execute(input); + + if (result.isOk()) { + this.logger.info("Book created successfully", { bookId: result.value.id }); + } else { + this.logger.error("Failed to create book", { error: result.error }); + } + + return result; + } +} + +const LoggingCreateBookDec = CreateBookUseCase.createDecorator({ + decorator: LoggingCreateBookDecorator, + dependencies: [Logger] +}); + +export default LoggingCreateBookDec; +``` + +**Key Point:** The decorator's last constructor parameter must be the type being decorated. The `decoratee` is automatically injected - you only list other dependencies in the `dependencies` array. + +## Key Points + +### Dependency Order Matters + +The order in the `dependencies` array must exactly match the constructor parameter order: + +```typescript +class MyClass implements SomeAbstraction.Interface { + public constructor( + private firstDep: FirstDep.Interface, + private secondDep: SecondDep.Interface + ) {} +} + +const MyClassImpl = SomeAbstraction.createImplementation({ + implementation: MyClass, + dependencies: [ + FirstDep, + SecondDep + ] +}); +``` + +### Always Use .Interface Types + +Constructor parameters should use the `.Interface` type from the abstraction: + +```typescript +// ✅ Correct +public constructor(private bookRepository: BookRepository.Interface) {} + +// ❌ Wrong - don't use the concrete class +public constructor(private bookRepository: InMemoryBookRepository) {} +``` + +### Export the Implementation + +Always export the result of `createImplementation()` or `createDecorator()`: + +```typescript +const MyImplementation = Something.createImplementation({ + implementation: SomethingImpl, + dependencies: [] +}); + +export default MyImplementation; +``` + diff --git a/docs/developer-docs/6.0.x/basic/result.ai.txt b/docs/developer-docs/6.0.x/basic/result.ai.txt new file mode 100644 index 000000000..9cbc86366 --- /dev/null +++ b/docs/developer-docs/6.0.x/basic/result.ai.txt @@ -0,0 +1,121 @@ +AI Context: Result Pattern (result.mdx) + +Source of Information: +1. Analyzed existing code examples throughout the 6.0.x documentation +2. Observed Result pattern usage in event handlers, use cases, and repositories +3. Examined the Result class API from code examples showing: + - Result.ok() for success + - Result.fail() for errors + - isOk() and isFail() methods + - error and value properties +4. Studied the pattern across multiple files (entry.mdx, model.mdx, group.mdx event handlers) + +Understanding the Result Pattern: +The Result pattern is an alternative to try/catch for error handling. Instead of throwing exceptions, functions return a Result object that contains either a success value or an error value. Think of it like a box that always tells you "did this work?" before you open it. + +Why Use Result Pattern: +- Type Safety: TypeScript knows exactly what errors can happen +- Explicit: Must check for errors (can't forget to handle them) +- No Surprises: No hidden exceptions that crash your app +- Better Flow: Read code top-to-bottom, no try/catch blocks + +Key Documentation Decisions: +- Explain the pattern's purpose: type-safe error handling without exceptions +- Show both success and failure paths +- Demonstrate property access patterns (value, error) +- Include checking methods (isOk(), isFail()) +- Show async usage patterns (commonly used throughout) +- Use simple, generic examples +- Reference the pattern in DI context since they're used together + +Pattern Observed: +```typescript +// Step 1: Call a function that returns Result +const result = await someOperation(); + +// Step 2: Check if it failed (always do this first!) +if (result.isFail()) { + return result; // or handle error: result.error contains the error +} + +// Step 3: If we get here, it succeeded - safe to use the value +const value = result.value; +``` + +How Result Works in Practice: +- Use cases return Result<Value, Error> +- Repositories return Result<void, Error> or Result<Entity, Error> +- Event handlers can return Result for validation/authorization +- Enables functional error handling without try/catch + +Comparison with Try/Catch: +```typescript +// Traditional try/catch approach +try { + const user = await createUser(data); + console.log(user); +} catch (error) { + console.error(error); +} + +// Result pattern approach +const result = await createUser(data); +if (result.isFail()) { + console.error(result.error); + return; +} +console.log(result.value); +``` + +Common Pattern - Early Return on Failure: +```typescript +async function processData() { + const result1 = await step1(); + if (result1.isFail()) return result1; // Stop if failed + + const result2 = await step2(result1.value); + if (result2.isFail()) return result2; // Stop if failed + + return Result.ok(result2.value); // All steps succeeded +} +``` + +Related Documents: +- See basic/di.mdx for how Result integrates with DI +- See all use-case/*.mdx files for Result usage examples +- See all event-handler/*.mdx files for validation patterns + +Key Code Locations: +- Result class: @webiny/feature/api (look for Result import in examples) +- Usage examples: Throughout the codebase showing Result pattern + +To examine source code implementations in detail, access to the Webiny project repository is needed. + +Common Patterns to Follow: +1. Always check isFail() before accessing value +2. Return failed results early (guard clauses) +3. Use Result.ok(value) for success +4. Use Result.fail(error) for failures +5. Chain Results in async operations + +Code Pattern to Follow: +```typescript +const result = await someOperation(); +if (result.isFail()) { + return result; // propagate error +} +const data = result.value; // safe to access +``` + +Tone Guidelines: +- Explain WHY Result pattern is used (type safety, explicit errors) +- Show both success and failure paths +- Keep examples simple and clear + +Key Takeaways: +1. Result = A container that holds either success value OR error +2. Always check isFail() before using result.value +3. No try/catch needed - errors are explicit in the return type +4. TypeScript helps: it knows what errors can happen +5. Pattern used consistently: use cases, repositories, event handlers + diff --git a/docs/developer-docs/6.0.x/basic/result.mdx b/docs/developer-docs/6.0.x/basic/result.mdx new file mode 100644 index 000000000..bc2a69825 --- /dev/null +++ b/docs/developer-docs/6.0.x/basic/result.mdx @@ -0,0 +1,147 @@ +--- +id: bpki4nn3 +title: Result +description: About Result +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is the `Result`? +- How to use it? +- How to use the return types? + +</Alert> + +## Overview + +System is utilizing the `Result` pattern, and there is a `Result` class that helps with that. + +The `Result` pattern is a way to represent the outcome of an operation that can either succeed or fail. +Instead of throwing exceptions, functions return a `Result` object that encapsulates either a successful value or an error. + +## Usage + +Let's say you have a function that performs some async call to an operation which you import from a dependency, and it can either return a result or throw an error. + +```typescript +import {Result} from "webiny/api"; +import {someOperation} from "some-module"; + +const myMethod = async() => { + try { + const operationResult = await someOperation(); + return Result.ok(operationResult); + } catch(ex) { + return Result.fail(ex); + } +} +const result = await myMethod(); +if(result.isOk()) { + console.log("Operation succeeded with value:", result.value); +} else { + console.error("Operation failed with error:", result.error); +} +``` + +This way you can be sure that the method does not throw an exception, and you do not have to worry about it down the call stack, which uses the `myMethod` function. + +## Return Types + +When using the `Result` pattern the return types are inferred from the values passed to the `Result.ok()` and `Result.fail()` methods. + +For example, if you have a function that returns a `Result` object with a successful value of type `string` and an error of type `Error`, the return type would be `Result<string, Error>`. + +```typescript +import {Result} from "webiny/api"; +const myMethod = async(): Promise<Result<string, Error>> => { + try { + const operationResult = await someOperation(); + return Result.ok(operationResult); + } catch(ex) { + return Result.fail(ex); + } +} +``` + +For more complex return types, you can define custom types for the success value and error value. + +```typescript +import type { Result } from "webiny/api"; +import type { NotAuthorizedError, ValueNotFoundError } from "webiny/api/error"; + +export interface SuccessData { + id: string; + name: string; +} +export interface Success { + data: SuccessData; + timestamp: number; +} +interface PossibleErrors { + notFound: ValueNotFoundError; + notAuthorized: NotAuthorizedError; +} + +type MyMethodErrors = PossibleErrors[keyof PossibleErrors]; + +type ReturnOfTheMethod = Promise<Result<Success, MyMethodErrors>>; + +interface MyMethodParams { + id: string; +} + +export interface MyMethod { + (params: MyMethodParams): ReturnOfTheMethod; +} +``` + +And then you can implement the method like this: + +```typescript +import { Result } from "webiny/api"; + +const myMethod: MyMethod = async (params) => { + try { + const operationResult = await someOperation(params.id); + if (!operationResult) { + return Result.fail(new ValueNotFoundError(`Value with ID ${params.id} not found.`)); + } + const successData: SuccessData = { + id: operationResult.id, + name: operationResult.name, + }; + return Result.ok({ + data: successData, + timestamp: Date.now(), + }); + } catch (ex) { + return Result.fail(new NotAuthorizedError(`Not authorized to access value with ID ${params.id}.`)); + } +}; +``` + +## Result Unwrap + +When using methods and functions that return a `Result` object, you might want to get the actual value or error types from the `Result` object. + +If the type is not available for you to import, you can use the `Result.UnwrapResult` and `Result.UnwrapError` utility to get those types. + +For example, using the `GetEntryByIdUseCase` from Headless CMS: + +```typescript +import type { Result } from "webiny/api"; +import type { GetEntryByIdUseCase } from "webiny/api/cms/entry"; + +export type IGetEntryByIdValue = Result.UnwrapResult<GetEntryByIdUseCase.Result>; +export type IGetEntryByIdError = Result.UnwrapError<GetEntryByIdUseCase.Result>; +``` + +This can be useful when you want to use return types from the system through your own code, but the types are not directly available for import. + + +## Conclusion +The `Result` pattern is a powerful way to handle success and failure in your code without relying on exceptions. +By using the `Result` class, you can create functions that return a `Result` object, making it easier to manage errors and success values in a consistent manner. +Additionally, the ability to infer return types from the `Result` object allows for better type safety and clarity in your code. diff --git a/docs/developer-docs/6.0.x/cli/deploy.ai.txt b/docs/developer-docs/6.0.x/cli/deploy.ai.txt new file mode 100644 index 000000000..8f378a5a9 --- /dev/null +++ b/docs/developer-docs/6.0.x/cli/deploy.ai.txt @@ -0,0 +1,35 @@ +AI Context: CLI - webiny deploy (cli/deploy.mdx) + +Source of Information: +1. v5 docs: https://www.webiny.com/docs/core-development-concepts/basics/project-deployment +2. v5 docs: https://www.webiny.com/docs/core-development-concepts/basics/webiny-cli +3. Existing v6 doc patterns (tasks/about.mdx, graphql/about.mdx) + +Key Documentation Decisions: +- Placed in cli/ root group, not under reference/ — these are operational command docs, not API reference +- Kept v5 content but stripped screenshots and external links to Pulumi docs +- No shell/bash code blocks per convention — using plain fenced blocks without language tag for CLI commands +- Removed v5-specific mention of four apps (Core/API/Admin/Website) as canonical project structure may differ in v6 +- Kept the dependency ordering note as it is still accurate and practically important +- Troubleshooting section trimmed to two most common issues; full Pulumi state repair deferred to pulumi.mdx + +Command Signature: + yarn webiny deploy [APP_PATH] --env ENV [--debug] + +Behavior: +- Without APP_PATH: deploys all apps in order (Core → API → Admin → Website) +- With APP_PATH: deploys only that app; --env is required +- Builds code first (runs build script from webiny.config.ts per package) +- Uses Pulumi under the hood; --debug exposes raw Pulumi error output + +Related Documents: +- cli/destroy.mdx — tear down what deploy created +- cli/pulumi.mdx — raw Pulumi command access +- cli/output.mdx — read stack outputs after deploy +- cli/watch.mdx — incremental dev-time redeploy + +Tone Guidelines: +- Direct and operational — this is a command reference page +- Show the command first, explain after +- No marketing language +- Warnings only for genuinely dangerous or surprising behavior (20-min first deploy, dependency order) diff --git a/docs/developer-docs/6.0.x/cli/deploy.mdx b/docs/developer-docs/6.0.x/cli/deploy.mdx new file mode 100644 index 000000000..27fffbc92 --- /dev/null +++ b/docs/developer-docs/6.0.x/cli/deploy.mdx @@ -0,0 +1,63 @@ +--- +id: wn4bx7k2 +title: webiny deploy +description: Build and deploy your Webiny project to AWS. +--- + +import { Alert } from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to deploy your whole Webiny project +- How to deploy one or more specific apps +- What options the `deploy` command accepts + +</Alert> + +## Overview + +The `deploy` command builds your code and deploys the resulting cloud infrastructure to AWS using Pulumi. You can deploy the whole project at once, or target one or more specific apps. + +## Deploy the Whole Project + +``` +yarn webiny deploy +``` + +This deploys all apps in the correct order. The environment defaults to `dev`. To target a different environment: + +``` +yarn webiny deploy --env prod +``` + +<Alert type="warning"> + Depending on your [database setup](#), the first deployment can take up to 20 minutes. +</Alert> + +## Deploy Specific Apps + +Pass one or more app names as arguments: + +``` +yarn webiny deploy api +yarn webiny deploy core api +yarn webiny deploy core api admin +``` + +With a specific environment: + +``` +yarn webiny deploy api --env prod +``` + +## Options + +| Option | Description | +| --------------------------- | ----------------------------------------------------------------------------------- | +| `--env` | Environment name (e.g. `dev`, `prod`). Defaults to `dev`. | +| `--variant` | Variant name. | +| `--region` | AWS region to target. | +| `--build` | Build packages before deploying. Defaults to `true`. | +| `--preview` | Preview the deploy without actually performing it. | +| `--show-deployment-logs` | Print deployment logs (automatically enabled in CI). | +| `--allow-local-state-files` | Allow using local Pulumi state files with production deployments (not recommended). | diff --git a/docs/developer-docs/6.0.x/cli/destroy.ai.txt b/docs/developer-docs/6.0.x/cli/destroy.ai.txt new file mode 100644 index 000000000..2a1a3e566 --- /dev/null +++ b/docs/developer-docs/6.0.x/cli/destroy.ai.txt @@ -0,0 +1,31 @@ +AI Context: CLI - webiny destroy (cli/destroy.mdx) + +Source of Information: +1. v5 docs: https://www.webiny.com/docs/infrastructure/basics/destroy-cloud-infrastructure +2. v5 docs: https://www.webiny.com/docs/core-development-concepts/basics/webiny-cli + +Key Documentation Decisions: +- Placed in cli/ root group alongside deploy, watch, output, pulumi +- Leading warning about irreversibility — this is a destructive command +- Reverse-order teardown note is critical for users who try to destroy Core before API +- Protected resources section kept because prod-environment protection trips up users regularly +- PreconditionFailed troubleshooting points to `webiny pulumi` for the refresh command rather than raw Pulumi CLI +- OpenSearch timing note retained — users frequently think something has gone wrong + +Command Signature: + yarn webiny destroy [APP_PATH] --env ENV [--confirm-destroy-env ENV] [--debug] + +Behavior: +- APP_PATH required for single-app destroy; --env always required +- No APP_PATH: destroys all apps; must also pass --confirm-destroy-env matching --env +- Pulumi protect: true resources in prod will block destroy until protection is lifted +- --debug exposes raw Pulumi logs + +Related Documents: +- cli/deploy.mdx — creates what destroy removes +- cli/pulumi.mdx — used for state repair (refresh, stack export/import) + +Tone Guidelines: +- Direct and cautious — lead with the warning +- Operational: show the commands, explain the caveats +- No filler prose diff --git a/docs/developer-docs/6.0.x/cli/destroy.mdx b/docs/developer-docs/6.0.x/cli/destroy.mdx new file mode 100644 index 000000000..c45c6dee1 --- /dev/null +++ b/docs/developer-docs/6.0.x/cli/destroy.mdx @@ -0,0 +1,59 @@ +--- +id: qm3tz9hs +title: webiny destroy +description: Destroy cloud infrastructure previously deployed for a Webiny app. +--- + +import { Alert } from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to destroy cloud infrastructure for a single app +- How to fully destroy your whole Webiny project + +</Alert> + +## Overview + +The `destroy` command removes all cloud infrastructure resources previously deployed by [`webiny deploy`](/docs/cli/deploy) for a given app and environment. It delegates to Pulumi internally. + +<Alert type="warning"> + This operation is irreversible. All AWS resources managed by the specified Pulumi stack will be + permanently deleted. +</Alert> + +## Destroy the Whole Project + +``` +yarn webiny destroy +``` + +The environment defaults to `dev`. To target a different environment: + +``` +yarn webiny destroy --env prod +``` + +## Destroy a Single App + +Pass the app name as the first argument: + +``` +yarn webiny destroy api +yarn webiny destroy admin +yarn webiny destroy core +``` + +With a specific environment: + +``` +yarn webiny destroy api --env prod +``` + +## Options + +| Option | Description | +| ----------- | --------------------------------------------------------- | +| `--env` | Environment name (e.g. `dev`, `prod`). Defaults to `dev`. | +| `--variant` | Variant name. | +| `--region` | AWS region to target. | diff --git a/docs/developer-docs/6.0.x/cli/info.ai.txt b/docs/developer-docs/6.0.x/cli/info.ai.txt new file mode 100644 index 000000000..17e9d474b --- /dev/null +++ b/docs/developer-docs/6.0.x/cli/info.ai.txt @@ -0,0 +1,24 @@ +AI Context: CLI - webiny info (cli/info.mdx) + +Source of Information: +1. webiny info --help output from wby-next project +2. v5 docs: https://www.webiny.com/docs/core-development-concepts/basics/webiny-cli + +Key Documentation Decisions: +- Very short page — the command has no subcommands, one job, few options +- Framed as "quick reference without AWS console" — that's the practical use case +- No screenshot (v5 had one); keeping it text-only per v6 doc conventions + +Command Signature: + yarn webiny info [--env ENV] [--variant VARIANT] [--region REGION] + +Behavior: +- Reads deployed stack outputs and prints URLs (Admin, API endpoint, etc.) +- Read-only, no side effects + +Related Documents: +- cli/output.mdx — more detailed stack output inspection +- cli/deploy.mdx — deploys the project whose URLs info displays + +Tone Guidelines: +- Very concise — one-liner overview, usage, options table diff --git a/docs/developer-docs/6.0.x/cli/info.mdx b/docs/developer-docs/6.0.x/cli/info.mdx new file mode 100644 index 000000000..334f4d463 --- /dev/null +++ b/docs/developer-docs/6.0.x/cli/info.mdx @@ -0,0 +1,37 @@ +--- +id: mn7qr3pb +title: webiny info +description: List relevant URLs for your deployed Webiny project. +--- + +import { Alert } from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to quickly retrieve URLs for your deployed Webiny project + +</Alert> + +## Overview + +The `info` command prints relevant URLs for your deployed Webiny project — things like the Admin app URL and the API endpoint. Useful when you need a quick reference without opening the AWS console. + +## Usage + +``` +yarn webiny info +``` + +With a specific environment: + +``` +yarn webiny info --env prod +``` + +## Options + +| Option | Description | +| ----------- | --------------------------------------------------------- | +| `--env` | Environment name (e.g. `dev`, `prod`). Defaults to `dev`. | +| `--variant` | Variant name. | +| `--region` | AWS region to target. | diff --git a/docs/developer-docs/6.0.x/cli/output.ai.txt b/docs/developer-docs/6.0.x/cli/output.ai.txt new file mode 100644 index 000000000..dc7c2ac5f --- /dev/null +++ b/docs/developer-docs/6.0.x/cli/output.ai.txt @@ -0,0 +1,28 @@ +AI Context: CLI - webiny output (cli/output.mdx) + +Source of Information: +1. v5 docs: https://www.webiny.com/docs/core-development-concepts/basics/webiny-cli (output section) +2. General Pulumi stack output concept + +Key Documentation Decisions: +- Short page — the command is simple, no need to pad it +- Focus on "what is it for" (retrieving deployment artifacts without AWS console) and "what does it print" +- Listed common output values as examples rather than exhaustive spec, since actual outputs vary by app version +- JSON output note added — useful for scripting use cases (CI/CD pipelines reading outputs) + +Command Signature: + yarn webiny output APP_PATH --env ENV + +Behavior: +- Reads the Pulumi stack state and prints exported output values as JSON +- Does not redeploy or modify anything — read-only +- Both APP_PATH and --env are required + +Related Documents: +- cli/deploy.mdx — creates the stack whose outputs this command reads +- cli/pulumi.mdx — for more advanced stack inspection via raw Pulumi commands + +Tone Guidelines: +- Concise — this is a small utility command +- Practical framing: "you need this when you want X without going to the AWS console" +- No filler diff --git a/docs/developer-docs/6.0.x/cli/output.mdx b/docs/developer-docs/6.0.x/cli/output.mdx new file mode 100644 index 000000000..9c841efae --- /dev/null +++ b/docs/developer-docs/6.0.x/cli/output.mdx @@ -0,0 +1,52 @@ +--- +id: hc5np2dw +title: webiny output +description: Print the Pulumi stack output for a deployed Webiny app. +--- + +import { Alert } from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to read stack output values for a deployed app +- What kind of information the output command returns + +</Alert> + +## Overview + +The `output` command prints the Pulumi stack output for an app that has already been deployed. Stack outputs are values that the infrastructure code explicitly exports — things like API endpoint URLs, CloudFront distribution IDs, S3 bucket names, and similar deployment artifacts. + +This is useful when you need to retrieve a URL or resource identifier after deployment without opening the AWS console. + +## Usage + +``` +yarn webiny output api +yarn webiny output core +yarn webiny output admin +``` + +With a specific environment: + +``` +yarn webiny output api --env prod +``` + +## Options + +| Option | Description | +| ----------- | --------------------------------------------------------- | +| `--env` | Environment name (e.g. `dev`, `prod`). Defaults to `dev`. | +| `--variant` | Variant of the app. | +| `--region` | AWS region to target. | +| `--json` | Emit output as JSON. | + +## What Gets Printed + +The exact outputs depend on what each app exports from its Pulumi program. Common values include: + +- API GraphQL endpoint URL +- CloudFront distribution domain names +- Cognito User Pool and Client IDs +- S3 bucket names diff --git a/docs/developer-docs/6.0.x/cli/pulumi.ai.txt b/docs/developer-docs/6.0.x/cli/pulumi.ai.txt new file mode 100644 index 000000000..2a5983cd4 --- /dev/null +++ b/docs/developer-docs/6.0.x/cli/pulumi.ai.txt @@ -0,0 +1,35 @@ +AI Context: CLI - webiny pulumi (cli/pulumi.mdx) + +Source of Information: +1. v5 docs: https://www.webiny.com/docs/infrastructure/pulumi-iac/execute-pulumi-commands +2. v5 docs: https://www.webiny.com/docs/core-development-concepts/basics/webiny-cli + +Key Documentation Decisions: +- Positioned as an escape hatch / advanced tool, not a daily driver — most users never need it +- The `--` separator is easy to miss and causes confusing errors; it gets its own callout in the usage section +- Focused on the three most common real-world use cases: resource inspection, stuck stack repair, refresh +- Dropped the v5 FAQ question about which CLI to prefer — obvious answer is always use Webiny CLI; not worth the space +- Local Pulumi binary location mentioned once for debugging purposes +- --yes flag troubleshooting kept — this trips up CI/CD pipelines regularly + +Command Signature: + yarn webiny pulumi APP_PATH --env ENV -- <pulumi-subcommand> [pulumi-args] + +Behavior: +- Sets up env vars and selects the correct Pulumi stack automatically +- Passes everything after `--` verbatim to the embedded Pulumi CLI +- Runs in non-interactive mode; confirmations require --yes + +Related Documents: +- cli/deploy.mdx — uses Pulumi internally; use this for normal deployments +- cli/destroy.mdx — uses Pulumi internally; mentions pulumi for state repair +- cli/output.mdx — simpler alternative for reading stack outputs + +Key Code Locations: +- node_modules/@webiny/pulumi-sdk/pulumi — embedded Pulumi binary +- packages/pulumi-sdk in webiny-js monorepo — source of the wrapper + +Tone Guidelines: +- Technical and concise +- Show real commands, not abstract placeholders +- Frame it as "you need this when X" for each use case diff --git a/docs/developer-docs/6.0.x/cli/pulumi.mdx b/docs/developer-docs/6.0.x/cli/pulumi.mdx new file mode 100644 index 000000000..b0a0abfc9 --- /dev/null +++ b/docs/developer-docs/6.0.x/cli/pulumi.mdx @@ -0,0 +1,91 @@ +--- +id: xt6kp4nj +title: webiny pulumi +description: Execute Pulumi CLI commands against a Webiny app stack. +--- + +import { Alert } from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- When and why you need to run raw Pulumi commands +- How to use `webiny pulumi` to pass commands to the Pulumi CLI +- Common scenarios where this command is required + +</Alert> + +## Overview + +The `pulumi` command is a thin wrapper that lets you run any [Pulumi CLI](https://www.pulumi.com/docs/reference/cli/) command against a specific app and environment. Webiny embeds its own Pulumi binary and sets up the required environment variables automatically — you do not need to install Pulumi separately or select a stack manually. + +Most day-to-day work uses [`webiny deploy`](/docs/cli/deploy) and [`webiny destroy`](/docs/cli/destroy). Use `webiny pulumi` when you need lower-level access that those commands do not expose. + +## Usage + +The app name and the `--` separator are both required. Everything after `--` is passed directly to the Pulumi CLI. + +``` +yarn webiny pulumi api -- <pulumi command> +``` + +With a specific environment: + +``` +yarn webiny pulumi api --env prod -- <pulumi command> +``` + +## Options + +| Option | Description | +| ----------- | --------------------------------------------------------- | +| `--env` | Environment name (e.g. `dev`, `prod`). Defaults to `dev`. | +| `--variant` | Variant name. | +| `--region` | AWS region to target. | + +## Common Use Cases + +### Inspect Stack Resources + +List all cloud infrastructure resources currently tracked in the stack: + +``` +yarn webiny pulumi api -- stack --show-urns +``` + +### Repair a Stuck Stack (Pending Operations) + +If a deployment was interrupted, Pulumi may report resources stuck in a `pending_operations` state. Export the stack, edit it to remove the pending entries, then import it back: + +``` +yarn webiny pulumi api -- stack export --file stack.json +# edit stack.json — remove entries from "pending_operations" +yarn webiny pulumi api -- stack import --file stack.json +``` + +### Refresh State + +Sync the Pulumi state file with the actual state of resources in AWS: + +``` +yarn webiny pulumi api -- refresh --yes +``` + +This is useful when resources have been modified outside of Pulumi (e.g. manually in the AWS console). + +### Preview Changes + +See what `deploy` would change without actually deploying: + +``` +yarn webiny pulumi api -- preview +``` + +## Troubleshooting + +### `--yes must be passed in to proceed when running in non-interactive mode` + +Webiny runs all Pulumi commands in non-interactive mode. If a Pulumi command requires confirmation, add `--yes`: + +``` +yarn webiny pulumi api -- destroy --yes +``` diff --git a/docs/developer-docs/6.0.x/cli/watch.ai.txt b/docs/developer-docs/6.0.x/cli/watch.ai.txt new file mode 100644 index 000000000..bf85a670e --- /dev/null +++ b/docs/developer-docs/6.0.x/cli/watch.ai.txt @@ -0,0 +1,28 @@ +AI Context: CLI - webiny watch (cli/watch.mdx) + +Source of Information: +1. v5 docs: https://www.webiny.com/docs/core-development-concepts/basics/watch-command +2. v5 docs: https://www.webiny.com/docs/core-development-concepts/basics/webiny-cli + +Key Documentation Decisions: +- Kept the frontend vs. backend split as the key conceptual distinction — most user confusion comes from expecting a local server for the API +- Dropped the v5 "Can I Use This?" availability notice (v5.5.0+) — not relevant to v6 docs +- Dropped the v5 beta "New Watch Command" callout about local Lambda development — v6 may handle this differently; don't carry over beta notes without verification +- Kept the "API must be deployed first" note — this is a real gotcha for new users +- FAQ trimmed to the single most important question (can I run locally) + +Command Signature: + yarn webiny watch APP_PATH --env ENV + +Behavior: +- Frontend (admin, website): local dev server + hot reload; requires API already deployed +- Backend (api): file watcher → build → Lambda redeploy cycle; no local server + +Related Documents: +- cli/deploy.mdx — initial deployment before watch can be used for backend +- cli/output.mdx — retrieve URLs after deploy to use during watch sessions + +Tone Guidelines: +- Practical and direct +- Explain the frontend/backend difference clearly — it surprises users +- Keep it short; the command has limited options diff --git a/docs/developer-docs/6.0.x/cli/watch.mdx b/docs/developer-docs/6.0.x/cli/watch.mdx new file mode 100644 index 000000000..f74f7bc06 --- /dev/null +++ b/docs/developer-docs/6.0.x/cli/watch.mdx @@ -0,0 +1,83 @@ +--- +id: bv8mr1yx +title: webiny watch +description: Start a local development session with continuous rebuild and redeploy. +--- + +import { Alert } from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to use `webiny watch` for frontend and backend development +- How the command behaves differently for `api` vs. `admin` +- How Local AWS Lambda Development works + +</Alert> + +## Overview + +The `watch` command is the primary tool for active development on a Webiny project. It monitors your source files for changes and continuously rebuilds and redeploys your code, so you don't need to manually run `webiny deploy` after every edit. + +The command works differently depending on which app you are watching. + +## Usage + +``` +yarn webiny watch api +yarn webiny watch admin +``` + +With a specific environment: + +``` +yarn webiny watch api --env prod +``` + +## Options + +| Option | Description | +| --------------------- | -------------------------------------------------------------------------- | +| `--env` | Environment name (e.g. `dev`, `prod`). Defaults to `dev`. | +| `--variant` | Variant name. | +| `--region` | AWS region to target. | +| `-p, --package` | One or more packages to watch for code changes. | +| `--allow-production` | Enables running `watch` against production environments (not recommended). | +| `--deployment-checks` | Enable or disable deployment checks before watching. Defaults to `true`. | + +### Local AWS Lambda Development Options + +| Option | Description | +| ------------------------------ | ------------------------------------------------------------------- | +| `-f, --function` | One or more Lambda functions to watch (comma-separated). | +| `--increase-timeout` | Increase Lambda function timeout in seconds. Defaults to `120`. | +| `--increase-handshake-timeout` | Increase the initial handshake timeout in seconds. Defaults to `5`. | +| `-i, --inspect` | [Experimental] Enable Node debugger. | + +## How It Works + +### Frontend App (Admin) + +For the **Admin** app, `watch` spins up a local development server. The app is rebuilt and hot-reloaded in the browser whenever a source file changes. + +### Backend App (API) — Local AWS Lambda Development + +For the **API** app, `watch` uses Local AWS Lambda Development. Your Lambda code runs on your local machine while staying connected to real AWS infrastructure — DynamoDB, OpenSearch, S3, Cognito, and other services your project depends on. + +Here's what happens when you run `yarn webiny watch api`: + +- **Lambda stubs are deployed** — Webiny's Lambda functions are temporarily replaced with stub code that forwards incoming events to your local machine. +- **Requests are forwarded locally** — when a request hits AWS, the stub forwards it to your local process. +- **Your code runs locally** — with the full Lambda execution context (environment variables, function context, etc.). +- **Responses are routed back** — your local response travels back through the stub to the original caller. + +This means you can iterate on backend code and see results immediately, without waiting for a full deployment. You can also attach a debugger since the code runs locally. + +<Alert type="warning"> + When you stop `watch`, your Lambda functions still contain stub code — your API will not work + until you redeploy. Run `yarn webiny deploy api` to restore the actual Lambda code. The watch + command will remind you of this when it exits. +</Alert> + +### Why Not Run Everything Locally? + +Running AWS-managed services like DynamoDB, OpenSearch, and Cognito fully locally would be complex and unreliable. The hybrid approach — local code execution, real cloud services — gives you fast iteration with a realistic environment. diff --git a/docs/developer-docs/6.0.x/get-started/install-webiny.mdx b/docs/developer-docs/6.0.x/get-started/install-webiny.mdx new file mode 100644 index 000000000..7c245e443 --- /dev/null +++ b/docs/developer-docs/6.0.x/get-started/install-webiny.mdx @@ -0,0 +1,76 @@ +--- +id: aafeab3f +title: Install Webiny +description: Learn how to create a new Webiny project and deploy it into your AWS account. +--- + +import { Alert } from "@/components/Alert"; +import { TabsComponent, TabsItem } from "@/components/TabsComponent"; + +<Alert type="success" title="WHAT YOU’LL LEARN"> + + - how to create a brand new Webiny project + - how to deploy it to your [AWS](https://aws.amazon.com/) account + +</Alert> + +--- + +## Prerequisites + +Before proceeding, make sure you have the following: + +1. **Node.js >=22** +- Node.js versions **22** or greater +- If you don't have Node.js installed, the easiest way to install it is by [downloading the official binary](https://nodejs.org/en/) +2. **yarn** +- Webiny works with both yarn versions [1 (classic)](https://yarnpkg.com/en/docs/install) and [>=2 (berry)](https://yarnpkg.com/) +- for version 1 - **1.22.0** or later is required +3. **AWS account and user credentials** +- in order to deploy Webiny, you must have a valid [AWS account and user credentials](/docs/infrastructure/aws/configure-aws-credentials) set up on your system + +## Project Setup + +Once you have all the prerequisites in place, we recommend creating a new Webiny project using `create-webiny-project` - a tool that sets everything up automatically for you. So, in your terminal of choice, run the following command: + +``` +npx create-webiny-project my-new-project +``` + +From there, follow the on-screen setup instructions, which includes answering a couple of project-related questions, and doing your first deployment. + +### Pick Your Database Setup + +Webiny supports two database setups: + +1. **Amazon DynamoDB** (for small and medium sized projects) +2. **Amazon DynamoDB + Amazon OpenSearch** (for large / enterprise-level projects) + +If you're building a small project (couple of thousands of database records) or just giving Webiny a try, we suggest you go with the **Amazon DynamoDB** database setup. On the other hand, if you're building a larger project and you know you will be dealing with hundreds of thousands or even millions of database records, choose the **Amazon DynamoDB + Amazon OpenSearch** database setup. + +Please choose your database setup with consideration for both present and future project requirements. The decision you make at this point **cannot** be changed later on without recreating your project from scratch. + +#### Amazon DynamoDB + Amazon OpenSearch - Monthly Cost❗ + +Although Webiny is designed to rely on serverless cloud infrastructure resources, the **Amazon DynamoDB + Amazon OpenSearch** database setup relies on [Amazon OpenSearch Service](https://aws.amazon.com/opensearch-service/), which is not serverless. + +More precisely, it doesn't scale to zero and it's billed per hour of usage. The cheapest configuration (which Webiny deploys for your development-related environments) amounts to roughly **$25/month**. For more information, please refer to the [Amazon OpenSearch Service pricing](https://aws.amazon.com/opensearch-service/pricing/) page. + +## First Deployment + +Once your new project has been created, it's time to deploy it into your AWS account. You can do that simply by running the following command in your terminal: + +``` +yarn webiny deploy +``` + +Note that the first deployment can take up to 15-30 minutes! So, even though it might look nothing is happening in the terminal, please be patient and let the process finish. If something went wrong, an error will be shown. + +Ultimately, once the deployment has been done, you are presented with the URL over which you can access your Admin Area, and finish the installation. + +<Alert type="info" title="Misplaced Admin area URL?"> + + Running the `yarn webiny info` command in your Webiny project folder provide you with the needed information. + + +</Alert> diff --git a/docs/developer-docs/6.0.x/get-started/welcome.mdx b/docs/developer-docs/6.0.x/get-started/welcome.mdx new file mode 100644 index 000000000..a57e8a977 --- /dev/null +++ b/docs/developer-docs/6.0.x/get-started/welcome.mdx @@ -0,0 +1,78 @@ +--- +id: db45d287 +title: Welcome to Webiny Docs +description: Learn how to install Webiny and customize its capabilities as a developer. +pageHeader: false +fullWidth: false +--- + +## Webiny Docs + +Welcome to the Webiny documentation — your reference manual for building, extending, and operating Webiny. + +Whether you’re integrating Webiny into an existing product, tailoring it into an enterprise content platform, or embedding it as a white-label builder, this portal is where you’ll find the exact methods, functions, and patterns you need. + +--- + +## What is Webiny? + +Webiny is an open-source, self-hosted content platform that combines ready-made apps (like Headless CMS, Website Builder, File Manager/DAM, Publishing Workflows, and Tenant Manager) with a TypeScript framework and APIs you can extend. You get SaaS-like reliability on a serverless foundation — but deployed into **your** cloud, under **your** governance. + +Webiny is built for teams that want flexibility without lock-in: define models and business rules as code, hook into lifecycle events, automate workflows, and integrate with any frontend or internal systems. + +--- + +## How to use the docs + +The docs are organized into three sections: + +**Getting Started** +Install Webiny, run it locally, deploy to your cloud, and learn the core building blocks. + +**Guides** +Step-by-step tutorials for real projects: extending apps, adding custom logic, integrating SSO, automating publishing, building multi-tenant setups, embedding the page builder, and more. + +**API Reference** +The detailed technical reference: functions, methods, types, GraphQL operations, lifecycle events, background tasks, and extension points. + +Use the sidebar to navigate, or search (Ctrl+K / Cmd+K) to jump straight to what you need. + +--- + +## Webiny apps and “framework mode” + +Webiny has two complementary ways to work: + +**Apps (ready-made products)** +Use Webiny’s built-in applications like Headless CMS, Website Builder, File Manager, Publishing Workflows, and Tenant Manager. They come with UI, permissions, editorial tooling, and the defaults most teams need. + +**Framework mode (build your own)** +Treat Webiny as your programmable foundation: add modules, extend APIs, create custom screens, enforce business rules, and shape workflows around your organization — all in a way that stays maintainable and upgrade-safe. + +--- + +## Prerequisite knowledge + +This documentation assumes you’re comfortable with: + +* JavaScript / TypeScript +* Modern web development fundamentals +* GraphQL basics +* Node.js tooling + +If you’re new to GraphQL or TypeScript, start with the Getting Started section and follow the examples as you go. + +--- + +## Where to start + +The best place to start learning Webiny is to go through the **Learn Webiny Course**. It’s a free, self-paced course that takes you through the basics of installing Webiny, running it locally, and deploying it to the cloud. You can find the course at <ExternalLink href="https://www.webiny.com/learn">learn.webiny.com/</ExternalLink>. + + +--- + +## Join the Webiny community + +If you get stuck, want feedback on an architecture, or need help with an extension, the community and the team are close by. You can also reach out if you want a technical deep-dive for your specific project. <ExternalLink href="/slack">Join Webiny Community</ExternalLink>. + + diff --git a/docs/developer-docs/6.0.x/graphql/about.ai.txt b/docs/developer-docs/6.0.x/graphql/about.ai.txt new file mode 100644 index 000000000..d2ccccb82 --- /dev/null +++ b/docs/developer-docs/6.0.x/graphql/about.ai.txt @@ -0,0 +1,63 @@ +AI Context: GraphQL - About (graphql/about.mdx) + +Source of Information: +1. Read graphql/reference.mdx and graphql/example.mdx to understand implementation +2. Analyzed the GraphQL schema factory pattern used in the system +3. Examined type and resolver registration patterns +4. Understood the declarative schema building approach + +Understanding the Factory Pattern: +The system uses a factory pattern for building GraphQL schemas. Instead of writing SDL (Schema Definition Language) strings or using decorators, you call factory methods to register types and resolvers. + +The Factory Approach vs Traditional: +- Traditional: Schema-first (SDL strings) or code-first (decorators) +- Factory Pattern: Programmatic, modular registration +- Benefits: Type safety, modularity, extensibility, schema composition + +Key Documentation Decisions: +- Created introductory document explaining GraphQL integration +- Focused on the factory pattern approach (not traditional schema-first or code-first) +- Explained the declarative nature of schema building +- Described the two main components: types and resolvers +- Kept it conceptual rather than implementation-focused +- Made it accessible for developers new to this GraphQL approach +- Linked to example and reference docs for implementation details + +Document Structure: +- Overview: How GraphQL works in this system +- What You'll Learn +- Factory Pattern explanation +- Types and Resolvers concepts +- Why this approach (modularity, extensibility, type safety) +- Links to practical examples + +Factory Pattern Components: +1. Types - Object types, inputs, enums, interfaces +2. Resolvers - Query/mutation/field logic +3. Schema building - Declarative registration + +Key Concepts: +- GraphQL schema factory pattern +- Type definitions (objects, inputs, enums) +- Resolvers for fields and queries/mutations +- Declarative schema building +- Modularity and extensibility benefits + +Key Benefits: +- Type safety with TypeScript +- Modular schema building +- Easy extension without schema conflicts +- Integration with DI container +- Separation of concerns + +Related Documents: +- graphql/reference.mdx - Factory API methods +- graphql/example.mdx - Complete working examples +- All use-case/*.mdx files show resolver integration + +Tone Guidelines: +- Conceptual introduction +- Compare to familiar approaches (Apollo, TypeGraphQL, schema-first, code-first) +- Explain the "why" of factory pattern +- Link to practical examples + diff --git a/docs/developer-docs/6.0.x/graphql/about.mdx b/docs/developer-docs/6.0.x/graphql/about.mdx new file mode 100644 index 000000000..3113d25bd --- /dev/null +++ b/docs/developer-docs/6.0.x/graphql/about.mdx @@ -0,0 +1,30 @@ +--- +id: a6cd5pa6 +title: About +description: About GraphQL +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How system uses GraphQL for its API layer? +- What is the GraphQL Schema Factory pattern? +- How to extend and customize GraphQL schemas? + +</Alert> + +## Overview + +System uses GraphQL as its primary API layer for all core applications including Headless CMS, Website Builder, and File Manager. GraphQL provides a flexible, type-safe way to query and mutate data, allowing clients to request exactly the data they need. + +### GraphQL Schema Factory + +System implements a factory pattern for building GraphQL schemas. The `GraphQLSchemaFactory` interface allows you to extend and customize the GraphQL API by: + +- **Adding type definitions** - Define your own GraphQL types, inputs, queries, and mutations +- **Registering resolvers** - Implement the logic that handles GraphQL operations +- **Dependency injection** - Access services and use cases within your resolvers +- **Modular architecture** - Build your schema in a composable, maintainable way + +This approach keeps your GraphQL layer thin and focused on data access, while business logic lives in dedicated service classes. You can extend existing schemas or create entirely new GraphQL APIs that integrate seamlessly with the system's infrastructure. diff --git a/docs/developer-docs/6.0.x/graphql/example.ai.txt b/docs/developer-docs/6.0.x/graphql/example.ai.txt new file mode 100644 index 000000000..978edd4fa --- /dev/null +++ b/docs/developer-docs/6.0.x/graphql/example.ai.txt @@ -0,0 +1,97 @@ +AI Context: GraphQL - Example (graphql/example.mdx) + +Source of Information: +1. Analyzed code examples showing GraphQL type resolver and schema definition implementation +2. Examined the factory pattern for type and resolver registration +3. Studied the integration between GraphQL types and business logic +4. Reviewed the modular approach to schema building + +Key Documentation Decisions: +- Provide a complete, working example of GraphQL implementation +- Show both type definitions and resolver implementations +- Demonstrate the factory pattern in action +- Include query and mutation examples +- Show how to integrate with use cases/business logic +- Make it practical and copy-paste friendly +- Used a cohesive example (Book management system) + +Example Structure: +1. Type Definitions - BookType with fields +2. Input Types - CreateBookInput for mutations +3. Query Resolvers - getBook, listBooks +4. Mutation Resolvers - createBook, updateBook +5. Integration with use cases + +Pattern Demonstrated: +- factory.createObjectType() for types +- factory.createInputObjectType() for inputs +- factory.createResolver() for query/mutation logic +- Type-safe resolver implementations +- Integration with domain layer (use cases) +- Error handling with Result pattern + +Tone: Practical and example-driven, showing how all pieces fit together. Maintains technical accuracy and consistency with reference.mdx. + +Related Documents: +- graphql/reference.mdx - Factory API methods +- graphql/about.mdx - Conceptual overview +- All use-case/*.mdx files show integration with GraphQL resolvers + +GraphQL Factory Pattern to Follow: +```typescript +// 1. Define types +factory.createObjectType({ + name: "Book", + fields: { + id: { type: "ID!" }, + title: { type: "String!" }, + author: { type: "Author" } + } +}); + +// 2. Define inputs +factory.createInputObjectType({ + name: "CreateBookInput", + fields: { + title: { type: "String!" }, + authorId: { type: "ID!" } + } +}); + +// 3. Create resolvers +factory.createResolver({ + type: "Query", + field: "getBook", + resolve: async (source, args, context) => { + const useCase = context.get(GetBookUseCase); + const result = await useCase.execute(args.id); + + if (result.isFail()) { + throw new Error(result.error.message); + } + + return result.value; + } +}); +``` + +Common Patterns: +1. Type definitions separate from resolvers +2. Use Input types for mutations +3. Integrate with use cases in resolvers +4. Handle Result pattern in resolvers (convert to errors/values) +5. Use context.get() for dependency injection +6. Type field definitions carefully (! for required) + +Integration with Use Cases: +- Resolvers are thin layers +- Business logic in use cases +- Resolvers handle GraphQL-specific concerns +- Use cases handle domain logic + +Tone Guidelines: +- Show complete, working examples +- Explain integration points +- Match reference.mdx tone +- Use "The system provides" consistently + diff --git a/docs/developer-docs/6.0.x/graphql/example.mdx b/docs/developer-docs/6.0.x/graphql/example.mdx new file mode 100644 index 000000000..9f5f3a082 --- /dev/null +++ b/docs/developer-docs/6.0.x/graphql/example.mdx @@ -0,0 +1,204 @@ +--- +id: ba8s58we +title: Example +description: GraphQL Example +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to add your own GraphQL schema? +- How to define GraphQL types, inputs, and mutations? +- How to add resolvers with dependency injection? +- How to handle errors in GraphQL responses? +- How to extend existing GraphQL types? + +</Alert> + +## Overview + +System provides a powerful GraphQL API framework that allows you to extend and customize the GraphQL schema. By implementing the `GraphQLSchemaFactory` interface, you can add custom types, queries, and mutations to your application. + +The example demonstrates a complete implementation of a custom GraphQL query that lists CMS entries from any content model. It shows how to: + +- Define GraphQL type definitions using `addTypeDefs()` with custom types and response structures +- Extend existing GraphQL types (like `Query`) with your custom operations +- Add resolvers using `addResolver()` with dependency injection support +- Handle both success and error responses using the Result pattern + +This pattern follow clean architecture principles, keeping the GraphQL layer thin and delegating business logic to dedicated use cases. The resolver functions receive injected dependencies and handle the communication between the GraphQL API and your application services. + + +## Query Code Example + +```typescript +import { GraphQLSchemaFactory } from "webiny/api/graphql"; +import { GetModelUseCase } from "webiny/api/cms/model"; +import { ListPublishedEntriesUseCase } from "webiny/api/cms/entry"; + +interface IListCmsEntriesArgs { + modelId: string; + limit?: number; + after?: string; +} + +class ListCmsEntriesGraphQL implements GraphQLSchemaFactory.Interface { + public async execute(builder: GraphQLSchemaFactory.SchemaBuilder): GraphQLSchemaFactory.Return { + builder.addTypeDefs(/* GraphQL */ ` + type CustomListCmsEntriesResponseItem { + id: ID! + title: String! + } + type CustomListCmsEntriesResponse { + data: [CustomListCmsEntriesResponseItem!] + meta: CmsListMeta + error: CmsError + } + + extend type Query { + listCmsEntries( + modelId: ID! + limit: Int + after: String + ): CustomListCmsEntriesResponse! + } + `); + + builder.addResolver<IListCmsEntriesArgs>({ + path: "Query.listCmsEntries", + dependencies: [GetModelUseCase, ListPublishedEntriesUseCase], + resolver( + getModel: GetModelUseCase.Interface, + listEntries: ListPublishedEntriesUseCase.Interface + ) { + return async ({ args }) => { + const { modelId, limit, after } = args; + + const modelResult = await getModel.execute(modelId); + + if (modelResult.isFail()) { + return { + error: modelResult.error, + data: null, + meta: null + }; + } + const model = modelResult.value; + + const entriesResult = await listEntries.execute(model, { + limit: limit || 10, + after: after || null + }); + if (entriesResult.isFail()) { + return { + error: entriesResult.error, + data: null, + meta: null + }; + } + + const { entries, meta } = entriesResult.value; + + return { + data: entries.map(item => ({ + id: item.id, + title: item.values[model.titleFieldId] || "No title" + })), + meta, + error: null + }; + }; + } + }); + + return builder; + } +} + +export default GraphQLSchemaFactory.createImplementation({ + implementation: ListCmsEntriesGraphQL, + dependencies: [], +}); +``` + + +## Mutation Code Example + +```typescript +import { GraphQLSchemaFactory } from "webiny/api/graphql"; +import { GetModelUseCase } from "webiny/api/cms/model"; +import { CreateEntryUseCase } from "webiny/api/cms/entry"; + +interface ILogMyClickArgs { + id: string; + ip: string; +} + +class LogMyClickGraphQL implements GraphQLSchemaFactory.Interface { + public async execute(builder: GraphQLSchemaFactory.SchemaBuilder): GraphQLSchemaFactory.Return { + builder.addTypeDefs(/* GraphQL */ ` + type LogMyClickResponseItem { + id: ID! + ip: String! + createdOn: String! + } + type LogMyClickResponse { + data: LogMyClickResponseItem + error: CmsError + } + + extend type Mutation { + logMyClick(id: ID!, ip: String!): LogMyClickResponse! + } + `); + + builder.addResolver<ILogMyClickArgs>({ + path: "Mutation.logMyClick", + dependencies: [GetModelUseCase, CreateEntryUseCase], + resolver( + getModel: GetModelUseCase.Interface, + createEntry: CreateEntryUseCase.Interface + ) { + return async ({ args }) => { + const modelResult = await getModel.execute("logMyClickModel"); + + if (modelResult.isFail()) { + return { + error: modelResult.error, + data: null, + meta: null + }; + } + const model = modelResult.value; + + const result = await createEntry.execute<ILogMyClickArgs>(model, { + values: { + id: args.id, + ip: args.ip + } + }); + if (result.isFail()) { + return { + error: result.error, + data: null, + meta: null + }; + } + return { + data: result.value, + error: null + }; + }; + } + }); + + return builder; + } +} + +export default GraphQLSchemaFactory.createImplementation({ + implementation: LogMyClickGraphQL, + dependencies: [], +}); +``` diff --git a/docs/developer-docs/6.0.x/graphql/reference.ai.txt b/docs/developer-docs/6.0.x/graphql/reference.ai.txt new file mode 100644 index 000000000..c1c08f7a9 --- /dev/null +++ b/docs/developer-docs/6.0.x/graphql/reference.ai.txt @@ -0,0 +1,93 @@ +AI Context: GraphQL - Reference (graphql/reference.mdx) + +Source of Information: +1. Analyzed GraphQL schema factory code examples +2. Examined factory methods for creating types, inputs, and resolvers +3. Studied the API surface of the GraphQL factory +4. Understood the type registration and schema building process + +Key Documentation Decisions: +- Simple, concise reference documentation +- Focus on the factory API methods +- Document each factory method (createObjectType, createInputObjectType, createResolver) +- Show method signatures and options +- Keep examples minimal but illustrative +- Explain when to use each method +- Cross-reference with example.mdx for complete implementations + +Methods Documented: +1. createObjectType() - Define GraphQL object types +2. createInputObjectType() - Define input types for mutations +3. createResolver() - Implement query/mutation logic +4. Type system integration + +Overview Written: +- Explains that factory provides declarative API +- Describes type safety benefits +- Notes the modular nature +- Keeps it simple and to-the-point + +Pattern Observed: +- Factory pattern for schema building +- Type definitions separate from resolvers +- Declarative API design +- Integration with TypeScript for type safety + +Tone: Consistent reference documentation style, technical and concise. + +Related Documents: +- graphql/about.mdx - Conceptual overview +- graphql/example.mdx - Complete examples + +Factory Methods to Document: +1. createObjectType() - Define GraphQL object types +2. createInputObjectType() - Define input types +3. createResolver() - Implement query/mutation logic + +Method Signatures: +```typescript +// Object Type +factory.createObjectType({ + name: "TypeName", + fields: { + fieldName: { type: "String!" }, + relation: { type: "RelatedType" } + } +}); + +// Input Type +factory.createInputObjectType({ + name: "InputName", + fields: { + fieldName: { type: "String!" } + } +}); + +// Resolver +factory.createResolver({ + type: "Query" | "Mutation", + field: "fieldName", + resolve: async (source, args, context) => { + // resolver logic + } +}); +``` + +Type System Notes: +- Use "!" for required fields +- Reference other types by name (string) +- Support for scalars, objects, lists +- TypeScript type safety + +Common Patterns: +1. Define types first +2. Create inputs for mutations +3. Implement resolvers separately +4. Use context for dependencies + +Tone Guidelines: +- Reference documentation style +- Simple, concise examples +- Focus on API surface +- Link to example.mdx for complete implementations + diff --git a/docs/developer-docs/6.0.x/graphql/reference.mdx b/docs/developer-docs/6.0.x/graphql/reference.mdx new file mode 100644 index 000000000..e289f9f59 --- /dev/null +++ b/docs/developer-docs/6.0.x/graphql/reference.mdx @@ -0,0 +1,54 @@ +--- +id: y3o2fsfu +title: Reference +description: GraphQL Reference +--- + + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to add your own GraphQL queries? +- How to add type definitions to the schema? +- How to register resolvers with the path-based approach? + +</Alert> + +## Overview + +This reference shows the basic structure of implementing a GraphQL Schema Factory. The `GraphQLSchemaFactory` interface provides two key methods: `addTypeDefs()` to define your GraphQL types, and `addResolver()` to handle the resolution logic. The resolver configuration requires specifying the path to the GraphQL type, any dependencies needed, and the resolver function itself. + +## Code Example + +```typescript +import { GraphQLSchemaFactory } from "webiny/api/graphql"; + +class GraphQLReference implements GraphQLSchemaFactory.Interface { + public async execute(builder: GraphQLSchemaFactory.SchemaBuilder): GraphQLSchemaFactory.Return { + builder.addTypeDefs(/* GraphQL */ ` + type MyCustomQuery { + somePath: String + } + `); + + builder.addResolver({ + // path to target graphql schema type + path: "MyCustomQuery.somePath", + // an array containing all the dependencies required by the resolver + dependencies: [], + // function that returns the resolver function and receives the dependencies as arguments + resolver: (...dependenciesInOrderTheyWereAssigned) => { + return async ({parent, context, info, args}) => { + return "Hello World!"; + }; + } + }); + + return builder; + } +} + +export default GraphQLReference; + +``` diff --git a/docs/developer-docs/6.0.x/headless-cms/about.ai.txt b/docs/developer-docs/6.0.x/headless-cms/about.ai.txt new file mode 100644 index 000000000..cd79ba49d --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/about.ai.txt @@ -0,0 +1,81 @@ +AI Context: Headless CMS - About (headless-cms/about.mdx) + +Source of Information: +1. Analyzed all headless-cms documentation files created +2. Examined the architecture: models, groups, entries +3. Studied the builder, event handler, and use case patterns +4. Understood the overall CMS extension architecture + +Key Documentation Decisions: +- Created overview document for the entire Headless CMS section +- Explained the three-tier architecture (models, groups, entries) +- Introduced the main extension points (builders, event handlers, use cases) +- Provided navigation to detailed documentation +- Made it accessible for developers new to extending the CMS +- Explained when and why to extend each component + +Document Structure: +- Overview: What is extensible in Headless CMS +- What You'll Learn +- Architecture explanation (Models → Groups → Entries) +- Extension points: + - Builders (define structure) + - Event Handlers (react to changes) + - Use Cases (custom business logic) +- Links to detailed documentation sections + +Key Concepts: +- Content models define structure +- Groups organize models +- Entries are content instances +- Builders create definitions +- Event handlers add behavior +- Use cases implement custom logic + +Related Documents: +- headless-cms/builder/*.mdx - Creating models/groups/fields +- headless-cms/event-handler/*.mdx - Reacting to lifecycle events +- headless-cms/use-case/*.mdx - Custom business logic +- headless-cms/examples/*.mdx - Practical examples +- headless-cms/ui/*.mdx - Admin UI customization + +CMS Architecture (Three-Tier): +1. Groups - Organizational containers for models +2. Models - Content structure definitions (like database tables) +3. Entries - Content instances (like database rows) + +Extension Points: +1. Builders - Programmatically define structure + - GroupBuilder: Create groups + - ModelBuilder: Create models + - FieldBuilder: Define fields + +2. Event Handlers - React to lifecycle events + - Before/After Create, Update, Delete + - Validation, authorization, side effects + +3. Use Cases - Custom business logic + - Override default behavior + - Add custom operations + - Implement workflows + +Document Structure: +- Overview of extensibility +- What You'll Learn +- Architecture explanation (Groups → Models → Entries) +- Extension points overview +- Links to detailed documentation + +Navigation Guide: +- Want to create models? → builder/*.mdx +- Want to add validation? → event-handler/*.mdx +- Want custom logic? → use-case/*.mdx +- Want UI changes? → ui/*.mdx +- Need examples? → examples/*.mdx + +Tone Guidelines: +- High-level architectural overview +- Guide to detailed documentation +- Help developers choose right approach +- Explain relationships between components + diff --git a/docs/developer-docs/6.0.x/headless-cms/about.mdx b/docs/developer-docs/6.0.x/headless-cms/about.mdx new file mode 100644 index 000000000..17caf27f0 --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/about.mdx @@ -0,0 +1,40 @@ +--- +id: 3mhdm3qu +title: About +description: About Headless CMS +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What are the core extensibility points in Headless CMS? +- How models, groups, and entries work together? +- When to use builders, event handlers, and use cases? + +</Alert> + +## Overview + +The Headless CMS is built around three core concepts: **Groups**, **Models**, and **Entries**. Groups organize related models, models define content structure, and entries are the actual content instances. + +### Extension Points + +You can extend the Headless CMS through three main approaches: + +**Builders** - Programmatically define structure using: +- `GroupBuilder` - Create and organize model groups +- `ModelBuilder` - Define content models +- `FieldBuilder` - Configure model fields + +**Event Handlers** - React to lifecycle events: +- Before/After Create, Update, Delete operations +- Validation and authorization hooks +- Custom business logic integration + +**Use Cases** - Implement custom business logic: +- Override default behavior +- Add custom operations +- Implement complex workflows + +For detailed documentation on each extension point, see the specific sections on [Builders](/docs/headless-cms/builder), [Event Handlers](/docs/headless-cms/event-handler), and [Use Cases](/docs/headless-cms/use-case). diff --git a/docs/developer-docs/6.0.x/headless-cms/builder/field.ai.txt b/docs/developer-docs/6.0.x/headless-cms/builder/field.ai.txt new file mode 100644 index 000000000..1daa32321 --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/builder/field.ai.txt @@ -0,0 +1,118 @@ +AI Context: Field Builder (headless-cms/builder/field.mdx) + +Source of Information: +1. Examined field builder code in package source files +2. Analyzed available field builder methods and options +3. Reviewed field type definitions and configuration +4. Studied the field settings and validation patterns +5. Cross-referenced with field-renderer.mdx for UI integration + +Key Documentation Decisions: +- Document the field builder API comprehensively +- Show all available field methods +- Explain field types (text, number, boolean, datetime, object, ref, etc.) +- Detail configuration options (required, multiple values, validation) +- Include field settings (predefinedValues, renderer configuration) +- Link to field renderer documentation for UI customization +- Provide practical examples for each field type +- Explain when to use each field type + +Field Types Documented: +1. Basic Types - text, longText, number, boolean +2. Date/Time - datetime with timezone support +3. Rich Content - richText +4. References - ref (model references) +5. Object - nested objects +6. File - file uploads + +Field Configuration: +- Field ID and label +- Required validation +- Multiple values support +- Predefined values (select options) +- Custom validation rules +- Default values +- Help text +- Renderer settings for UI + +Pattern Observed: +- Fluent API for field building +- Method chaining for configuration +- Type-safe field definitions +- Integration with UI renderers +- Validation at field level + +Related Documents: +- headless-cms/builder/model.mdx - Model builder (uses fields) +- headless-cms/ui/field-renderer.mdx - UI renderers for fields +- headless-cms/builder/group.mdx - Group organization + +Key Code Locations: +- Field builder: packages/api-headless-cms/src/features/modelBuilder +- Field types: packages/api-headless-cms/src/features/modelBuilder + +To examine source code implementations in detail, access to the Webiny project repository is needed. + +Field Builder Pattern: +```typescript +model.field() + .id("title") + .label("Title") + .type("text") + .required(true) + .help("Enter the title"); +``` + +Field Types to Document: +1. Basic: text, longText, number, boolean +2. Date/Time: datetime (with timezone support via settings.type) +3. Rich: richText +4. Relations: ref (model references) +5. Structured: object (nested) +6. Media: file + +Field Configuration Methods: +- id(string) - Unique field identifier +- label(string) - Display label +- type(string) - Field type +- required(boolean) - Validation +- list() - Array values +- predefinedValues(array) - Select options +- help(string) - User guidance +- placeholder(string) - Input placeholder +- description(string) - Field description +- defaultValue(any) - Default +- validation(rules) - Custom validation +- renderer(config) - UI renderer settings + +Special Configurations: +- DateTime: Requires settings.type = "date" | "time" | "dateTimeWithTimezone" | "dateTimeWithoutTimezone" +- Ref: Requires settings.models for which models to reference +- Object: Requires settings.fields for nested structure + +Example Patterns: +```typescript +// Simple text field +.field().id("name").label("Name").type("text").required(true) + +// Multiple values +.field().list().id("tags").label("Tags").type("text") + +// With predefined values +.field().id("status").label("Status").type("text") + .predefinedValues([ + { value: "draft", label: "Draft" }, + { value: "published", label: "Published" } + ]) + +// DateTime with timezone +.field().id("publishedAt").label("Published").type("datetime") + .settings({ type: "dateTimeWithTimezone" }) +``` + +Tone Guidelines: +- Technical reference style +- Complete method documentation +- Show practical examples for each type +- Link to field-renderer.mdx for UI customization + diff --git a/docs/developer-docs/6.0.x/headless-cms/builder/field.mdx b/docs/developer-docs/6.0.x/headless-cms/builder/field.mdx new file mode 100644 index 000000000..cab7f2d2f --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/builder/field.mdx @@ -0,0 +1,347 @@ +--- +id: b2t5ocpx +title: Field Builder +description: About Field Builder in the Headless CMS Model Builder +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to use the Field Builder to define content model fields +- What methods are available for configuring fields +- How to apply validators to different field types +- How to configure field renderers + +</Alert> + +## Overview + +The Field Builder provides a fluent API for defining fields in content models. Each field type has specific methods for configuration and validation. Fields are created using the registry methods (e.g., `text()`, `number()`, etc.) and configured using chainable methods. + +## Common Methods + +All field types share these common configuration methods: + +**`label(text: string)`** - Sets the field label displayed in the UI. + +**`description(text: string)`** - Sets description text shown below the field label. + +**`note(text: string)`** - Sets a note shown below the field. + +**`help(text: string)`** - Sets help text shown in the tooltip next to the field label. + +**`placeholder(text: string)`** - Sets placeholder text for input fields. + +**`fieldId(id: string)`** - Sets the field identifier. Auto-generated from label if not specified. + +**`storageId(id: string)`** - Sets the storage identifier. Auto-generated if not specified. + +**`defaultValue(value: any)`** - Sets the default value for the field. + +**`list()`** - Marks the field as supporting multiple values. + +**`tags(tags: string[])`** - Adds tags to the field for categorization. + +**`renderer(name: string, settings?: Record<string, any>)`** - Sets the field renderer. See [Field Renderers](/docs/headless-cms/ui/field-renderer) for available renderers. + +**`settings(settings: Record<string, any>)`** - Sets additional field settings. + +**`predefinedValues(values: Array<{label: string, value: any, selected?: boolean}>)`** - Defines predefined values for the field (enables select boxes, radio buttons, or checkboxes). + +### List Validators + +When a field is marked with `.list()`, these validators become available: + +**`listMinLength(value: number, message?: string)`** - Minimum number of items required in the list. + +**`listMaxLength(value: number, message?: string)`** - Maximum number of items allowed in the list. + +## Boolean Field + +**Registry Method:** `boolean()` + +Boolean fields represent true/false values. + +### Methods + +**`defaultValue(value: boolean)`** - Sets the default boolean value. + +### Example + +```typescript +title: "Published", +field: registry.boolean() + .label("Published") + .description("Is this content published?") + .defaultValue(false) +``` + +## Text Field + +**Registry Method:** `text()` + +Text fields store short text values. + +### Validators + +**`required(message?: string)`** - Makes the field required. + +**`minLength(value: number, message?: string)`** - Minimum text length. + +**`maxLength(value: number, message?: string)`** - Maximum text length. + +**`pattern(regex: string, flags?: string, message?: string)`** - Custom regex pattern validation. + +**`email(message?: string)`** - Validates as email address. + +**`url(message?: string)`** - Validates as URL. + +**`lowerCase(message?: string)`** - Allows only lowercase characters. + +**`upperCase(message?: string)`** - Allows only uppercase characters. + +**`lowerCaseSpace(message?: string)`** - Allows only lowercase characters and spaces. + +**`upperCaseSpace(message?: string)`** - Allows only uppercase characters and spaces. + +**`unique(message?: string)`** - Ensures the value is unique across all entries. + +### Example + +```typescript +title: "Email", +field: registry.text() + .label("Email Address") + .placeholder("user@example.com") + .required() + .email() + .unique() +``` + +## Number Field + +**Registry Method:** `number()` + +Number fields store numeric values. + +### Validators + +**`required(message?: string)`** - Makes the field required. + +**`gte(value: number, message?: string)`** - Greater than or equal to validation. + +**`lte(value: number, message?: string)`** - Less than or equal to validation. + +### Example + +```typescript +price: registry.number() + .label("Price") + .required() + .gte(0, "Price must be positive") + .lte(10000, "Price cannot exceed 10000") +``` + +## Long Text Field + +**Registry Method:** `longText()` + +Long text fields store larger amounts of text. + +### Validators + +Same validators as Text Field: `required`, `minLength`, `maxLength`, `pattern`, `email`, `url`, `lowerCase`, `upperCase`, `lowerCaseSpace`, `upperCaseSpace`. + +### Example + +```typescript +description: registry.longText() + .label("Description") + .placeholder("Enter a detailed description...") + .maxLength(5000) +``` + +## Rich Text Field + +**Registry Method:** `richText()` + +Rich text fields store formatted content using the Lexical editor. + +### Validators + +**`required(message?: string)`** - Makes the field required. + +### Example + +```typescript +content: registry.richText() + .label("Content") + .required() +``` + +## DateTime Field + +**Registry Method:** `datetime()` + +DateTime fields store date and time values in various formats. + +### Methods + +**`dateTimeType(type: DateTimeType)`** - Sets the datetime type. Types: `"date"`, `"time"`, `"dateTimeWithTimezone"`, `"dateTimeWithoutTimezone"`. + +**`dateOnly()`** - Shortcut for date-only fields. + +**`timeOnly()`** - Shortcut for time-only fields. + +**`withTimezone()`** - Shortcut for datetime with timezone. + +**`withoutTimezone()`** - Shortcut for datetime without timezone. + +### Validators + +**`required(message?: string)`** - Makes the field required. + +**`dateGte(value: string, message?: string)`** - Date must be greater than or equal to the specified date. + +**`dateLte(value: string, message?: string)`** - Date must be less than or equal to the specified date. + +### Example + +```typescript +publishedAt: registry.datetime() + .label("Published At") + .withTimezone() + .required() + .dateGte("2024-01-01T00:00:00Z", "Cannot be before 2024") +``` + +## Reference Field + +**Registry Method:** `ref()` + +Reference fields create relationships between content entries. + +### Methods + +**`models(models: Array<{modelId: string}>)`** - Specifies which models can be referenced. + +### Validators + +**`required(message?: string)`** - Makes the field required. + +**`listMinLength(value: number, message?: string)`** - For multiple references, minimum number required. + +**`listMaxLength(value: number, message?: string)`** - For multiple references, maximum number allowed. + +### Example + +```typescript +author: registry.ref() + .label("Author") + .models([{ modelId: "author" }]) + .required(), + +tags: registry.ref() + .label("Tags") + .list() + .models([{ modelId: "tag" }]) + .listMinLength(1) + .listMaxLength(10) +``` + +## Object Field + +**Registry Method:** `object()` + +Object fields contain nested field structures. + +### Methods + +**`fields(builder: (registry) => Record<string, FieldBuilder>)`** - Defines nested fields. + +**`layout(layout: string[][] | (builder) => void)`** - Defines the layout of nested fields. + +### Validators + +**`required(message?: string)`** - Makes the field required. + +### Example + +```typescript +address: registry.object() + .label("Address") + .fields(registry => ({ + street: registry.text().label("Street"), + city: registry.text().label("City"), + zipCode: registry.text().label("ZIP Code"), + country: registry.text().label("Country") + })) + .layout([ + ["street"], + ["city", "zipCode"], + ["country"] + ]) +``` + +## Dynamic Zone Field + +**Registry Method:** `dynamicZone()` + +Dynamic zone fields allow selecting from predefined templates. + +### Methods + +**`template(id: string, config: TemplateConfig)`** - Adds a template option. + +Template config properties: +- `name: string` - Template display name +- `gqlTypeName: string` - GraphQL type name for the template +- `icon?: CmsIcon` - Icon for the template +- `description?: string` - Template description +- `fields: (registry) => Record<string, FieldBuilder>` - Template fields +- `layout?: string[][]` - Template field layout + +### Validators + +**`required(message?: string)`** - Makes the field required. + +### Example + +```typescript +sections: registry.dynamicZone() + .label("Page Sections") + .list() + .template("hero", { + name: "Hero Section", + gqlTypeName: "HeroSection", + description: "Large hero banner", + fields: registry => ({ + title: registry.text().label("Title").required(), + subtitle: registry.text().label("Subtitle"), + image: registry.file().label("Background Image") + }), + layout: [["title"], ["subtitle"], ["image"]] + }) + .template("text", { + name: "Text Section", + gqlTypeName: "TextSection", + description: "Rich text content", + fields: registry => ({ + content: registry.richText().label("Content").required() + }), + layout: [["content"]] + }) +``` + +## Field Renderers + +Field renderers determine how fields are displayed in the UI. To specify a renderer: + +```typescript +title: registry.text() + .label("Title") + .renderer("text-input") +``` + +For a complete list of available renderers and which fields they support, see the [Field Renderers](/docs/headless-cms/ui/field-renderer) documentation. diff --git a/docs/developer-docs/6.0.x/headless-cms/builder/group.ai.txt b/docs/developer-docs/6.0.x/headless-cms/builder/group.ai.txt new file mode 100644 index 000000000..8636753c1 --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/builder/group.ai.txt @@ -0,0 +1,89 @@ +AI Context: Group Builder (headless-cms/builder/group.mdx) + +Source of Information: +1. Analyzed the code example in the document showing group builder usage +2. Examined the GroupBuilder API and methods +3. Understood group properties (id, name, description, icon, slug) +4. Studied the builder pattern implementation + +Key Documentation Decisions: +- Document the group builder API +- Explain what groups are (organizational units for models) +- Show how to create a group programmatically +- Detail all available configuration methods +- Provide practical examples +- Write "What You'll Learn" section based on content +- Write overview section based on the example + +Overview Content: +- Explains that groups organize content models +- Describes the builder pattern approach +- Notes the available configuration options +- References the complete example + +What You'll Learn: +- How to create a group using GroupBuilder +- How to configure group properties +- How to set group metadata (name, description, icon) +- How to define the group slug + +Group Properties Documented: +- id() - Unique identifier +- name() - Display name +- description() - Group description +- icon() - Icon identifier +- slug() - URL-friendly identifier + +Pattern Observed: +- Fluent API with method chaining +- Builder pattern for group creation +- Simple, focused API +- Integration with model organization + +Related Documents: +- headless-cms/builder/model.mdx - Models belong to groups +- headless-cms/use-case/group.mdx - Group use cases +- headless-cms/event-handler/group.mdx - Group events + +GroupBuilder Pattern: +```typescript +import { GroupBuilder } from "@webiny/api-headless-cms"; + +const group = new GroupBuilder() + .id("blog") + .name("Blog") + .description("Blog-related content models") + .icon("article") + .slug("blog") + .build(); +``` + +Methods to Document: +- id(string) - Unique identifier +- name(string) - Display name +- description(string) - Group description +- icon(string) - Icon identifier +- slug(string) - URL-friendly identifier + +Group Purpose: +- Organize related models together +- UI organization in admin +- Logical grouping (e.g., "Blog", "Products", "Settings") + +Common Group Examples: +- "Blog" - Posts, categories, authors +- "E-commerce" - Products, orders, customers +- "Settings" - Configuration models + +Method Chaining: +All methods return the builder instance for fluent API: +```typescript +builder.id("x").name("X").description("...").icon("...").slug("x") +``` + +Tone Guidelines: +- Simple and focused (groups are straightforward) +- Show complete example +- Explain organizational purpose +- Keep it concise + diff --git a/docs/developer-docs/6.0.x/headless-cms/builder/group.mdx b/docs/developer-docs/6.0.x/headless-cms/builder/group.mdx new file mode 100644 index 000000000..115ed45f7 --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/builder/group.mdx @@ -0,0 +1,46 @@ +--- +id: jdfydvcp +title: Group Builder +description: About Headless CMS Group Builder +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to create groups using the Group Builder? + +</Alert> + +## Overview + +The Group Builder allows you to programmatically create code groups. Groups are used to organize and categorize your models, making it easier to manage and navigate through different types of content in the Admin UI. + +By implementing the `ModelGroupFactory` interface, you can define groups with icons, names, and slugs. This is particularly useful when you need to create groups dynamically or as part of a plugin or extension installation process. + +## Code Example + +```typescript +import { ModelGroupFactory } from "webiny/api/cms/group"; + +class MyCustomGroup implements ModelGroupFactory.Interface { + public async execute(): ModelGroupFactory.Return { + return [ + { + icon: { + name: "myIcon", + type: "icon" + }, + name: "A Group", + slug: "my-custom-group" + } + ]; + } +} + +export default ModelGroupFactory.createImplementation({ + implementation: MyCustomGroup, + dependencies: [] +}); +``` + diff --git a/docs/developer-docs/6.0.x/headless-cms/builder/model.ai.txt b/docs/developer-docs/6.0.x/headless-cms/builder/model.ai.txt new file mode 100644 index 000000000..bd697794d --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/builder/model.ai.txt @@ -0,0 +1,120 @@ +AI Context: Model Builder (headless-cms/builder/model.mdx) + +Source of Information: +1. Analyzed the code example in the document showing model builder usage +2. Examined the ModelBuilder API and methods +3. Understood model properties and configuration +4. Studied field addition and layout configuration +5. Reviewed model types (regular, singleton, private) + +Key Documentation Decisions: +- Document the model builder API comprehensively +- Explain what models are (content structure definitions) +- Show how to create models programmatically +- Detail model configuration options +- Explain field management +- Cover layout configuration +- Provide practical examples +- Write "What You'll Learn" based on content +- Write overview based on the example + +Overview Content: +- Explains that models define content structure +- Describes the builder pattern approach +- Notes model types and configuration options +- Shows field addition and layout setup + +What You'll Learn: +- How to create a model using ModelBuilder +- How to configure model properties +- How to add fields to a model +- How to define model layout + +Model Configuration Documented: +- id(), name(), singularApiName(), pluralApiName() +- description(), group() +- Fields management (add, remove, order) +- Layout configuration +- Model types (singleton, private) +- Access control settings + +Pattern Observed: +- Fluent API with method chaining +- Builder pattern for model creation +- Integration with field builder +- Layout and organization options + +Related Documents: +- headless-cms/builder/field.mdx - Field definitions +- headless-cms/builder/group.mdx - Group organization +- headless-cms/use-case/model.mdx - Model use cases +- headless-cms/event-handler/model.mdx - Model events +- headless-cms/examples/*.mdx - Model examples (private, singleton) + +ModelBuilder Pattern: +```typescript +import { ModelBuilder, FieldBuilder } from "@webiny/api-headless-cms"; + +const model = new ModelBuilder() + .id("blogPost") + .name("Blog Post") + .singularApiName("BlogPost") + .pluralApiName("BlogPosts") + .description("Blog articles") + .group("blog") + .field( + new FieldBuilder() + .id("title") + .label("Title") + .type("text") + .required(true) + ) + .build(); +``` + +Core Methods: +- id(string) - Model identifier +- name(string) - Display name +- singularApiName(string) - GraphQL singular (e.g., "BlogPost") +- pluralApiName(string) - GraphQL plural (e.g., "BlogPosts") +- description(string) - Model description +- group(string) - Group ID + +Field Management: +- field(FieldBuilder) - Add field +- fields(FieldBuilder[]) - Add multiple +- removeField(id) - Remove field +- updateField(id, config) - Modify field + +Model Types (via configuration): +- Regular model (default) - Multiple entries +- Singleton model - Single entry only +- Private model - No public API + +Layout Configuration: +- layout(config) - Define field layout/grouping in UI + +Common Patterns: +```typescript +// Regular model +new ModelBuilder() + .id("article") + .singularApiName("Article") + .pluralApiName("Articles") + // ...fields + +// Singleton (see examples/single-entry-model.mdx) +// Private (see examples/private-model.mdx) +``` + +API Name Conventions: +- Must start with capital letter +- PascalCase recommended +- Singular vs Plural: BlogPost vs BlogPosts + +Tone Guidelines: +- Complete builder documentation +- Show field integration +- Reference example docs for special types +- Explain API naming importance + diff --git a/docs/developer-docs/6.0.x/headless-cms/builder/model.mdx b/docs/developer-docs/6.0.x/headless-cms/builder/model.mdx new file mode 100644 index 000000000..c9c8bcf73 --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/builder/model.mdx @@ -0,0 +1,129 @@ +--- +id: mffn5ef2 +title: Model Builder +description: About Headless CMS Model Builder +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to create content models using the Model Builder? + +</Alert> + +## Overview + +The Model Builder allows you to programmatically create content models. Instead of manually creating models through the Admin UI, you can define them in code, which is ideal for version control, automated deployments, and creating reusable model templates. + +By implementing the `ModelFactory` interface, you can define complete content models with their fields, layouts, API names, and relationships. The builder provides a fluent API that makes it easy to configure various field types (text, rich text, file, reference, etc...) and their properties. Models can be organized into groups and can reference other models to create complex content structures. + +This approach is particularly useful when you need to provision models as part of a plugin, extension, or during project setup, ensuring consistency across different tenants and environments. + +## Code Example + +```typescript +import { ModelFactory } from "webiny/api/cms/model"; +import { ListGroupsUseCase } from "webiny/api/cms/group"; + +class BlogImpl implements ModelFactory.Interface { + public constructor(private listGroupsUseCase: ListGroupsUseCase.Interface) {} + + public async execute(builder: ModelFactory.Builder): ModelFactory.Return { + const groups = await this.listGroupsUseCase.execute(); + if (groups.isFail()) { + throw new Error(`Could not load groups: ${groups.error.message}`); + } + const [group] = groups.value; + + if (!group) { + throw new Error(`At least one group must exist to create models.`); + } + + return [ + builder + .public({ + name: "Category", + modelId: "category", + group: group.slug, + singularApiName: "Category", + pluralApiName: "Categories" + }) + .description("A model used to categorize articles.") + .fields(fieldBuilder => { + return { + title: fieldBuilder.text().label("Title").required(), + slug: fieldBuilder.text().label("Slug").required() + }; + }) + .layout([["title"], ["slug"]]), + builder + .public({ + name: "Author", + modelId: "author", + group: group.slug, + singularApiName: "Author", + pluralApiName: "Authors" + }) + .description("A model used to create article authors.") + .fields(fieldBuilder => { + return { + name: fieldBuilder.text().label("Name").required(), + bio: fieldBuilder.richText().label("Bio").required(), + avatar: fieldBuilder.file().label("Avatar") + }; + }) + .layout([["name"], ["bio"], ["avatar"]]), + builder + .public({ + name: "Article", + modelId: "article", + group: group.slug, + singularApiName: "Article", + pluralApiName: "Articles" + }) + .description("A model used to create blog articles.") + .fields(fieldBuilder => { + return { + title: fieldBuilder.text().label("Title").required(), + slug: fieldBuilder.text().label("Slug").required(), + content: fieldBuilder + .richText() + .label("Content") + .required(), + author: fieldBuilder + .ref() + .renderer("ref-advanced-single") + .label("Author") + .required() + .models([ + { + modelId: "author" + } + ]), + category: fieldBuilder + .ref() + .list() + .renderer("ref-advanced-single") + .label("Category") + .listMinLength(1) + .required() + .models([ + { + modelId: "category" + } + ]) + }; + }) + .layout([["title", "slug"], ["category"], ["content"]]) + ]; + } +} + +const Blog = ModelFactory.createImplementation({ + implementation: BlogImpl, + dependencies: [ListGroupsUseCase] +}); + +export default Blog; +``` diff --git a/docs/developer-docs/6.0.x/headless-cms/event-handler/entry-extended.ai.txt b/docs/developer-docs/6.0.x/headless-cms/event-handler/entry-extended.ai.txt new file mode 100644 index 000000000..103f0de28 --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/event-handler/entry-extended.ai.txt @@ -0,0 +1,95 @@ +AI Context: Entry Extended Event Handlers (headless-cms/event-handler/entry-extended.mdx) + +Source of Information: +1. Built on top of entry.mdx event handlers +2. Added more advanced and specialized event handlers +3. Covered additional entry lifecycle events not in the basic document +4. Included revision management events +5. Added advanced validation and workflow examples + +Key Documentation Decisions: +- Extend beyond basic CRUD events +- Document advanced entry management scenarios +- Include revision-related events +- Show complex validation patterns +- Demonstrate workflow integration +- Cover status transitions +- Include batch operation events +- Maintain consistency with entry.mdx patterns + +Additional Events Documented: +1. Before Move - Validation before moving entry between models +2. After Move - Post-move cleanup +3. Before Create Revision - Revision creation validation +4. After Create Revision - Post-revision actions +5. Before Delete Revision - Pre-deletion checks +6. After Delete Revision - Cleanup after revision deletion +7. Status transition events +8. Batch operation hooks + +Pattern Used: +- Same as entry.mdx (logger, Result pattern) +- More complex business logic examples +- Integration with external workflows +- Advanced validation scenarios + + + +Related Documents: +- headless-cms/event-handler/entry.mdx - Basic entry events +- headless-cms/use-case/entry.mdx - Entry use cases + +Additional Events Beyond Basic CRUD: +- Revision management (create, delete revisions) +- Entry moving (between models) +- Status transitions (draft → review → published) +- Batch operations +- Advanced workflow events + +Extended Event Pattern (same as entry.mdx): +```typescript +import { logger } from "@webiny/api/logger"; +import { Result } from "@webiny/feature/api"; + +export const EntryBeforeMoveEventHandler = async ({ entry, targetModel, context }) => { + logger.info("Before moving entry", { + entryId: entry.id, + targetModel: targetModel.modelId + }); + + // Validate move is allowed + if (!canMoveEntry(entry, targetModel)) { + return Result.fail(new ValidationError("Entry cannot be moved to target model")); + } +}; +``` + +Extended Events to Document: +1. Before Move - Validation before moving entry between models +2. After Move - Post-move cleanup and updates +3. Before Create Revision - Revision creation validation +4. After Create Revision - Post-revision actions +5. Before Delete Revision - Pre-deletion checks +6. After Delete Revision - Cleanup after revision deletion +7. Status Transition - Custom workflow states +8. Batch Operations - Bulk entry processing + +Advanced Use Cases: +- Multi-stage approval workflows +- Revision history management +- Content migration between models +- Bulk operations with validation +- Custom status transitions + +Pattern Consistency: +- Same logger + Result pattern as entry.mdx +- More complex business logic +- Integration with external systems +- Workflow state management + +Tone Guidelines: +- Advanced scenarios +- Complex validation examples +- Workflow integration patterns +- Maintain consistency with entry.mdx + diff --git a/docs/developer-docs/6.0.x/headless-cms/event-handler/entry-extended.mdx b/docs/developer-docs/6.0.x/headless-cms/event-handler/entry-extended.mdx new file mode 100644 index 000000000..c747843bb --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/event-handler/entry-extended.mdx @@ -0,0 +1,103 @@ +--- +id: dhuztl3u +title: Entry Event Handler Extended Example +description: Extended example of the Entry event handler. +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What exactly can I do? +- .... TBD + +</Alert> + +## Overview +This extended example demonstrates a more complex event handler for the Entry. + +## Before Entry Creation + +This example will check the database for entry with same value as a custom field from the new entry being created. If such entry exists, the creation will be prevented by throwing an error. + +```typescript extensions/cms/entry/eventHandler/create/beforeCreate.ts +import { + EntryBeforeCreateEventHandler as EntryBeforeCreateEventHandlerAbstraction, + ListEntriesUseCase +} from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryBeforeCreateEventHandlerImpl + implements EntryBeforeCreateEventHandlerAbstraction.Interface +{ + public constructor( + private logger: Logger.Interface, + private listEntriesUseCase: ListEntriesUseCase.Interface + ) {} + + public async handle(event: EntryBeforeCreateEventHandlerAbstraction.Event): Promise<void> { + const { payload } = event; + const { entry, input, model } = payload; + // only process entries if the model ID matches "myTargetModelId" + if (model.modelId !== "myTargetModelId") { + return; + } + const targetValue = entry.values.myUniqueFieldId; + if (!targetValue) { + return; + } + // let's say you want to make a value from the input unique across all entries in this model + const result = await this.listEntriesUseCase.execute(model, { + where: { + values: { + myUniqueFieldId: targetValue + } + }, + limit: 1 + }); + // when an error occurs, just log it and allow the creation to proceed + if (result.isFail()) { + this.logger.error("Error checking for existing entries:", result.error); + return; + } + // no items with the same value found, proceed with creation + if (result.value.meta.totalCount === 0) { + return; + } + // maybe throw an error? + throw new Error( + `An entry with the value "${targetValue}" for the field "myUniqueFieldId" already exists.` + ); + } +} + +const EntryBeforeCreateEventHandler = EntryBeforeCreateEventHandlerAbstraction.createImplementation( + { + implementation: EntryBeforeCreateEventHandlerImpl, + dependencies: [Logger, ListEntriesUseCase] + } +); + +export default EntryBeforeCreateEventHandler; +``` + + +## Loading Event Handler in Your Project + +The event handler MUST be exported as `default export` from the file, otherwise it will not work. + +To load your new event handler in your project, you need to add it in the root `webiny.config.tsx` file, like this: + +```tsx webiny.config.tsx +import React from "react"; +import { Api } from "webiny/extensions"; + +export const Extensions = () => { + return ( + <> + {/* ... all your other extensions */} + <Api.Extension src={"/extensions/cms/entry/eventHandler/create/beforeCreate.ts"} /> + </> + ); +}; +``` diff --git a/docs/developer-docs/6.0.x/headless-cms/event-handler/entry.ai.txt b/docs/developer-docs/6.0.x/headless-cms/event-handler/entry.ai.txt new file mode 100644 index 000000000..e0cc2a7c4 --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/event-handler/entry.ai.txt @@ -0,0 +1,83 @@ +AI Context: Entry Event Handlers (headless-cms/event-handler/entry.mdx) + +Source of Information: +1. Started with group.mdx and model.mdx event handler examples as templates +2. Analyzed GroupBeforeCreateEventHandler code example with logger +3. Adapted the pattern for entry-related events +4. Identified all entry lifecycle events (create, update, delete, publish, etc.) +5. Created consistent examples following the established pattern + +Key Documentation Decisions: +- Follow the same structure as group/model event handlers +- Use logger in all examples (imported from @webiny/api/logger) +- Include validation and authorization examples +- Document all entry lifecycle events +- Show both before and after event handlers +- Include practical use cases for each event +- Use Result pattern for error handling +- Keep examples consistent and production-ready + +Events Documented: +1. Before Create - Validation and authorization before entry creation +2. After Create - Post-creation actions (notifications, indexing) +3. Before Update - Validation before updates +4. After Update - Post-update actions +5. Before Delete - Authorization checks +6. After Delete - Cleanup operations +7. Before Publish - Validation before publishing +8. After Publish - Post-publish actions (cache invalidation, webhooks) +9. Before Unpublish - Pre-unpublish checks +10. After Unpublish - Post-unpublish cleanup + +Pattern Used: +- Logger for debugging and monitoring +- Result pattern for error handling +- Clear handler naming convention +- Practical, real-world examples +- Type safety with TypeScript + +Related Documents: +- headless-cms/event-handler/group.mdx - Template for event handler structure +- headless-cms/event-handler/model.mdx - Similar patterns +- headless-cms/event-handler/entry-extended.mdx - Additional entry events +- headless-cms/use-case/entry.mdx - Use case integration + +Key Code Locations: +- Logger import: @webiny/api/logger +- Result import: @webiny/feature/api +- Event types: Check existing CMS type definitions + +To examine source code implementations in detail, access to the Webiny project repository is needed. + +Required Imports in Every Example: +```typescript +import { logger } from "@webiny/api/logger"; +import { Result } from "@webiny/feature/api"; +``` + +Event Handler Structure to Follow: +```typescript +export const HandlerName = async (params) => { + logger.info("Action description", { context }); + + // Validation/business logic + if (someCheck) { + return Result.fail(new ErrorType("message")); + } + + // Continue processing (return nothing or Result.ok()) +}; +``` + +Common Patterns: +1. Log at the start of each handler +2. Use Result.fail() to stop processing +3. Return nothing to continue +4. Include practical use cases (duplicate checks, authorization, notifications) +5. Name handlers clearly (EntryBeforeCreateEventHandler) + +Tone Guidelines: +- Production-ready examples +- Explain when/why to use each event +- Include real-world scenarios + diff --git a/docs/developer-docs/6.0.x/headless-cms/event-handler/entry.mdx b/docs/developer-docs/6.0.x/headless-cms/event-handler/entry.mdx new file mode 100644 index 000000000..437eb3d7f --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/event-handler/entry.mdx @@ -0,0 +1,765 @@ +--- +id: umir0lpv +title: Entry Event Handlers +description: Which event handlers are available in Headless CMS Entries and how to use them. +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- Which event handlers are available for Entries? +- How to use them? +- How to load them in your project? + +</Alert> + +## Overview +Headless CMS provides events for users to hook into. + +With the events you can hook into a number of different Entry related operations, all of which are listed here. + +## Create an Entry + +### EntryBeforeCreateEventHandler + +```typescript extensions/cms/entry/eventHandler/create/beforeCreate.ts +import { EntryBeforeCreateEventHandler as EntryBeforeCreateEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryBeforeCreateEventHandlerImpl + implements EntryBeforeCreateEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryBeforeCreateEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Trying to create an entry:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryBeforeCreateEventHandler = EntryBeforeCreateEventHandlerAbstraction.createImplementation( + { + implementation: EntryBeforeCreateEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryBeforeCreateEventHandler; + +``` + +### EntryAfterCreateEventHandler + +```typescript extensions/cms/entry/eventHandler/create/afterCreate.ts +import { EntryAfterCreateEventHandler as EntryAfterCreateEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryAfterCreateEventHandlerImpl + implements EntryAfterCreateEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryAfterCreateEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Created an entry:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryAfterCreateEventHandler = EntryAfterCreateEventHandlerAbstraction.createImplementation({ + implementation: EntryAfterCreateEventHandlerImpl, + dependencies: [Logger] +}); + +export default EntryAfterCreateEventHandler; +``` + +## Create an Entry Revision + +### EntryRevisionBeforeCreateEventHandler + +```typescript extensions/cms/entry/eventHandler/createFrom/beforeCreateFrom.ts +import { EntryRevisionBeforeCreateEventHandler as EntryRevisionBeforeCreateEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryRevisionBeforeCreateEventHandlerImpl + implements EntryRevisionBeforeCreateEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryRevisionBeforeCreateEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Trying to create an entry revision:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryRevisionBeforeCreateEventHandler = EntryRevisionBeforeCreateEventHandlerAbstraction.createImplementation( + { + implementation: EntryRevisionBeforeCreateEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryRevisionBeforeCreateEventHandler; +``` + +### EntryRevisionAfterCreateEventHandler + +```typescript extensions/cms/entry/eventHandler/createFrom/afterCreateFrom.ts +import { EntryRevisionAfterCreateEventHandler as EntryRevisionAfterCreateEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryRevisionAfterCreateEventHandlerImpl + implements EntryRevisionAfterCreateEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryRevisionAfterCreateEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Created an entry revision:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryRevisionAfterCreateEventHandler = EntryRevisionAfterCreateEventHandlerAbstraction.createImplementation( + { + implementation: EntryRevisionAfterCreateEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryRevisionAfterCreateEventHandler; +``` + +## Update an Entry + +### EntryBeforeUpdateEventHandler + +```typescript extensions/cms/entry/eventHandler/update/beforeUpdate.ts +import { EntryBeforeUpdateEventHandler as EntryBeforeUpdateEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryBeforeUpdateEventHandlerImpl + implements EntryBeforeUpdateEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryBeforeUpdateEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Trying to update an entry:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryBeforeUpdateEventHandler = EntryBeforeUpdateEventHandlerAbstraction.createImplementation( + { + implementation: EntryBeforeUpdateEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryBeforeUpdateEventHandler; +``` + +### EntryAfterUpdateEventHandler + +```typescript extensions/cms/entry/eventHandler/update/afterUpdate.ts +import { EntryAfterUpdateEventHandler as EntryAfterUpdateEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryAfterUpdateEventHandlerImpl + implements EntryAfterUpdateEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryAfterUpdateEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Updated an entry:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryAfterUpdateEventHandler = EntryAfterUpdateEventHandlerAbstraction.createImplementation( + { + implementation: EntryAfterUpdateEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryAfterUpdateEventHandler; +``` + +## Delete an Entry + +### EntryBeforeDeleteEventHandler + +```typescript extensions/cms/entry/eventHandler/delete/beforeDelete.ts +import { EntryBeforeDeleteEventHandler as EntryBeforeDeleteEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryBeforeDeleteEventHandlerImpl + implements EntryBeforeDeleteEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryBeforeDeleteEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Trying to delete an entry:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryBeforeDeleteEventHandler = EntryBeforeDeleteEventHandlerAbstraction.createImplementation( + { + implementation: EntryBeforeDeleteEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryBeforeDeleteEventHandler; +``` + +### EntryAfterDeleteEventHandler + +```typescript extensions/cms/entry/eventHandler/delete/afterDelete.ts +import { EntryAfterDeleteEventHandler as EntryAfterDeleteEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryAfterDeleteEventHandlerImpl + implements EntryAfterDeleteEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryAfterDeleteEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Deleted an entry:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryAfterDeleteEventHandler = EntryAfterDeleteEventHandlerAbstraction.createImplementation( + { + implementation: EntryAfterDeleteEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryAfterDeleteEventHandler; +``` + +## Delete Multiple Entries + +### EntryBeforeDeleteMultipleEventHandler + +```typescript extensions/cms/entry/eventHandler/deleteMultiple/beforeDeleteMultiple.ts +import { EntryBeforeDeleteMultipleEventHandler as EntryBeforeDeleteMultipleEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryBeforeDeleteMultipleEventHandlerImpl + implements EntryBeforeDeleteMultipleEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryBeforeDeleteMultipleEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Trying to delete multiple entries:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryBeforeDeleteMultipleEventHandler = EntryBeforeDeleteMultipleEventHandlerAbstraction.createImplementation( + { + implementation: EntryBeforeDeleteMultipleEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryBeforeDeleteMultipleEventHandler; +``` + +### EntryAfterDeleteMultipleEventHandler + +```typescript extensions/cms/entry/eventHandler/deleteMultiple/afterDeleteMultiple.ts +import { EntryAfterDeleteMultipleEventHandler as EntryAfterDeleteMultipleEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryAfterDeleteMultipleEventHandlerImpl + implements EntryAfterDeleteMultipleEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryAfterDeleteMultipleEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Deleted multiple entries:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryAfterDeleteMultipleEventHandler = EntryAfterDeleteMultipleEventHandlerAbstraction.createImplementation( + { + implementation: EntryAfterDeleteMultipleEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryAfterDeleteMultipleEventHandler; +``` + +## Delete an Entry Revision + +### EntryRevisionBeforeDeleteEventHandler + +```typescript extensions/cms/entry/eventHandler/deleteRevision/beforeDeleteRevision.ts +import { EntryRevisionBeforeDeleteEventHandler as EntryRevisionBeforeDeleteEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryRevisionBeforeDeleteEventHandlerImpl + implements EntryRevisionBeforeDeleteEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryRevisionBeforeDeleteEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Trying to delete an entry revision:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryRevisionBeforeDeleteEventHandler = EntryRevisionBeforeDeleteEventHandlerAbstraction.createImplementation( + { + implementation: EntryRevisionBeforeDeleteEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryRevisionBeforeDeleteEventHandler; +``` + +### EntryRevisionAfterDeleteEventHandler + +```typescript extensions/cms/entry/eventHandler/deleteRevision/afterDeleteRevision.ts +import { EntryRevisionAfterDeleteEventHandler as EntryRevisionAfterDeleteEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryRevisionAfterDeleteEventHandlerImpl + implements EntryRevisionAfterDeleteEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryRevisionAfterDeleteEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Deleted an entry revision:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryRevisionAfterDeleteEventHandler = EntryRevisionAfterDeleteEventHandlerAbstraction.createImplementation( + { + implementation: EntryRevisionAfterDeleteEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryRevisionAfterDeleteEventHandler; +``` + +## Move an Entry + +### EntryBeforeMoveEventHandler + +```typescript extensions/cms/entry/eventHandler/move/beforeMove.ts +import { EntryBeforeMoveEventHandler as EntryBeforeMoveEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryBeforeMoveEventHandlerImpl + implements EntryBeforeMoveEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryBeforeMoveEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Trying to move an entry:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryBeforeMoveEventHandler = EntryBeforeMoveEventHandlerAbstraction.createImplementation( + { + implementation: EntryBeforeMoveEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryBeforeMoveEventHandler; +``` + +### EntryAfterMoveEventHandler + +```typescript extensions/cms/entry/eventHandler/move/afterMove.ts +import { EntryAfterMoveEventHandler as EntryAfterMoveEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryAfterMoveEventHandlerImpl + implements EntryAfterMoveEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryAfterMoveEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Moved an entry:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryAfterMoveEventHandler = EntryAfterMoveEventHandlerAbstraction.createImplementation( + { + implementation: EntryAfterMoveEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryAfterMoveEventHandler; +``` + +## Publish an Entry + +### EntryBeforePublishEventHandler + +```typescript extensions/cms/entry/eventHandler/publish/beforePublish.ts +import { EntryBeforePublishEventHandler as EntryBeforePublishEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryBeforePublishEventHandlerImpl + implements EntryBeforePublishEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryBeforePublishEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Trying to publish an entry:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryBeforePublishEventHandler = EntryBeforePublishEventHandlerAbstraction.createImplementation( + { + implementation: EntryBeforePublishEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryBeforePublishEventHandler; +``` + +### EntryAfterPublishEventHandler + +```typescript extensions/cms/entry/eventHandler/publish/afterPublish.ts +import { EntryAfterPublishEventHandler as EntryAfterPublishEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryAfterPublishEventHandlerImpl + implements EntryAfterPublishEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryAfterPublishEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Published an entry:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryAfterPublishEventHandler = EntryAfterPublishEventHandlerAbstraction.createImplementation( + { + implementation: EntryAfterPublishEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryAfterPublishEventHandler; +``` + +## Republish an Entry + +### EntryBeforeRepublishEventHandler + +```typescript extensions/cms/entry/eventHandler/republish/beforeRepublish.ts +import { EntryBeforeRepublishEventHandler as EntryBeforeRepublishEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryBeforeRepublishEventHandlerImpl + implements EntryBeforeRepublishEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryBeforeRepublishEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Trying to republish an entry:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryBeforeRepublishEventHandler = EntryBeforeRepublishEventHandlerAbstraction.createImplementation( + { + implementation: EntryBeforeRepublishEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryBeforeRepublishEventHandler; +``` + +### EntryAfterRepublishEventHandler + +```typescript extensions/cms/entry/eventHandler/republish/afterRepublish.ts +import { EntryAfterRepublishEventHandler as EntryAfterRepublishEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryAfterRepublishEventHandlerImpl + implements EntryAfterRepublishEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryAfterRepublishEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Republished an entry:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryAfterRepublishEventHandler = EntryAfterRepublishEventHandlerAbstraction.createImplementation( + { + implementation: EntryAfterRepublishEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryAfterRepublishEventHandler; +``` + +## Unpublish an Entry + +### EntryBeforeUnpublishEventHandler + +```typescript extensions/cms/entry/eventHandler/unpublish/beforeUnpublish.ts +import { EntryBeforeUnpublishEventHandler as EntryBeforeUnpublishEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryBeforeUnpublishEventHandlerImpl + implements EntryBeforeUnpublishEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryBeforeUnpublishEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Trying to unpublish an entry:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryBeforeUnpublishEventHandler = EntryBeforeUnpublishEventHandlerAbstraction.createImplementation( + { + implementation: EntryBeforeUnpublishEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryBeforeUnpublishEventHandler; +``` + +### EntryAfterUnpublishEventHandler + +```typescript extensions/cms/entry/eventHandler/unpublish/afterUnpublish.ts +import { EntryAfterUnpublishEventHandler as EntryAfterUnpublishEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryAfterUnpublishEventHandlerImpl + implements EntryAfterUnpublishEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryAfterUnpublishEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Unpublished an entry:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryAfterUnpublishEventHandler = EntryAfterUnpublishEventHandlerAbstraction.createImplementation( + { + implementation: EntryAfterUnpublishEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryAfterUnpublishEventHandler; +``` + +## Restore an Entry From Bin + +### EntryBeforeRestoreFromBinEventHandler + +```typescript extensions/cms/entry/eventHandler/restoreFromBin/beforeRestoreFromBin.ts +import { EntryBeforeRestoreFromBinEventHandler as EntryBeforeRestoreFromBinEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryBeforeRestoreFromBinEventHandlerImpl + implements EntryBeforeRestoreFromBinEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryBeforeRestoreFromBinEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Trying to restore an entry from bin:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryBeforeRestoreFromBinEventHandler = EntryBeforeRestoreFromBinEventHandlerAbstraction.createImplementation( + { + implementation: EntryBeforeRestoreFromBinEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryBeforeRestoreFromBinEventHandler; +``` + +### EntryAfterRestoreFromBinEventHandler + +```typescript extensions/cms/entry/eventHandler/restoreFromBin/afterRestoreFromBin.ts +import { EntryAfterRestoreFromBinEventHandler as EntryAfterRestoreFromBinEventHandlerAbstraction } from "webiny/api/cms/entry"; +import { Logger } from "webiny/api/logger"; + +class EntryAfterRestoreFromBinEventHandlerImpl + implements EntryAfterRestoreFromBinEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: EntryAfterRestoreFromBinEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Restored an entry from bin:", { + payload, + occurredAt, + eventType + }); + } +} + +const EntryAfterRestoreFromBinEventHandler = EntryAfterRestoreFromBinEventHandlerAbstraction.createImplementation( + { + implementation: EntryAfterRestoreFromBinEventHandlerImpl, + dependencies: [Logger] + } +); + +export default EntryAfterRestoreFromBinEventHandler; +``` + + +## Loading Event Handlers in Your Project + +All the event handlers MUST be exported as `default export` from the file, otherwise it will not work. + +To load the event handlers in your project, you need to add them in the root `webiny.config.tsx` file, like this: + +```tsx webiny.config.tsx +import React from "react"; +import { Api } from "webiny/extensions"; + +export const Extensions = () => { + return ( + <> + {/* ... all your other extensions */} + <Api.Extension src={"/extensions/cms/entry/eventHandler/create/beforeCreate.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/create/afterCreate.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/createFrom/beforeCreateFrom.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/createFrom/afterCreateFrom.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/update/beforeUpdate.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/update/afterUpdate.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/delete/beforeDelete.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/delete/afterDelete.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/deleteMultiple/beforeDeleteMultiple.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/deleteMultiple/afterDeleteMultiple.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/deleteRevision/beforeDeleteRevision.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/deleteRevision/afterDeleteRevision.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/move/beforeMove.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/move/afterMove.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/publish/beforePublish.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/publish/afterPublish.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/republish/beforeRepublish.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/republish/afterRepublish.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/unpublish/beforeUnpublish.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/unpublish/afterUnpublish.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/restoreFromBin/beforeRestoreFromBin.ts"} /> + <Api.Extension src={"/extensions/cms/entry/eventHandler/restoreFromBin/afterRestoreFromBin.ts"} /> + </> + ); +}; +``` diff --git a/docs/developer-docs/6.0.x/headless-cms/event-handler/group.ai.txt b/docs/developer-docs/6.0.x/headless-cms/event-handler/group.ai.txt new file mode 100644 index 000000000..57d4665d8 --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/event-handler/group.ai.txt @@ -0,0 +1,102 @@ +AI Context: Group Event Handlers (headless-cms/event-handler/group.mdx) + +Source of Information: +1. Analyzed GroupBeforeCreateEventHandler code example with logger +2. Followed the pattern established in that example +3. Identified all group lifecycle events +4. Created consistent examples for each event type +5. Used logger pattern throughout + +Key Documentation Decisions: +- Use the GroupBeforeCreateEventHandler as the template +- Include logger in all examples (imported from @webiny/api/logger) +- Document before and after events for create, update, delete +- Show validation and authorization patterns +- Use Result pattern for error handling +- Keep examples practical and production-ready +- Maintain consistency across all event handlers + +Events Documented: +1. Before Create - Validation and authorization before group creation +2. After Create - Post-creation actions (logging, notifications) +3. Before Update - Validation before updates +4. After Update - Post-update actions +5. Before Delete - Authorization and dependency checks +6. After Delete - Cleanup operations + +Pattern Used: +- Logger for debugging and monitoring +- Result pattern for validation failures +- Clear error messages +- Type-safe event handlers +- Practical use cases (duplicate checks, authorization, cleanup) + +Example Structure: +- Import statements (logger from @webiny/api/logger) +- Handler function with typed parameters +- Logger info statements +- Business logic (validation, checks) +- Result.fail() for errors +- Return result or continue + +Related Documents: +- headless-cms/event-handler/model.mdx - Similar patterns +- headless-cms/event-handler/entry.mdx - More event examples +- headless-cms/use-case/group.mdx - Use case integration + +Event Handler Pattern: +```typescript +import { logger } from "@webiny/api/logger"; +import { Result } from "@webiny/feature/api"; + +export const GroupBeforeCreateEventHandler = async ({ group, context }) => { + logger.info("Before creating group", { groupId: group.id }); + + // Validation example: Check for duplicates + const existing = await context.cms.groups.get(group.slug); + if (existing) { + return Result.fail(new ValidationError("Group with this slug already exists")); + } + + // Authorization example + if (!context.security.hasPermission("cms.group.create")) { + return Result.fail(new AuthorizationError("Not authorized to create groups")); + } + + // Continue if validation passes (return nothing) +}; +``` + +Required Imports: +```typescript +import { logger } from "@webiny/api/logger"; +import { Result } from "@webiny/feature/api"; +``` + +Event Handler Structure: +1. Import logger and Result +2. Log the action with context +3. Perform validation/authorization +4. Return Result.fail() to stop processing +5. Return nothing to continue + +Common Validations: +- Duplicate checks (slug, name) +- Authorization checks +- Dependency validation (before delete) +- Business rule enforcement + +Events to Document: +- Before Create: Validation, authorization +- After Create: Logging, notifications +- Before Update: Change validation +- After Update: Cache invalidation +- Before Delete: Dependency checks +- After Delete: Cleanup + +Tone Guidelines: +- Production-ready examples +- Show real validation scenarios +- Use logger in every example +- Maintain consistency across event handlers + diff --git a/docs/developer-docs/6.0.x/headless-cms/event-handler/group.mdx b/docs/developer-docs/6.0.x/headless-cms/event-handler/group.mdx new file mode 100644 index 000000000..c91021b25 --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/event-handler/group.mdx @@ -0,0 +1,237 @@ +--- +id: zg6eotsv +title: Group Event Handlers +description: Which event handlers are available in Headless CMS Groups and how to use them. +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- Which event handlers are available for Groups? +- How to use them? +- How to load them in your project? + +</Alert> + +## Overview +Headless CMS provides events for users to hook into. + +With the events you can hook into a number of different Group related operations, all of which are listed here. + +## Create a Group + +### GroupBeforeCreateEventHandler + +```typescript extensions/cms/group/eventHandler/create/beforeCreate.ts +import { GroupBeforeCreateEventHandler as GroupBeforeCreateEventHandlerAbstraction } from "webiny/api/cms/group"; +import { Logger } from "webiny/api/logger"; + +class GroupBeforeCreateEventHandlerImpl + implements GroupBeforeCreateEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: GroupBeforeCreateEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Trying to create a group:", { + payload, + occurredAt, + eventType + }); + } +} + +const GroupBeforeCreateEventHandler = GroupBeforeCreateEventHandlerAbstraction.createImplementation( + { + implementation: GroupBeforeCreateEventHandlerImpl, + dependencies: [Logger] + } +); + +export default GroupBeforeCreateEventHandler; +``` + +### GroupAfterCreateEventHandler + +```typescript extensions/cms/group/eventHandler/create/afterCreate.ts +import { GroupAfterCreateEventHandler as GroupAfterCreateEventHandlerAbstraction } from "webiny/api/cms/group"; +import { Logger } from "webiny/api/logger"; + +class GroupAfterCreateEventHandlerImpl + implements GroupAfterCreateEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: GroupAfterCreateEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Created a group:", { + payload, + occurredAt, + eventType + }); + } +} + +const GroupAfterCreateEventHandler = GroupAfterCreateEventHandlerAbstraction.createImplementation( + { + implementation: GroupAfterCreateEventHandlerImpl, + dependencies: [Logger] + } +); + +export default GroupAfterCreateEventHandler; +``` + +## Update a Group + +### GroupBeforeUpdateEventHandler + +```typescript extensions/cms/group/eventHandler/update/beforeUpdate.ts +import { GroupBeforeUpdateEventHandler as GroupBeforeUpdateEventHandlerAbstraction } from "webiny/api/cms/group"; +import { Logger } from "webiny/api/logger"; + +class GroupBeforeUpdateEventHandlerImpl + implements GroupBeforeUpdateEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: GroupBeforeUpdateEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Trying to update a group:", { + payload, + occurredAt, + eventType + }); + } +} + +const GroupBeforeUpdateEventHandler = GroupBeforeUpdateEventHandlerAbstraction.createImplementation( + { + implementation: GroupBeforeUpdateEventHandlerImpl, + dependencies: [Logger] + } +); + +export default GroupBeforeUpdateEventHandler; +``` + +### GroupAfterUpdateEventHandler + +```typescript extensions/cms/group/eventHandler/update/afterUpdate.ts +import { GroupAfterUpdateEventHandler as GroupAfterUpdateEventHandlerAbstraction } from "webiny/api/cms/group"; +import { Logger } from "webiny/api/logger"; + +class GroupAfterUpdateEventHandlerImpl + implements GroupAfterUpdateEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: GroupAfterUpdateEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Updated a group:", { + payload, + occurredAt, + eventType + }); + } +} + +const GroupAfterUpdateEventHandler = GroupAfterUpdateEventHandlerAbstraction.createImplementation( + { + implementation: GroupAfterUpdateEventHandlerImpl, + dependencies: [Logger] + } +); + +export default GroupAfterUpdateEventHandler; +``` + +## Delete a Group + +### GroupBeforeDeleteEventHandler + +```typescript extensions/cms/group/eventHandler/delete/beforeDelete.ts +import { GroupBeforeDeleteEventHandler as GroupBeforeDeleteEventHandlerAbstraction } from "webiny/api/cms/group"; +import { Logger } from "webiny/api/logger"; + +class GroupBeforeDeleteEventHandlerImpl + implements GroupBeforeDeleteEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: GroupBeforeDeleteEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Trying to delete a group:", { + payload, + occurredAt, + eventType + }); + } +} + +const GroupBeforeDeleteEventHandler = GroupBeforeDeleteEventHandlerAbstraction.createImplementation( + { + implementation: GroupBeforeDeleteEventHandlerImpl, + dependencies: [Logger] + } +); + +export default GroupBeforeDeleteEventHandler; +``` + +### GroupAfterDeleteEventHandler + +```typescript extensions/cms/group/eventHandler/delete/afterDelete.ts +import { GroupAfterDeleteEventHandler as GroupAfterDeleteEventHandlerAbstraction } from "webiny/api/cms/group"; +import { Logger } from "webiny/api/logger"; + +class GroupAfterDeleteEventHandlerImpl + implements GroupAfterDeleteEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: GroupAfterDeleteEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Deleted a group:", { + payload, + occurredAt, + eventType + }); + } +} + +const GroupAfterDeleteEventHandler = GroupAfterDeleteEventHandlerAbstraction.createImplementation( + { + implementation: GroupAfterDeleteEventHandlerImpl, + dependencies: [Logger] + } +); + +export default GroupAfterDeleteEventHandler; +``` + +## Loading Event Handlers in Your Project + +All the event handlers MUST be exported as `default export` from the file, otherwise it will not work. + +To load the event handlers in your project, you need to add them in the root `webiny.config.tsx` file, like this: + +```tsx webiny.config.tsx +import React from "react"; +import { Api } from "webiny/extensions"; + +export const Extensions = () => { + return ( + <> + {/* ... all your other extensions */} + <Api.Extension src={"/extensions/cms/group/eventHandler/create/beforeCreate.ts"} /> + <Api.Extension src={"/extensions/cms/group/eventHandler/create/afterCreate.ts"} /> + <Api.Extension src={"/extensions/cms/group/eventHandler/update/beforeUpdate.ts"} /> + <Api.Extension src={"/extensions/cms/group/eventHandler/update/afterUpdate.ts"} /> + <Api.Extension src={"/extensions/cms/group/eventHandler/delete/beforeDelete.ts"} /> + <Api.Extension src={"/extensions/cms/group/eventHandler/delete/afterDelete.ts"} /> + </> + ); +}; +``` diff --git a/docs/developer-docs/6.0.x/headless-cms/event-handler/model.ai.txt b/docs/developer-docs/6.0.x/headless-cms/event-handler/model.ai.txt new file mode 100644 index 000000000..b482fc65b --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/event-handler/model.ai.txt @@ -0,0 +1,105 @@ +AI Context: Model Event Handlers (headless-cms/event-handler/model.mdx) + +Source of Information: +1. Followed the pattern from group.mdx event handlers +2. Adapted for model-specific lifecycle events +3. Used the same logger and Result pattern approach +4. Identified model-specific validation scenarios +5. Included field validation examples + +Key Documentation Decisions: +- Follow group.mdx structure and patterns +- Include logger in all examples +- Document model lifecycle events (create, update, delete) +- Show model-specific validations (field checks, naming conventions) +- Use Result pattern consistently +- Include practical examples (field validation, API name checks) +- Maintain consistency with other event handler docs + +Events Documented: +1. Before Create - Validation before model creation (API names, field checks) +2. After Create - Post-creation actions (logging, initial setup) +3. Before Update - Validation before updates (breaking changes check) +4. After Update - Post-update actions (cache invalidation) +5. Before Delete - Authorization and dependency checks +6. After Delete - Cleanup operations (remove related data) + +Pattern Used: +- Logger from @webiny/api/logger +- Result pattern for validation errors +- Model-specific validation logic +- Field structure validation +- API naming convention checks +- Dependency validation + +Examples Include: +- Validating required fields are present +- Checking API name format +- Preventing breaking changes +- Verifying no entries exist before deletion +- Logging model changes + +Related Documents: +- headless-cms/event-handler/group.mdx - Base pattern +- headless-cms/event-handler/entry.mdx - Related events +- headless-cms/use-case/model.mdx - Use case integration +- headless-cms/builder/model.mdx - Model structure + +Model-Specific Event Handler Pattern: +```typescript +import { logger } from "@webiny/api/logger"; +import { Result } from "@webiny/feature/api"; + +export const ModelBeforeCreateEventHandler = async ({ model, context }) => { + logger.info("Before creating model", { modelId: model.modelId }); + + // Model-specific validation: Check required fields + const hasIdField = model.fields.some(f => f.fieldId === "id"); + if (!hasIdField) { + return Result.fail(new ValidationError("Model must have an 'id' field")); + } + + // API name validation + if (!/^[a-z][a-zA-Z0-9]*$/.test(model.singularApiName)) { + return Result.fail(new ValidationError("Invalid API name format")); + } + + // Continue if valid +}; +``` + +Model-Specific Validations: +1. Field structure validation (required fields present) +2. API naming conventions (singularApiName, pluralApiName) +3. Field type validation +4. Breaking change detection (before update) +5. Dependency checks (entries exist before delete) + +Events to Document: +- Before Create: Field validation, API names, structure +- After Create: Logging, initial setup +- Before Update: Breaking change prevention +- After Update: Cache/schema invalidation +- Before Delete: Entry existence check +- After Delete: Cleanup (indexes, caches) + +Model Structure to Validate: +- modelId, name, description +- singularApiName, pluralApiName +- fields array (field definitions) +- group assignment +- layout configuration + +Common Patterns: +1. Validate field structure completeness +2. Check naming conventions +3. Prevent breaking changes on update +4. Ensure no entries exist before delete +5. Log all model changes + +Tone Guidelines: +- Show model-specific validations +- Explain importance of checks (breaking changes, data integrity) +- Use logger in all examples +- Production-ready validation logic + diff --git a/docs/developer-docs/6.0.x/headless-cms/event-handler/model.mdx b/docs/developer-docs/6.0.x/headless-cms/event-handler/model.mdx new file mode 100644 index 000000000..112044744 --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/event-handler/model.mdx @@ -0,0 +1,303 @@ +--- +id: bxdbed4t +title: Model Event Handlers +description: Which event handlers are available in Headless CMS Models and how to use them. +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- Which event handlers are available for Models? +- How to use them? +- How to load them in your project? + +</Alert> + +## Overview +Headless CMS provides events for users to hook into. + +With the events you can hook into a number of different Model related operations, all of which are listed here. + +## Create a Model + +### ModelBeforeCreateEventHandler + +```typescript extensions/cms/model/eventHandler/create/beforeCreate.ts +import { ModelBeforeCreateEventHandler as ModelBeforeCreateEventHandlerAbstraction } from "webiny/api/cms/model"; +import { Logger } from "webiny/api/logger"; + +class ModelBeforeCreateEventHandlerImpl + implements ModelBeforeCreateEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: ModelBeforeCreateEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Trying to create a model:", { + payload, + occurredAt, + eventType + }); + } +} + +const ModelBeforeCreateEventHandler = ModelBeforeCreateEventHandlerAbstraction.createImplementation( + { + implementation: ModelBeforeCreateEventHandlerImpl, + dependencies: [Logger] + } +); + +export default ModelBeforeCreateEventHandler; +``` + +### ModelAfterCreateEventHandler + +```typescript extensions/cms/model/eventHandler/create/afterCreate.ts +import { ModelAfterCreateEventHandler as ModelAfterCreateEventHandlerAbstraction } from "webiny/api/cms/model"; +import { Logger } from "webiny/api/logger"; + +class ModelAfterCreateEventHandlerImpl + implements ModelAfterCreateEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: ModelAfterCreateEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Created a model:", { + payload, + occurredAt, + eventType + }); + } +} + +const ModelAfterCreateEventHandler = ModelAfterCreateEventHandlerAbstraction.createImplementation( + { + implementation: ModelAfterCreateEventHandlerImpl, + dependencies: [Logger] + } +); + +export default ModelAfterCreateEventHandler; +``` + +## Update a Model + +### ModelBeforeUpdateEventHandler + +```typescript extensions/cms/model/eventHandler/update/beforeUpdate.ts +import { ModelBeforeUpdateEventHandler as ModelBeforeUpdateEventHandlerAbstraction } from "webiny/api/cms/model"; +import { Logger } from "webiny/api/logger"; + +class ModelBeforeUpdateEventHandlerImpl + implements ModelBeforeUpdateEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: ModelBeforeUpdateEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Trying to update a model:", { + payload, + occurredAt, + eventType + }); + } +} + +const ModelBeforeUpdateEventHandler = ModelBeforeUpdateEventHandlerAbstraction.createImplementation( + { + implementation: ModelBeforeUpdateEventHandlerImpl, + dependencies: [Logger] + } +); + +export default ModelBeforeUpdateEventHandler; +``` + +### ModelAfterUpdateEventHandler + +```typescript extensions/cms/model/eventHandler/update/afterUpdate.ts +import { ModelAfterUpdateEventHandler as ModelAfterUpdateEventHandlerAbstraction } from "webiny/api/cms/model"; +import { Logger } from "webiny/api/logger"; + +class ModelAfterUpdateEventHandlerImpl + implements ModelAfterUpdateEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: ModelAfterUpdateEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Updated a model:", { + payload, + occurredAt, + eventType + }); + } +} + +const ModelAfterUpdateEventHandler = ModelAfterUpdateEventHandlerAbstraction.createImplementation( + { + implementation: ModelAfterUpdateEventHandlerImpl, + dependencies: [Logger] + } +); + +export default ModelAfterUpdateEventHandler; +``` + +## Create a Model From Existing One + +### ModelBeforeCreateFromEventHandler + +```typescript extensions/cms/model/eventHandler/createFrom/beforeCreateFrom.ts +import { ModelBeforeCreateFromEventHandler as ModelBeforeCreateFromEventHandlerAbstraction } from "webiny/api/cms/model"; +import { Logger } from "webiny/api/logger"; + +class ModelBeforeCreateFromEventHandlerImpl + implements ModelBeforeCreateFromEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: ModelBeforeCreateFromEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Trying to create a model from:", { + payload, + occurredAt, + eventType + }); + } +} + +const ModelBeforeCreateFromEventHandler = + ModelBeforeCreateFromEventHandlerAbstraction.createImplementation({ + implementation: ModelBeforeCreateFromEventHandlerImpl, + dependencies: [Logger] + }); + +export default ModelBeforeCreateFromEventHandler; + +``` + +### ModelAfterCreateFromEventHandler + +```typescript extensions/cms/model/eventHandler/createFrom/afterCreateFrom.ts +import { ModelAfterCreateFromEventHandler as ModelAfterCreateFromEventHandlerAbstraction } from "webiny/api/cms/model"; +import { Logger } from "webiny/api/logger"; + +class ModelAfterCreateFromEventHandlerImpl + implements ModelAfterCreateFromEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: ModelAfterCreateFromEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Created a model from:", { + payload, + occurredAt, + eventType + }); + } +} + +const ModelAfterCreateFromEventHandler = + ModelAfterCreateFromEventHandlerAbstraction.createImplementation({ + implementation: ModelAfterCreateFromEventHandlerImpl, + dependencies: [Logger] + }); + +export default ModelAfterCreateFromEventHandler; + +``` + +## Delete a Model + +### ModelBeforeDeleteEventHandler + +```typescript extensions/cms/model/eventHandler/delete/beforeDelete.ts +import { ModelBeforeDeleteEventHandler as ModelBeforeDeleteEventHandlerAbstraction } from "webiny/api/cms/model"; +import { Logger } from "webiny/api/logger"; + +class ModelBeforeDeleteEventHandlerImpl + implements ModelBeforeDeleteEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: ModelBeforeDeleteEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Trying to delete a model:", { + payload, + occurredAt, + eventType + }); + } +} + +const ModelBeforeDeleteEventHandler = ModelBeforeDeleteEventHandlerAbstraction.createImplementation( + { + implementation: ModelBeforeDeleteEventHandlerImpl, + dependencies: [Logger] + } +); + +export default ModelBeforeDeleteEventHandler; +``` + +### ModelAfterDeleteEventHandler + +```typescript extensions/cms/model/eventHandler/delete/afterDelete.ts +import { ModelAfterDeleteEventHandler as ModelAfterDeleteEventHandlerAbstraction } from "webiny/api/cms/model"; +import { Logger } from "webiny/api/logger"; + +class ModelAfterDeleteEventHandlerImpl + implements ModelAfterDeleteEventHandlerAbstraction.Interface +{ + public constructor(private logger: Logger.Interface) {} + + public async handle(event: ModelAfterDeleteEventHandlerAbstraction.Event): Promise<void> { + const { payload, occurredAt, eventType } = event; + this.logger.info("Deleted a model:", { + payload, + occurredAt, + eventType + }); + } +} + +const ModelAfterDeleteEventHandler = ModelAfterDeleteEventHandlerAbstraction.createImplementation( + { + implementation: ModelAfterDeleteEventHandlerImpl, + dependencies: [Logger] + } +); + +export default ModelAfterDeleteEventHandler; +``` + +## Loading Event Handlers in Your Project + +All the event handlers MUST be exported as `default export` from the file, otherwise it will not work. + +To load the event handlers in your project, you need to add them in the root `webiny.config.tsx` file, like this: + +```tsx webiny.config.tsx +import React from "react"; +import { Api } from "webiny/extensions"; + +export const Extensions = () => { + return ( + <> + {/* ... all your other extensions */} + <Api.Extension src={"/extensions/cms/model/eventHandler/create/beforeCreate.ts"} /> + <Api.Extension src={"/extensions/cms/model/eventHandler/create/afterCreate.ts"} /> + <Api.Extension src={"/extensions/cms/model/eventHandler/createFrom/beforeCreateFrom.ts"} /> + <Api.Extension src={"/extensions/cms/model/eventHandler/createFrom/afterCreateFrom.ts"} /> + <Api.Extension src={"/extensions/cms/model/eventHandler/update/beforeUpdate.ts"} /> + <Api.Extension src={"/extensions/cms/model/eventHandler/update/afterUpdate.ts"} /> + <Api.Extension src={"/extensions/cms/model/eventHandler/delete/beforeDelete.ts"} /> + <Api.Extension src={"/extensions/cms/model/eventHandler/delete/afterDelete.ts"} /> + </> + ); +}; +``` diff --git a/docs/developer-docs/6.0.x/headless-cms/examples/private-model.ai.txt b/docs/developer-docs/6.0.x/headless-cms/examples/private-model.ai.txt new file mode 100644 index 000000000..632e30e55 --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/examples/private-model.ai.txt @@ -0,0 +1,101 @@ +AI Context: Private Model Example (headless-cms/examples/private-model.mdx) + +Source of Information: +1. Analyzed content model concepts and builder patterns +2. Examined access control and visibility requirements +3. Studied use cases for private/internal models +4. Reviewed model builder API from builder/model.mdx + +Key Documentation Decisions: +- Provide a complete, practical example of creating a private model +- Explain what private models are and when to use them +- Show how to configure model access restrictions +- Include field definitions appropriate for private data +- Demonstrate integration with the builder API +- Include real-world use case (internal audit log, system configuration) + +What is a Private Model: +- Not exposed in public APIs +- Used for internal system data +- No GraphQL API generation +- Backend-only access +- Administrative/system data + +Example Use Cases: +- Audit logs +- System configuration +- Internal metrics +- User activity tracking +- System state management + +Implementation Shown: +- Model builder configuration +- Private flag setting +- Field definitions for audit data +- Appropriate field types +- Access control considerations + +Pattern Used: +- Model builder fluent API +- Field builder integration +- Configuration best practices +- Security considerations + +Related Documents: +- headless-cms/builder/model.mdx - Model builder API +- headless-cms/examples/single-entry-model.mdx - Another model example + +What is a Private Model: +- Not exposed in public GraphQL APIs +- Backend-only access +- Used for internal/system data +- No automatic API generation +- Administrative access only + +Use Cases: +- Audit logs (user actions, changes) +- System configuration (internal settings) +- Internal metrics (performance, usage) +- User activity tracking +- System state management +- Background job logs + +Example Structure: +```typescript +import { ModelBuilder } from "@webiny/api-headless-cms"; + +const auditLogModel = new ModelBuilder() + .id("auditLog") + .name("Audit Log") + .singularApiName("AuditLog") + .pluralApiName("AuditLogs") + .private(true) // Key setting + .group("system") + .field(/* timestamp */) + .field(/* user */) + .field(/* action */) + .field(/* details */) + .build(); +``` + +Key Configuration: +- `.private(true)` - Makes model private +- Appropriate fields for internal data +- System/admin group assignment + +Access Pattern: +- Available through backend context only +- Not in public GraphQL schema +- Direct CMS API access required + +Security Considerations: +- No public exposure +- Backend validation still needed +- Access control at application level + +Tone Guidelines: +- Explain what private models are +- Show practical use case (audit log) +- Complete example with appropriate fields +- Explain security implications + diff --git a/docs/developer-docs/6.0.x/headless-cms/examples/private-model.mdx b/docs/developer-docs/6.0.x/headless-cms/examples/private-model.mdx new file mode 100644 index 000000000..76d416557 --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/examples/private-model.mdx @@ -0,0 +1,135 @@ +--- +id: 7gwku532 +title: Private Model Builder and Usage +description: About Private Models, how and where to use them. +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is a private model and how does it differ from public models? +- How to create a private model using the Model Builder? +- When to use private models? +- How to access data from private models? + +</Alert> + +## Overview + +This example demonstrates how to create a private model and why would you use it or need it. + +Private models are not exposed through the GraphQL API, so you need to expose them yourself if required (build a schema and resolvers). + +## Private Model Builder + +```typescript +import { ModelFactory } from "webiny/api/cms/model"; + +class UserLogImpl implements ModelFactory.Interface { + public async execute(builder: ModelFactory.Builder): ModelFactory.Return { + return [ + builder + .private({ + name: "UserLog", + modelId: "userLog" + }) + .fields(fieldBuilder => { + return { + id: fieldBuilder.text().label("id").required(), + ip: fieldBuilder.text().label("ip").required() + }; + }) + ]; + } +} + +const UserLog = ModelFactory.createImplementation({ + implementation: UserLogImpl, + dependencies: [] +}); + +export default UserLog; +``` + +## Usage Of the Defined Private Model + +For example, you want to log every time user authenticates in your application. + +```typescript +import { AfterAuthenticationHandler } from "webiny/api/security/authentication"; +import { CreateEntryUseCase } from "webiny/api/cms/entry"; +import { GetModelUseCase } from "webiny/api/cms/model"; + +class LogUser implements AfterAuthenticationHandler.Interface { + public constructor( + private createEntryUseCase: CreateEntryUseCase.Interface, + private getModelUseCase: GetModelUseCase.Interface + ) {} + + public async handle(event: AfterAuthenticationHandler.Event) { + const { payload } = event; + const { identity } = payload; + if (identity.isAnonymous()) { + return; + } + const model = await this.getModel(); + await this.createEntryUseCase.execute(model, { + values: { + userId: identity.id + } + }); + } + + private async getModel() { + const result = await this.getModelUseCase.execute("userLog"); + if (result.isFail()) { + throw new Error(result.error.message); + } + return result.value; + } +} + +export default AfterAuthenticationHandler.createImplementation({ + implementation: LogUser, + dependencies: [CreateEntryUseCase, GetModelUseCase] +}); +``` + +### What's Happening Here + +This example demonstrates a practical use case for private models. The `LogUser` handler intercepts authentication events and stores user login data in the private `userLog` model. + +Since the model is private, this data is only accessible through your backend code, not through the public GraphQL API. This is perfect for internal logging, analytics, or storing sensitive data that shouldn't be exposed to frontend applications. + +## Accessing Private Model Data + +To access data from a private model, you would typically create custom GraphQL resolvers or use the CMS API directly in your backend code. + +This allows you to control who can access this data and how it's used, ensuring that sensitive information remains secure. + +```typescript +import { GetModelUseCase } from "webiny/api/cms/model"; +import { ListEntriesUseCase } from "webiny/api/cms/entry"; + +const modelResult = await this.getModelUseCase.execute("userLog"); +if (modelResult.isFail()) { + throw new Error(model.error.message); +} +const model = modelResult.value; + +const entriesResult = await this.listEntriesUseCase.execute(model, { + where: { + userId: "some-user-id" + } +}); +if (entriesResult.isFail()) { + throw new Error(entriesResult.error.message); +} +const userLogs = entriesResult.value; + +console.log({ + userLogs +}); + +``` diff --git a/docs/developer-docs/6.0.x/headless-cms/examples/single-entry-model.ai.txt b/docs/developer-docs/6.0.x/headless-cms/examples/single-entry-model.ai.txt new file mode 100644 index 000000000..5ad724f78 --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/examples/single-entry-model.ai.txt @@ -0,0 +1,113 @@ +AI Context: Single Entry Model Example (headless-cms/examples/single-entry-model.mdx) + +Source of Information: +1. Analyzed content model concepts and singleton patterns +2. Examined use cases for single-entry/singleton models +3. Studied model builder API and configuration options +4. Reviewed field builder patterns + +Key Documentation Decisions: +- Provide a complete example of creating a singleton model +- Explain what single-entry models are and when to use them +- Show how to configure model as singleton +- Include field definitions appropriate for singleton data +- Demonstrate practical use cases +- Include implementation details + +What is a Single Entry Model: +- Only one instance allowed (singleton pattern) +- Used for global configuration +- Site-wide settings +- Application preferences +- Company information + +Example Use Cases: +- Site settings (site name, logo, contact info) +- Global configuration (feature flags, API keys) +- Company information (about, contact details) +- Theme settings +- SEO defaults + +Implementation Shown: +- Model builder configuration +- Singleton flag/configuration +- Field definitions for settings +- Appropriate field types +- Structure best practices + +Pattern Used: +- Model builder fluent API +- Field builder integration +- Singleton pattern implementation +- Configuration management + +Related Documents: +- headless-cms/builder/model.mdx - Model builder API +- headless-cms/examples/private-model.mdx - Another model example + +What is a Single Entry Model (Singleton): +- Only one instance allowed +- Used for global/site-wide data +- Cannot create multiple entries +- Perfect for settings and configuration + +Use Cases: +- Site settings (name, logo, contact info) +- Global configuration (feature flags, API keys) +- Company information (about, contact) +- Theme settings (colors, fonts) +- SEO defaults (meta tags, analytics) +- Footer/header content + +Example Structure: +```typescript +import { ModelBuilder } from "@webiny/api-headless-cms"; + +const siteSettingsModel = new ModelBuilder() + .id("siteSettings") + .name("Site Settings") + .singularApiName("SiteSettings") + .pluralApiName("SiteSettings") // Same as singular + .singleton(true) // Key setting + .group("settings") + .field(/* site name */) + .field(/* logo */) + .field(/* contact email */) + .field(/* social links */) + .build(); +``` + +Key Configuration: +- `.singleton(true)` - Makes model singleton +- Appropriate fields for global data +- Settings/configuration group + +API Behavior: +- GraphQL query: `getSiteSettings` (no ID needed) +- GraphQL mutation: `updateSiteSettings` (no create/delete) +- Always returns the same single entry + +Access Pattern: +```graphql +query { + getSiteSettings { + siteName + logo + contactEmail + } +} +``` + +Common Singleton Models: +- Site Settings +- Company Info +- Theme Configuration +- SEO Defaults +- Contact Information + +Tone Guidelines: +- Explain singleton pattern clearly +- Show practical use case (site settings) +- Complete example with relevant fields +- Explain API differences from regular models + diff --git a/docs/developer-docs/6.0.x/headless-cms/examples/single-entry-model.mdx b/docs/developer-docs/6.0.x/headless-cms/examples/single-entry-model.mdx new file mode 100644 index 000000000..4ef9c3f6e --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/examples/single-entry-model.mdx @@ -0,0 +1,80 @@ +--- +id: cxmf6k99 +title: Single Entry Model Builder and Usage +description: About Single Entry Models, how and where to use them. +--- +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is a single entry model? +- How to create a single entry model using the Model Builder? +- When to use single entry models in your application? + +</Alert> + +## Overview + +This example demonstrates how to create a single entry model and why would you use it or need it. + +## Settings Model Builder + +```typescript +import { ModelFactory } from "webiny/api/cms/model"; +import { ListGroupsUseCase } from "webiny/api/cms/group"; + +class SettingsImpl implements ModelFactory.Interface { + public constructor(private listGroupsUseCase: ListGroupsUseCase.Interface) {} + + public async execute(builder: ModelFactory.Builder): ModelFactory.Return { + const groups = await this.listGroupsUseCase.execute(); + if (groups.isFail()) { + throw new Error(`Could not load groups: ${groups.error.message}`); + } + const [group] = groups.value; + + if (!group) { + throw new Error(`At least one group must exist to create models.`); + } + + return [ + builder + .public({ + name: "Settings", + modelId: "settings", + group: group.slug, + singularApiName: "Setting", + pluralApiName: "Settings" + }) + .singleEntry() + .description("A model used to store settings.") + .fields(fieldBuilder => { + return { + googleAnalytics: fieldBuilder + .text() + .label("Google Analytics") + .required(), + facebookPixel: fieldBuilder + .text() + .label("Facebook Pixel") + }; + }) + ]; + } +} + +const Settings = ModelFactory.createImplementation({ + implementation: SettingsImpl, + dependencies: [ListGroupsUseCase] +}); + +export default Settings; +``` + +## Usage Of the Defined Single Entry Model + +The model we created will be used to store the settings of our application, and it will show in the Admin UI. + +Since it's a single entry model, there will be only one entry of this model in the system. + +Also, the entry stored via this model is available on both manage and read GraphQL API (completely public). diff --git a/docs/developer-docs/6.0.x/headless-cms/ui/field-renderer.ai.txt b/docs/developer-docs/6.0.x/headless-cms/ui/field-renderer.ai.txt new file mode 100644 index 000000000..8ff24a6f0 --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/ui/field-renderer.ai.txt @@ -0,0 +1,100 @@ +AI Context: Field Renderer (headless-cms/ui/field-renderer.mdx) + +Source of Information: +1. Analyzed field renderer implementations in the codebase +2. Examined each renderer plugin's structure +3. Identified renderer.rendererName values +4. Analyzed renderer.canUse functions to determine field/renderer compatibility +5. Documented field configuration dependencies (predefined values, multiple values) + +Key Documentation Decisions: +- Document all built-in field renderers +- Organize by field type (boolean, text, number, long text, rich text, datetime, reference, object, dynamic zone, special types) +- Show which renderers work with which field type +- Note special requirements (predefined values, multiple values, settings.type) +- Use clear naming conventions (camelCase for renderer names) +- Include utility renderers (hidden, passthrough) +- Keep descriptions concise and focused on functionality + +Field/Renderer Mapping: +**Boolean Field:** +- switch: Toggle switch for true/false values + +**Text Field:** +- textInput: Single text input +- textInputs: Multiple text inputs (multiple values) +- tags: Tag input component (multiple values) +- radioButtons: Radio button selection (requires predefined values) +- dropdown: Select box (requires predefined values) +- checkboxes: Checkbox selection (multiple values, requires predefined values) + +**Number Field:** +- numberInput: Single number input +- numberInputs: Multiple number inputs (multiple values) +- radioButtons: Radio button selection (requires predefined values) +- dropdown: Select box (requires predefined values) +- checkboxes: Checkbox selection (multiple values, requires predefined values) + +**Long Text Field:** +- textarea: Single text area +- textareas: Multiple text areas (multiple values) + +**Rich Text Field:** +- lexicalEditor: Lexical editor for formatted content +- lexicalEditors: Multiple Lexical editors (multiple values) + +**DateTime Field:** +- dateTimeInput: Date/time input (supports dateOnly, dateTimeWithoutTimezone, dateTimeWithTimezone, time) +- dateTimeInputs: Multiple date/time inputs (multiple values) +Note: Format defined via settings.type property + +**Reference Field:** +- refAutocompleteSingle: Autocomplete for single entry +- refAutocompleteMultiple: Autocomplete for multiple entries (multiple values) +- refRadioButtons: Radio buttons for single selection +- refCheckboxes: Checkboxes for multiple selection (multiple values) +- refDialogSingle: Modal dialog for single entry selection +- refDialogMultiple: Modal dialog for multiple entry selection (multiple values) + +**Object Field:** +- objectAccordionSingle: Accordion for nested fields +- objectAccordionMultiple: Accordion with add/remove (multiple values) + +**Dynamic Zone Field:** +- dynamicZone: Template selection (supports single and multiple values, requires templates in field settings) + +**Special Field Types:** +- uiSeparator: Visual separator (field type: ui) + +**Utility Renderers:** +- hidden: Hides field from UI (works with all fields) +- passthrough: Renders children without wrappers (special cases, not selectable by default) + +Related Documents: +- headless-cms/builder/field.mdx - Field builder API (links to this doc) +- headless-cms/builder/model.mdx - Model builder with field configuration + +Key Code Locations: +- Field renderer plugins: packages/app-headless-cms/src/admin/plugins/fieldRenderers + +To examine source code implementations in detail, access to the Webiny project repository is needed. + +Document Structure: +- Group by field type +- List compatible renderers with rendererName in camelCase +- Note requirements (predefined values, multiple values, special settings) +- Include utility renderers section +- Brief, focused descriptions + +Key Patterns: +- rendererName uses camelCase (e.g., textInput, refAutocompleteSingle) +- Multiple value support indicated with "Supports multiple values" +- Predefined values requirement noted where applicable +- DateTime fields require settings.type configuration + +Tone Guidelines: +- Concise and informative +- Focus on capabilities and requirements +- Clear organization by field type +- Direct descriptions without redundant phrasing + diff --git a/docs/developer-docs/6.0.x/headless-cms/ui/field-renderer.mdx b/docs/developer-docs/6.0.x/headless-cms/ui/field-renderer.mdx new file mode 100644 index 000000000..db8c44d9b --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/ui/field-renderer.mdx @@ -0,0 +1,121 @@ +--- +id: anmxv1uu +title: Field Renderers +description: List of available built-in field renderers for the UI of the Headless CMS. +--- +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What field renderers are available +- Which renderers can be used with each field type +- How renderer selection depends on field configuration + +</Alert> + +## Overview + +Field renderers determine how content fields are displayed and edited in the Headless CMS UI. Built-in renderers are available for all field types, and the available renderers depend on the field's configuration, including whether it supports multiple values and predefined values. + +Each renderer is identified by a unique `rendererName` and can be selected when configuring a field. The `canUse` method of each renderer determines whether it's available for a specific field configuration. + +## Boolean Field + +Boolean fields represent true/false values. + +**`switch`** - Renders a simple switch button. + +## Text Field + +Text fields store short text values. + +**`textInput`** - Renders a simple input with its type set to "text". + +**`textInputs`** - Renders a simple list of text inputs. *Supports multiple values.* + +**`tags`** - Renders a tags component for entering multiple text values. *Supports multiple values.* + +**`radioButtons`** - Renders radio buttons, allowing selection of a single value. *Requires predefined values.* + +**`dropdown`** - Renders a select box, allowing selection of a single value. *Requires predefined values.* + +**`checkboxes`** - Renders checkboxes, allowing selection of multiple values. *Supports multiple values. Requires predefined values.* + +## Number Field + +Number fields store numeric values. + +**`numberInput`** - Renders a simple input with its type set to "number". + +**`numberInputs`** - Renders a simple list of number inputs. *Supports multiple values.* + +**`radioButtons`** - Renders radio buttons, allowing selection of a single numeric value. *Requires predefined values.* + +**`dropdown`** - Renders a select box, allowing selection of a single numeric value. *Requires predefined values.* + +**`checkboxes`** - Renders checkboxes, allowing selection of multiple numeric values. *Supports multiple values. Requires predefined values.* + +## Long Text Field + +Long text fields store larger amounts of text. + +**`textarea`** - Renders a simple text area, suitable for larger amounts of text. + +**`textareas`** - Renders a simple list of text areas. *Supports multiple values.* + +## Rich Text Field + +Rich text fields store formatted text content using Lexical editor. + +**`lexicalEditor`** - Renders a lexical text editor. + +**`lexicalEditors`** - Renders a list of lexical editors. *Supports multiple values.* + +## DateTime Field + +DateTime fields store date and time values in various formats. The format is defined using the `settings.type` property. + +**`dateTimeInput`** - Renders input for various formats of date and time. Supports: `dateOnly`, `dateTimeWithoutTimezone`, `dateTimeWithTimezone`, `time`. + +**`dateTimeInputs`** - Renders inputs for various formats of dates and times. *Supports multiple values.* Supports: `dateOnly`, `dateTimeWithoutTimezone`, `dateTimeWithTimezone`, `time`. + +## Reference Field + +Reference fields create relationships between content entries. + +**`refAutocompleteSingle`** - Renders an auto-complete input, allowing selection of a single referenced entry. + +**`refAutocompleteMultiple`** - Renders an auto-complete input, allowing selection of multiple referenced entries. *Supports multiple values.* + +**`refRadioButtons`** - Renders a list of radio buttons, allowing selection of one related record. + +**`refCheckboxes`** - Renders a list of checkboxes, allowing selection of one or more records. *Supports multiple values.* + +**`refDialogSingle`** - Renders a preview card of the selected record. The user searches through records using a modal window. + +**`refDialogMultiple`** - Renders preview cards of the selected records. User can browse through records using a modal dialog. *Supports multiple values.* + +## Object Field + +Object fields contain nested field structures. + +**`objectAccordionSingle`** - Renders fields within an accordion. + +**`objectAccordionMultiple`** - Renders multiple objects within an accordion with add/remove functionality. *Supports multiple values.* + +## Dynamic Zone Field + +Dynamic zone fields allow selecting from predefined templates. + +**`dynamicZone`** - Renders a dynamic zone with template selection. Templates must be defined in field settings. *Supports both single and multiple values.* + +## Special Field Types + +**`uiSeparator`** - Renders a visual separator to organize form fields. *Field type: `ui`.* +Note that the `ui` field is a base field, which other UI fields can be built on top of. + +## Utility Renderers + +**`hidden`** - Hides the field from the UI completely. Can be used with all fields. + +**`passthrough`** - Renders child fields without any extra wrappers. Special cases only (not selectable by default). diff --git a/docs/developer-docs/6.0.x/headless-cms/use-case/entry.ai.txt b/docs/developer-docs/6.0.x/headless-cms/use-case/entry.ai.txt new file mode 100644 index 000000000..ea489fce7 --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/use-case/entry.ai.txt @@ -0,0 +1,139 @@ +AI Context: Entry Use Cases (headless-cms/use-case/entry.mdx) + +Source of Information: +1. Analyzed existing use case patterns from group.mdx and model.mdx +2. Examined entry use case implementations +3. Examined create, update, delete, publish, unpublish use case implementations +4. Studied the use case pattern: interface, abstraction, implementation +5. Understood the integration between use cases, repositories, and event handlers + +Key Documentation Decisions: +- Document all entry-related use cases +- Follow the established pattern from group/model use cases +- Show abstraction creation with createAbstraction +- Include implementation examples with createImplementation +- Demonstrate repository integration +- Show event handler triggering +- Use Result pattern throughout +- Include error handling patterns +- Cover full entry lifecycle + +Use Cases Documented: +1. Create Entry - Create new content entries +2. Update Entry - Modify existing entries +3. Delete Entry - Remove entries +4. Get Entry - Retrieve single entry +5. List Entries - Query multiple entries +6. Publish Entry - Make entry public +7. Unpublish Entry - Remove from public view +8. Create Revision - Version management +9. Validate Entry - Entry validation logic + +Pattern Used: +- Abstraction definition with interface +- Error types definition +- createAbstraction call +- Namespace export pattern +- createImplementation with dependencies +- Repository pattern integration +- Event handler integration +- Result pattern for error handling + +Verification Done: +- Read actual use case implementation files +- Verified method signatures +- Confirmed parameter types +- Validated return types +- Ensured consistency with actual code + +Related Documents: +- headless-cms/use-case/model.mdx - Similar patterns for models +- headless-cms/use-case/group.mdx - Similar patterns for groups +- headless-cms/event-handler/entry.mdx - Event integration +- basic/di.mdx - Abstraction creation guide +- basic/result.mdx - Result pattern guide + +Key Code Locations: +- Use case implementations: Look for entry-related use cases in the codebase + +To examine source code implementations in detail, access to the Webiny project repository is needed. +- Abstraction examples: extensions/[module]/[feature]/abstraction/ +- Source code: extensions/[module]/ directory structure + +Complete Use Case Pattern (verified from actual code): +```typescript +// 1. Interface +export interface ICreateEntryUseCase { + execute<T extends CmsEntryValues = CmsEntryValues>( + model: CmsModel, + input: CreateCmsEntryInput<T>, + options?: CreateCmsEntryOptionsInput + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} + +// 2. Error types +export interface ICreateEntryUseCaseErrors { + notAuthorized: EntryNotAuthorizedError; + validation: EntryValidationError; + repository: RepositoryError; +} +type UseCaseError = ICreateEntryUseCaseErrors[keyof ICreateEntryUseCaseErrors]; + +// 3. Abstraction +export const CreateEntryUseCase = createAbstraction<ICreateEntryUseCase>("Cms/CreateEntry"); + +// 4. Namespace export +export namespace CreateEntryUseCase { + export type Interface = ICreateEntryUseCase; + export type Input<T extends CmsEntryValues = CmsEntryValues> = CreateCmsEntryInput<T>; + export type Options = CreateCmsEntryOptionsInput; + export type Error = UseCaseError; + export type Return<T extends CmsEntryValues = CmsEntryValues> = Promise<Result<CmsEntry<T>, UseCaseError>>; +} + +// 5. Implementation +export const createEntryUseCase = CreateEntryUseCase.createImplementation({ + repository: CreateEntryRepository, + validator: EntryValidator +}, async ({ repository, validator }, model, input, options) => { + // Validation + const validationResult = await validator.validate(model, input); + if (validationResult.isFail()) { + return validationResult; + } + + // Business logic + const entry = createEntry(model, input); + + // Persistence + const saveResult = await repository.execute(model, entry); + if (saveResult.isFail()) { + return saveResult; + } + + return Result.ok(entry); +}); +``` + +Critical Patterns: +1. Prefix abstraction with domain (e.g., "Cms/CreateEntry") +2. Export namespace with ALL types users need +3. Use generic types for flexibility (CmsEntryValues) +4. Separate concerns: validation → business logic → persistence +5. Repository pattern for data access +6. Always return Result type + +Common Use Cases to Document: +- Create: New entry with validation +- Update: Modify with version management +- Delete: Remove with dependency checks +- Publish/Unpublish: Publishing workflow +- Get/List: Retrieval operations +- Validate: Entry validation logic + +Tone Guidelines: +- Technical and complete +- Show full patterns, not snippets +- Reference actual implementation files +- Explain repository integration + diff --git a/docs/developer-docs/6.0.x/headless-cms/use-case/entry.mdx b/docs/developer-docs/6.0.x/headless-cms/use-case/entry.mdx new file mode 100644 index 000000000..65bb048db --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/use-case/entry.mdx @@ -0,0 +1,297 @@ +--- +id: au12c3js +title: Entry Use Cases +description: About Headless CMS Entry Use Cases +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What are available use cases for Headless CMS Entries? +- How to use them? + +</Alert> + +## Overview +This article will list all the use cases available for Headless CMS Entries and explain how to use them. + +## Use Cases + +All use cases have an `execute` method that you can call to perform the action that use case is for. +Params of that method and its return type are defined in the abstraction of the use case. + +Consult the examples below for more information. + +### Create Entry Use Case + +```typescript extensions/cms/entry/useCase/createEntryUseCase.ts +import { CreateEntry } from "./abstractions.js"; +import { CreateEntryUseCase } from "webiny/api/cms/entry"; +import { GetModelUseCase } from "webiny/api/cms/model"; + +class CreateEntryUseCaseImpl implements CreateEntry.Interface { + public constructor( + private createEntryUseCase: CreateEntryUseCase.Interface, + private getModelUseCase: GetModelUseCase.Interface + ) {} + + public async execute(params: CreateEntry.Params): CreateEntry.Return { + const model = await this.getModelUseCase.execute(params.model.modelId); + if (model.isFail()) { + throw new Error(`Could not find model ${params.model.modelId}.`); + } + + const result = await this.createEntryUseCase.execute(model.value, params.input); + if (result.isFail()) { + throw new Error(result.error.message); + } + return result.value; + } +} + +const MyCustomClassUsingTheUseCase = CreateEntry.createImplementation({ + implementation: CreateEntryUseCaseImpl, + dependencies: [CreateEntryUseCase, GetModelUseCase] +}); + +export default MyCustomClassUsingTheUseCase; +``` + + +### Update Entry Use Case + +```typescript extensions/cms/entry/useCase/createEntryUseCase.ts +import { UpdateEntry } from "./abstractions.js"; +import { GetEntryByIdUseCase, UpdateEntryUseCase } from "webiny/api/cms/entry"; +import { GetModelUseCase } from "webiny/api/cms/model"; + +class UpdateEntryUseCaseImpl implements UpdateEntry.Interface { + public constructor( + private updateEntryUseCase: UpdateEntryUseCase.Interface, + private getEntryByIdUseCase: GetEntryByIdUseCase.Interface, + private getModelUseCase: GetModelUseCase.Interface + ) {} + + public async execute(params: UpdateEntry.Params): UpdateEntry.Return { + const model = await this.getModelUseCase.execute(params.model.modelId); + if (model.isFail()) { + throw new Error(`Could not find model ${params.model.modelId}.`); + } + + const original = await this.getEntryByIdUseCase.execute(model.value, params.id); + if (original.isFail()) { + throw new Error(`Could not find entry with ID ${params.id}.`); + } + + const result = await this.updateEntryUseCase.execute( + model.value, + original.value.id, + params.input + ); + if (result.isFail()) { + throw new Error(result.error.message); + } + return result.value; + } +} + +const MyCustomClassUsingTheUseCase = UpdateEntry.createImplementation({ + implementation: UpdateEntryUseCaseImpl, + dependencies: [UpdateEntryUseCase, GetEntryByIdUseCase, GetModelUseCase] +}); + +export default MyCustomClassUsingTheUseCase; +``` + +### Create Entry Revision From Use Case + +```typescript +import { CreateEntryRevisionFromUseCase } from "webiny/api/cms/entry"; +``` + +### Delete Entry Use Case + +```typescript +import { DeleteEntryUseCase } from "webiny/api/cms/entry"; +``` + +### Delete Entry Revision Use Case + +```typescript +import { DeleteEntryRevisionUseCase } from "webiny/api/cms/entry"; +``` + +### Delete Multiple Entries Use Case + +```typescript +import { DeleteMultipleEntriesUseCase } from "webiny/api/cms/entry"; +``` + +### Move Entry Use Case + +```typescript +import { MoveEntryUseCase } from "webiny/api/cms/entry"; +``` + +### Publish Entry Use Case + +```typescript +import { PublishEntryUseCase } from "webiny/api/cms/entry"; +``` + +### Update Singleton Entry Use Case + +```typescript +import { UpdateSingletonEntryUseCase } from "webiny/api/cms/entry"; +``` + +### Get Entry By Id Use Case + +```typescript +import { GetEntryByIdUseCase } from "webiny/api/cms/entry"; +``` + +### Get Entry Use Case + +```typescript +import { GetEntryUseCase } from "webiny/api/cms/entry"; +``` + +### Get Published Entries By Ids Use Case + +```typescript +import { GetPublishedEntriesByIdsUseCase } from "webiny/api/cms/entry"; +``` + +### Get Previous Revision By Entry Id Use Case + +```typescript +import { GetPreviousRevisionByEntryIdUseCase } from "webiny/api/cms/entry"; +``` + +### Get Latest Revision By Entry Id Including Deleted Use Case + +```typescript +import { GetLatestRevisionByEntryIdIncludingDeletedUseCase } from "webiny/api/cms/entry"; +``` + +### Get Latest Entries By Ids Use Case + +```typescript +import { GetLatestEntriesByIdsUseCase } from "webiny/api/cms/entry"; +``` + +### List Entries Use Case + +```typescript +import { ListEntriesUseCase } from "webiny/api/cms/entry"; +``` + +### List Deleted Entries Use Case + +```typescript +import { ListDeletedEntriesUseCase } from "webiny/api/cms/entry"; +``` + +### List Entries Repository + +```typescript +import { ListEntriesRepository } from "webiny/api/cms/entry"; +``` + +### List Latest Entries Use Case + +```typescript +import { ListLatestEntriesUseCase } from "webiny/api/cms/entry"; +``` + +### List Published Entries Use Case + +```typescript +import { ListPublishedEntriesUseCase } from "webiny/api/cms/entry"; +``` + +### Get Latest Revision By Entry Id Use Case + +```typescript +import { GetLatestRevisionByEntryIdUseCase } from "webiny/api/cms/entry"; +``` + +### Get Entries By Ids Use Case + +```typescript +import { GetEntriesByIdsUseCase } from "webiny/api/cms/entry"; +``` + +### Get Latest Revision By Entry Id Base Use Case + +```typescript +import { GetLatestRevisionByEntryIdBaseUseCase } from "webiny/api/cms/entry"; +``` + +### Get Previous Revision By Entry Id Base Use Case + +```typescript +import { GetPreviousRevisionByEntryIdBaseUseCase } from "webiny/api/cms/entry"; +``` + +### Get Latest Deleted Revision By Entry Id Use Case + +```typescript +import { GetLatestDeletedRevisionByEntryIdUseCase } from "webiny/api/cms/entry"; +``` + +### Get Revision By Id Use Case + +```typescript +import { GetRevisionByIdUseCase } from "webiny/api/cms/entry"; +``` + +### Get Revisions By Entry Id Use Case + +```typescript +import { GetRevisionsByEntryIdUseCase } from "webiny/api/cms/entry"; +``` + +### Get Singleton Entry Use Case + +```typescript +import { GetSingletonEntryUseCase } from "webiny/api/cms/entry"; +``` + +### Get Published Revision By Entry Id Use Case + +```typescript +import { GetPublishedRevisionByEntryIdUseCase } from "webiny/api/cms/entry"; +``` + +### Unpublish Entry Use Case + +```typescript +import { UnpublishEntryUseCase } from "webiny/api/cms/entry"; +``` + +### Move Entry To Bin Use Case + +```typescript +import { MoveEntryToBinUseCase } from "webiny/api/cms/entry"; +``` + +### Republish Entry Use Case + +```typescript +import { RepublishEntryUseCase } from "webiny/api/cms/entry"; +``` + +### Restore Entry From Bin Use Case + +```typescript +import { RestoreEntryFromBinUseCase } from "webiny/api/cms/entry"; +``` + +### Validate Entry Use Case + +```typescript +import { ValidateEntryUseCase } from "webiny/api/cms/entry"; +``` diff --git a/docs/developer-docs/6.0.x/headless-cms/use-case/group.ai.txt b/docs/developer-docs/6.0.x/headless-cms/use-case/group.ai.txt new file mode 100644 index 000000000..71ef2aa8b --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/use-case/group.ai.txt @@ -0,0 +1,112 @@ +AI Context: Group Use Cases (headless-cms/use-case/group.mdx) + +Source of Information: +1. Analyzed use case patterns from existing documentation +2. Examined group use case implementations +3. Examined create, update, delete, get, list use cases +4. Studied the abstraction and implementation patterns +5. Understood repository integration + +Key Documentation Decisions: +- Document all group-related use cases +- Show abstraction creation pattern +- Include implementation examples +- Demonstrate repository integration +- Show error handling with Result pattern +- Include validation patterns +- Cover CRUD operations comprehensively + +Use Cases Documented: +1. Create Group - Create new content groups +2. Update Group - Modify existing groups +3. Delete Group - Remove groups +4. Get Group - Retrieve single group +5. List Groups - Query multiple groups + +Pattern Used: +- Interface definition +- Error types (validation, authorization, repository errors) +- createAbstraction call +- Namespace export with all types +- createImplementation pattern +- Repository dependency injection +- Result pattern for error handling +- Validation logic +- Authorization checks + +Implementation Details: +- Dependency injection of repositories +- Error type unions +- Type-safe implementations +- Result.ok() for success +- Result.fail() for errors +- Repository method calls + +Related Documents: +- headless-cms/use-case/model.mdx - Model use cases (similar pattern) +- headless-cms/use-case/entry.mdx - Entry use cases (similar pattern) +- headless-cms/event-handler/group.mdx - Event integration +- headless-cms/builder/group.mdx - Group builder +- basic/di.mdx - Abstraction patterns + +Key Code Locations: +- Use case implementations: Look for group-related use cases in the codebase + +To examine source code implementations in detail, access to the Webiny project repository is needed. + +Use Case Pattern (following established structure): +```typescript +// 1. Interface +export interface ICreateGroupUseCase { + execute(input: CreateGroupInput): Promise<Result<CmsGroup, UseCaseError>>; +} + +// 2. Errors +export interface ICreateGroupUseCaseErrors { + notAuthorized: GroupNotAuthorizedError; + validation: GroupValidationError; + repository: RepositoryError; +} +type UseCaseError = ICreateGroupUseCaseErrors[keyof ICreateGroupUseCaseErrors]; + +// 3. Abstraction +export const CreateGroupUseCase = createAbstraction<ICreateGroupUseCase>("Cms/CreateGroup"); + +// 4. Namespace +export namespace CreateGroupUseCase { + export type Interface = ICreateGroupUseCase; + export type Input = CreateGroupInput; + export type Error = UseCaseError; + export type Return = Promise<Result<CmsGroup, UseCaseError>>; +} + +// 5. Implementation +export const createGroupUseCase = CreateGroupUseCase.createImplementation({ + repository: CreateGroupRepository +}, async ({ repository }, input) => { + // Validation + // Business logic + // Persistence + return Result.ok(group); +}); +``` + +Use Cases to Document: +1. Create Group - New group with validation +2. Update Group - Modify existing group +3. Delete Group - Remove (check for models) +4. Get Group - Retrieve single group +5. List Groups - Query multiple groups + +Common Validations: +- Slug uniqueness +- Name requirements +- Authorization checks +- Model dependency (before delete) + +Tone Guidelines: +- Follow established use case pattern +- Show complete abstraction structure +- Include namespace exports +- Reference CMS entry/model for consistency + diff --git a/docs/developer-docs/6.0.x/headless-cms/use-case/group.mdx b/docs/developer-docs/6.0.x/headless-cms/use-case/group.mdx new file mode 100644 index 000000000..0da026f7e --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/use-case/group.mdx @@ -0,0 +1,119 @@ +--- +id: jdg35yg6 +title: Group Use Cases +description: About Headless CMS Group Use Cases +--- +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What are available use cases for Headless CMS Groups? +- How to use them? + +</Alert> + +## Overview +This article will list all the use cases available for Headless CMS Groups and explain how to use them. + +## Use Cases + +All use cases have an `execute` method that you can call to perform the action that use case is for. +Params of that method and its return type are defined in the abstraction of the use case. + +Consult the examples below for more information. + +### Create Group Use Case + +```typescript extensions/cms/group/useCase/createGroupUseCase.ts +import { CreateGroupUseCase } from "webiny/api/cms/group"; +import { CreateGroup } from "./abstraction.js"; + +class MyCustomClassUsingTheUseCaseImpl implements CreateGroup.Interface { + public constructor(private useCase: CreateGroupUseCase.Interface) {} + + public async execute(params: CreateGroup.Params): CreateGroup.Return { + /** + * User wants to create a new group in their own class + */ + const newGroup = await this.useCase.execute({ + name: params.name, + slug: params.slug + }); + if (newGroup.isFail()) { + // Handle the error + } + return newGroup.value; + } +} + +const MyCustomClassUsingTheUseCase = CreateGroup.createImplementation({ + implementation: MyCustomClassUsingTheUseCaseImpl, + dependencies: [CreateGroupUseCase] +}); + +export default MyCustomClassUsingTheUseCase; +``` + +### Update Group Use Case + +```typescript extensions/cms/group/useCase/updateGroupUseCase.ts +import {CreateGroupUseCase} from "webiny/api/cms/group"; +import {UpdateGroup} from "./abstraction.js"; + +class MyCustomClassUsingTheUseCaseImpl implements UpdateGroup.Interface { + public constructor(private useCase: UpdateGroupUseCase.Interface) {} + + public async execute(params: UpdateGroup.Params): UpdateGroup.Return { + /** + * User wants to update a group in their own class + */ + const newGroup = await this.useCase.execute({ + name: params.name, + slug: params.slug + }); + if (newGroup.isFail()) { + // Handle the error + } + return newGroup.value; + } +} + +const MyCustomClassUsingTheUseCase = UpdateGroup.createImplementation({ + implementation: MyCustomClassUsingTheUseCaseImpl, + dependencies: [CreateGroupUseCase] +}); + +export default MyCustomClassUsingTheUseCase; +``` + +### Delete Group Use Case + +```typescript extensions/cms/group/useCase/deleteGroupUseCase.ts +import { CreateGroupUseCase } from "webiny/api/cms/group"; +import { DeleteGroup } from "./abstraction.js"; + +class MyCustomClassUsingTheUseCaseImpl implements DeleteGroup.Interface { + public constructor(private useCase: DeleteGroupUseCase.Interface) {} + + public async execute(params: DeleteGroup.Params): DeleteGroup.Return { + /** + * User wants to delete a group in their own class + */ + const newGroup = await this.useCase.execute({ + name: params.name, + slug: params.slug + }); + if (newGroup.isFail()) { + // Handle the error + } + return newGroup.value; + } +} + +const MyCustomClassUsingTheUseCase = DeleteGroup.createImplementation({ + implementation: MyCustomClassUsingTheUseCaseImpl, + dependencies: [CreateGroupUseCase] +}); + +export default MyCustomClassUsingTheUseCase; +``` diff --git a/docs/developer-docs/6.0.x/headless-cms/use-case/model.ai.txt b/docs/developer-docs/6.0.x/headless-cms/use-case/model.ai.txt new file mode 100644 index 000000000..5b34a2382 --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/use-case/model.ai.txt @@ -0,0 +1,130 @@ +AI Context: Model Use Cases (headless-cms/use-case/model.mdx) + +Source of Information: +1. Analyzed use case patterns from group and entry use cases +2. Examined model use case implementations +3. Examined create, update, delete, get, list use cases +4. Studied model-specific validation and business logic +5. Understood field validation and model structure requirements + +Key Documentation Decisions: +- Document all model-related use cases +- Show abstraction creation pattern +- Include implementation examples +- Demonstrate repository integration +- Show model-specific validations (fields, API names) +- Include error handling with Result pattern +- Cover CRUD operations comprehensively + +Use Cases Documented: +1. Create Model - Create new content models +2. Update Model - Modify existing models +3. Delete Model - Remove models +4. Get Model - Retrieve single model +5. List Models - Query multiple models + +Pattern Used: +- Interface definition +- Error types (validation, authorization, repository errors) +- createAbstraction call +- Namespace export with all types +- createImplementation pattern +- Repository dependency injection +- Result pattern for error handling +- Model-specific validation (field structure, naming) +- Authorization checks + +Model-Specific Validations: +- Required field presence +- API name format validation +- Field structure validation +- Duplicate field ID checks +- Breaking change prevention + +Implementation Details: +- Dependency injection of repositories +- Complex validation logic +- Type-safe implementations +- Model structure validation +- Field management + +Related Documents: +- headless-cms/use-case/group.mdx - Group use cases (similar pattern) +- headless-cms/use-case/entry.mdx - Entry use cases (similar pattern) +- headless-cms/event-handler/model.mdx - Event integration +- headless-cms/builder/model.mdx - Model builder +- basic/di.mdx - Abstraction patterns + +Key Code Locations: +- Use case implementations: Look for model-related use cases in the codebase + +To examine source code implementations in detail, access to the Webiny project repository is needed. + +Model Use Case Pattern: +```typescript +// 1. Interface +export interface ICreateModelUseCase { + execute(input: CreateModelInput): Promise<Result<CmsModel, UseCaseError>>; +} + +// 2. Errors +export interface ICreateModelUseCaseErrors { + notAuthorized: ModelNotAuthorizedError; + validation: ModelValidationError; + repository: RepositoryError; +} +type UseCaseError = ICreateModelUseCaseErrors[keyof ICreateModelUseCaseErrors]; + +// 3. Abstraction +export const CreateModelUseCase = createAbstraction<ICreateModelUseCase>("Cms/CreateModel"); + +// 4. Namespace +export namespace CreateModelUseCase { + export type Interface = ICreateModelUseCase; + export type Input = CreateModelInput; + export type Error = UseCaseError; + export type Return = Promise<Result<CmsModel, UseCaseError>>; +} +``` + +Use Cases to Document: +1. Create Model - New model with field validation +2. Update Model - Modify with breaking change checks +3. Delete Model - Remove (check for entries) +4. Get Model - Retrieve single model +5. List Models - Query multiple models + +Model-Specific Validations: +- Field structure validation (required fields) +- API name format (singularApiName, pluralApiName) +- Field type validation +- Duplicate field ID checks +- Breaking change detection (update) +- Entry existence check (delete) + +Critical Validations: +```typescript +// API name validation +if (!/^[A-Z][a-zA-Z0-9]*$/.test(input.singularApiName)) { + return Result.fail(new ValidationError("Invalid API name")); +} + +// Field structure validation +const hasIdField = input.fields.some(f => f.fieldId === "id"); +if (!hasIdField) { + return Result.fail(new ValidationError("Model must have 'id' field")); +} + +// Before delete - check entries +const entries = await context.cms.entries.list(model.modelId); +if (entries.length > 0) { + return Result.fail(new ValidationError("Cannot delete model with entries")); +} +``` + +Tone Guidelines: +- Show model-specific validation complexity +- Explain field structure requirements +- Include breaking change considerations +- Reference builder for model structure + diff --git a/docs/developer-docs/6.0.x/headless-cms/use-case/model.mdx b/docs/developer-docs/6.0.x/headless-cms/use-case/model.mdx new file mode 100644 index 000000000..14a76d1d6 --- /dev/null +++ b/docs/developer-docs/6.0.x/headless-cms/use-case/model.mdx @@ -0,0 +1,192 @@ +--- +id: kq2numnh +title: Model Use Cases +description: About Headless CMS Model Use Cases +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What are available use cases for Headless CMS Models? +- How to use them? + +</Alert> + +## Overview +This article will list all the use cases available for Headless CMS Models and explain how to use them. + +## Use Cases + +All use cases have an `execute` method that you can call to perform the action that use case is for. +Params of that method and its return type are defined in the abstraction of the use case. + +Consult the examples below for more information. + +### Create Model Use Case + +```typescript extensions/cms/model/useCase/createModelUseCase.ts +import { CreateModelUseCase } from "webiny/api/cms/model"; +import { ListGroupsUseCase } from "webiny/api/cms/group"; +import { CreateModel } from "./abstraction.js"; + +class MyCustomClassUsingTheUseCaseImpl implements CreateModel.Interface { + public constructor( + private createModelUseCase: CreateModelUseCase.Interface, + private listGroupsUseCase: ListGroupsUseCase.Interface + ) {} + + public async execute(params: CreateModel.Params): CreateModel.Return { + const groups = await this.listGroupsUseCase.execute(); + if (groups.isFail()) { + throw new Error("Could not load groups."); + } else if (groups.value.length === 0) { + throw new Error("No groups found. Please create a group first."); + } + const group = groups.value[0]; + + const newModel = await this.createModelUseCase.execute({ + name: params.name, + modelId: params.modelId, + singularApiName: params.singularApiName, + pluralApiName: params.pluralApiName, + group: group.slug, + fields: [], + layout: [] + }); + if (newModel.isFail()) { + throw new Error(newModel.error.message); + } + return newModel.value; + } +} + +const MyCustomClassUsingTheUseCase = CreateModel.createImplementation({ + implementation: MyCustomClassUsingTheUseCaseImpl, + dependencies: [CreateModelUseCase, ListGroupsUseCase] +}); + +export default MyCustomClassUsingTheUseCase; +``` + +### Create Model From Existing One Use Case + +```typescript extensions/cms/model/useCase/createModelFromUseCase.ts +import {CreateModelFromUseCase} from "webiny/api/cms/model"; +import {ListGroupsUseCase} from "webiny/api/cms/group"; +import {CreateModelFrom} from "./abstraction.js"; + +class MyCustomClassUsingTheUseCaseImpl implements CreateModelFrom.Interface { + public constructor( + private createModelFromUseCase: CreateModelFromUseCase.Interface, + private listGroupsUseCase: ListGroupsUseCase.Interface + ) {} + + public async execute(params: CreateModelFrom.Params): CreateModelFrom.Return { + const groups = await this.listGroupsUseCase.execute(); + if (groups.isFail()) { + throw new Error("Could not load groups."); + } else if (groups.value.length === 0) { + throw new Error("No groups found. Please create a group first."); + } + const group = groups.value[0]; + + const newModelFromExistingOne = await this.createModelFromUseCase.execute( + "originalModelId", + { + name: params.name, + modelId: params.modelId, + singularApiName: params.singularApiName, + pluralApiName: params.pluralApiName, + group: group.slug + } + ); + if (newModelFromExistingOne.isFail()) { + throw new Error(newModelFromExistingOne.error.message); + } + return newModelFromExistingOne.value; + } +} + +const MyCustomClassUsingTheUseCase = CreateModelFrom.createImplementation({ + implementation: MyCustomClassUsingTheUseCaseImpl, + dependencies: [CreateModelFromUseCase, ListGroupsUseCase] +}); + +export default MyCustomClassUsingTheUseCase; +``` + +### Update Model Use Case + +```typescript extensions/cms/model/useCase/updateModelUseCase.ts +import { GetModelUseCase, UpdateModelUseCase } from "webiny/api/cms/model"; +import { UpdateModel } from "./abstraction.js"; + +class MyCustomClassUsingTheUseCaseImpl implements UpdateModel.Interface { + public constructor( + private updateModelUseCase: UpdateModelUseCase.Interface, + private getModelUseCase: GetModelUseCase.Interface + ) {} + + public async execute(modelId: string, params: UpdateModel.Params): UpdateModel.Return { + const original = await this.getModelUseCase.execute(modelId); + if (original.isFail()) { + throw new Error(`Could not find model ${modelId}.`); + } + const model = original.value; + + const newModel = await this.updateModelUseCase.execute(modelId, { + ...model, + ...params + }); + if (newModel.isFail()) { + throw new Error(newModel.error.message); + } + return newModel.value; + } +} + +const MyCustomClassUsingTheUseCase = UpdateModel.createImplementation({ + implementation: MyCustomClassUsingTheUseCaseImpl, + dependencies: [UpdateModelUseCase, GetModelUseCase] +}); + +export default MyCustomClassUsingTheUseCase; +``` + +### Delete Model Use Case + +```typescript extensions/cms/model/useCase/deleteModelUseCase.ts +import { DeleteModelUseCase, GetModelUseCase } from "webiny/api/cms/model"; +import { DeleteModel } from "./abstraction.js"; + +class MyCustomClassUsingTheUseCaseImpl implements DeleteModel.Interface { + public constructor( + private deleteModelUseCase: DeleteModelUseCase.Interface, + private getModelUseCase: GetModelUseCase.Interface + ) {} + + public async execute(modelId: string): DeleteModel.Return { + const original = await this.getModelUseCase.execute(modelId); + if (original.isFail()) { + throw new Error(`Could not find model ${modelId}.`); + } + const model = original.value; + const result = await this.deleteModelUseCase.execute(modelId); + + if (result.isFail()) { + throw new Error(result.error.message); + } + return model; + } +} + +const MyCustomClassUsingTheUseCase = DeleteModel.createImplementation({ + implementation: MyCustomClassUsingTheUseCaseImpl, + dependencies: [DeleteModelUseCase, GetModelUseCase] +}); + +export default MyCustomClassUsingTheUseCase; + + +``` diff --git a/docs/developer-docs/6.0.x/navigation.tsx b/docs/developer-docs/6.0.x/navigation.tsx new file mode 100644 index 000000000..bacac97b7 --- /dev/null +++ b/docs/developer-docs/6.0.x/navigation.tsx @@ -0,0 +1,156 @@ +import React from "react"; +import { Group, NavigationRoot, Page, Separator } from "@webiny/docs-generator"; + +export const Navigation = ({ children }: { children: React.ReactNode }) => { + return ( + <NavigationRoot directory={__dirname}> + <Group + title={"Get Started"} + icon={"/docs-menu-icons/get-started.svg"} + link={"get-started/install-webiny"} + > + <Page link={"get-started/welcome"} /> + <Page link={"get-started/install-webiny"} /> + </Group> + <Group title={"Basic"} icon={"/docs-menu-icons/webiny-overview.svg"} link={"basic/result"}> + <Page link={"basic/result"} /> + <Page link={"basic/di"} /> + </Group> + <Group + title={"Headless CMS"} + icon={"/docs-menu-icons/headless-cms.svg"} + link={"headless-cms/about"} + > + <Page link={"headless-cms/about"} /> + <Group title={"Backend"}> + <Page link={"headless-cms/event-handler/group"} /> + <Page link={"headless-cms/event-handler/model"} /> + <Page link={"headless-cms/event-handler/entry"} /> + <Page link={"headless-cms/event-handler/entry-extended"} /> + + <Page link={"headless-cms/use-case/group"} /> + <Page link={"headless-cms/use-case/model"} /> + <Page link={"headless-cms/use-case/entry"} /> + + <Page link={"headless-cms/builder/group"} /> + <Page link={"headless-cms/builder/model"} /> + <Page link={"headless-cms/builder/field"} /> + + <Page link={"headless-cms/examples/private-model"} /> + <Page link={"headless-cms/examples/single-entry-model"} /> + </Group> + <Group title={"UI"}> + <Page link={"headless-cms/ui/field-renderer"} /> + </Group> + </Group> + <Group + title={"Tenant Manager"} + icon={"/docs-menu-icons/webiny-overview.svg"} + link={"tenant-manager/manage-tenants"} + > + <Page link={"tenant-manager/manage-tenants"} title={"Manage Tenants"} /> + <Page link={"tenant-manager/extend-tenant-model"} title={"Extend Tenant Model"} /> + </Group> + <Group title={"GraphQL"} icon={"/docs-menu-icons/webiny-overview.svg"} link={"graphql/about"}> + <Page link={"graphql/about"} /> + <Page link={"graphql/reference"} /> + <Page link={"graphql/example"} /> + </Group> + <Group title={"Tasks"} icon={"/docs-menu-icons/webiny-overview.svg"} link={"tasks/about"}> + <Page link={"tasks/about"} /> + <Page link={"tasks/reference"} /> + <Page link={"tasks/management"} /> + </Group> + <Group title={"CLI"} icon={"/docs-menu-icons/webiny-overview.svg"} link={"cli/deploy"}> + <Page link={"cli/deploy"} /> + <Page link={"cli/destroy"} /> + <Page link={"cli/output"} /> + <Page link={"cli/watch"} /> + <Page link={"cli/pulumi"} /> + <Page link={"cli/info"} /> + </Group> + <Group + title={"Reference"} + icon={"/docs-menu-icons/core-dev-concepts.svg"} + link={"reference/api/cms/entry"} + > + {/* __REFERENCE_PAGES_START__ */} + <Page link={"reference/extensions"} /> + <Group title={"Admin"} link={"reference/admin"}> + <Page link={"reference/admin"} title={"Root"} /> + <Page link={"reference/admin/aco"} title={"ACO"} /> + <Page link={"reference/admin/build-params"} title={"Build Params"} /> + <Page link={"reference/admin/configs"} title={"Configs"} /> + <Page link={"reference/admin/env-config"} title={"Env Config"} /> + <Page link={"reference/admin/form"} title={"Form"} /> + <Page link={"reference/admin/graphql-client"} title={"Graphql Client"} /> + <Page link={"reference/admin/lexical"} title={"Lexical Editor"} /> + <Page link={"reference/admin/local-storage"} title={"Local Storage"} /> + <Page link={"reference/admin/router"} title={"Router"} /> + <Page link={"reference/admin/tenancy"} title={"Tenancy"} /> + <Page link={"reference/admin/ui"} title={"UI"} /> + <Group title={"CMS"} link={"reference/admin/cms"}> + <Page link={"reference/admin/cms"} title={"Root"} /> + <Page link={"reference/admin/cms/entry/editor"} title={"Editor"} /> + <Page link={"reference/admin/cms/entry/list"} title={"List"} /> + <Page link={"reference/admin/cms/fieldRenderers/dynamic-zone"} title={"Dynamic Zone"} /> + <Page link={"reference/admin/cms/fieldRenderers/object"} title={"Object"} /> + <Page link={"reference/admin/cms/lexical"} title={"Lexical Editor"} /> + <Page link={"reference/admin/cms/model"} title={"Model"} /> + </Group> + <Group title={"Website Builder"} link={"reference/admin/website-builder"}> + <Page link={"reference/admin/website-builder"} title={"Root"} /> + <Page link={"reference/admin/website-builder/lexical"} title={"Lexical Editor"} /> + <Page link={"reference/admin/website-builder/page/editor"} title={"Editor"} /> + <Page link={"reference/admin/website-builder/page/list"} title={"List"} /> + <Page link={"reference/admin/website-builder/redirect/list"} title={"List"} /> + </Group> + </Group> + <Group title={"API"} link={"reference/api/cms/entry"}> + <Page link={"reference/api"} title={"Root"} /> + <Page link={"reference/api/build-params"} title={"Build Params"} /> + <Page link={"reference/api/event-publisher"} title={"Event Publisher"} /> + <Page link={"reference/api/graphql"} title={"GraphQL"} /> + <Page link={"reference/api/key-value-store"} title={"Key Value Store"} /> + <Page link={"reference/api/logger"} title={"Logger"} /> + <Page link={"reference/api/system"} title={"System"} /> + <Page link={"reference/api/tasks"} title={"Tasks"} /> + <Page link={"reference/api/tenancy"} title={"Tenancy"} /> + <Page link={"reference/api/tenant-manager"} title={"Tenant Manager"} /> + <Group title={"CMS"} link={"reference/api/cms/entry"}> + <Page link={"reference/api/cms/entry"} title={"Entry"} /> + <Page link={"reference/api/cms/group"} title={"Group"} /> + <Page link={"reference/api/cms/model"} title={"Model"} /> + </Group> + <Group title={"Security"} link={"reference/api/security"}> + <Page link={"reference/api/security"} title={"Root"} /> + <Page link={"reference/api/security/api-key"} title={"Api Key"} /> + <Page link={"reference/api/security/authentication"} title={"Authentication"} /> + <Page link={"reference/api/security/role"} title={"Role"} /> + <Page link={"reference/api/security/user"} title={"User"} /> + </Group> + <Group title={"Website Builder"} link={"reference/api/website-builder/page"}> + <Page link={"reference/api/website-builder/nextjs"} title={"Next.js"} /> + <Page link={"reference/api/website-builder/page"} title={"Page"} /> + <Page link={"reference/api/website-builder/redirect"} title={"Redirect"} /> + </Group> + </Group> + <Group title={"CLI"} link={"reference/cli/overview"}> + <Page link={"reference/cli/overview"} title={"Root"} /> + <Page link={"reference/cli/command"} title={"Command"} /> + </Group> + <Group title={"Infrastructure"} link={"reference/infra/overview"}> + <Page link={"reference/infra/overview"} title={"Root"} /> + <Page link={"reference/infra/admin"} title={"Admin"} /> + <Page link={"reference/infra/api"} title={"API"} /> + <Page link={"reference/infra/core"} title={"Core"} /> + </Group> + {/* __REFERENCE_PAGES_END__ */} + </Group> + <Page link={"overview/pricing"} hidden={true} /> + <Page link={"overview/features/security"} hidden={true} /> + <Separator /> + {children} + </NavigationRoot> + ); +}; diff --git a/docs/developer-docs/6.0.x/overview/features/security.mdx b/docs/developer-docs/6.0.x/overview/features/security.mdx new file mode 100644 index 000000000..f4c0995f0 --- /dev/null +++ b/docs/developer-docs/6.0.x/overview/features/security.mdx @@ -0,0 +1,102 @@ +--- +id: aafeaacb +title: Security +description: Overview of Webiny security strategy. +--- + +import { Alert } from "@/components/Alert"; + +<Alert type="success" title="What You’ll Learn"> + +- How we approach security +- Additional security recommendations + +</Alert> + +## About + +If we don't have security, we can't really say we have a good product. Although Webiny is a self-hosted solution, meaning you control your security, it's still important for us to provide an overview of our security practices. This will make you acquainted with our approach, and will make it easier to align your implementation to some of the best practices we established. + +This being an overview article, it will provide the main elements and a clear distinction in terms of the security responsibilities that are on your end in comparison to the ones being handled by Webiny. + +We've structured the article into 4 main sections: + +- **Codebase** - how we ensure our codebase isn't compromised +- **Infrastructure** - how the security layer is implemented as part of the infrastructure that Webiny deploys +- **Application** - how Webiny protects the application from unauthorized access +- **Data** - how your data is stored and secured + +## Codebase + +Webiny, being an open-source project, our code is public, and with that comes great responsibility for the security aspects around it. + +Our code-base is regularly scanned for vulnerabilities by [CodeQL](https://securitylab.github.com/tools/codeql)—the world’s most powerful code analysis engine. + +All the 3rd party dependencies we use are scanned via [Dependabot](https://dependabot.com). + +No single change made to our codebase skips these checks. + +## Infrastructure + +Webiny is designed to run on top of the AWS cloud at the moment, with support for other clouds coming at a later point. + + +The serverless services Webiny uses as part of its architecture are fault-tolerant by design. The only exception is Elasticsearch. In the Webiny production deployment stack, Elasticsearch is automatically deployed in multiple AZs, making it highly-available. Any public access, in both VPC and non-VPC deployment is restricted. + +With Webiny there are zero servers you need to manage, reducing the risk of a security breach due to misconfiguration. Serverless services are tested by the cloud provider against all forms of attacks across millions of customers, giving your confidence in their security. Serverless services in general reduce the potential attack vectors that can be used against your application. + +Webiny ships with 2 infrastructure stacks by default, a development one and a production one. + +<Alert type="warning" title="Use the right stack"> + +We highly recommend that you use the production stack for all your projects running production traffic. + +</Alert> + +The production stack by default is deployed inside a private VPC preventing direct access to resources like DynamoDB and the Elasticsearch database. Keeping your data safe. + +Additional security improvements you can make to your project: + +- **Firewall**: Webiny intentionally deploys a CloudFront web distribution in front of an API Gateway. This setup allows you to place a web application firewall to all incoming requests for added security. + +## Application + +Webiny is built to support different authentication mechanisms. Out of the box, it is configured to work with [AWS Cognito](https://aws.amazon.com/cognito/), an enterprise-grade, battle-tested identity provider. The framework, however, supports any identity provider, by means of plugins. + +Webiny draws a very clear line between **authentication** and **authorization**. We rely on third-party IdPs for authentication and use a very flexible system of permissions for authorization. + +Authorization is usually very closely tied to business logic, so using scopes from the JWT, or simple string-based roles is not enough for complex business applications. To allow different types of integration, we provide a very thin security framework, based on plugins. On top of that, we define permissions as rich objects with different application-related properties. + +## Data + +Because Webiny is self-hosted and under the MIT license, your data stays within your cloud infrastructure. In practice, this usually means there is no need for any legal, data compliance or GDPR changes to be made when adopting Webiny. + +When it comes to storing your data, it's saved inside a DynamoDB database and Elasticsearch, and files are stored inside an S3 bucket. + +All the data inside DynamoDB is encrypted in transit and at rest by default. + +All the data inside Elasticsearch is encrypted at transit only, by default. + +<Alert type="info" title="Elasticsearch Encrypt at rest"> + +For production cases, we recommend you also encrypt data at rest in Elasticsearch. Ensure you have a proper key management strategy in place beforehand otherwise it could lead to making your data inaccessible. For more info visit: https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/encryption-at-rest.html + +</Alert> + +The data inside S3 bucket by default is not encrypted, is set to be publicly accessible and versioning is turned off. Public access is only allowed on the `list` command. Write operations need to be signed with a security token to be allowed. We advise that you adjust these parameters to the needs of your project accordingly. + +<Alert type="info" title="Making S3 private"> + +If needed you can restrict access to the S3 buckets by modifying the ACL policy inside the Pulumi infrastructure files. At the moment if you make the S3 bucket private to non-authorized users, images embedded in the Page Builder and other places will not be displayed and potentially the Admin app might be made inaccessible. Please contact us in case you need to make your S3 completely private. + +</Alert> + +## FAQ + +### Can I use a different identity provider? + +Yes, absolutely. The default IdP implementation contains a set of plugins on the API and React sides. All you need to do is follow the same principle and implement your own plugins that will work with the IdP of your choice. + +### Can I roll my own authentication system instead of using a third-party IdP? + +We don't recommend it, but yes, you can. Following the same implementation strategy that comes with Webiny by default, you can create all kinds of authentication mechanisms. diff --git a/docs/developer-docs/6.0.x/overview/pricing.mdx b/docs/developer-docs/6.0.x/overview/pricing.mdx new file mode 100644 index 000000000..0b730f2d8 --- /dev/null +++ b/docs/developer-docs/6.0.x/overview/pricing.mdx @@ -0,0 +1,66 @@ +--- +id: aafeab41 +title: Pricing Tiers +description: How is Webiny priced and what are the available options. +--- + +import { Alert } from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is Webiny's business model? +- What is commercial open-source software? +- What are the different Webiny pricing tiers? + +</Alert> + +Webiny is an open-source project and at such, all our code is open to the public on our [GitHub repository](https://github.com/webiny/webiny-js). However building an open-source project and a business, in the past have been two different things. But lately, they have come together into what's today known as Commercial Open Source Software (COSS) and this is the model Webiny as a project has embraced. + +<Alert type="info" title="Want to learn more about COSS?"> + +Here's is a great article on the topic of Commercial Open-Source: +https://www.webiny.com/blog/what-is-commercial-open-source + +</Alert> + +## Webiny's Dual License Model + +Majority of Webiny's code base (over 95%) is licensed under the MIT open-source license. As such, you are given the right to use that code for any type of use-cases, projects, be commercial or not. You're allowed to make changes to the project and you can even resell it if you want to. We are a strong believer that open-source is the only way software will be written and distributed in the future and we are commited to such a cause ourselves. + +However, as a fairly young company we need to ensure the long-term success of our project. Webiny is already a large project, and it's growing. As such it requires a dedicated team working full time to maintain, build and fix things, alongside the contributions coming from the community. To ensure their long-term sustainability, many open-source projects add a commercial aspect to their project. + +This is usually done through either offering a cloud version, or a dual-license offering. Certain features might not be available under the free OSS license, but instead under a commercial license. Which might, or might not, be open-source. <u>**It's important to distiguish that open-source doesn't mean "free"**</u>. If only means the code is open for public to view, modify and enhance. Still to use the code, the user must adhear to the terms of the license. + +<Alert type="info" title="Learn more about what it means to be open-source"> + +What is open-source? https://opensource.com/resources/what-open-source + +</Alert> + +Alongside the MIT license, Webiny also has a commercial license that comes with a cost, which unlocks additional features and functionality within the system. The revenue we get from this license is directly reinvested into building more features, and making the platform better and enjoyable to use. This is how we are building a sustainable model around our business, and ensuring the long-term development of our project. + +## Webiny Pricing Tiers + +Webiny comes in these three pricing tiers: + +- **Free** + - for personal and hobby projects + - has only basic security options + - doesn't support multi-tenancy + - all code is licensed under the MIT open-source license + - 100% free to use without any restrictions +- **Business** + - for small team projects + - supports advanced roles and permissions + - supports optional addons such as Publishing Workflow and Headless Pages + - supports multi-tenancy + - all the code is open-source, but it's a mix of the MIT license and the Webiny's commerical license, users are allowed to make modifications to the code regardless of the license + - price starts at $9 user/month, first user is free +- **Enterprise** + - for teams working on critical projects + - comes with SSO and team management + - includes SLA support and consultancy services + - all the code is open-source, but it's a mix of the MIT license and the Webiny's commerical license, users are allowed to make modifications to the code regardless of the license + - price starts at $3,499 / month + +For more details on the pricing tier, please visit our [pricing page](https://www.webiny.com/pricing). For any additional questions, please email us at [sales@webiny.com](mailto:sales@webiny.com). diff --git a/docs/developer-docs/6.0.x/reference/admin.ai.txt b/docs/developer-docs/6.0.x/reference/admin.ai.txt new file mode 100644 index 000000000..656e3a84a --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin.ai.txt @@ -0,0 +1,28 @@ +AI Context: Admin (reference/admin.mdx) + +Source of Information: +1. packages/webiny/src/admin.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app/src/shared/di/useFeature.ts — originating source +3. /Users/adrian/dev/wby-next/packages/app/src/errors/index.ts — originating source +4. /Users/adrian/dev/wby-next/packages/app-admin/src/permissions/index.ts — originating source +5. /Users/adrian/dev/wby-next/packages/app-admin/src/features/buildParams/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +useFeature, NetworkErrorEventHandler, createPermissionSchema, createHasPermission, createUsePermissions, BuildParam, BuildParams + +Import Path: webiny/admin + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin.mdx b/docs/developer-docs/6.0.x/reference/admin.mdx new file mode 100644 index 000000000..53b845e6b --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin.mdx @@ -0,0 +1,222 @@ +--- +id: ywrtaw40 +title: Admin +description: "Admin app core: createFeature, createAbstraction, Provider, Plugin" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- Which event handlers can you implement? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin`. Import any of the items below directly from this path in your Webiny extensions. + +**Hooks** + +<SymbolList symbols={[{ name: "useFeature", anchor: "use-feature" }]} /> + +**Other** + +<SymbolList + symbols={[ + { name: "BuildParam", anchor: "build-param" }, + { name: "BuildParams", anchor: "build-params" }, + { name: "createHasPermission", anchor: "create-has-permission" }, + { name: "createPermissionSchema", anchor: "create-permission-schema" }, + { name: "createUsePermissions", anchor: "create-use-permissions" }, + { name: "NetworkErrorEventHandler", anchor: "network-error-event-handler" } + ]} +/> + +## Hooks + +### `useFeature` + +**Function** — imported from `webiny/admin` + +```typescript +import { useFeature } from "webiny/admin"; +``` + +```typescript +export function useFeature<TExports>(feature: FeatureDefinition<TExports, any[]>): TExports; +``` + +## Other + +### `BuildParam` + +**Abstraction** — imported from `webiny/admin` + +```typescript +import { BuildParam } from "webiny/admin"; +``` + +**Interface `BuildParam.Interface`:** + +```typescript +interface BuildParam.Interface { + key: string; + value: any; +} +``` + +**Types:** + +```typescript +namespace BuildParam { + type Interface = IBuildParam; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { BuildParam } from "webiny/admin"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private buildParam: BuildParam.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.buildParam.key: string(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [BuildParam] +}); +``` + +### `BuildParams` + +**Abstraction** — imported from `webiny/admin` + +```typescript +import { BuildParams } from "webiny/admin"; +``` + +**Interface `BuildParams.Interface`:** + +```typescript +interface BuildParams.Interface { + get<T = any>(key: string): T | null; +} +``` + +**Types:** + +```typescript +namespace BuildParams { + type Interface = IBuildParams; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { BuildParams } from "webiny/admin"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private buildParams: BuildParams.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.buildParams.get(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [BuildParams] +}); +``` + +### `createHasPermission` + +**Function** — imported from `webiny/admin` + +```typescript +import { createHasPermission } from "webiny/admin"; +``` + +```typescript +export function createHasPermission<const S extends PermissionSchemaConfig>( + schema: S +): React.FC<HasPermissionProps<S>>; +``` + +### `createPermissionSchema` + +**Function** — imported from `webiny/admin` + +```typescript +import { createPermissionSchema } from "webiny/admin"; +``` + +```typescript +export function createPermissionSchema<const T extends PermissionSchemaConfig>(config: T): T; +``` + +### `createUsePermissions` + +**Function** — imported from `webiny/admin` + +```typescript +import { createUsePermissions } from "webiny/admin"; +``` + +```typescript +export function createUsePermissions<const S extends PermissionSchemaConfig>( + schema: S +): () => UsePermissionsResult<S>; +``` + +### `NetworkErrorEventHandler` + +**Event Handler Abstraction** — imported from `webiny/admin` + +```typescript +import { NetworkErrorEventHandler } from "webiny/admin"; +``` + +**Interface `NetworkErrorEventHandler.Interface`:** + +```typescript +interface NetworkErrorEventHandler.Interface { + handle(event: NetworkErrorEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace NetworkErrorEventHandler { + type Interface = IEventHandler<NetworkErrorEvent>; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { NetworkErrorEventHandler } from "webiny/admin"; + +class MyHandler implements NetworkErrorEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: NetworkErrorEventHandler.Event): Promise<void> { + // implementation + } +} + +export default NetworkErrorEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/aco.ai.txt b/docs/developer-docs/6.0.x/reference/admin/aco.ai.txt new file mode 100644 index 000000000..735f21b6d --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/aco.ai.txt @@ -0,0 +1,26 @@ +AI Context: ACO (reference/admin/aco.mdx) + +Source of Information: +1. packages/webiny/src/admin/aco.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app-aco/src/hooks/useRecords.ts — originating source +3. /Users/adrian/dev/wby-next/packages/app-aco/src/hooks/useNavigateFolder.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +useRecords, useNavigateFolder + +Import Path: webiny/admin/aco + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/aco.mdx b/docs/developer-docs/6.0.x/reference/admin/aco.mdx new file mode 100644 index 000000000..36e32fb1a --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/aco.mdx @@ -0,0 +1,72 @@ +--- +id: ywrtaw4v +title: ACO +description: "ACO (Advanced Content Organisation) hooks and utilities" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/aco`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/aco`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "useNavigateFolder", anchor: "use-navigate-folder" }, + { name: "useRecords", anchor: "use-records" } + ]} +/> + +## `useNavigateFolder` + +**Constant** — imported from `webiny/admin/aco` + +```typescript +import { useNavigateFolder } from "webiny/admin/aco"; +``` + +```typescript +export const useNavigateFolder = () => { + const context = useContext(NavigateFolderContext); + if (!context) { + throw new Error("useNavigateFolder must be used within a NavigateFolderContext"); + } + + return context; +}; +``` + +## `useRecords` + +**Constant** — imported from `webiny/admin/aco` + +```typescript +import { useRecords } from "webiny/admin/aco"; +``` + +```typescript +export const useRecords = makeDecoratable((folderId?: string) => { + const context = useContext(SearchRecordsContext); + + if (!context) { + throw new Error("useSearchRecords must be used within a SearchRecordsContext"); + } + + const { folderIdPath } = useAcoApp(); + + const { currentFolderId } = useNavigateFolder(); + + const { + records, + loading, + meta, + +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/build-params.ai.txt b/docs/developer-docs/6.0.x/reference/admin/build-params.ai.txt new file mode 100644 index 000000000..e0c8f90e5 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/build-params.ai.txt @@ -0,0 +1,25 @@ +AI Context: Build Params (reference/admin/build-params.mdx) + +Source of Information: +1. packages/webiny/src/admin/build-params.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app-admin/src/features/buildParams/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +BuildParam, BuildParams + +Import Path: webiny/admin/build-params + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/build-params.mdx b/docs/developer-docs/6.0.x/reference/admin/build-params.mdx new file mode 100644 index 000000000..c0ea63ccf --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/build-params.mdx @@ -0,0 +1,113 @@ +--- +id: ywrtaw4v +title: Build Params +description: "Reference for webiny/admin/build-params" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/build-params`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/build-params`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "BuildParam", anchor: "build-param" }, + { name: "BuildParams", anchor: "build-params" } + ]} +/> + +## `BuildParam` + +**Abstraction** — imported from `webiny/admin/build-params` + +```typescript +import { BuildParam } from "webiny/admin/build-params"; +``` + +**Interface `BuildParam.Interface`:** + +```typescript +interface BuildParam.Interface { + key: string; + value: any; +} +``` + +**Types:** + +```typescript +namespace BuildParam { + type Interface = IBuildParam; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { BuildParam } from "webiny/admin/build-params"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private buildParam: BuildParam.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.buildParam.key: string(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [BuildParam] +}); +``` + +## `BuildParams` + +**Abstraction** — imported from `webiny/admin/build-params` + +```typescript +import { BuildParams } from "webiny/admin/build-params"; +``` + +**Interface `BuildParams.Interface`:** + +```typescript +interface BuildParams.Interface { + get<T = any>(key: string): T | null; +} +``` + +**Types:** + +```typescript +namespace BuildParams { + type Interface = IBuildParams; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { BuildParams } from "webiny/admin/build-params"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private buildParams: BuildParams.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.buildParams.get(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [BuildParams] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/buildParams.ai.txt b/docs/developer-docs/6.0.x/reference/admin/buildParams.ai.txt new file mode 100644 index 000000000..129386644 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/buildParams.ai.txt @@ -0,0 +1,25 @@ +AI Context: Build Params (reference/admin/buildParams.mdx) + +Source of Information: +1. packages/webiny/src/admin/buildParams.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app-admin/src/features/buildParams/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +BuildParam, BuildParams + +Import Path: webiny/admin/buildParams + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/buildParams.mdx b/docs/developer-docs/6.0.x/reference/admin/buildParams.mdx new file mode 100644 index 000000000..a3fd1fabb --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/buildParams.mdx @@ -0,0 +1,115 @@ +--- +id: ywrtaw4v +title: Build Params +description: "Admin build parameter types" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/buildParams`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/buildParams`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "BuildParam", anchor: "buildparam" }, + { name: "BuildParams", anchor: "buildparams" } + ]} +/> + +## `BuildParam` + +**Abstraction** — imported from `webiny/admin/buildParams` + +```typescript +import { BuildParam } from "webiny/admin/buildParams"; +``` + +**Interface `BuildParam.Interface`:** + +```typescript +interface BuildParam.Interface { + key: string; + value: any; +} +``` + +**Types:** + +```typescript +namespace BuildParam { + type Interface = IBuildParam; +} +``` + +**Usage:** + +```typescript +// extensions/MyImpl.ts +import { BuildParam } from "webiny/admin/buildParams"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private buildParam: BuildParam.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.buildParam.key: string(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [BuildParam] +}); +``` + +## `BuildParams` + +**Abstraction** — imported from `webiny/admin/buildParams` + +```typescript +import { BuildParams } from "webiny/admin/buildParams"; +``` + +**Interface `BuildParams.Interface`:** + +```typescript +interface BuildParams.Interface { + get<T = any>(key: string): T | null; +} +``` + +**Types:** + +```typescript +namespace BuildParams { + type Interface = IBuildParams; +} +``` + +**Usage:** + +```typescript +// extensions/MyImpl.ts +import { BuildParams } from "webiny/admin/buildParams"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private buildParams: BuildParams.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.buildParams.get(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [BuildParams] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/cms.ai.txt b/docs/developer-docs/6.0.x/reference/admin/cms.ai.txt new file mode 100644 index 000000000..9c71a89d5 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/cms.ai.txt @@ -0,0 +1,31 @@ +AI Context: CMS (reference/admin/cms.mdx) + +Source of Information: +1. packages/webiny/src/admin/cms.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app-headless-cms/src/admin/hooks/useQuery.ts — originating source +3. /Users/adrian/dev/wby-next/packages/app-headless-cms/src/admin/hooks/useLazyQuery.ts — originating source +4. /Users/adrian/dev/wby-next/packages/app-headless-cms/src/admin/hooks/useMutation.ts — originating source +5. /Users/adrian/dev/wby-next/packages/app-headless-cms/src/admin/components/ModelProvider/index.ts — originating source +6. /Users/adrian/dev/wby-next/packages/app-headless-cms/src/admin/hooks/usePermission.ts — originating source +7. /Users/adrian/dev/wby-next/packages/app-headless-cms/src/routes.ts — originating source +8. /Users/adrian/dev/wby-next/packages/app-headless-cms-common/src/types/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +useQuery, useLazyQuery, useMutation, useModel, usePermission, Routes, CmsContentEntry, CmsModel, CmsModelField, CmsIdentity, CmsLayoutFieldTypePlugin, CmsLayoutDescriptorRendererPlugin, CmsBaseLayoutDescriptor, CmsLayoutDescriptor + +Import Path: webiny/admin/cms + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/cms.mdx b/docs/developer-docs/6.0.x/reference/admin/cms.mdx new file mode 100644 index 000000000..7ed0fdf57 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/cms.mdx @@ -0,0 +1,295 @@ +--- +id: ywrtaw4v +title: CMS +description: "CMS admin hooks, types and utilities" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/cms`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/cms`. Import any of the items below directly from this path in your Webiny extensions. + +**Components** + +<SymbolList symbols={[{ name: "Routes", anchor: "routes" }]} /> + +**Hooks** + +<SymbolList + symbols={[ + { name: "useLazyQuery", anchor: "use-lazy-query" }, + { name: "useModel", anchor: "use-model" }, + { name: "useMutation", anchor: "use-mutation" }, + { name: "usePermission", anchor: "use-permission" }, + { name: "useQuery", anchor: "use-query" } + ]} +/> + +**Types** + +<SymbolList + symbols={[ + { name: "CmsBaseLayoutDescriptor", anchor: "cms-base-layout-descriptor" }, + { name: "CmsContentEntry", anchor: "cms-content-entry" }, + { name: "CmsIdentity", anchor: "cms-identity" }, + { name: "CmsLayoutDescriptor", anchor: "cms-layout-descriptor" }, + { name: "CmsLayoutDescriptorRendererPlugin", anchor: "cms-layout-descriptor-renderer-plugin" }, + { name: "CmsLayoutFieldTypePlugin", anchor: "cms-layout-field-type-plugin" }, + { name: "CmsModel", anchor: "cms-model" }, + { name: "CmsModelField", anchor: "cms-model-field" } + ]} +/> + +## Components + +### `Routes` + +**Constant** — imported from `webiny/admin/cms` + +```typescript +import { Routes } from "webiny/admin/cms"; +``` + +```typescript +export const Routes = { + ContentModelGroups: { + List: new Route({ + name: "Cms/ContentModelGroups/List", + path: "/cms/content-model-groups", + params: zod => { + return { + id: zod.string().optional(), + new: zod.boolean().optional() + }; + } + }) + }, + + ContentEntries: { + +``` + +## Hooks + +### `useLazyQuery` + +**Constant** — imported from `webiny/admin/cms` + +```typescript +import { useLazyQuery } from "webiny/admin/cms"; +``` + +```typescript +export const useLazyQuery = function <TData = any, TVariables = OperationVariables>( + query: DocumentNode, + options: LazyQueryHookOptions<TData, TVariables> = {} +): QueryTuple<TData, TVariables> { + const { apolloClient } = useCms(); + + return apolloUseLazyQuery<TData, TVariables>(query, { + client: apolloClient, + ...options + }); +}; +``` + +### `useModel` + +**Function** — imported from `webiny/admin/cms` + +Get model from the current context. + +```typescript +import { useModel } from "webiny/admin/cms"; +``` + +```typescript +export function useModel(): UseModelReturnType; +``` + +### `useMutation` + +**Constant** — imported from `webiny/admin/cms` + +```typescript +import { useMutation } from "webiny/admin/cms"; +``` + +```typescript +export const useMutation = function <TData = any, TVariables = OperationVariables>( + mutation: DocumentNode, + options: MutationHookOptions<TData, TVariables> = {} +): MutationTuple<TData, TVariables> { + const { apolloClient } = useCms(); + + return apolloUseMutation<TData, TVariables>(mutation, { + client: apolloClient, + ...options + }); +}; +``` + +### `usePermission` + +**Constant** — imported from `webiny/admin/cms` + +```typescript +import { usePermission } from "webiny/admin/cms"; +``` + +```typescript +export const usePermission = makeDecoratable(() => { + const { identity } = useIdentity(); + + const hasFullAccess = useMemo(() => !!identity.getPermission("cms.*"), [identity]); + + const canRead = useCallback( + (permissionName: string): boolean => { + if (hasFullAccess) { + return true; + } + const permissions = + identity.getP +``` + +### `useQuery` + +**Constant** — imported from `webiny/admin/cms` + +```typescript +import { useQuery } from "webiny/admin/cms"; +``` + +```typescript +export const useQuery = function <TData = any, TVariables = OperationVariables>( + query: DocumentNode, + options: QueryHookOptions<TData, TVariables> = {} +): QueryResult<TData, TVariables> { + const { apolloClient } = useCms(); + + return apolloUseQuery<TData, TVariables>(query, { + client: apolloClient, + skip: !apolloClient, + ...options + }); +}; +``` + +## Types + +### `CmsBaseLayoutDescriptor` + +**Type** — imported from `webiny/admin/cms` + +```typescript +import type { CmsBaseLayoutDescriptor } from "webiny/admin/cms"; +``` + +```typescript +export interface CmsBaseLayoutDescriptor { + id: string; + type: string; + rules?: FieldRule[]; +} +``` + +### `CmsContentEntry` + +**Type** — imported from `webiny/admin/cms` + +```typescript +import type { CmsContentEntry } from "webiny/admin/cms"; +``` + +```typescript +export interface CmsContentEntry<TValues extends GenericRecord = GenericRecord> { ... } +``` + +### `CmsIdentity` + +**Type** — imported from `webiny/admin/cms` + +```typescript +import type { CmsIdentity } from "webiny/admin/cms"; +``` + +```typescript +export interface CmsIdentity { + id: string; + displayName: string; + type: string; +} +``` + +### `CmsLayoutDescriptor` + +**Type** — imported from `webiny/admin/cms` + +```typescript +import type { CmsLayoutDescriptor } from "webiny/admin/cms"; +``` + +```typescript +export type CmsLayoutDescriptor = + | CmsSeparatorLayoutDescriptor + | CmsAlertLayoutDescriptor + | CmsTabLayoutDescriptor + | CmsBaseLayoutDescriptor; +``` + +### `CmsLayoutDescriptorRendererPlugin` + +**Type** — imported from `webiny/admin/cms` + +```typescript +import type { CmsLayoutDescriptorRendererPlugin } from "webiny/admin/cms"; +``` + +```typescript +export interface CmsLayoutDescriptorRendererPlugin extends Plugin { ... } +``` + +### `CmsLayoutFieldTypePlugin` + +**Type** — imported from `webiny/admin/cms` + +```typescript +import type { CmsLayoutFieldTypePlugin } from "webiny/admin/cms"; +``` + +```typescript +export interface CmsLayoutFieldTypePlugin extends Plugin { ... } +``` + +### `CmsModel` + +**Type** — imported from `webiny/admin/cms` + +```typescript +import type { CmsModel } from "webiny/admin/cms"; +``` + +```typescript +export interface CmsModel { ... } +``` + +### `CmsModelField` + +**Type** — imported from `webiny/admin/cms` + +```typescript +import type { CmsModelField } from "webiny/admin/cms"; +``` + +```typescript +export type CmsModelField<T = unknown> = T & { ... }; +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/cms/entry/editor.ai.txt b/docs/developer-docs/6.0.x/reference/admin/cms/entry/editor.ai.txt new file mode 100644 index 000000000..5fd4c6d9b --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/cms/entry/editor.ai.txt @@ -0,0 +1,28 @@ +AI Context: Editor (reference/admin/cms/entry/editor.mdx) + +Source of Information: +1. packages/webiny/src/admin/cms/entry/editor.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app-headless-cms/src/admin/components/ContentEntryForm/useContentEntryForm.ts — originating source +3. /Users/adrian/dev/wby-next/packages/app-headless-cms/src/admin/views/contentEntries/hooks/index.ts — originating source +4. /Users/adrian/dev/wby-next/packages/app-headless-cms/src/admin/config/contentEntries/index.ts — originating source +5. /Users/adrian/dev/wby-next/packages/app-headless-cms/src/admin/views/contentEntries/hooks/useSingletonContentEntry.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +useContentEntryForm, useContentEntryEditor, ContentEntryEditorConfig, useSingleEntryContentEntry + +Import Path: webiny/admin/cms/entry/editor + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/cms/entry/editor.mdx b/docs/developer-docs/6.0.x/reference/admin/cms/entry/editor.mdx new file mode 100644 index 000000000..73fea49b7 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/cms/entry/editor.mdx @@ -0,0 +1,113 @@ +--- +id: ywrtaw4v +title: Editor +description: "Content entry editor components and hooks" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/cms/entry/editor`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/cms/entry/editor`. Import any of the items below directly from this path in your Webiny extensions. + +**Components** + +<SymbolList + symbols={[{ name: "ContentEntryEditorConfig", anchor: "content-entry-editor-config" }]} +/> + +**Hooks** + +<SymbolList + symbols={[ + { name: "useContentEntryEditor", anchor: "use-content-entry-editor" }, + { name: "useContentEntryForm", anchor: "use-content-entry-form" }, + { name: "useSingleEntryContentEntry", anchor: "use-single-entry-content-entry" } + ]} +/> + +## Components + +### `ContentEntryEditorConfig` + +**Constant** — imported from `webiny/admin/cms/entry/editor` + +```typescript +import { ContentEntryEditorConfig } from "webiny/admin/cms/entry/editor"; +``` + +```typescript +export const ContentEntryEditorConfig = Object.assign(base.Config, { + Actions, + FieldElement, + Width, + ValidationIndicators: ValidationIndicatorsConfig +}); +``` + +## Hooks + +### `useContentEntryEditor` + +**Constant** — imported from `webiny/admin/cms/entry/editor` + +```typescript +import { useContentEntryEditor } from "webiny/admin/cms/entry/editor"; +``` + +```typescript +export const useContentEntry = makeDecoratable(() => { + const context = useContext(ContentEntryContext); + if (!context) { + throw Error(`useContentEntry() hook can only be used within the ContentEntryContext provider.`); + } + return context; +}); +``` + +### `useContentEntryForm` + +**Constant** — imported from `webiny/admin/cms/entry/editor` + +```typescript +import { useContentEntryForm } from "webiny/admin/cms/entry/editor"; +``` + +```typescript +export const useContentEntryForm = makeDecoratable(() => { + const context = React.useContext(ContentEntryFormContext); + if (!context) { + throw new Error("ContentEntryFormProvider is missing in the component hierarchy!"); + } + + return context; +}); +``` + +### `useSingleEntryContentEntry` + +**Constant** — imported from `webiny/admin/cms/entry/editor` + +```typescript +import { useSingleEntryContentEntry } from "webiny/admin/cms/entry/editor"; +``` + +```typescript +export const useSingletonContentEntry = makeDecoratable(() => { + const context = useContext(SingletonContentEntryContext); + if (!context) { + throw Error( + `useSingletonContentEntry() hook can only be used within the SingletonContentEntryContext provider.` + ); + } + return context; +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/cms/entry/list.ai.txt b/docs/developer-docs/6.0.x/reference/admin/cms/entry/list.ai.txt new file mode 100644 index 000000000..7c80a8db2 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/cms/entry/list.ai.txt @@ -0,0 +1,26 @@ +AI Context: List (reference/admin/cms/entry/list.mdx) + +Source of Information: +1. packages/webiny/src/admin/cms/entry/list.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app-headless-cms/src/admin/config/contentEntries/index.ts — originating source +3. /Users/adrian/dev/wby-next/packages/app-headless-cms/src/admin/hooks/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +ContentEntryListConfig, useContentEntriesList + +Import Path: webiny/admin/cms/entry/list + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/cms/entry/list.mdx b/docs/developer-docs/6.0.x/reference/admin/cms/entry/list.mdx new file mode 100644 index 000000000..4fc1e69f3 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/cms/entry/list.mdx @@ -0,0 +1,51 @@ +--- +id: ywrtaw4v +title: List +description: "Content entry list configuration" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/cms/entry/list`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/cms/entry/list`. Import any of the items below directly from this path in your Webiny extensions. + +**Components** + +<SymbolList symbols={[{ name: "ContentEntryListConfig", anchor: "content-entry-list-config" }]} /> + +**Other** + +<SymbolList symbols={[{ name: "useContentEntriesList", anchor: "use-content-entries-list" }]} /> + +## Components + +### `ContentEntryListConfig` + +**Constant** — imported from `webiny/admin/cms/entry/list` + +```typescript +import { ContentEntryListConfig } from "webiny/admin/cms/entry/list"; +``` + +```typescript +export const ContentEntryListConfig = Object.assign(PublicContentEntryListConfig, { Browser }); +``` + +## Other + +### `useContentEntriesList` + +**Export** — imported from `webiny/admin/cms/entry/list` + +```typescript +import { useContentEntriesList } from "webiny/admin/cms/entry/list"; +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/cms/fieldRenderers/dynamic-zone.ai.txt b/docs/developer-docs/6.0.x/reference/admin/cms/fieldRenderers/dynamic-zone.ai.txt new file mode 100644 index 000000000..ef5bdb06c --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/cms/fieldRenderers/dynamic-zone.ai.txt @@ -0,0 +1,25 @@ +AI Context: Dynamic Zone (reference/admin/cms/fieldRenderers/dynamic-zone.mdx) + +Source of Information: +1. packages/webiny/src/admin/cms/fieldRenderers/dynamic-zone.ts — barrel re-export file + + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: + + +Import Path: webiny/admin/cms/fieldRenderers/dynamic-zone + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/cms/fieldRenderers/dynamic-zone.mdx b/docs/developer-docs/6.0.x/reference/admin/cms/fieldRenderers/dynamic-zone.mdx new file mode 100644 index 000000000..d0715ac77 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/cms/fieldRenderers/dynamic-zone.mdx @@ -0,0 +1,21 @@ +--- +id: ywrtaw4v +title: Dynamic Zone +description: "Reference for webiny/admin/cms/fieldRenderers/dynamic-zone" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/cms/fieldRenderers/dynamic-zone`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/cms/fieldRenderers/dynamic-zone`. Import any of the items below directly from this path in your Webiny extensions. + +_No exported symbols found._ diff --git a/docs/developer-docs/6.0.x/reference/admin/cms/fieldRenderers/dynamicZone.ai.txt b/docs/developer-docs/6.0.x/reference/admin/cms/fieldRenderers/dynamicZone.ai.txt new file mode 100644 index 000000000..bcd8aad34 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/cms/fieldRenderers/dynamicZone.ai.txt @@ -0,0 +1,25 @@ +AI Context: DynamicZone (reference/admin/cms/fieldRenderers/dynamicZone.mdx) + +Source of Information: +1. packages/webiny/src/admin/cms/fieldRenderers/dynamicZone.ts — barrel re-export file + + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: + + +Import Path: webiny/admin/cms/fieldRenderers/dynamicZone + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/cms/fieldRenderers/dynamicZone.mdx b/docs/developer-docs/6.0.x/reference/admin/cms/fieldRenderers/dynamicZone.mdx new file mode 100644 index 000000000..348784ce4 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/cms/fieldRenderers/dynamicZone.mdx @@ -0,0 +1,21 @@ +--- +id: ywrtaw4v +title: DynamicZone +description: "Dynamic zone field renderer components" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/cms/fieldRenderers/dynamicZone`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/cms/fieldRenderers/dynamicZone`. Import any of the items below directly from this path in your Webiny extensions. + +_No exported symbols found._ diff --git a/docs/developer-docs/6.0.x/reference/admin/cms/fieldRenderers/object.ai.txt b/docs/developer-docs/6.0.x/reference/admin/cms/fieldRenderers/object.ai.txt new file mode 100644 index 000000000..fcd502b81 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/cms/fieldRenderers/object.ai.txt @@ -0,0 +1,25 @@ +AI Context: Object (reference/admin/cms/fieldRenderers/object.mdx) + +Source of Information: +1. packages/webiny/src/admin/cms/fieldRenderers/object.ts — barrel re-export file + + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: + + +Import Path: webiny/admin/cms/fieldRenderers/object + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/cms/fieldRenderers/object.mdx b/docs/developer-docs/6.0.x/reference/admin/cms/fieldRenderers/object.mdx new file mode 100644 index 000000000..37925bb50 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/cms/fieldRenderers/object.mdx @@ -0,0 +1,21 @@ +--- +id: ywrtaw4v +title: Object +description: "Object field renderer components" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/cms/fieldRenderers/object`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/cms/fieldRenderers/object`. Import any of the items below directly from this path in your Webiny extensions. + +_No exported symbols found._ diff --git a/docs/developer-docs/6.0.x/reference/admin/cms/lexical.ai.txt b/docs/developer-docs/6.0.x/reference/admin/cms/lexical.ai.txt new file mode 100644 index 000000000..46e31057e --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/cms/lexical.ai.txt @@ -0,0 +1,25 @@ +AI Context: Lexical Editor (reference/admin/cms/lexical.mdx) + +Source of Information: +1. packages/webiny/src/admin/cms/lexical.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/lexical-editor/src/exports/admin/lexical.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +useLexicalEditorConfig, LexicalHtmlRenderer, getNodeFromSelection, useCurrentElement, useCurrentSelection, useDeriveValueFromSelection, useRichTextEditor, useFontColorPicker, useTextAlignmentAction, useTypographyAction, useIsMounted, Divider, DropDownItem, DropDown, Klass, LexicalNode + +Import Path: webiny/admin/cms/lexical + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/cms/lexical.mdx b/docs/developer-docs/6.0.x/reference/admin/cms/lexical.mdx new file mode 100644 index 000000000..38113ff49 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/cms/lexical.mdx @@ -0,0 +1,168 @@ +--- +id: ywrtaw4v +title: Lexical Editor +description: "CMS Lexical rich-text editor config" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/cms/lexical`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/cms/lexical`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "Divider", anchor: "divider" }, + { name: "DropDown", anchor: "drop-down" }, + { name: "DropDownItem", anchor: "drop-down-item" }, + { name: "getNodeFromSelection", anchor: "get-node-from-selection" }, + { name: "Klass", anchor: "klass" }, + { name: "LexicalHtmlRenderer", anchor: "lexical-html-renderer" }, + { name: "LexicalNode", anchor: "lexical-node" }, + { name: "useCurrentElement", anchor: "use-current-element" }, + { name: "useCurrentSelection", anchor: "use-current-selection" }, + { name: "useDeriveValueFromSelection", anchor: "use-derive-value-from-selection" }, + { name: "useFontColorPicker", anchor: "use-font-color-picker" }, + { name: "useIsMounted", anchor: "use-is-mounted" }, + { name: "useLexicalEditorConfig", anchor: "use-lexical-editor-config" }, + { name: "useRichTextEditor", anchor: "use-rich-text-editor" }, + { name: "useTextAlignmentAction", anchor: "use-text-alignment-action" }, + { name: "useTypographyAction", anchor: "use-typography-action" } + ]} +/> + +## `Divider` + +**Export** — imported from `webiny/admin/cms/lexical` + +```typescript +import { Divider } from "webiny/admin/cms/lexical"; +``` + +## `DropDown` + +**Export** — imported from `webiny/admin/cms/lexical` + +```typescript +import { DropDown } from "webiny/admin/cms/lexical"; +``` + +## `DropDownItem` + +**Export** — imported from `webiny/admin/cms/lexical` + +```typescript +import { DropDownItem } from "webiny/admin/cms/lexical"; +``` + +## `getNodeFromSelection` + +**Export** — imported from `webiny/admin/cms/lexical` + +```typescript +import { getNodeFromSelection } from "webiny/admin/cms/lexical"; +``` + +## `Klass` + +**Type** — imported from `webiny/admin/cms/lexical` + +```typescript +import type { Klass } from "webiny/admin/cms/lexical"; +``` + +## `LexicalHtmlRenderer` + +**Export** — imported from `webiny/admin/cms/lexical` + +```typescript +import { LexicalHtmlRenderer } from "webiny/admin/cms/lexical"; +``` + +## `LexicalNode` + +**Type** — imported from `webiny/admin/cms/lexical` + +```typescript +import type { LexicalNode } from "webiny/admin/cms/lexical"; +``` + +## `useCurrentElement` + +**Export** — imported from `webiny/admin/cms/lexical` + +```typescript +import { useCurrentElement } from "webiny/admin/cms/lexical"; +``` + +## `useCurrentSelection` + +**Export** — imported from `webiny/admin/cms/lexical` + +```typescript +import { useCurrentSelection } from "webiny/admin/cms/lexical"; +``` + +## `useDeriveValueFromSelection` + +**Export** — imported from `webiny/admin/cms/lexical` + +```typescript +import { useDeriveValueFromSelection } from "webiny/admin/cms/lexical"; +``` + +## `useFontColorPicker` + +**Export** — imported from `webiny/admin/cms/lexical` + +```typescript +import { useFontColorPicker } from "webiny/admin/cms/lexical"; +``` + +## `useIsMounted` + +**Export** — imported from `webiny/admin/cms/lexical` + +```typescript +import { useIsMounted } from "webiny/admin/cms/lexical"; +``` + +## `useLexicalEditorConfig` + +**Export** — imported from `webiny/admin/cms/lexical` + +```typescript +import { useLexicalEditorConfig } from "webiny/admin/cms/lexical"; +``` + +## `useRichTextEditor` + +**Export** — imported from `webiny/admin/cms/lexical` + +```typescript +import { useRichTextEditor } from "webiny/admin/cms/lexical"; +``` + +## `useTextAlignmentAction` + +**Export** — imported from `webiny/admin/cms/lexical` + +```typescript +import { useTextAlignmentAction } from "webiny/admin/cms/lexical"; +``` + +## `useTypographyAction` + +**Export** — imported from `webiny/admin/cms/lexical` + +```typescript +import { useTypographyAction } from "webiny/admin/cms/lexical"; +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/cms/model.ai.txt b/docs/developer-docs/6.0.x/reference/admin/cms/model.ai.txt new file mode 100644 index 000000000..eedddd27a --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/cms/model.ai.txt @@ -0,0 +1,26 @@ +AI Context: Model (reference/admin/cms/model.mdx) + +Source of Information: +1. packages/webiny/src/admin/cms/model.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app-headless-cms-common/src/Fields/index.ts — originating source +3. /Users/adrian/dev/wby-next/packages/app-headless-cms-common/src/types/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +useFieldAccessControlRules, useEffectiveRules, CmsLayoutFieldTypePlugin, CmsLayoutDescriptorRendererPlugin, CmsBaseLayoutDescriptor, CmsLayoutDescriptor + +Import Path: webiny/admin/cms/model + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/cms/model.mdx b/docs/developer-docs/6.0.x/reference/admin/cms/model.mdx new file mode 100644 index 000000000..4be25704a --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/cms/model.mdx @@ -0,0 +1,131 @@ +--- +id: ywrtaw4v +title: Model +description: "Reference for webiny/admin/cms/model" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/cms/model`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/cms/model`. Import any of the items below directly from this path in your Webiny extensions. + +**Hooks** + +<SymbolList + symbols={[ + { name: "useEffectiveRules", anchor: "use-effective-rules" }, + { name: "useFieldAccessControlRules", anchor: "use-field-access-control-rules" } + ]} +/> + +**Types** + +<SymbolList + symbols={[ + { name: "CmsBaseLayoutDescriptor", anchor: "cms-base-layout-descriptor" }, + { name: "CmsLayoutDescriptor", anchor: "cms-layout-descriptor" }, + { name: "CmsLayoutDescriptorRendererPlugin", anchor: "cms-layout-descriptor-renderer-plugin" }, + { name: "CmsLayoutFieldTypePlugin", anchor: "cms-layout-field-type-plugin" } + ]} +/> + +## Hooks + +### `useEffectiveRules` + +**Function** — imported from `webiny/admin/cms/model` + +Composes useParentRules and useFieldRules into a single hook +that returns the effective (intersected) rules. + +```typescript +import { useEffectiveRules } from "webiny/admin/cms/model"; +``` + +```typescript +export function useEffectiveRules(item: HasRules): EffectiveFieldRules; +``` + +### `useFieldAccessControlRules` + +**Function** — imported from `webiny/admin/cms/model` + +Hook that evaluates access control rules for the current identity. +Does not require `bindParentName` — only identity-based permissions. + +```typescript +import { useFieldAccessControlRules } from "webiny/admin/cms/model"; +``` + +```typescript +export function useFieldAccessControlRules( + item: HasRules +): Pick<EffectiveFieldRules, "canView" | "canEdit">; +``` + +## Types + +### `CmsBaseLayoutDescriptor` + +**Type** — imported from `webiny/admin/cms/model` + +```typescript +import type { CmsBaseLayoutDescriptor } from "webiny/admin/cms/model"; +``` + +```typescript +export interface CmsBaseLayoutDescriptor { + id: string; + type: string; + rules?: FieldRule[]; +} +``` + +### `CmsLayoutDescriptor` + +**Type** — imported from `webiny/admin/cms/model` + +```typescript +import type { CmsLayoutDescriptor } from "webiny/admin/cms/model"; +``` + +```typescript +export type CmsLayoutDescriptor = + | CmsSeparatorLayoutDescriptor + | CmsAlertLayoutDescriptor + | CmsTabLayoutDescriptor + | CmsBaseLayoutDescriptor; +``` + +### `CmsLayoutDescriptorRendererPlugin` + +**Type** — imported from `webiny/admin/cms/model` + +```typescript +import type { CmsLayoutDescriptorRendererPlugin } from "webiny/admin/cms/model"; +``` + +```typescript +export interface CmsLayoutDescriptorRendererPlugin extends Plugin { ... } +``` + +### `CmsLayoutFieldTypePlugin` + +**Type** — imported from `webiny/admin/cms/model` + +```typescript +import type { CmsLayoutFieldTypePlugin } from "webiny/admin/cms/model"; +``` + +```typescript +export interface CmsLayoutFieldTypePlugin extends Plugin { ... } +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/configs.ai.txt b/docs/developer-docs/6.0.x/reference/admin/configs.ai.txt new file mode 100644 index 000000000..d07f212ad --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/configs.ai.txt @@ -0,0 +1,25 @@ +AI Context: Configs (reference/admin/configs.mdx) + +Source of Information: +1. packages/webiny/src/admin/configs.ts — barrel re-export file + + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: + + +Import Path: webiny/admin/configs + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/configs.mdx b/docs/developer-docs/6.0.x/reference/admin/configs.mdx new file mode 100644 index 000000000..4f863d758 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/configs.mdx @@ -0,0 +1,21 @@ +--- +id: ywrtaw4v +title: Configs +description: "Admin configuration types" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/configs`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/configs`. Import any of the items below directly from this path in your Webiny extensions. + +_No exported symbols found._ diff --git a/docs/developer-docs/6.0.x/reference/admin/env-config.ai.txt b/docs/developer-docs/6.0.x/reference/admin/env-config.ai.txt new file mode 100644 index 000000000..f06611619 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/env-config.ai.txt @@ -0,0 +1,25 @@ +AI Context: Env Config (reference/admin/env-config.mdx) + +Source of Information: +1. packages/webiny/src/admin/env-config.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app/src/features/envConfig/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +EnvConfig + +Import Path: webiny/admin/env-config + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/env-config.mdx b/docs/developer-docs/6.0.x/reference/admin/env-config.mdx new file mode 100644 index 000000000..62088ff73 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/env-config.mdx @@ -0,0 +1,33 @@ +--- +id: ywrtaw4v +title: Env Config +description: "Reference for webiny/admin/env-config" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/env-config`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/env-config`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList symbols={[{ name: "EnvConfig", anchor: "env-config" }]} /> + +## `EnvConfig` + +**Constant** — imported from `webiny/admin/env-config` + +```typescript +import { EnvConfig } from "webiny/admin/env-config"; +``` + +```typescript +export const EnvConfig = new Abstraction<IEnvConfig>("EnvConfig"); +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/envConfig.ai.txt b/docs/developer-docs/6.0.x/reference/admin/envConfig.ai.txt new file mode 100644 index 000000000..bdcd7a895 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/envConfig.ai.txt @@ -0,0 +1,25 @@ +AI Context: Env Config (reference/admin/envConfig.mdx) + +Source of Information: +1. packages/webiny/src/admin/envConfig.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app/src/features/envConfig/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +EnvConfig + +Import Path: webiny/admin/envConfig + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/envConfig.mdx b/docs/developer-docs/6.0.x/reference/admin/envConfig.mdx new file mode 100644 index 000000000..4615fe11f --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/envConfig.mdx @@ -0,0 +1,33 @@ +--- +id: ywrtaw4v +title: Env Config +description: "Environment configuration for admin" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/envConfig`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/envConfig`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList symbols={[{ name: "EnvConfig", anchor: "envconfig" }]} /> + +## `EnvConfig` + +**Constant** — imported from `webiny/admin/envConfig` + +```typescript +import { EnvConfig } from "webiny/admin/envConfig"; +``` + +```typescript +export const EnvConfig = new Abstraction<IEnvConfig>("EnvConfig"); +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/form.ai.txt b/docs/developer-docs/6.0.x/reference/admin/form.ai.txt new file mode 100644 index 000000000..132963c10 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/form.ai.txt @@ -0,0 +1,26 @@ +AI Context: Form (reference/admin/form.mdx) + +Source of Information: +1. packages/webiny/src/admin/form.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/form/src/index.ts — originating source +3. /Users/adrian/dev/wby-next/packages/validation/src/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +Bind, Form, UnsetOnUnmount, useBind, useBindPrefix, useGenerateSlug, useForm, FormApi, FormOnSubmit, GenericFormData, validation, Validation, ValidationError + +Import Path: webiny/admin/form + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/form.mdx b/docs/developer-docs/6.0.x/reference/admin/form.mdx new file mode 100644 index 000000000..11160ea49 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/form.mdx @@ -0,0 +1,296 @@ +--- +id: ywrtaw4v +title: Form +description: "Form primitives: Bind, Form, useForm, validation" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/form`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/form`. Import any of the items below directly from this path in your Webiny extensions. + +**Components** + +<SymbolList + symbols={[ + { name: "Bind", anchor: "bind" }, + { name: "Form", anchor: "form" }, + { name: "UnsetOnUnmount", anchor: "unset-on-unmount" }, + { name: "Validation", anchor: "validation" }, + { name: "ValidationError", anchor: "validation-error" } + ]} +/> + +**Hooks** + +<SymbolList + symbols={[ + { name: "useBind", anchor: "use-bind" }, + { name: "useBindPrefix", anchor: "use-bind-prefix" }, + { name: "useForm", anchor: "use-form" }, + { name: "useGenerateSlug", anchor: "use-generate-slug" } + ]} +/> + +**Types** + +<SymbolList + symbols={[ + { name: "FormApi", anchor: "form-api" }, + { name: "FormOnSubmit", anchor: "form-on-submit" }, + { name: "GenericFormData", anchor: "generic-form-data" } + ]} +/> + +**Other** + +<SymbolList symbols={[{ name: "validation", anchor: "validation" }]} /> + +## Components + +### `Bind` + +**Function** — imported from `webiny/admin/form` + +```typescript +import { Bind } from "webiny/admin/form"; +``` + +```typescript +export function Bind( +``` + +### `Form` + +**Constant** — imported from `webiny/admin/form` + +```typescript +import { Form } from "webiny/admin/form"; +``` + +```typescript +export const Form = observer( + React.forwardRef(FormInner) as <T extends GenericFormData = GenericFormData>( + props: FormProps<T> & { ref?: React.ForwardedRef<any> } + ) => ReturnType<typeof FormInner<T>> +); +``` + +### `UnsetOnUnmount` + +**Constant** — imported from `webiny/admin/form` + +```typescript +import { UnsetOnUnmount } from "webiny/admin/form"; +``` + +```typescript +export const UnsetOnUnmount = ({ name, children }: { name: string; children: React.ReactNode }) => { + const form = useForm(); + + useEffect(() => { + return () => { + form.setValue(name, undefined); + }; + }, []); + + return <>{children}</>; +}; +``` + +### `Validation` + +**Class** — imported from `webiny/admin/form` + +Main class of Validation library. +Exported as a singleton instance, it offers methods for sync/async data validation and overwriting or adding new validators. + +@class Validation +@example +import { validation } from '@webiny/validation'; + +// `validation` is a preconfigured instance of Validation class. +// From here you can either add new validators or use it as-is. + +```typescript +import { Validation } from "webiny/admin/form"; +``` + +```typescript +class Validation { + __validators:; + constructor(); + setValidator(name: string, callable: Validator): this; + getValidator(name: string): Validator; + async validate( + value: any, + validators: string, + options: ValidateOptions =; + validateSync( + value: any, + validators: string, + options: ValidateOptions =; + create(validators: string); + createSync(validators: string); + __parseValidateProperty(validators: string): ParsedValidators; +} +``` + +### `ValidationError` + +**Class** — imported from `webiny/admin/form` + +This class is used by validators to throw an error when value validation fails. + +```typescript +import { ValidationError } from "webiny/admin/form"; +``` + +```typescript +class ValidationError extends Error { + public override readonly message: string; + public readonly validator: string | null; + public readonly value: any; + constructor(message = "", validator: string | null = null, value: string | null = null); +} +``` + +## Hooks + +### `useBind` + +**Constant** — imported from `webiny/admin/form` + +```typescript +import { useBind } from "webiny/admin/form"; +``` + +```typescript +export const useBind = makeDecoratable((props: BindComponentProps): UseBindHook => { + const form = useForm(); + const bindPrefix = useBindPrefix(); + + const bindName = useMemo(() => { + return [bindPrefix, props.name].filter(Boolean).join("."); + }, [props.name]); + + const fieldProps = { ...props, name: bindName }; + + useEffect(() => { + form.registerField(fieldProps); + + +``` + +### `useBindPrefix` + +**Function** — imported from `webiny/admin/form` + +```typescript +import { useBindPrefix } from "webiny/admin/form"; +``` + +```typescript +export function useBindPrefix(); +``` + +### `useForm` + +**Constant** — imported from `webiny/admin/form` + +```typescript +import { useForm } from "webiny/admin/form"; +``` + +```typescript +export const useForm = <T extends GenericFormData = GenericFormData>() => { + const context = useContext(FormContext) as FormAPI<T>; + if (!context) { + throw new Error("Missing Form component in the component hierarchy!"); + } + return context; +}; +``` + +### `useGenerateSlug` + +**Function** — imported from `webiny/admin/form` + +This hook is designed to be used with the `useForm` hook. +When `generateSlug` is called, it will generate a slug using the `from` form field, and set it into the `to` form field. +@param form +@param from +@param to + +```typescript +import { useGenerateSlug } from "webiny/admin/form"; +``` + +```typescript +export function useGenerateSlug(form: FormAPI, from: string, to = "slug"); +``` + +## Types + +### `FormApi` + +**Type** — imported from `webiny/admin/form` + +```typescript +import type { FormApi } from "webiny/admin/form"; +``` + +```typescript +export interface FormAPI<T = GenericFormData> { ... } +``` + +### `FormOnSubmit` + +**Type** — imported from `webiny/admin/form` + +```typescript +import type { FormOnSubmit } from "webiny/admin/form"; +``` + +```typescript +export interface FormOnSubmit<T = GenericFormData> { + (data: T, form: FormAPI<T>): any; +} +``` + +### `GenericFormData` + +**Type** — imported from `webiny/admin/form` + +```typescript +import type { GenericFormData } from "webiny/admin/form"; +``` + +```typescript +export type GenericFormData = { + [key: string]: any; +}; +``` + +## Other + +### `validation` + +**Constant** — imported from `webiny/admin/form` + +```typescript +import { validation } from "webiny/admin/form"; +``` + +```typescript +export const validation = new Validation(); +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/graphql-client.ai.txt b/docs/developer-docs/6.0.x/reference/admin/graphql-client.ai.txt new file mode 100644 index 000000000..9767dd619 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/graphql-client.ai.txt @@ -0,0 +1,25 @@ +AI Context: Graphql Client (reference/admin/graphql-client.mdx) + +Source of Information: +1. packages/webiny/src/admin/graphql-client.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app/src/features/graphqlClient/abstractions.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +GraphQLClient + +Import Path: webiny/admin/graphql-client + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/graphql-client.mdx b/docs/developer-docs/6.0.x/reference/admin/graphql-client.mdx new file mode 100644 index 000000000..c7494f3d6 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/graphql-client.mdx @@ -0,0 +1,66 @@ +--- +id: ywrtaw4v +title: Graphql Client +description: "Reference for webiny/admin/graphql-client" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/graphql-client`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/graphql-client`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList symbols={[{ name: "GraphQLClient", anchor: "graph-ql-client" }]} /> + +## `GraphQLClient` + +**Abstraction** — imported from `webiny/admin/graphql-client` + +```typescript +import { GraphQLClient } from "webiny/admin/graphql-client"; +``` + +**Interface `GraphQLClient.Interface`:** + +```typescript +interface GraphQLClient.Interface { + execute<TResult = any, TVariables = any>(params: GraphQLRequest<TVariables>): Promise<TResult>; +} +``` + +**Types:** + +```typescript +namespace GraphQLClient { + type Headers = IHeaders; + type Interface = IGraphQLClient; + type Request = GraphQLRequest<TVariables>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GraphQLClient } from "webiny/admin/graphql-client"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private graphQLClient: GraphQLClient.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.graphQLClient.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GraphQLClient] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/graphqlClient.ai.txt b/docs/developer-docs/6.0.x/reference/admin/graphqlClient.ai.txt new file mode 100644 index 000000000..f403fce26 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/graphqlClient.ai.txt @@ -0,0 +1,25 @@ +AI Context: GraphQL Client (reference/admin/graphqlClient.mdx) + +Source of Information: +1. packages/webiny/src/admin/graphqlClient.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app/src/features/graphqlClient/abstractions.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +GraphQLClient + +Import Path: webiny/admin/graphqlClient + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/graphqlClient.mdx b/docs/developer-docs/6.0.x/reference/admin/graphqlClient.mdx new file mode 100644 index 000000000..26db5c331 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/graphqlClient.mdx @@ -0,0 +1,67 @@ +--- +id: ywrtaw4v +title: GraphQL Client +description: "GraphQL client hooks and utilities" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/graphqlClient`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/graphqlClient`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList symbols={[{ name: "GraphQLClient", anchor: "graphqlclient" }]} /> + +## `GraphQLClient` + +**Abstraction** — imported from `webiny/admin/graphqlClient` + +```typescript +import { GraphQLClient } from "webiny/admin/graphqlClient"; +``` + +**Interface `GraphQLClient.Interface`:** + +```typescript +interface GraphQLClient.Interface { + execute<TResult = any, TVariables = any>(params: GraphQLRequest<TVariables>): Promise<TResult>; +} +``` + +**Types:** + +```typescript +namespace GraphQLClient { + type Headers = IHeaders; + type Interface = IGraphQLClient; + type Request = GraphQLRequest<TVariables>; +} +``` + +**Usage:** + +```typescript +// extensions/MyImpl.ts +import { GraphQLClient } from "webiny/admin/graphqlClient"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private graphQLClient: GraphQLClient.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.graphQLClient.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GraphQLClient] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/lexical.ai.txt b/docs/developer-docs/6.0.x/reference/admin/lexical.ai.txt new file mode 100644 index 000000000..321778c84 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/lexical.ai.txt @@ -0,0 +1,26 @@ +AI Context: Lexical Editor (reference/admin/lexical.mdx) + +Source of Information: +1. packages/webiny/src/admin/lexical.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/lexical-editor/src/hooks/index.ts — originating source +3. /Users/adrian/dev/wby-next/packages/lexical-editor/src/types.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +getNodeFromSelection, useCurrentElement, useCurrentSelection, useDeriveValueFromSelection, useRichTextEditor, useFontColorPicker, useTextAlignmentAction, useTypographyAction, useIsMounted, Klass, LexicalNode + +Import Path: webiny/admin/lexical + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/lexical.mdx b/docs/developer-docs/6.0.x/reference/admin/lexical.mdx new file mode 100644 index 000000000..ba297b811 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/lexical.mdx @@ -0,0 +1,252 @@ +--- +id: ywrtaw4v +title: Lexical Editor +description: "Lexical editor components and hooks" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/lexical`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/lexical`. Import any of the items below directly from this path in your Webiny extensions. + +**Components** + +<SymbolList symbols={[{ name: "LexicalNode", anchor: "lexical-node" }]} /> + +**Hooks** + +<SymbolList + symbols={[ + { name: "useCurrentElement", anchor: "use-current-element" }, + { name: "useCurrentSelection", anchor: "use-current-selection" }, + { name: "useDeriveValueFromSelection", anchor: "use-derive-value-from-selection" }, + { name: "useFontColorPicker", anchor: "use-font-color-picker" }, + { name: "useIsMounted", anchor: "use-is-mounted" }, + { name: "useRichTextEditor", anchor: "use-rich-text-editor" }, + { name: "useTextAlignmentAction", anchor: "use-text-alignment-action" }, + { name: "useTypographyAction", anchor: "use-typography-action" } + ]} +/> + +**Types** + +<SymbolList symbols={[{ name: "Klass", anchor: "klass" }]} /> + +**Other** + +<SymbolList symbols={[{ name: "getNodeFromSelection", anchor: "get-node-from-selection" }]} /> + +## Components + +### `LexicalNode` + +**Type** — imported from `webiny/admin/lexical` + +```typescript +import type { LexicalNode } from "webiny/admin/lexical"; +``` + +```typescript +export declare class LexicalNode { + ["constructor"]: KlassConstructor<typeof LexicalNode>; + __type: string; + __key: string; + __parent: null | NodeKey; + __prev: null | NodeKey; + __next: null | NodeKey; + __state?: NodeState<this>; + static getType(): string; + static clone(_data: unknown): LexicalNode; + $config(): BaseStaticNodeConfig; + config<Type extends string, Config extends StaticNodeConfigValue<this, Type>>( + type: Type, + config: Config + ): StaticNodeConfigRecord<Type, Config>; + afterCloneFrom(prevNode: this): void; + static importDOM?: () => DOMConversionMap<any> | null; + constructor(key?: NodeKey); + getType(): string; + isInline(): boolean; + isAttached(): boolean; + isSelected(selection?: null | BaseSelection): boolean; + getKey(): NodeKey; + getIndexWithinParent(): number; + getParent<T extends ElementNode>(): T | null; + getParentOrThrow<T extends ElementNode>(): T; + getTopLevelElement(): ElementNode | DecoratorNode<unknown> | null; + getTopLevelElementOrThrow(): ElementNode | DecoratorNode<unknown>; + getParents(): Array<ElementNode>; + getParentKeys(): Array<NodeKey>; + getPreviousSibling<T extends LexicalNode>(): T | null; + getPreviousSiblings<T extends LexicalNode>(): Array<T>; + getNextSibling<T extends LexicalNode>(): T | null; + getNextSiblings<T extends LexicalNode>(): Array<T>; + getCommonAncestor<T extends ElementNode = ElementNode>(node: LexicalNode): T | null; + is(object: LexicalNode | null | undefined): boolean; + isBefore(targetNode: LexicalNode): boolean; + isParentOf(targetNode: LexicalNode): boolean; + getNodesBetween(targetNode: LexicalNode): Array<LexicalNode>; + isDirty(): boolean; + getLatest(): this; + getWritable(): this; + getTextContent(): string; + getTextContentSize(): number; + createDOM(_config: EditorConfig, _editor: LexicalEditor): HTMLElement; + updateDOM(_prevNode: unknown, _dom: HTMLElement, _config: EditorConfig): boolean; + exportDOM(editor: LexicalEditor): DOMExportOutput; + exportJSON(): SerializedLexicalNode; + static importJSON(_serializedNode: SerializedLexicalNode): LexicalNode; + updateFromJSON(serializedNode: LexicalUpdateJSON<SerializedLexicalNode>): this; + static transform(): ((node: LexicalNode) => void) | null; + remove(preserveEmptyParent?: boolean): void; + replace<N extends LexicalNode>(replaceWith: N, includeChildren?: boolean): N; + insertAfter(nodeToInsert: LexicalNode, restoreSelection?: boolean): LexicalNode; + insertBefore(nodeToInsert: LexicalNode, restoreSelection?: boolean): LexicalNode; + isParentRequired(): boolean; + createParentElementNode(): ElementNode; + selectStart(): RangeSelection; + selectEnd(): RangeSelection; + selectPrevious(anchorOffset?: number, focusOffset?: number): RangeSelection; + selectNext(anchorOffset?: number, focusOffset?: number): RangeSelection; + markDirty(): void; + reconcileObservedMutation(dom: HTMLElement, editor: LexicalEditor): void; +} +``` + +## Hooks + +### `useCurrentElement` + +**Function** — imported from `webiny/admin/lexical` + +```typescript +import { useCurrentElement } from "webiny/admin/lexical"; +``` + +```typescript +export function useCurrentElement(); +``` + +### `useCurrentSelection` + +**Function** — imported from `webiny/admin/lexical` + +```typescript +import { useCurrentSelection } from "webiny/admin/lexical"; +``` + +```typescript +export function useCurrentSelection(); +``` + +### `useDeriveValueFromSelection` + +**Function** — imported from `webiny/admin/lexical` + +```typescript +import { useDeriveValueFromSelection } from "webiny/admin/lexical"; +``` + +```typescript +export function useDeriveValueFromSelection<T>(generator: Generator<T>); +``` + +### `useFontColorPicker` + +**Function** — imported from `webiny/admin/lexical` + +```typescript +import { useFontColorPicker } from "webiny/admin/lexical"; +``` + +```typescript +export function useFontColorPicker(); +``` + +### `useIsMounted` + +**Function** — imported from `webiny/admin/lexical` + +```typescript +import { useIsMounted } from "webiny/admin/lexical"; +``` + +```typescript +export function useIsMounted(); +``` + +### `useRichTextEditor` + +**Function** — imported from `webiny/admin/lexical` + +```typescript +import { useRichTextEditor } from "webiny/admin/lexical"; +``` + +```typescript +export function useRichTextEditor(); +``` + +### `useTextAlignmentAction` + +**Function** — imported from `webiny/admin/lexical` + +```typescript +import { useTextAlignmentAction } from "webiny/admin/lexical"; +``` + +```typescript +export function useTextAlignmentAction(); +``` + +### `useTypographyAction` + +**Function** — imported from `webiny/admin/lexical` + +```typescript +import { useTypographyAction } from "webiny/admin/lexical"; +``` + +```typescript +export function useTypographyAction(); +``` + +## Types + +### `Klass` + +**Type** — imported from `webiny/admin/lexical` + +```typescript +import type { Klass } from "webiny/admin/lexical"; +``` + +```typescript +export type Klass<T extends LexicalNode> = + InstanceType<T["constructor"]> extends T + ? T["constructor"] + : GenericConstructor<T> & T["constructor"]; +``` + +## Other + +### `getNodeFromSelection` + +**Function** — imported from `webiny/admin/lexical` + +```typescript +import { getNodeFromSelection } from "webiny/admin/lexical"; +``` + +```typescript +export function getNodeFromSelection(selection: RangeSelection); +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/local-storage.ai.txt b/docs/developer-docs/6.0.x/reference/admin/local-storage.ai.txt new file mode 100644 index 000000000..088fe4abb --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/local-storage.ai.txt @@ -0,0 +1,26 @@ +AI Context: Local Storage (reference/admin/local-storage.mdx) + +Source of Information: +1. packages/webiny/src/admin/local-storage.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app/src/features/localStorage/abstractions.ts — originating source +3. /Users/adrian/dev/wby-next/packages/app/src/presentation/localStorage/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +LocalStorage, useLocalStorage, useLocalStorageValue, useLocalStorageValues + +Import Path: webiny/admin/local-storage + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/local-storage.mdx b/docs/developer-docs/6.0.x/reference/admin/local-storage.mdx new file mode 100644 index 000000000..2d47af6ac --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/local-storage.mdx @@ -0,0 +1,93 @@ +--- +id: ywrtaw4v +title: Local Storage +description: "Reference for webiny/admin/local-storage" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/local-storage`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/local-storage`. Import any of the items below directly from this path in your Webiny extensions. + +**Components** + +<SymbolList symbols={[{ name: "LocalStorage", anchor: "local-storage" }]} /> + +**Hooks** + +<SymbolList + symbols={[ + { name: "useLocalStorage", anchor: "use-local-storage" }, + { name: "useLocalStorageValue", anchor: "use-local-storage-value" }, + { name: "useLocalStorageValues", anchor: "use-local-storage-values" } + ]} +/> + +## Components + +### `LocalStorage` + +**Constant** — imported from `webiny/admin/local-storage` + +```typescript +import { LocalStorage } from "webiny/admin/local-storage"; +``` + +```typescript +export const LocalStorage = new Abstraction<ILocalStorage>("LocalStorage"); +``` + +## Hooks + +### `useLocalStorage` + +**Function** — imported from `webiny/admin/local-storage` + +Returns the LocalStorage instance from DI. +Useful when you want to call service methods imperatively inside components. + +```typescript +import { useLocalStorage } from "webiny/admin/local-storage"; +``` + +```typescript +export function useLocalStorage(): LocalStorage.Interface; +``` + +### `useLocalStorageValue` + +**Function** — imported from `webiny/admin/local-storage` + +```typescript +import { useLocalStorageValue } from "webiny/admin/local-storage"; +``` + +```typescript +export function useLocalStorageValue<T = string>(key: string): T | undefined; +``` + +### `useLocalStorageValues` + +**Function** — imported from `webiny/admin/local-storage` + +Observes multiple keys in LocalStorage and returns an object of { key: value }. +Re-renders when any of the observed keys change. + +```typescript +import { useLocalStorageValues } from "webiny/admin/local-storage"; +``` + +```typescript +export function useLocalStorageValues<T extends Record<string, any>>( + keys: (keyof T & string)[] +): Partial<T>; +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/localStorage.ai.txt b/docs/developer-docs/6.0.x/reference/admin/localStorage.ai.txt new file mode 100644 index 000000000..28fe2bb45 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/localStorage.ai.txt @@ -0,0 +1,26 @@ +AI Context: Local Storage (reference/admin/localStorage.mdx) + +Source of Information: +1. packages/webiny/src/admin/localStorage.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app/src/features/localStorage/abstractions.ts — originating source +3. /Users/adrian/dev/wby-next/packages/app/src/presentation/localStorage/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +LocalStorage, useLocalStorage, useLocalStorageValue, useLocalStorageValues + +Import Path: webiny/admin/localStorage + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/localStorage.mdx b/docs/developer-docs/6.0.x/reference/admin/localStorage.mdx new file mode 100644 index 000000000..728d3800e --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/localStorage.mdx @@ -0,0 +1,84 @@ +--- +id: ywrtaw4v +title: Local Storage +description: "Local storage abstraction and hooks" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/localStorage`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/localStorage`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "LocalStorage", anchor: "localstorage" }, + { name: "useLocalStorage", anchor: "uselocalstorage" }, + { name: "useLocalStorageValue", anchor: "uselocalstoragevalue" }, + { name: "useLocalStorageValues", anchor: "uselocalstoragevalues" } + ]} +/> + +## `LocalStorage` + +**Constant** — imported from `webiny/admin/localStorage` + +```typescript +import { LocalStorage } from "webiny/admin/localStorage"; +``` + +```typescript +export const LocalStorage = new Abstraction<ILocalStorage>("LocalStorage"); +``` + +## `useLocalStorage` + +**Function** — imported from `webiny/admin/localStorage` + +Returns the LocalStorage instance from DI. +Useful when you want to call service methods imperatively inside components. + +```typescript +import { useLocalStorage } from "webiny/admin/localStorage"; +``` + +```typescript +export function useLocalStorage(): LocalStorage.Interface; +``` + +## `useLocalStorageValue` + +**Function** — imported from `webiny/admin/localStorage` + +```typescript +import { useLocalStorageValue } from "webiny/admin/localStorage"; +``` + +```typescript +export function useLocalStorageValue<T = string>(key: string): T | undefined; +``` + +## `useLocalStorageValues` + +**Function** — imported from `webiny/admin/localStorage` + +Observes multiple keys in LocalStorage and returns an object of { key: value }. +Re-renders when any of the observed keys change. + +```typescript +import { useLocalStorageValues } from "webiny/admin/localStorage"; +``` + +```typescript +export function useLocalStorageValues<T extends Record<string, any>>( + keys: (keyof T & string)[] +): Partial<T>; +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/router.ai.txt b/docs/developer-docs/6.0.x/reference/admin/router.ai.txt new file mode 100644 index 000000000..2c348e703 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/router.ai.txt @@ -0,0 +1,26 @@ +AI Context: Router (reference/admin/router.mdx) + +Source of Information: +1. packages/webiny/src/admin/router.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app/src/features/router/Route.ts — originating source +3. /Users/adrian/dev/wby-next/packages/app/src/presentation/router/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +Route, useRoute, useRouter + +Import Path: webiny/admin/router + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/router.mdx b/docs/developer-docs/6.0.x/reference/admin/router.mdx new file mode 100644 index 000000000..231cc1977 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/router.mdx @@ -0,0 +1,94 @@ +--- +id: ywrtaw4v +title: Router +description: "Router components and hooks" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/router`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/router`. Import any of the items below directly from this path in your Webiny extensions. + +**Components** + +<SymbolList symbols={[{ name: "Route", anchor: "route" }]} /> + +**Hooks** + +<SymbolList + symbols={[ + { name: "useRoute", anchor: "use-route" }, + { name: "useRouter", anchor: "use-router" } + ]} +/> + +## Components + +### `Route` + +**Class** — imported from `webiny/admin/router` + +```typescript +import { Route } from "webiny/admin/router"; +``` + +```typescript +export class Route<TParams extends RouteParamsDefinition | undefined = undefined> { + private readonly route: RouteParams<TParams>; + private readonly schema: TParams extends RouteParamsDefinition + ? RouteParamsInfer<TParams> + : undefined; + constructor(route: RouteParams<TParams>); + get name(); + get path(); + get params(): TParams extends RouteParamsDefinition ? RouteParamsInfer<TParams> : undefined; + private coerceParams<T extends Record<string, z.ZodTypeAny>>(shape: T); +} +``` + +## Hooks + +### `useRoute` + +**Function** — imported from `webiny/admin/router` + +```typescript +import { useRoute } from "webiny/admin/router"; +``` + +```typescript +export function useRoute<TParams extends RouteParamsDefinition | undefined = undefined>( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + route?: Route<TParams> +); +``` + +### `useRouter` + +**Constant** — imported from `webiny/admin/router` + +```typescript +import { useRouter } from "webiny/admin/router"; +``` + +```typescript +export const useRouter = () => { + const { presenter } = useFeature(RouterFeature); + const container = useContainer(); + const registry = container.resolve(RouteElementRegistry); + + return { + goToRoute: presenter.goToRoute.bind(presenter), + getLink: presenter.getLink.bind(presenter), + onRouteExit: presenter.onRouteExit.bind(presenter), + setRoutes: (routes: Reac +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/security.ai.txt b/docs/developer-docs/6.0.x/reference/admin/security.ai.txt new file mode 100644 index 000000000..7c3d48631 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/security.ai.txt @@ -0,0 +1,31 @@ +AI Context: Security (reference/admin/security.mdx) + +Source of Information: +1. packages/webiny/src/admin/security.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app/src/errors/abstractions.ts — originating source +3. /Users/adrian/dev/wby-next/packages/app-admin/src/features/security/LogIn/index.ts — originating source +4. /Users/adrian/dev/wby-next/packages/app-admin/src/features/security/LogOut/index.ts — originating source +5. /Users/adrian/dev/wby-next/packages/app-admin/src/features/security/AuthenticationContext/index.ts — originating source +6. /Users/adrian/dev/wby-next/packages/app-admin/src/features/security/IdentityContext/index.ts — originating source +7. /Users/adrian/dev/wby-next/packages/app-admin/src/presentation/security/hooks/useAuthentication.ts — originating source +8. /Users/adrian/dev/wby-next/packages/app-admin/src/presentation/security/hooks/useIdentity.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +AuthenticationErrorEventHandler, LogInUseCase, LogOutUseCase, AuthenticationContext, IdentityContext, useAuthentication, useIdentity + +Import Path: webiny/admin/security + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/security.mdx b/docs/developer-docs/6.0.x/reference/admin/security.mdx new file mode 100644 index 000000000..33835881d --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/security.mdx @@ -0,0 +1,294 @@ +--- +id: ywrtaw4v +title: Security +description: "Admin security: authentication, identity, permissions" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What use cases are available in `webiny/admin/security`? +- Which event handlers can you implement? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/security`. Import any of the items below directly from this path in your Webiny extensions. + +**Hooks** + +<SymbolList + symbols={[ + { name: "useAuthentication", anchor: "use-authentication" }, + { name: "useIdentity", anchor: "use-identity" } + ]} +/> + +**Other** + +<SymbolList + symbols={[ + { name: "AuthenticationContext", anchor: "authentication-context" }, + { name: "AuthenticationErrorEventHandler", anchor: "authentication-error-event-handler" }, + { name: "IdentityContext", anchor: "identity-context" }, + { name: "LogInUseCase", anchor: "log-in-use-case" }, + { name: "LogOutUseCase", anchor: "log-out-use-case" } + ]} +/> + +## Hooks + +### `useAuthentication` + +**Function** — imported from `webiny/admin/security` + +```typescript +import { useAuthentication } from "webiny/admin/security"; +``` + +```typescript +export function useAuthentication(): IUseAuthenticationReturn; +``` + +### `useIdentity` + +**Function** — imported from `webiny/admin/security` + +```typescript +import { useIdentity } from "webiny/admin/security"; +``` + +```typescript +export function useIdentity(): IUseIdentityReturn; +``` + +## Other + +### `AuthenticationContext` + +**Abstraction** — imported from `webiny/admin/security` + +```typescript +import { AuthenticationContext } from "webiny/admin/security"; +``` + +**Interface `AuthenticationContext.Interface`:** + +```typescript +interface AuthenticationContext.Interface { + clear(): void; + getIdToken: IIdTokenProvider; + setIdTokenProvider(provider: IIdTokenProvider): void; + setLogoutCallback(callback: ILogoutCallback): void; + getLogoutCallback(): ILogoutCallback; +} +``` + +**Types:** + +```typescript +namespace AuthenticationContext { + type Interface = IAuthenticationContext; + type IdTokenProvider = IIdTokenProvider; + type LogoutCallback = ILogoutCallback; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { AuthenticationContext } from "webiny/admin/security"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private authenticationContext: AuthenticationContext.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.authenticationContext.clear(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [AuthenticationContext] +}); +``` + +### `AuthenticationErrorEventHandler` + +**Event Handler Abstraction** — imported from `webiny/admin/security` + +```typescript +import { AuthenticationErrorEventHandler } from "webiny/admin/security"; +``` + +**Interface `AuthenticationErrorEventHandler.Interface`:** + +```typescript +interface AuthenticationErrorEventHandler.Interface { + handle(event: AuthenticationErrorEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace AuthenticationErrorEventHandler { + type Interface = IEventHandler<AuthenticationErrorEvent>; + type Event = AuthenticationErrorEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { AuthenticationErrorEventHandler } from "webiny/admin/security"; + +class MyHandler implements AuthenticationErrorEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: AuthenticationErrorEventHandler.Event): Promise<void> { + // implementation + } +} + +export default AuthenticationErrorEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `IdentityContext` + +**Abstraction** — imported from `webiny/admin/security` + +```typescript +import { IdentityContext } from "webiny/admin/security"; +``` + +**Interface `IdentityContext.Interface`:** + +```typescript +interface IdentityContext.Interface { + getIdentity(): Identity; + setIdentity(identity: Identity): void; + clear(): void; +} +``` + +**Types:** + +```typescript +namespace IdentityContext { + type Interface = IIdentityContext; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { IdentityContext } from "webiny/admin/security"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private identityContext: IdentityContext.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.identityContext.getIdentity(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [IdentityContext] +}); +``` + +### `LogInUseCase` + +**Use Case Abstraction** — imported from `webiny/admin/security` + +```typescript +import { LogInUseCase } from "webiny/admin/security"; +``` + +**Interface `LogInUseCase.Interface`:** + +```typescript +interface LogInUseCase.Interface { + execute(params: ILoginParams): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace LogInUseCase { + type Interface = ILogInUseCase; + type Params = ILoginParams; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { LogInUseCase } from "webiny/admin/security"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private logInUseCase: LogInUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.logInUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [LogInUseCase] +}); +``` + +### `LogOutUseCase` + +**Use Case Abstraction** — imported from `webiny/admin/security` + +```typescript +import { LogOutUseCase } from "webiny/admin/security"; +``` + +**Interface `LogOutUseCase.Interface`:** + +```typescript +interface LogOutUseCase.Interface { + execute(): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace LogOutUseCase { + type Interface = ILogOutUseCase; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { LogOutUseCase } from "webiny/admin/security"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private logOutUseCase: LogOutUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.logOutUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [LogOutUseCase] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/tenancy.ai.txt b/docs/developer-docs/6.0.x/reference/admin/tenancy.ai.txt new file mode 100644 index 000000000..205ae1e30 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/tenancy.ai.txt @@ -0,0 +1,26 @@ +AI Context: Tenancy (reference/admin/tenancy.mdx) + +Source of Information: +1. packages/webiny/src/admin/tenancy.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app-admin/src/features/tenancy/abstractions.ts — originating source +3. /Users/adrian/dev/wby-next/packages/app-admin/src/presentation/tenancy/useTenantContext.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +TenantContext, useTenantContext + +Import Path: webiny/admin/tenancy + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/tenancy.mdx b/docs/developer-docs/6.0.x/reference/admin/tenancy.mdx new file mode 100644 index 000000000..b7ba2b6dc --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/tenancy.mdx @@ -0,0 +1,55 @@ +--- +id: ywrtaw4v +title: Tenancy +description: "Admin tenancy hooks and context" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/tenancy`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/tenancy`. Import any of the items below directly from this path in your Webiny extensions. + +**Components** + +<SymbolList symbols={[{ name: "TenantContext", anchor: "tenant-context" }]} /> + +**Hooks** + +<SymbolList symbols={[{ name: "useTenantContext", anchor: "use-tenant-context" }]} /> + +## Components + +### `TenantContext` + +**Constant** — imported from `webiny/admin/tenancy` + +```typescript +import { TenantContext } from "webiny/admin/tenancy"; +``` + +```typescript +export const TenantContext = new Abstraction<ITenantContext>("TenantContext"); +``` + +## Hooks + +### `useTenantContext` + +**Function** — imported from `webiny/admin/tenancy` + +```typescript +import { useTenantContext } from "webiny/admin/tenancy"; +``` + +```typescript +export function useTenantContext(); +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/ui.ai.txt b/docs/developer-docs/6.0.x/reference/admin/ui.ai.txt new file mode 100644 index 000000000..69a90bfa3 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/ui.ai.txt @@ -0,0 +1,83 @@ +AI Context: UI (reference/admin/ui.mdx) + +Source of Information: +1. packages/webiny/src/admin/ui.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/admin-ui/src/Accordion/index.ts — originating source +3. /Users/adrian/dev/wby-next/packages/admin-ui/src/Alert/index.ts — originating source +4. /Users/adrian/dev/wby-next/packages/admin-ui/src/AutoComplete/index.ts — originating source +5. /Users/adrian/dev/wby-next/packages/admin-ui/src/Avatar/index.ts — originating source +6. /Users/adrian/dev/wby-next/packages/admin-ui/src/Button/index.ts — originating source +7. /Users/adrian/dev/wby-next/packages/admin-ui/src/Card/index.ts — originating source +8. /Users/adrian/dev/wby-next/packages/admin-ui/src/Checkbox/index.ts — originating source +9. /Users/adrian/dev/wby-next/packages/admin-ui/src/CheckboxGroup/index.ts — originating source +10. /Users/adrian/dev/wby-next/packages/admin-ui/src/CodeEditor/index.ts — originating source +11. /Users/adrian/dev/wby-next/packages/admin-ui/src/ColorPicker/index.ts — originating source +12. /Users/adrian/dev/wby-next/packages/admin-ui/src/DataList/index.ts — originating source +13. /Users/adrian/dev/wby-next/packages/admin-ui/src/DataTable/index.ts — originating source +14. /Users/adrian/dev/wby-next/packages/admin-ui/src/DelayedOnChange/index.ts — originating source +15. /Users/adrian/dev/wby-next/packages/admin-ui/src/Dialog/index.ts — originating source +16. /Users/adrian/dev/wby-next/packages/admin-ui/src/Drawer/index.ts — originating source +17. /Users/adrian/dev/wby-next/packages/admin-ui/src/DropdownMenu/index.ts — originating source +18. /Users/adrian/dev/wby-next/packages/admin-ui/src/DynamicFieldset/index.ts — originating source +19. /Users/adrian/dev/wby-next/packages/admin-ui/src/FilePicker/index.ts — originating source +20. /Users/adrian/dev/wby-next/packages/admin-ui/src/Grid/index.ts — originating source +21. /Users/adrian/dev/wby-next/packages/admin-ui/src/HeaderBar/index.ts — originating source +22. /Users/adrian/dev/wby-next/packages/admin-ui/src/Heading/index.ts — originating source +23. /Users/adrian/dev/wby-next/packages/admin-ui/src/Icon/index.ts — originating source +24. /Users/adrian/dev/wby-next/packages/admin-ui/src/IconPicker/index.ts — originating source +25. /Users/adrian/dev/wby-next/packages/admin-ui/src/Image/index.ts — originating source +26. /Users/adrian/dev/wby-next/packages/admin-ui/src/Input/index.ts — originating source +27. /Users/adrian/dev/wby-next/packages/admin-ui/src/Label/index.ts — originating source +28. /Users/adrian/dev/wby-next/packages/admin-ui/src/Link/index.ts — originating source +29. /Users/adrian/dev/wby-next/packages/admin-ui/src/List/index.ts — originating source +30. /Users/adrian/dev/wby-next/packages/admin-ui/src/Loader/index.ts — originating source +31. /Users/adrian/dev/wby-next/packages/admin-ui/src/MultiAutoComplete/index.ts — originating source +32. /Users/adrian/dev/wby-next/packages/admin-ui/src/MultiFilePicker/index.ts — originating source +33. /Users/adrian/dev/wby-next/packages/admin-ui/src/Portal/index.ts — originating source +34. /Users/adrian/dev/wby-next/packages/admin-ui/src/Popover/index.ts — originating source +35. /Users/adrian/dev/wby-next/packages/admin-ui/src/ProgressBar/index.ts — originating source +36. /Users/adrian/dev/wby-next/packages/admin-ui/src/RadioGroup/index.ts — originating source +37. /Users/adrian/dev/wby-next/packages/admin-ui/src/RangeSlider/index.ts — originating source +38. /Users/adrian/dev/wby-next/packages/admin-ui/src/Scrollbar/index.ts — originating source +39. /Users/adrian/dev/wby-next/packages/admin-ui/src/ScrollArea/index.ts — originating source +40. /Users/adrian/dev/wby-next/packages/admin-ui/src/SegmentedControl/index.ts — originating source +41. /Users/adrian/dev/wby-next/packages/admin-ui/src/Select/index.ts — originating source +42. /Users/adrian/dev/wby-next/packages/admin-ui/src/Separator/index.ts — originating source +43. /Users/adrian/dev/wby-next/packages/admin-ui/src/Sidebar/index.ts — originating source +44. /Users/adrian/dev/wby-next/packages/admin-ui/src/Skeleton/index.ts — originating source +45. /Users/adrian/dev/wby-next/packages/admin-ui/src/Slider/index.ts — originating source +46. /Users/adrian/dev/wby-next/packages/admin-ui/src/SteppedProgress/index.ts — originating source +47. /Users/adrian/dev/wby-next/packages/admin-ui/src/Switch/index.ts — originating source +48. /Users/adrian/dev/wby-next/packages/admin-ui/src/Table/index.ts — originating source +49. /Users/adrian/dev/wby-next/packages/admin-ui/src/Tabs/index.ts — originating source +50. /Users/adrian/dev/wby-next/packages/admin-ui/src/Tag/index.ts — originating source +51. /Users/adrian/dev/wby-next/packages/admin-ui/src/Tags/index.ts — originating source +52. /Users/adrian/dev/wby-next/packages/admin-ui/src/Text/index.ts — originating source +53. /Users/adrian/dev/wby-next/packages/admin-ui/src/Textarea/index.ts — originating source +54. /Users/adrian/dev/wby-next/packages/admin-ui/src/TimeAgo/index.ts — originating source +55. /Users/adrian/dev/wby-next/packages/admin-ui/src/Toast/index.ts — originating source +56. /Users/adrian/dev/wby-next/packages/admin-ui/src/Tooltip/index.ts — originating source +57. /Users/adrian/dev/wby-next/packages/admin-ui/src/Tree/index.ts — originating source +58. /Users/adrian/dev/wby-next/packages/admin-ui/src/Widget/index.ts — originating source +59. /Users/adrian/dev/wby-next/packages/admin-ui/src/hooks/index.ts — originating source +60. /Users/adrian/dev/wby-next/packages/app-admin/src/components/Dialogs/useDialogs.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +Accordion, Alert, AutoComplete, Avatar, Button, CopyButton, IconButton, Card, Checkbox, CheckboxGroup, CodeEditor, ColorPicker, CloneIcon, CreateIcon, DataList, DataListModal, DataListWithSections, DeleteIcon, DownloadIcon, EditIcon, FilterIcon, ListIcon, LoginIcon, NextPageIcon, OptionsIcon, PreviousPageIcon, RefreshIcon, SortIcon, UploadIcon, DataTable, DelayedOnChange, Dialog, Drawer, DropdownMenu, DynamicFieldset, FilePicker, Grid, HeaderBar, Heading, Icon, IconPicker, Image, Input, Label, Link, List, Loader, OverlayLoader, MultiAutoComplete, MultiFilePicker, Portal, Popover, ProgressBar, Radio, RadioGroup, RangeSlider, Scrollbar, ScrollArea, ScrollBar, SegmentedControl, Select, Separator, Sidebar, SidebarProvider, useSidebar, Skeleton, Slider, SteppedProgress, Switch, Table, Tabs, Tag, Tags, Text, Textarea, TimeAgo, Toast, useToast, Tooltip, Tree, Widget, useDisclosure, useDialogs + +Import Path: webiny/admin/ui + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/ui.mdx b/docs/developer-docs/6.0.x/reference/admin/ui.mdx new file mode 100644 index 000000000..b15da94de --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/ui.mdx @@ -0,0 +1,1430 @@ +--- +id: ywrtaw4v +title: UI +description: "Admin UI component library" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/ui`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/ui`. Import any of the items below directly from this path in your Webiny extensions. + +**Components** + +<SymbolList + symbols={[ + { name: "Accordion", anchor: "accordion" }, + { name: "Alert", anchor: "alert" }, + { name: "AutoComplete", anchor: "auto-complete" }, + { name: "Avatar", anchor: "avatar" }, + { name: "Button", anchor: "button" }, + { name: "Card", anchor: "card" }, + { name: "Checkbox", anchor: "checkbox" }, + { name: "CheckboxGroup", anchor: "checkbox-group" }, + { name: "CloneIcon", anchor: "clone-icon" }, + { name: "CodeEditor", anchor: "code-editor" }, + { name: "ColorPicker", anchor: "color-picker" }, + { name: "CopyButton", anchor: "copy-button" }, + { name: "CreateIcon", anchor: "create-icon" }, + { name: "DataList", anchor: "data-list" }, + { name: "DataListModal", anchor: "data-list-modal" }, + { name: "DataListWithSections", anchor: "data-list-with-sections" }, + { name: "DataTable", anchor: "data-table" }, + { name: "DelayedOnChange", anchor: "delayed-on-change" }, + { name: "DeleteIcon", anchor: "delete-icon" }, + { name: "Dialog", anchor: "dialog" }, + { name: "DownloadIcon", anchor: "download-icon" }, + { name: "Drawer", anchor: "drawer" }, + { name: "DropdownMenu", anchor: "dropdown-menu" }, + { name: "DynamicFieldset", anchor: "dynamic-fieldset" }, + { name: "EditIcon", anchor: "edit-icon" }, + { name: "FilePicker", anchor: "file-picker" }, + { name: "FilterIcon", anchor: "filter-icon" }, + { name: "Grid", anchor: "grid" }, + { name: "HeaderBar", anchor: "header-bar" }, + { name: "Heading", anchor: "heading" }, + { name: "Icon", anchor: "icon" }, + { name: "IconButton", anchor: "icon-button" }, + { name: "IconPicker", anchor: "icon-picker" }, + { name: "Image", anchor: "image" }, + { name: "Input", anchor: "input" }, + { name: "Label", anchor: "label" }, + { name: "Link", anchor: "link" }, + { name: "List", anchor: "list" }, + { name: "ListIcon", anchor: "list-icon" }, + { name: "Loader", anchor: "loader" }, + { name: "LoginIcon", anchor: "login-icon" }, + { name: "MultiAutoComplete", anchor: "multi-auto-complete" }, + { name: "MultiFilePicker", anchor: "multi-file-picker" }, + { name: "NextPageIcon", anchor: "next-page-icon" }, + { name: "OptionsIcon", anchor: "options-icon" }, + { name: "OverlayLoader", anchor: "overlay-loader" }, + { name: "Popover", anchor: "popover" }, + { name: "Portal", anchor: "portal" }, + { name: "PreviousPageIcon", anchor: "previous-page-icon" }, + { name: "ProgressBar", anchor: "progress-bar" }, + { name: "Radio", anchor: "radio" }, + { name: "RadioGroup", anchor: "radio-group" }, + { name: "RangeSlider", anchor: "range-slider" }, + { name: "RefreshIcon", anchor: "refresh-icon" }, + { name: "ScrollArea", anchor: "scroll-area" }, + { name: "Scrollbar", anchor: "scrollbar" }, + { name: "ScrollBar", anchor: "scroll-bar" }, + { name: "SegmentedControl", anchor: "segmented-control" }, + { name: "Select", anchor: "select" }, + { name: "Separator", anchor: "separator" }, + { name: "Sidebar", anchor: "sidebar" }, + { name: "SidebarProvider", anchor: "sidebar-provider" }, + { name: "Skeleton", anchor: "skeleton" }, + { name: "Slider", anchor: "slider" }, + { name: "SortIcon", anchor: "sort-icon" }, + { name: "SteppedProgress", anchor: "stepped-progress" }, + { name: "Switch", anchor: "switch" }, + { name: "Table", anchor: "table" }, + { name: "Tabs", anchor: "tabs" }, + { name: "Tag", anchor: "tag" }, + { name: "Tags", anchor: "tags" }, + { name: "Text", anchor: "text" }, + { name: "Textarea", anchor: "textarea" }, + { name: "TimeAgo", anchor: "time-ago" }, + { name: "Toast", anchor: "toast" }, + { name: "Tooltip", anchor: "tooltip" }, + { name: "Tree", anchor: "tree" }, + { name: "UploadIcon", anchor: "upload-icon" }, + { name: "Widget", anchor: "widget" } + ]} +/> + +**Hooks** + +<SymbolList + symbols={[ + { name: "useDialogs", anchor: "use-dialogs" }, + { name: "useDisclosure", anchor: "use-disclosure" }, + { name: "useSidebar", anchor: "use-sidebar" }, + { name: "useToast", anchor: "use-toast" } + ]} +/> + +## Components + +### `Accordion` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Accordion } from "webiny/admin/ui"; +``` + +```typescript +export const Accordion = withStaticProps(DecoratableAccordion, { + Item: AccordionItem +}); +``` + +### `Alert` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Alert } from "webiny/admin/ui"; +``` + +```typescript +const Alert = withStaticProps(makeDecoratable("AlertBase", AlertBase), { + Action: AlertAction +}); +``` + +### `AutoComplete` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { AutoComplete } from "webiny/admin/ui"; +``` + +```typescript +const AutoComplete = makeDecoratable("AutoComplete", DecoratableAutoComplete); +``` + +### `Avatar` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Avatar } from "webiny/admin/ui"; +``` + +```typescript +const Avatar = withStaticProps(makeDecoratable("Avatar", AvatarBase), { + Fallback: AvatarFallback, + Image: AvatarImage +}); +``` + +### `Button` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Button } from "webiny/admin/ui"; +``` + +```typescript +const Button = makeDecoratable("Button", ButtonBase); +``` + +### `Card` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Card } from "webiny/admin/ui"; +``` + +```typescript +const Card = withStaticProps(DecoratableCard, { + ConfirmAction, + CancelAction, + Icon +}); +``` + +### `Checkbox` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Checkbox } from "webiny/admin/ui"; +``` + +```typescript +const Checkbox = makeDecoratable("Checkbox", DecoratableCheckbox); +``` + +### `CheckboxGroup` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { CheckboxGroup } from "webiny/admin/ui"; +``` + +```typescript +const CheckboxGroup = makeDecoratable("CheckboxGroup", DecoratableCheckboxGroup); +``` + +### `CloneIcon` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { CloneIcon } from "webiny/admin/ui"; +``` + +```typescript +export const CloneIcon = (props: IconButtonProps) => { + return ( + <IconButton + icon={<List.Item.Icon icon={<Clone />} label={"Clone"} />} + variant={"ghost"} + size={"sm"} + {...props} + /> + ); +}; +``` + +### `CodeEditor` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { CodeEditor } from "webiny/admin/ui"; +``` + +```typescript +const CodeEditor = makeDecoratable("CodeEditor", DecoratableCodeEditor); +``` + +### `ColorPicker` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { ColorPicker } from "webiny/admin/ui"; +``` + +```typescript +const ColorPicker = makeDecoratable("ColorPicker", DecoratableIconPicker); +``` + +### `CopyButton` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { CopyButton } from "webiny/admin/ui"; +``` + +```typescript +const CopyButton = makeDecoratable("CopyButton", CopyButtonBase); +``` + +### `CreateIcon` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { CreateIcon } from "webiny/admin/ui"; +``` + +```typescript +export const CreateIcon = (props: IconButtonProps) => { + return ( + <IconButton + icon={<List.Item.Icon icon={<Edit />} label={"Create"} />} + variant={"ghost"} + size={"sm"} + {...props} + /> + ); +}; +``` + +### `DataList` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { DataList } from "webiny/admin/ui"; +``` + +```typescript +export const DataList = <TData,>(propsInput: DataListProps<TData>) => { + let render: React.ReactNode | null; + + const props = useMemo(() => { + return { + ...defaultDataListProps, + ...propsInput + }; + }, [propsInput]); + + if (props.loading) { + render = props.loader; + } else if (isEmpty(props.data)) { + render = props.noData; + } else { + +``` + +### `DataListModal` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { DataListModal } from "webiny/admin/ui"; +``` + +```typescript +const DataListModal = withStaticProps(BaseDataListModal, { + Trigger: DataListModalTrigger, + Content: DataListModalContent +}); +``` + +### `DataListWithSections` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { DataListWithSections } from "webiny/admin/ui"; +``` + +```typescript +export const DataListWithSections = <TData,>(propsInput: DataListProps<TData>) => { + let render: React.ReactNode | null; + + const props = useMemo(() => { + return { + ...dataListWithSectionsDefaultProps, + ...propsInput + }; + }, [propsInput]); + + if (props.loading) { + render = props.loader; + } else if (isEmpty(props.data)) { + render = prop +``` + +### `DataTable` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { DataTable } from "webiny/admin/ui"; +``` + +```typescript +const DataTable = makeDecoratable("DataTable", DecoratableDataTable); +``` + +### `DelayedOnChange` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { DelayedOnChange } from "webiny/admin/ui"; +``` + +```typescript +export const DelayedOnChange = <TValue = any>({ + children, + ...other +}: DelayedOnChangeProps<TValue>) => { + const firstMount = useRef(true); + const { onChange, delay = 400, value: initialValue } = other; + const [value, setValue] = useState<TValue | undefined>(initialValue); + // Sync state and props + useEffect(() => { + // Do not update local state, if the incoming value +``` + +### `DeleteIcon` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { DeleteIcon } from "webiny/admin/ui"; +``` + +```typescript +export const DeleteIcon = (props: IconButtonProps) => { + return ( + <IconButton + icon={<List.Item.Icon icon={<Delete />} label={"Delete"} />} + variant={"ghost"} + size={"sm"} + {...props} + /> + ); +}; +``` + +### `Dialog` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Dialog } from "webiny/admin/ui"; +``` + +```typescript +const Dialog = withStaticProps(DecoratableDialog, { + ConfirmAction, + CancelAction, + Icon, + Close: DialogClose +}); +``` + +### `DownloadIcon` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { DownloadIcon } from "webiny/admin/ui"; +``` + +```typescript +export const DownloadIcon = (props: IconButtonProps) => { + return ( + <IconButton + icon={<List.Item.Icon icon={<Download />} label={"Download"} />} + variant={"ghost"} + size={"sm"} + {...props} + /> + ); +}; +``` + +### `Drawer` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Drawer } from "webiny/admin/ui"; +``` + +```typescript +const Drawer = withStaticProps(DecoratableDrawer, { + ConfirmButton, + CancelButton, + Icon +}); +``` + +### `DropdownMenu` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { DropdownMenu } from "webiny/admin/ui"; +``` + +```typescript +const DropdownMenu = withStaticProps(DecoratableDropdownMenu, { + Separator: DropdownMenuSeparator, + Label: DropdownMenuLabel, + Group: DropdownMenuGroup, + Item: DropdownMenuItem, + Link: DropdownMenuLink, + CheckboxItem: DropdownMenuCheckboxItem +}); +``` + +### `DynamicFieldset` + +**Class** — imported from `webiny/admin/ui` + +```typescript +import { DynamicFieldset } from "webiny/admin/ui"; +``` + +```typescript +class DynamicFieldset extends React.Component<DynamicFieldsetProps> { + static defaultProps: Partial<DynamicFieldsetProps> =; + header: React.ReactNode = null; + footer: React.ReactNode = null; + rows: React.ReactNode = null; + empty: React.ReactNode = null; + actions =; + removeData = (index: number) =>; + addData = (index = -1) =>; + renderHeader = (cb: () => React.ReactNode): React.ReactNode =>; + renderFooter = (cb: () => React.ReactNode): React.ReactNode =>; + renderRow = (cb: ChildrenRenderPropRowCallable): React.ReactNode =>; + renderEmpty = (cb: () => React.ReactNode): React.ReactNode =>; + public renderComponent(): React.ReactNode; + public override render(); +} +``` + +### `EditIcon` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { EditIcon } from "webiny/admin/ui"; +``` + +```typescript +export const EditIcon = (props: IconButtonProps) => { + return ( + <IconButton + icon={<List.Item.Icon icon={<Edit />} label={"Edit"} />} + variant={"ghost"} + size={"sm"} + {...props} + /> + ); +}; +``` + +### `FilePicker` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { FilePicker } from "webiny/admin/ui"; +``` + +```typescript +const FilePicker = withStaticProps(DecoratableFilePicker, { + Preview: { + Image: ImagePreview, + RichItem: RichItemPreview, + TextOnly: TextOnlyPreview + } +}); +``` + +### `FilterIcon` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { FilterIcon } from "webiny/admin/ui"; +``` + +```typescript +export const FilterIcon = (props: IconButtonProps) => { + return ( + <IconButton + icon={<List.Item.Icon icon={<Filter />} label={"Filter"} />} + variant={"ghost"} + size={"sm"} + {...props} + /> + ); +}; +``` + +### `Grid` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Grid } from "webiny/admin/ui"; +``` + +```typescript +const Grid = withStaticProps(DecoratableGrid, { Column }); +``` + +### `HeaderBar` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { HeaderBar } from "webiny/admin/ui"; +``` + +```typescript +const HeaderBar = makeDecoratable("HeaderBar", HeaderBarBase); +``` + +### `Heading` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Heading } from "webiny/admin/ui"; +``` + +```typescript +const Heading = makeDecoratable("Heading", HeadingBase); +``` + +### `Icon` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Icon } from "webiny/admin/ui"; +``` + +```typescript +const Icon = makeDecoratable("Icon", IconBase); +``` + +### `IconButton` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { IconButton } from "webiny/admin/ui"; +``` + +```typescript +const IconButton = makeDecoratable("IconButton", DecoratableIconButton); +``` + +### `IconPicker` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { IconPicker } from "webiny/admin/ui"; +``` + +```typescript +const IconPicker = makeDecoratable("IconPicker", DecoratableIconPicker); +``` + +### `Image` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Image } from "webiny/admin/ui"; +``` + +```typescript +const Image = ({ ...rest }: ImageProps) => { + const finalProps = { ...rest }; + const srcSet = finalProps.srcSet; + if (srcSet && typeof srcSet === "object") { + finalProps.srcSet = Object.keys(srcSet) + .map(key => `${srcSet[key]} ${key}`) + .join(", "); + } + + return <img {...finalProps} />; +}; +``` + +### `Input` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Input } from "webiny/admin/ui"; +``` + +```typescript +const Input = makeDecoratable("Input", DecoratableInput); +``` + +### `Label` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Label } from "webiny/admin/ui"; +``` + +```typescript +const Label = makeDecoratable("Label", LabelBase); +``` + +### `Link` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Link } from "webiny/admin/ui"; +``` + +```typescript +export const Link = makeDecoratable("Link", LinkBase); +``` + +### `List` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { List } from "webiny/admin/ui"; +``` + +```typescript +const List = withStaticProps(makeDecoratable("List", DecoratableList), { + Item: ListItem +}); +``` + +### `ListIcon` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { ListIcon } from "webiny/admin/ui"; +``` + +```typescript +export const ListIcon = (props: IconButtonProps) => { + return ( + <IconButton + icon={<List.Item.Icon icon={<ListView />} label={"List"} />} + variant={"ghost"} + size={"sm"} + {...props} + /> + ); +}; +``` + +### `Loader` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Loader } from "webiny/admin/ui"; +``` + +```typescript +const Loader = makeDecoratable("Loader", DecoratableLoader); +``` + +### `LoginIcon` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { LoginIcon } from "webiny/admin/ui"; +``` + +```typescript +export const LoginIcon = (props: IconButtonProps) => { + return ( + <IconButton + icon={<List.Item.Icon icon={<Login />} label={"Login"} />} + variant={"ghost"} + size={"sm"} + {...props} + /> + ); +}; +``` + +### `MultiAutoComplete` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { MultiAutoComplete } from "webiny/admin/ui"; +``` + +```typescript +const MultiAutoComplete = makeDecoratable("MultiAutoComplete", DecoratableMultiAutoComplete); +``` + +### `MultiFilePicker` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { MultiFilePicker } from "webiny/admin/ui"; +``` + +```typescript +const MultiFilePicker = withStaticProps(DecoratableMultiFilePicker, { + Preview: { + Image: ImagePreview, + RichItem: RichItemPreview, + TextOnly: TextOnlyPreview + } +}); +``` + +### `NextPageIcon` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { NextPageIcon } from "webiny/admin/ui"; +``` + +```typescript +export const NextPageIcon = (props: IconButtonProps) => { + return ( + <IconButton + icon={<List.Item.Icon icon={<NavigateAfter />} label={"Next Page"} />} + variant={"ghost"} + size={"sm"} + {...props} + /> + ); +}; +``` + +### `OptionsIcon` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { OptionsIcon } from "webiny/admin/ui"; +``` + +```typescript +export const OptionsIcon = (props: IconButtonProps) => { + return ( + <IconButton + icon={<List.Item.Icon icon={<Tune />} label={"Options"} />} + variant={"ghost"} + size={"sm"} + {...props} + /> + ); +}; +``` + +### `OverlayLoader` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { OverlayLoader } from "webiny/admin/ui"; +``` + +```typescript +const OverlayLoader = makeDecoratable("OverlayLoader", DecoratableOverlayLoader); +``` + +### `Popover` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Popover } from "webiny/admin/ui"; +``` + +```typescript +const Popover = makeDecoratable("Popover", DecoratablePopover); +``` + +### `Portal` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Portal } from "webiny/admin/ui"; +``` + +```typescript +const Portal = PortalPrimitive.Root; +``` + +### `PreviousPageIcon` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { PreviousPageIcon } from "webiny/admin/ui"; +``` + +```typescript +export const PreviousPageIcon = (props: IconButtonProps) => { + return ( + <IconButton + icon={<List.Item.Icon icon={<NavigateBefore />} label={"Previous Page"} />} + variant={"ghost"} + size={"sm"} + {...props} + /> + ); +}; +``` + +### `ProgressBar` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { ProgressBar } from "webiny/admin/ui"; +``` + +```typescript +const ProgressBar = makeDecoratable("ProgressBar", DecoratableProgressBar); +``` + +### `Radio` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Radio } from "webiny/admin/ui"; +``` + +```typescript +const Radio = makeDecoratable("Radio", DecoratableRadio); +``` + +### `RadioGroup` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { RadioGroup } from "webiny/admin/ui"; +``` + +```typescript +const RadioGroup = makeDecoratable("RadioGroup", DecoratableRadioGroup); +``` + +### `RangeSlider` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { RangeSlider } from "webiny/admin/ui"; +``` + +```typescript +const RangeSlider = makeDecoratable("RangeSlider", DecoratableRangeSlider); +``` + +### `RefreshIcon` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { RefreshIcon } from "webiny/admin/ui"; +``` + +```typescript +export const RefreshIcon = (props: IconButtonProps) => { + return ( + <IconButton + icon={<List.Item.Icon icon={<AutoRenew />} label={"Refresh"} />} + variant={"ghost"} + size={"sm"} + {...props} + /> + ); +}; +``` + +### `ScrollArea` + +**Function** — imported from `webiny/admin/ui` + +```typescript +import { ScrollArea } from "webiny/admin/ui"; +``` + +```typescript +function ScrollArea( +``` + +### `Scrollbar` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Scrollbar } from "webiny/admin/ui"; +``` + +```typescript +const Scrollbar = (props: ScrollbarProps) => { + return <Scrollbars {...props} />; +}; +``` + +### `ScrollBar` + +**Function** — imported from `webiny/admin/ui` + +```typescript +import { ScrollBar } from "webiny/admin/ui"; +``` + +```typescript +function ScrollBar( +``` + +### `SegmentedControl` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { SegmentedControl } from "webiny/admin/ui"; +``` + +```typescript +const SegmentedControl = makeDecoratable("SegmentedControl", DecoratableSegmentedControl); +``` + +### `Select` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Select } from "webiny/admin/ui"; +``` + +```typescript +const Select = makeDecoratable("Select", DecoratableSelect); +``` + +### `Separator` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Separator } from "webiny/admin/ui"; +``` + +```typescript +const Separator = makeDecoratable("Separator", SeparatorBase); +``` + +### `Sidebar` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Sidebar } from "webiny/admin/ui"; +``` + +```typescript +const Sidebar = withStaticProps(DecoratableSidebar, { + Item: SidebarMenuItem, + Link: SidebarMenuLink, + Group: SidebarMenuGroup, + Icon: SidebarIcon +}); +``` + +### `SidebarProvider` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { SidebarProvider } from "webiny/admin/ui"; +``` + +```typescript +const SidebarProvider = ({ + className, + children, + state: cachedState, + onChangeState, + ...props +}: SidebarProviderProps) => { + const [sidebarState, setSidebarState] = React.useState<SidebarState>(() => + createInitialSidebarState(cachedState) + ); + const [pinnedItemsData, setPinnedItemsData] = React.useState<Map<string, PinnedItemData>>( + new Map() + ); + + +``` + +### `Skeleton` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Skeleton } from "webiny/admin/ui"; +``` + +```typescript +const Skeleton = makeDecoratable("Skeleton", DecoratableSkeleton); +``` + +### `Slider` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Slider } from "webiny/admin/ui"; +``` + +```typescript +const Slider = makeDecoratable("Slider", DecoratableSlider); +``` + +### `SortIcon` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { SortIcon } from "webiny/admin/ui"; +``` + +```typescript +export const SortIcon = (props: IconButtonProps) => { + return ( + <IconButton + icon={<List.Item.Icon icon={<Sort />} label={"Sort"} />} + variant={"ghost"} + size={"sm"} + {...props} + /> + ); +}; +``` + +### `SteppedProgress` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { SteppedProgress } from "webiny/admin/ui"; +``` + +```typescript +const SteppedProgress = withStaticProps(BaseSteppedProgress, { + Item: SteppedProgressItem +}); +``` + +### `Switch` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Switch } from "webiny/admin/ui"; +``` + +```typescript +const Switch = makeDecoratable("Switch", DecoratableSwitch); +``` + +### `Table` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Table } from "webiny/admin/ui"; +``` + +```typescript +const Table = withStaticProps(BaseTable, { + Body, + Caption, + Cell, + Direction, + Footer, + Head, + Header, + Resizer, + Row +}); +``` + +### `Tabs` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Tabs } from "webiny/admin/ui"; +``` + +```typescript +const Tabs = withStaticProps(BaseTabs, { + Tab +}); +``` + +### `Tag` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Tag } from "webiny/admin/ui"; +``` + +```typescript +const Tag = makeDecoratable("Tag", DecoratableTag); +``` + +### `Tags` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Tags } from "webiny/admin/ui"; +``` + +```typescript +const Tags = makeDecoratable("Tags", DecoratableTags); +``` + +### `Text` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Text } from "webiny/admin/ui"; +``` + +```typescript +const Text = makeDecoratable("Text", TextBase); +``` + +### `Textarea` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Textarea } from "webiny/admin/ui"; +``` + +```typescript +const Textarea = makeDecoratable("Textarea", DecoratableTextarea); +``` + +### `TimeAgo` + +**Class** — imported from `webiny/admin/ui` + +```typescript +import { TimeAgo } from "webiny/admin/ui"; +``` + +```typescript +export default class TimeAgo extends React.PureComponent<TimeAgoProps> { + static defaultProps:; + dom: HTMLTimeElement; + componentDidMount(): void; + componentDidUpdate(): void; + renderTimeAgo(): void; + componentWillUnmount(): void; + render(): JSX.Element; +} +``` + +### `Toast` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Toast } from "webiny/admin/ui"; +``` + +```typescript +const Toast = withStaticProps(makeDecoratable("Toast", DecoratableToast), { + Title: ToastTitle, + Description: ToastDescription, + Actions: ToastActions, + Provider: (props: ToasterProps) => ( + <Portal> + <Toaster expand={true} duration={6000} position={"bottom-left"} {...props} /> + </Portal> + ) +}); +``` + +### `Tooltip` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Tooltip } from "webiny/admin/ui"; +``` + +```typescript +const Tooltip = withStaticProps(makeDecoratable("Tooltip", DecoratableTooltip), { + Provider: TooltipProvider +}); +``` + +### `Tree` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Tree } from "webiny/admin/ui"; +``` + +```typescript +const Tree = withStaticProps(DecoratableTree, { + Item +}); +``` + +### `UploadIcon` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { UploadIcon } from "webiny/admin/ui"; +``` + +```typescript +export const UploadIcon = (props: IconButtonProps) => { + return ( + <IconButton + icon={<List.Item.Icon icon={<Upload />} label={"Upload"} />} + variant={"ghost"} + size={"sm"} + {...props} + /> + ); +}; +``` + +### `Widget` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { Widget } from "webiny/admin/ui"; +``` + +```typescript +const Widget = withStaticProps(DecoratableWidget, { + Action: WidgetAction, + Icon +}); +``` + +## Hooks + +### `useDialogs` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { useDialogs } from "webiny/admin/ui"; +``` + +```typescript +export const useDialogs = () => { + const context = useContext(DialogsContext); + + if (!context) { + throw new Error("useDialogs must be used within a DialogsContext.Provider"); + } + + return context; +}; +``` + +### `useDisclosure` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { useDisclosure } from "webiny/admin/ui"; +``` + +```typescript +export const useDisclosure = <TData = undefined>(isOpenDefault = false) => { + const [isOpen, defaultSetIsOpen] = useState(isOpenDefault); + const [data, setData] = useState<TData | null>(null); + + const setIsOpen = useCallback( + (isOpen: boolean | ((prev: boolean) => boolean), data?: TData) => { + defaultSetIsOpen(isOpen); + if (typeof data !== "undefined") { + +``` + +### `useSidebar` + +**Function** — imported from `webiny/admin/ui` + +```typescript +import { useSidebar } from "webiny/admin/ui"; +``` + +```typescript +function useSidebar(); +``` + +### `useToast` + +**Constant** — imported from `webiny/admin/ui` + +```typescript +import { useToast } from "webiny/admin/ui"; +``` + +```typescript +const useToast = () => { + const getTitle = React.useCallback((title: React.ReactElement<typeof ToastTitle> | string) => { + return typeof title === "string" ? <ToastTitle text={title} /> : title; + }, []); + + const getDescription = React.useCallback( + (description: React.ReactElement<typeof ToastDescription> | string | undefined) => { + return typeof description === " +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/website-builder.ai.txt b/docs/developer-docs/6.0.x/reference/admin/website-builder.ai.txt new file mode 100644 index 000000000..11986ed52 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/website-builder.ai.txt @@ -0,0 +1,25 @@ +AI Context: Website Builder (reference/admin/website-builder.mdx) + +Source of Information: +1. packages/webiny/src/admin/website-builder.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app-website-builder/src/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +pagePathFromTitle + +Import Path: webiny/admin/website-builder + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/website-builder.mdx b/docs/developer-docs/6.0.x/reference/admin/website-builder.mdx new file mode 100644 index 000000000..603ff67b8 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/website-builder.mdx @@ -0,0 +1,40 @@ +--- +id: ywrtaw4v +title: Website Builder +description: "Website Builder admin utilities" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/website-builder`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/website-builder`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList symbols={[{ name: "pagePathFromTitle", anchor: "page-path-from-title" }]} /> + +## `pagePathFromTitle` + +**Constant** — imported from `webiny/admin/website-builder` + +```typescript +import { pagePathFromTitle } from "webiny/admin/website-builder"; +``` + +```typescript +export const pagePathFromTitle = (title: string = "") => { + return slugify(title, { + replacement: "-", + lower: true, + remove: /[*#\?<>_\{\}\[\]+~.()'"!:;@]/g, + trim: false + }); +}; +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/website-builder/lexical.ai.txt b/docs/developer-docs/6.0.x/reference/admin/website-builder/lexical.ai.txt new file mode 100644 index 000000000..9a22e20d4 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/website-builder/lexical.ai.txt @@ -0,0 +1,25 @@ +AI Context: Lexical Editor (reference/admin/website-builder/lexical.mdx) + +Source of Information: +1. packages/webiny/src/admin/website-builder/lexical.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/lexical-editor/src/exports/admin/lexical.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +useLexicalEditorConfig, LexicalHtmlRenderer, getNodeFromSelection, useCurrentElement, useCurrentSelection, useDeriveValueFromSelection, useRichTextEditor, useFontColorPicker, useTextAlignmentAction, useTypographyAction, useIsMounted, Divider, DropDownItem, DropDown, Klass, LexicalNode + +Import Path: webiny/admin/website-builder/lexical + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/website-builder/lexical.mdx b/docs/developer-docs/6.0.x/reference/admin/website-builder/lexical.mdx new file mode 100644 index 000000000..3ae307131 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/website-builder/lexical.mdx @@ -0,0 +1,168 @@ +--- +id: ywrtaw4v +title: Lexical Editor +description: "Website Builder Lexical editor config" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/website-builder/lexical`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/website-builder/lexical`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "Divider", anchor: "divider" }, + { name: "DropDown", anchor: "drop-down" }, + { name: "DropDownItem", anchor: "drop-down-item" }, + { name: "getNodeFromSelection", anchor: "get-node-from-selection" }, + { name: "Klass", anchor: "klass" }, + { name: "LexicalHtmlRenderer", anchor: "lexical-html-renderer" }, + { name: "LexicalNode", anchor: "lexical-node" }, + { name: "useCurrentElement", anchor: "use-current-element" }, + { name: "useCurrentSelection", anchor: "use-current-selection" }, + { name: "useDeriveValueFromSelection", anchor: "use-derive-value-from-selection" }, + { name: "useFontColorPicker", anchor: "use-font-color-picker" }, + { name: "useIsMounted", anchor: "use-is-mounted" }, + { name: "useLexicalEditorConfig", anchor: "use-lexical-editor-config" }, + { name: "useRichTextEditor", anchor: "use-rich-text-editor" }, + { name: "useTextAlignmentAction", anchor: "use-text-alignment-action" }, + { name: "useTypographyAction", anchor: "use-typography-action" } + ]} +/> + +## `Divider` + +**Export** — imported from `webiny/admin/website-builder/lexical` + +```typescript +import { Divider } from "webiny/admin/website-builder/lexical"; +``` + +## `DropDown` + +**Export** — imported from `webiny/admin/website-builder/lexical` + +```typescript +import { DropDown } from "webiny/admin/website-builder/lexical"; +``` + +## `DropDownItem` + +**Export** — imported from `webiny/admin/website-builder/lexical` + +```typescript +import { DropDownItem } from "webiny/admin/website-builder/lexical"; +``` + +## `getNodeFromSelection` + +**Export** — imported from `webiny/admin/website-builder/lexical` + +```typescript +import { getNodeFromSelection } from "webiny/admin/website-builder/lexical"; +``` + +## `Klass` + +**Type** — imported from `webiny/admin/website-builder/lexical` + +```typescript +import type { Klass } from "webiny/admin/website-builder/lexical"; +``` + +## `LexicalHtmlRenderer` + +**Export** — imported from `webiny/admin/website-builder/lexical` + +```typescript +import { LexicalHtmlRenderer } from "webiny/admin/website-builder/lexical"; +``` + +## `LexicalNode` + +**Type** — imported from `webiny/admin/website-builder/lexical` + +```typescript +import type { LexicalNode } from "webiny/admin/website-builder/lexical"; +``` + +## `useCurrentElement` + +**Export** — imported from `webiny/admin/website-builder/lexical` + +```typescript +import { useCurrentElement } from "webiny/admin/website-builder/lexical"; +``` + +## `useCurrentSelection` + +**Export** — imported from `webiny/admin/website-builder/lexical` + +```typescript +import { useCurrentSelection } from "webiny/admin/website-builder/lexical"; +``` + +## `useDeriveValueFromSelection` + +**Export** — imported from `webiny/admin/website-builder/lexical` + +```typescript +import { useDeriveValueFromSelection } from "webiny/admin/website-builder/lexical"; +``` + +## `useFontColorPicker` + +**Export** — imported from `webiny/admin/website-builder/lexical` + +```typescript +import { useFontColorPicker } from "webiny/admin/website-builder/lexical"; +``` + +## `useIsMounted` + +**Export** — imported from `webiny/admin/website-builder/lexical` + +```typescript +import { useIsMounted } from "webiny/admin/website-builder/lexical"; +``` + +## `useLexicalEditorConfig` + +**Export** — imported from `webiny/admin/website-builder/lexical` + +```typescript +import { useLexicalEditorConfig } from "webiny/admin/website-builder/lexical"; +``` + +## `useRichTextEditor` + +**Export** — imported from `webiny/admin/website-builder/lexical` + +```typescript +import { useRichTextEditor } from "webiny/admin/website-builder/lexical"; +``` + +## `useTextAlignmentAction` + +**Export** — imported from `webiny/admin/website-builder/lexical` + +```typescript +import { useTextAlignmentAction } from "webiny/admin/website-builder/lexical"; +``` + +## `useTypographyAction` + +**Export** — imported from `webiny/admin/website-builder/lexical` + +```typescript +import { useTypographyAction } from "webiny/admin/website-builder/lexical"; +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/website-builder/page/editor.ai.txt b/docs/developer-docs/6.0.x/reference/admin/website-builder/page/editor.ai.txt new file mode 100644 index 000000000..304cc4e96 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/website-builder/page/editor.ai.txt @@ -0,0 +1,25 @@ +AI Context: Editor (reference/admin/website-builder/page/editor.mdx) + +Source of Information: +1. packages/webiny/src/admin/website-builder/page/editor.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app-website-builder/src/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +Editor, PageEditorConfig + +Import Path: webiny/admin/website-builder/page/editor + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/website-builder/page/editor.mdx b/docs/developer-docs/6.0.x/reference/admin/website-builder/page/editor.mdx new file mode 100644 index 000000000..0b4f824d7 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/website-builder/page/editor.mdx @@ -0,0 +1,58 @@ +--- +id: ywrtaw4v +title: Editor +description: "Page editor components" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/website-builder/page/editor`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/website-builder/page/editor`. Import any of the items below directly from this path in your Webiny extensions. + +**Components** + +<SymbolList symbols={[{ name: "PageEditorConfig", anchor: "page-editor-config" }]} /> + +**Other** + +<SymbolList symbols={[{ name: "Editor", anchor: "editor" }]} /> + +## Components + +### `PageEditorConfig` + +**Constant** — imported from `webiny/admin/website-builder/page/editor` + +```typescript +import { PageEditorConfig } from "webiny/admin/website-builder/page/editor"; +``` + +```typescript +export const PageEditorConfig = Object.assign(BasePageEditorConfig, EditorConfig); +``` + +## Other + +### `Editor` + +**Export** — imported from `webiny/admin/website-builder/page/editor` + +```typescript +import { Editor } from "webiny/admin/website-builder/page/editor"; +``` + +```typescript +export { DefaultEditorConfig } from "./defaultConfig/DefaultEditorConfig.js"; +export * from "./config/index.js"; +export * from "./commands.js"; +export type { ElementInputRendererProps } from "./config/ElementInput.js"; +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/website-builder/page/list.ai.txt b/docs/developer-docs/6.0.x/reference/admin/website-builder/page/list.ai.txt new file mode 100644 index 000000000..b6b9187e4 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/website-builder/page/list.ai.txt @@ -0,0 +1,25 @@ +AI Context: List (reference/admin/website-builder/page/list.mdx) + +Source of Information: +1. packages/webiny/src/admin/website-builder/page/list.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app-website-builder/src/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +PageListConfig + +Import Path: webiny/admin/website-builder/page/list + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/website-builder/page/list.mdx b/docs/developer-docs/6.0.x/reference/admin/website-builder/page/list.mdx new file mode 100644 index 000000000..392176817 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/website-builder/page/list.mdx @@ -0,0 +1,29 @@ +--- +id: ywrtaw4v +title: List +description: "Page list configuration" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/website-builder/page/list`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/website-builder/page/list`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList symbols={[{ name: "PageListConfig", anchor: "page-list-config" }]} /> + +## `PageListConfig` + +**Export** — imported from `webiny/admin/website-builder/page/list` + +```typescript +import { PageListConfig } from "webiny/admin/website-builder/page/list"; +``` diff --git a/docs/developer-docs/6.0.x/reference/admin/website-builder/redirect/list.ai.txt b/docs/developer-docs/6.0.x/reference/admin/website-builder/redirect/list.ai.txt new file mode 100644 index 000000000..e3166d8e0 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/website-builder/redirect/list.ai.txt @@ -0,0 +1,25 @@ +AI Context: List (reference/admin/website-builder/redirect/list.mdx) + +Source of Information: +1. packages/webiny/src/admin/website-builder/redirect/list.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/app-website-builder/src/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +RedirectListConfig + +Import Path: webiny/admin/website-builder/redirect/list + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/admin/website-builder/redirect/list.mdx b/docs/developer-docs/6.0.x/reference/admin/website-builder/redirect/list.mdx new file mode 100644 index 000000000..ab4d27adc --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/admin/website-builder/redirect/list.mdx @@ -0,0 +1,29 @@ +--- +id: ywrtaw4v +title: List +description: "Redirect list configuration" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/admin/website-builder/redirect/list`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/admin/website-builder/redirect/list`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList symbols={[{ name: "RedirectListConfig", anchor: "redirect-list-config" }]} /> + +## `RedirectListConfig` + +**Export** — imported from `webiny/admin/website-builder/redirect/list` + +```typescript +import { RedirectListConfig } from "webiny/admin/website-builder/redirect/list"; +``` diff --git a/docs/developer-docs/6.0.x/reference/api.ai.txt b/docs/developer-docs/6.0.x/reference/api.ai.txt new file mode 100644 index 000000000..358c313db --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api.ai.txt @@ -0,0 +1,25 @@ +AI Context: API (reference/api.mdx) + +Source of Information: +1. packages/webiny/src/api.ts — barrel re-export file + + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: + + +Import Path: webiny/api + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api.mdx b/docs/developer-docs/6.0.x/reference/api.mdx new file mode 100644 index 000000000..19b8a8e57 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api.mdx @@ -0,0 +1,21 @@ +--- +id: yxbp0000 +title: API +description: "Core API primitives: createFeature, createAbstraction, Result, BaseError" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/api`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api`. Import any of the items below directly from this path in your Webiny extensions. + +_No exported symbols found._ diff --git a/docs/developer-docs/6.0.x/reference/api/build-params.ai.txt b/docs/developer-docs/6.0.x/reference/api/build-params.ai.txt new file mode 100644 index 000000000..fbb8838f7 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/build-params.ai.txt @@ -0,0 +1,25 @@ +AI Context: Build Params (reference/api/build-params.mdx) + +Source of Information: +1. packages/webiny/src/api/build-params.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-core/src/features/buildParams/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +BuildParam, BuildParams + +Import Path: webiny/api/build-params + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/build-params.mdx b/docs/developer-docs/6.0.x/reference/api/build-params.mdx new file mode 100644 index 000000000..3c1dad99e --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/build-params.mdx @@ -0,0 +1,113 @@ +--- +id: yxbpl2j1 +title: Build Params +description: "Reference for webiny/api/build-params" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/api/build-params`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/build-params`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "BuildParam", anchor: "build-param" }, + { name: "BuildParams", anchor: "build-params" } + ]} +/> + +## `BuildParam` + +**Abstraction** — imported from `webiny/api/build-params` + +```typescript +import { BuildParam } from "webiny/api/build-params"; +``` + +**Interface `BuildParam.Interface`:** + +```typescript +interface BuildParam.Interface { + key: string; + value: any; +} +``` + +**Types:** + +```typescript +namespace BuildParam { + type Interface = IBuildParam; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { BuildParam } from "webiny/api/build-params"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private buildParam: BuildParam.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.buildParam.key: string(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [BuildParam] +}); +``` + +## `BuildParams` + +**Abstraction** — imported from `webiny/api/build-params` + +```typescript +import { BuildParams } from "webiny/api/build-params"; +``` + +**Interface `BuildParams.Interface`:** + +```typescript +interface BuildParams.Interface { + get<T = any>(key: string): T | null; +} +``` + +**Types:** + +```typescript +namespace BuildParams { + type Interface = IBuildParams; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { BuildParams } from "webiny/api/build-params"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private buildParams: BuildParams.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.buildParams.get(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [BuildParams] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/api/buildParams.ai.txt b/docs/developer-docs/6.0.x/reference/api/buildParams.ai.txt new file mode 100644 index 000000000..c27a9c8e8 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/buildParams.ai.txt @@ -0,0 +1,25 @@ +AI Context: Build Params (reference/api/buildParams.mdx) + +Source of Information: +1. packages/webiny/src/api/buildParams.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-core/src/features/buildParams/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +BuildParam, BuildParams + +Import Path: webiny/api/buildParams + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/buildParams.mdx b/docs/developer-docs/6.0.x/reference/api/buildParams.mdx new file mode 100644 index 000000000..52e3e79a0 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/buildParams.mdx @@ -0,0 +1,115 @@ +--- +id: yxbpl2j1 +title: Build Params +description: "API build parameter types" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/api/buildParams`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/buildParams`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "BuildParam", anchor: "buildparam" }, + { name: "BuildParams", anchor: "buildparams" } + ]} +/> + +## `BuildParam` + +**Abstraction** — imported from `webiny/api/buildParams` + +```typescript +import { BuildParam } from "webiny/api/buildParams"; +``` + +**Interface `BuildParam.Interface`:** + +```typescript +interface BuildParam.Interface { + key: string; + value: any; +} +``` + +**Types:** + +```typescript +namespace BuildParam { + type Interface = IBuildParam; +} +``` + +**Usage:** + +```typescript +// extensions/MyImpl.ts +import { BuildParam } from "webiny/api/buildParams"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private buildParam: BuildParam.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.buildParam.key: string(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [BuildParam] +}); +``` + +## `BuildParams` + +**Abstraction** — imported from `webiny/api/buildParams` + +```typescript +import { BuildParams } from "webiny/api/buildParams"; +``` + +**Interface `BuildParams.Interface`:** + +```typescript +interface BuildParams.Interface { + get<T = any>(key: string): T | null; +} +``` + +**Types:** + +```typescript +namespace BuildParams { + type Interface = IBuildParams; +} +``` + +**Usage:** + +```typescript +// extensions/MyImpl.ts +import { BuildParams } from "webiny/api/buildParams"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private buildParams: BuildParams.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.buildParams.get(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [BuildParams] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/api/cms/entry.ai.txt b/docs/developer-docs/6.0.x/reference/api/cms/entry.ai.txt new file mode 100644 index 000000000..b76662cfc --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/cms/entry.ai.txt @@ -0,0 +1,64 @@ +AI Context: Entry (reference/api/cms/entry.mdx) + +Source of Information: +1. packages/webiny/src/api/cms/entry.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/domain/contentEntry/EntryId.ts — originating source +3. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/types/types.ts — originating source +4. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/CreateEntry/abstractions.ts — originating source +5. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/CreateEntry/events.ts — originating source +6. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/CreateEntryRevisionFrom/abstractions.ts — originating source +7. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/CreateEntryRevisionFrom/events.ts — originating source +8. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/DeleteEntry/abstractions.ts — originating source +9. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/DeleteEntry/events.ts — originating source +10. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/DeleteEntryRevision/abstractions.ts — originating source +11. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/DeleteEntryRevision/events.ts — originating source +12. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/DeleteMultipleEntries/abstractions.ts — originating source +13. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/DeleteMultipleEntries/events.ts — originating source +14. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/MoveEntry/abstractions.ts — originating source +15. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/MoveEntry/events.ts — originating source +16. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/PublishEntry/abstractions.ts — originating source +17. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/PublishEntry/events.ts — originating source +18. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/RepublishEntry/abstractions.ts — originating source +19. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/RepublishEntry/events.ts — originating source +20. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/RestoreEntryFromBin/abstractions.ts — originating source +21. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/RestoreEntryFromBin/events.ts — originating source +22. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/UnpublishEntry/abstractions.ts — originating source +23. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/UnpublishEntry/events.ts — originating source +24. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/UpdateEntry/abstractions.ts — originating source +25. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/UpdateEntry/events.ts — originating source +26. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/UpdateSingletonEntry/abstractions.ts — originating source +27. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/GetEntriesByIds/abstractions.ts — originating source +28. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/GetEntry/abstractions.ts — originating source +29. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/GetEntryById/abstractions.ts — originating source +30. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/GetLatestEntriesByIds/abstractions.ts — originating source +31. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/GetLatestRevisionByEntryId/abstractions.ts — originating source +32. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/GetPreviousRevisionByEntryId/abstractions.ts — originating source +33. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/GetPublishedEntriesByIds/abstractions.ts — originating source +34. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/GetPublishedRevisionByEntryId/abstractions.ts — originating source +35. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/GetRevisionById/abstractions.ts — originating source +36. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/GetRevisionsByEntryId/abstractions.ts — originating source +37. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/GetSingletonEntry/abstractions.ts — originating source +38. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/ListEntries/abstractions.ts — originating source +39. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentEntry/ValidateEntry/abstractions.ts — originating source +40. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/whereMapper/abstractions.ts — originating source +41. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/sortMapper/abstractions.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +EntryId, CmsEntry, CmsEntryValues, CreateEntryUseCase, EntryBeforeCreateEventHandler, EntryAfterCreateEventHandler, CreateEntryRevisionFromUseCase, EntryRevisionBeforeCreateEventHandler, EntryRevisionAfterCreateEventHandler, DeleteEntryUseCase, MoveEntryToBinUseCase, EntryBeforeDeleteEventHandler, EntryAfterDeleteEventHandler, DeleteEntryRevisionUseCase, EntryRevisionBeforeDeleteEventHandler, EntryRevisionAfterDeleteEventHandler, DeleteMultipleEntriesUseCase, EntryBeforeDeleteMultipleEventHandler, EntryAfterDeleteMultipleEventHandler, MoveEntryUseCase, EntryBeforeMoveEventHandler, EntryAfterMoveEventHandler, PublishEntryUseCase, EntryBeforePublishEventHandler, EntryAfterPublishEventHandler, RepublishEntryUseCase, EntryBeforeRepublishEventHandler, EntryAfterRepublishEventHandler, RestoreEntryFromBinUseCase, EntryBeforeRestoreFromBinEventHandler, EntryAfterRestoreFromBinEventHandler, UnpublishEntryUseCase, EntryBeforeUnpublishEventHandler, EntryAfterUnpublishEventHandler, UpdateEntryUseCase, EntryBeforeUpdateEventHandler, EntryAfterUpdateEventHandler, UpdateSingletonEntryUseCase, GetEntriesByIdsUseCase, GetEntryUseCase, GetEntryByIdUseCase, GetLatestEntriesByIdsUseCase, GetLatestRevisionByEntryIdBaseUseCase, GetLatestRevisionByEntryIdUseCase, GetLatestDeletedRevisionByEntryIdUseCase, GetLatestRevisionByEntryIdIncludingDeletedUseCase, GetPreviousRevisionByEntryIdBaseUseCase, GetPreviousRevisionByEntryIdUseCase, GetPublishedEntriesByIdsUseCase, GetPublishedRevisionByEntryIdUseCase, GetRevisionByIdUseCase, GetRevisionsByEntryIdUseCase, GetSingletonEntryUseCase, ListEntriesUseCase, ListLatestEntriesUseCase, ListPublishedEntriesUseCase, ListDeletedEntriesUseCase, ValidateEntryUseCase, CmsWhereMapper, CmsSortMapper + +Import Path: webiny/api/cms/entry + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/cms/entry.mdx b/docs/developer-docs/6.0.x/reference/api/cms/entry.mdx new file mode 100644 index 000000000..3ba4b93bc --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/cms/entry.mdx @@ -0,0 +1,2972 @@ +--- +id: yxbpl2nt +title: Entry +description: "CMS entry use cases and event handlers" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What use cases are available in `webiny/api/cms/entry`? +- Which event handlers can you implement? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/cms/entry`. Import any of the items below directly from this path in your Webiny extensions. + +**Use Cases** + +<SymbolList + symbols={[ + { name: "CreateEntryRevisionFromUseCase", anchor: "create-entry-revision-from-use-case" }, + { name: "CreateEntryUseCase", anchor: "create-entry-use-case" }, + { name: "DeleteEntryRevisionUseCase", anchor: "delete-entry-revision-use-case" }, + { name: "DeleteEntryUseCase", anchor: "delete-entry-use-case" }, + { name: "DeleteMultipleEntriesUseCase", anchor: "delete-multiple-entries-use-case" }, + { name: "GetEntriesByIdsUseCase", anchor: "get-entries-by-ids-use-case" }, + { name: "GetEntryByIdUseCase", anchor: "get-entry-by-id-use-case" }, + { name: "GetEntryUseCase", anchor: "get-entry-use-case" }, + { + name: "GetLatestDeletedRevisionByEntryIdUseCase", + anchor: "get-latest-deleted-revision-by-entry-id-use-case" + }, + { name: "GetLatestEntriesByIdsUseCase", anchor: "get-latest-entries-by-ids-use-case" }, + { + name: "GetLatestRevisionByEntryIdBaseUseCase", + anchor: "get-latest-revision-by-entry-id-base-use-case" + }, + { + name: "GetLatestRevisionByEntryIdIncludingDeletedUseCase", + anchor: "get-latest-revision-by-entry-id-including-deleted-use-case" + }, + { + name: "GetLatestRevisionByEntryIdUseCase", + anchor: "get-latest-revision-by-entry-id-use-case" + }, + { + name: "GetPreviousRevisionByEntryIdBaseUseCase", + anchor: "get-previous-revision-by-entry-id-base-use-case" + }, + { + name: "GetPreviousRevisionByEntryIdUseCase", + anchor: "get-previous-revision-by-entry-id-use-case" + }, + { name: "GetPublishedEntriesByIdsUseCase", anchor: "get-published-entries-by-ids-use-case" }, + { + name: "GetPublishedRevisionByEntryIdUseCase", + anchor: "get-published-revision-by-entry-id-use-case" + }, + { name: "GetRevisionByIdUseCase", anchor: "get-revision-by-id-use-case" }, + { name: "GetRevisionsByEntryIdUseCase", anchor: "get-revisions-by-entry-id-use-case" }, + { name: "GetSingletonEntryUseCase", anchor: "get-singleton-entry-use-case" }, + { name: "ListDeletedEntriesUseCase", anchor: "list-deleted-entries-use-case" }, + { name: "ListEntriesUseCase", anchor: "list-entries-use-case" }, + { name: "ListLatestEntriesUseCase", anchor: "list-latest-entries-use-case" }, + { name: "ListPublishedEntriesUseCase", anchor: "list-published-entries-use-case" }, + { name: "MoveEntryToBinUseCase", anchor: "move-entry-to-bin-use-case" }, + { name: "MoveEntryUseCase", anchor: "move-entry-use-case" }, + { name: "PublishEntryUseCase", anchor: "publish-entry-use-case" }, + { name: "RepublishEntryUseCase", anchor: "republish-entry-use-case" }, + { name: "RestoreEntryFromBinUseCase", anchor: "restore-entry-from-bin-use-case" }, + { name: "UnpublishEntryUseCase", anchor: "unpublish-entry-use-case" }, + { name: "UpdateEntryUseCase", anchor: "update-entry-use-case" }, + { name: "UpdateSingletonEntryUseCase", anchor: "update-singleton-entry-use-case" }, + { name: "ValidateEntryUseCase", anchor: "validate-entry-use-case" } + ]} +/> + +**Event Handlers** + +<SymbolList + symbols={[ + { name: "EntryAfterCreateEventHandler", anchor: "entry-after-create-event-handler" }, + { name: "EntryAfterDeleteEventHandler", anchor: "entry-after-delete-event-handler" }, + { + name: "EntryAfterDeleteMultipleEventHandler", + anchor: "entry-after-delete-multiple-event-handler" + }, + { name: "EntryAfterMoveEventHandler", anchor: "entry-after-move-event-handler" }, + { name: "EntryAfterPublishEventHandler", anchor: "entry-after-publish-event-handler" }, + { name: "EntryAfterRepublishEventHandler", anchor: "entry-after-republish-event-handler" }, + { + name: "EntryAfterRestoreFromBinEventHandler", + anchor: "entry-after-restore-from-bin-event-handler" + }, + { name: "EntryAfterUnpublishEventHandler", anchor: "entry-after-unpublish-event-handler" }, + { name: "EntryAfterUpdateEventHandler", anchor: "entry-after-update-event-handler" }, + { name: "EntryBeforeCreateEventHandler", anchor: "entry-before-create-event-handler" }, + { name: "EntryBeforeDeleteEventHandler", anchor: "entry-before-delete-event-handler" }, + { + name: "EntryBeforeDeleteMultipleEventHandler", + anchor: "entry-before-delete-multiple-event-handler" + }, + { name: "EntryBeforeMoveEventHandler", anchor: "entry-before-move-event-handler" }, + { name: "EntryBeforePublishEventHandler", anchor: "entry-before-publish-event-handler" }, + { name: "EntryBeforeRepublishEventHandler", anchor: "entry-before-republish-event-handler" }, + { + name: "EntryBeforeRestoreFromBinEventHandler", + anchor: "entry-before-restore-from-bin-event-handler" + }, + { name: "EntryBeforeUnpublishEventHandler", anchor: "entry-before-unpublish-event-handler" }, + { name: "EntryBeforeUpdateEventHandler", anchor: "entry-before-update-event-handler" }, + { + name: "EntryRevisionAfterCreateEventHandler", + anchor: "entry-revision-after-create-event-handler" + }, + { + name: "EntryRevisionAfterDeleteEventHandler", + anchor: "entry-revision-after-delete-event-handler" + }, + { + name: "EntryRevisionBeforeCreateEventHandler", + anchor: "entry-revision-before-create-event-handler" + }, + { + name: "EntryRevisionBeforeDeleteEventHandler", + anchor: "entry-revision-before-delete-event-handler" + } + ]} +/> + +**Services** + +<SymbolList + symbols={[ + { name: "CmsSortMapper", anchor: "cms-sort-mapper" }, + { name: "CmsWhereMapper", anchor: "cms-where-mapper" } + ]} +/> + +**Types & Classes** + +<SymbolList + symbols={[ + { name: "CmsEntry", anchor: "cms-entry" }, + { name: "CmsEntryValues", anchor: "cms-entry-values" }, + { name: "EntryId", anchor: "entry-id" } + ]} +/> + +## Use Cases + +### `CreateEntryRevisionFromUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { CreateEntryRevisionFromUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `CreateEntryRevisionFromUseCase.Interface`:** + +```typescript +interface CreateEntryRevisionFromUseCase.Interface { + execute<T extends CmsEntryValues = CmsEntryValues>( + model: CmsModel, + sourceId: string, + input: CreateCmsEntryInput<T>, + options?: CreateCmsEntryOptionsInput + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace CreateEntryRevisionFromUseCase { + type Interface = ICreateEntryRevisionFromUseCase; + type Input = CreateCmsEntryInput<T>; + type Options = CreateCmsEntryOptionsInput; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; + type Error = UseCaseError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CreateEntryRevisionFromUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor( + private createEntryRevisionFromUseCase: CreateEntryRevisionFromUseCase.Interface + ) {} + + public async execute(/* ... */): Promise<void> { + await this.createEntryRevisionFromUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CreateEntryRevisionFromUseCase] +}); +``` + +### `CreateEntryUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { CreateEntryUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `CreateEntryUseCase.Interface`:** + +```typescript +interface CreateEntryUseCase.Interface { + execute<T extends CmsEntryValues = CmsEntryValues>( + model: CmsModel, + input: CreateCmsEntryInput<T>, + options?: CreateCmsEntryOptionsInput + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace CreateEntryUseCase { + type Interface = ICreateEntryUseCase; + type Input = CreateCmsEntryInput<T>; + type Options = CreateCmsEntryOptionsInput; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CreateEntryUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private createEntryUseCase: CreateEntryUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.createEntryUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CreateEntryUseCase] +}); +``` + +### `DeleteEntryRevisionUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { DeleteEntryRevisionUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `DeleteEntryRevisionUseCase.Interface`:** + +```typescript +interface DeleteEntryRevisionUseCase.Interface { + execute(model: CmsModel, revisionId: string): Promise<Result<void, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace DeleteEntryRevisionUseCase { + type Interface = IDeleteEntryRevisionUseCase; + type Error = UseCaseError; + type Return = Promise<Result<void, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { DeleteEntryRevisionUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private deleteEntryRevisionUseCase: DeleteEntryRevisionUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.deleteEntryRevisionUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [DeleteEntryRevisionUseCase] +}); +``` + +### `DeleteEntryUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { DeleteEntryUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `DeleteEntryUseCase.Interface`:** + +```typescript +interface DeleteEntryUseCase.Interface { + execute( + model: CmsModel, + id: string, + options?: CmsDeleteEntryOptions + ): Promise<Result<void, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace DeleteEntryUseCase { + type Interface = IDeleteEntryUseCase; + type Options = CmsDeleteEntryOptions; + type Error = UseCaseError; + type Return = Promise<Result<void, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { DeleteEntryUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private deleteEntryUseCase: DeleteEntryUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.deleteEntryUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [DeleteEntryUseCase] +}); +``` + +### `DeleteMultipleEntriesUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { DeleteMultipleEntriesUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `DeleteMultipleEntriesUseCase.Interface`:** + +```typescript +interface DeleteMultipleEntriesUseCase.Interface { + execute( + model: CmsModel, + params: IDeleteMultipleEntriesUseCaseParams + ): Promise<Result<IDeleteMultipleEntriesUseCaseResultItem[], UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace DeleteMultipleEntriesUseCase { + type Interface = IDeleteMultipleEntriesUseCase; + type Params = IDeleteMultipleEntriesUseCaseParams; + type Error = UseCaseError; + type Return = Promise<Result<IDeleteMultipleEntriesUseCaseResultItem[], UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { DeleteMultipleEntriesUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor( + private deleteMultipleEntriesUseCase: DeleteMultipleEntriesUseCase.Interface + ) {} + + public async execute(/* ... */): Promise<void> { + await this.deleteMultipleEntriesUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [DeleteMultipleEntriesUseCase] +}); +``` + +### `GetEntriesByIdsUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { GetEntriesByIdsUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `GetEntriesByIdsUseCase.Interface`:** + +```typescript +interface GetEntriesByIdsUseCase.Interface { + execute<T extends CmsEntryValues>( + model: CmsModel, + ids: string[] + ): Promise<Result<CmsEntry<T>[], UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetEntriesByIdsUseCase { + type Interface = IGetEntriesByIdsUseCase; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>[], UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetEntriesByIdsUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getEntriesByIdsUseCase: GetEntriesByIdsUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getEntriesByIdsUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetEntriesByIdsUseCase] +}); +``` + +### `GetEntryByIdUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { GetEntryByIdUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `GetEntryByIdUseCase.Interface`:** + +```typescript +interface GetEntryByIdUseCase.Interface { + execute<T extends CmsEntryValues>( + model: CmsModel, + id: string + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetEntryByIdUseCase { + type Interface = IGetEntryByIdUseCase; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetEntryByIdUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getEntryByIdUseCase: GetEntryByIdUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getEntryByIdUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetEntryByIdUseCase] +}); +``` + +### `GetEntryUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { GetEntryUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `GetEntryUseCase.Interface`:** + +```typescript +interface GetEntryUseCase.Interface { + execute<T extends CmsEntryValues>( + model: CmsModel, + params: CmsEntryGetParams + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetEntryUseCase { + type Interface = IGetEntryUseCase; + type Error = UseCaseError; + type Params = CmsEntryGetParams; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetEntryUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getEntryUseCase: GetEntryUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getEntryUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetEntryUseCase] +}); +``` + +### `GetLatestDeletedRevisionByEntryIdUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { GetLatestDeletedRevisionByEntryIdUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `GetLatestDeletedRevisionByEntryIdUseCase.Interface`:** + +```typescript +interface GetLatestDeletedRevisionByEntryIdUseCase.Interface { + execute<T extends CmsEntryValues>( + model: CmsModel, + params: CmsEntryStorageOperationsGetLatestRevisionParams + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetLatestDeletedRevisionByEntryIdUseCase { + type Interface = IGetLatestRevisionByEntryIdBaseUseCase; + type Params = CmsEntryStorageOperationsGetLatestRevisionParams; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetLatestDeletedRevisionByEntryIdUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor( + private getLatestDeletedRevisionByEntryIdUseCase: GetLatestDeletedRevisionByEntryIdUseCase.Interface + ) {} + + public async execute(/* ... */): Promise<void> { + await this.getLatestDeletedRevisionByEntryIdUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetLatestDeletedRevisionByEntryIdUseCase] +}); +``` + +### `GetLatestEntriesByIdsUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { GetLatestEntriesByIdsUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `GetLatestEntriesByIdsUseCase.Interface`:** + +```typescript +interface GetLatestEntriesByIdsUseCase.Interface { + execute<T extends CmsEntryValues>( + model: CmsModel, + ids: string[] + ): Promise<Result<CmsEntry<T>[], UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetLatestEntriesByIdsUseCase { + type Interface = IGetLatestEntriesByIdsUseCase; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>[], UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetLatestEntriesByIdsUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor( + private getLatestEntriesByIdsUseCase: GetLatestEntriesByIdsUseCase.Interface + ) {} + + public async execute(/* ... */): Promise<void> { + await this.getLatestEntriesByIdsUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetLatestEntriesByIdsUseCase] +}); +``` + +### `GetLatestRevisionByEntryIdBaseUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { GetLatestRevisionByEntryIdBaseUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `GetLatestRevisionByEntryIdBaseUseCase.Interface`:** + +```typescript +interface GetLatestRevisionByEntryIdBaseUseCase.Interface { + execute<T extends CmsEntryValues>( + model: CmsModel, + params: CmsEntryStorageOperationsGetLatestRevisionParams + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetLatestRevisionByEntryIdBaseUseCase { + type Interface = IGetLatestRevisionByEntryIdBaseUseCase; + type Params = CmsEntryStorageOperationsGetLatestRevisionParams; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetLatestRevisionByEntryIdBaseUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor( + private getLatestRevisionByEntryIdBaseUseCase: GetLatestRevisionByEntryIdBaseUseCase.Interface + ) {} + + public async execute(/* ... */): Promise<void> { + await this.getLatestRevisionByEntryIdBaseUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetLatestRevisionByEntryIdBaseUseCase] +}); +``` + +### `GetLatestRevisionByEntryIdIncludingDeletedUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { GetLatestRevisionByEntryIdIncludingDeletedUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `GetLatestRevisionByEntryIdIncludingDeletedUseCase.Interface`:** + +```typescript +interface GetLatestRevisionByEntryIdIncludingDeletedUseCase.Interface { + execute<T extends CmsEntryValues>( + model: CmsModel, + params: CmsEntryStorageOperationsGetLatestRevisionParams + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetLatestRevisionByEntryIdIncludingDeletedUseCase { + type Interface = IGetLatestRevisionByEntryIdBaseUseCase; + type Params = CmsEntryStorageOperationsGetLatestRevisionParams; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetLatestRevisionByEntryIdIncludingDeletedUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor( + private getLatestRevisionByEntryIdIncludingDeletedUseCase: GetLatestRevisionByEntryIdIncludingDeletedUseCase.Interface + ) {} + + public async execute(/* ... */): Promise<void> { + await this.getLatestRevisionByEntryIdIncludingDeletedUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetLatestRevisionByEntryIdIncludingDeletedUseCase] +}); +``` + +### `GetLatestRevisionByEntryIdUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { GetLatestRevisionByEntryIdUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `GetLatestRevisionByEntryIdUseCase.Interface`:** + +```typescript +interface GetLatestRevisionByEntryIdUseCase.Interface { + execute<T extends CmsEntryValues>( + model: CmsModel, + params: CmsEntryStorageOperationsGetLatestRevisionParams + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetLatestRevisionByEntryIdUseCase { + type Interface = IGetLatestRevisionByEntryIdBaseUseCase; + type Params = CmsEntryStorageOperationsGetLatestRevisionParams; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetLatestRevisionByEntryIdUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor( + private getLatestRevisionByEntryIdUseCase: GetLatestRevisionByEntryIdUseCase.Interface + ) {} + + public async execute(/* ... */): Promise<void> { + await this.getLatestRevisionByEntryIdUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetLatestRevisionByEntryIdUseCase] +}); +``` + +### `GetPreviousRevisionByEntryIdBaseUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { GetPreviousRevisionByEntryIdBaseUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `GetPreviousRevisionByEntryIdBaseUseCase.Interface`:** + +```typescript +interface GetPreviousRevisionByEntryIdBaseUseCase.Interface { + execute<T extends CmsEntryValues>( + model: CmsModel, + params: CmsEntryStorageOperationsGetPreviousRevisionParams + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetPreviousRevisionByEntryIdBaseUseCase { + type Interface = IGetPreviousRevisionByEntryIdBaseUseCase; + type Params = CmsEntryStorageOperationsGetPreviousRevisionParams; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetPreviousRevisionByEntryIdBaseUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor( + private getPreviousRevisionByEntryIdBaseUseCase: GetPreviousRevisionByEntryIdBaseUseCase.Interface + ) {} + + public async execute(/* ... */): Promise<void> { + await this.getPreviousRevisionByEntryIdBaseUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetPreviousRevisionByEntryIdBaseUseCase] +}); +``` + +### `GetPreviousRevisionByEntryIdUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { GetPreviousRevisionByEntryIdUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `GetPreviousRevisionByEntryIdUseCase.Interface`:** + +```typescript +interface GetPreviousRevisionByEntryIdUseCase.Interface { + execute<T extends CmsEntryValues>( + model: CmsModel, + params: CmsEntryStorageOperationsGetPreviousRevisionParams + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetPreviousRevisionByEntryIdUseCase { + type Interface = IGetPreviousRevisionByEntryIdBaseUseCase; + type Params = CmsEntryStorageOperationsGetPreviousRevisionParams; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetPreviousRevisionByEntryIdUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor( + private getPreviousRevisionByEntryIdUseCase: GetPreviousRevisionByEntryIdUseCase.Interface + ) {} + + public async execute(/* ... */): Promise<void> { + await this.getPreviousRevisionByEntryIdUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetPreviousRevisionByEntryIdUseCase] +}); +``` + +### `GetPublishedEntriesByIdsUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { GetPublishedEntriesByIdsUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `GetPublishedEntriesByIdsUseCase.Interface`:** + +```typescript +interface GetPublishedEntriesByIdsUseCase.Interface { + execute<T extends CmsEntryValues>( + model: CmsModel, + ids: string[] + ): Promise<Result<CmsEntry<T>[], UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetPublishedEntriesByIdsUseCase { + type Interface = IGetPublishedEntriesByIdsUseCase; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>[], UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetPublishedEntriesByIdsUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor( + private getPublishedEntriesByIdsUseCase: GetPublishedEntriesByIdsUseCase.Interface + ) {} + + public async execute(/* ... */): Promise<void> { + await this.getPublishedEntriesByIdsUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetPublishedEntriesByIdsUseCase] +}); +``` + +### `GetPublishedRevisionByEntryIdUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { GetPublishedRevisionByEntryIdUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `GetPublishedRevisionByEntryIdUseCase.Interface`:** + +```typescript +interface GetPublishedRevisionByEntryIdUseCase.Interface { + execute<T extends CmsEntryValues = CmsEntryValues>( + model: CmsModel, + entryId: string + ): Promise<Result<CmsEntry<T> | null, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetPublishedRevisionByEntryIdUseCase { + type Interface = IGetPublishedRevisionByEntryIdUseCase; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T> | null, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetPublishedRevisionByEntryIdUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor( + private getPublishedRevisionByEntryIdUseCase: GetPublishedRevisionByEntryIdUseCase.Interface + ) {} + + public async execute(/* ... */): Promise<void> { + await this.getPublishedRevisionByEntryIdUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetPublishedRevisionByEntryIdUseCase] +}); +``` + +### `GetRevisionByIdUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { GetRevisionByIdUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `GetRevisionByIdUseCase.Interface`:** + +```typescript +interface GetRevisionByIdUseCase.Interface { + execute<T extends CmsEntryValues = CmsEntryValues>( + model: CmsModel, + id: string + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetRevisionByIdUseCase { + type Interface = IGetRevisionByIdUseCase; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetRevisionByIdUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getRevisionByIdUseCase: GetRevisionByIdUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getRevisionByIdUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetRevisionByIdUseCase] +}); +``` + +### `GetRevisionsByEntryIdUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { GetRevisionsByEntryIdUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `GetRevisionsByEntryIdUseCase.Interface`:** + +```typescript +interface GetRevisionsByEntryIdUseCase.Interface { + execute<T extends CmsEntryValues>( + model: CmsModel, + entryId: string + ): Promise<Result<CmsEntry<T>[], UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetRevisionsByEntryIdUseCase { + type Interface = IGetRevisionsByEntryIdUseCase; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>[], UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetRevisionsByEntryIdUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor( + private getRevisionsByEntryIdUseCase: GetRevisionsByEntryIdUseCase.Interface + ) {} + + public async execute(/* ... */): Promise<void> { + await this.getRevisionsByEntryIdUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetRevisionsByEntryIdUseCase] +}); +``` + +### `GetSingletonEntryUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { GetSingletonEntryUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `GetSingletonEntryUseCase.Interface`:** + +```typescript +interface GetSingletonEntryUseCase.Interface { + execute<T extends CmsEntryValues = CmsEntryValues>( + model: CmsModel + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetSingletonEntryUseCase { + type Interface = IGetSingletonEntryUseCase; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetSingletonEntryUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getSingletonEntryUseCase: GetSingletonEntryUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getSingletonEntryUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetSingletonEntryUseCase] +}); +``` + +### `ListDeletedEntriesUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { ListDeletedEntriesUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `ListDeletedEntriesUseCase.Interface`:** + +```typescript +interface ListDeletedEntriesUseCase.Interface { + execute<T extends CmsEntryValues>( + model: CmsModel, + params?: CmsEntryListParams + ): Promise<Result<IListEntriesResult<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace ListDeletedEntriesUseCase { + type Interface = IListDeletedEntriesUseCase; + type Params = CmsEntryListParams; + type Return = Promise<Result<IListEntriesResult<T>, UseCaseError>>; + type Error = UseCaseError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ListDeletedEntriesUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private listDeletedEntriesUseCase: ListDeletedEntriesUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.listDeletedEntriesUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ListDeletedEntriesUseCase] +}); +``` + +### `ListEntriesUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { ListEntriesUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `ListEntriesUseCase.Interface`:** + +```typescript +interface ListEntriesUseCase.Interface { + execute<T extends CmsEntryValues>( + model: CmsModel, + params?: CmsEntryListParams + ): Promise<Result<IListEntriesResult<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace ListEntriesUseCase { + type Interface = IListEntriesUseCase; + type Params = CmsEntryListParams; + type Return = Promise<Result<IListEntriesResult<T>, UseCaseError>>; + type Error = UseCaseError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ListEntriesUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private listEntriesUseCase: ListEntriesUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.listEntriesUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ListEntriesUseCase] +}); +``` + +### `ListLatestEntriesUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { ListLatestEntriesUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `ListLatestEntriesUseCase.Interface`:** + +```typescript +interface ListLatestEntriesUseCase.Interface { + execute<T extends CmsEntryValues>( + model: CmsModel, + params?: CmsEntryListParams + ): Promise<Result<IListEntriesResult<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace ListLatestEntriesUseCase { + type Interface = IListLatestEntriesUseCase; + type Params = CmsEntryListParams; + type Return = Promise<Result<IListEntriesResult<T>, UseCaseError>>; + type Error = UseCaseError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ListLatestEntriesUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private listLatestEntriesUseCase: ListLatestEntriesUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.listLatestEntriesUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ListLatestEntriesUseCase] +}); +``` + +### `ListPublishedEntriesUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { ListPublishedEntriesUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `ListPublishedEntriesUseCase.Interface`:** + +```typescript +interface ListPublishedEntriesUseCase.Interface { + execute<T extends CmsEntryValues>( + model: CmsModel, + params?: CmsEntryListParams + ): Promise<Result<IListEntriesResult<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace ListPublishedEntriesUseCase { + type Interface = IListPublishedEntriesUseCase; + type Params = CmsEntryListParams; + type Return = Promise<Result<IListEntriesResult<T>, UseCaseError>>; + type Error = UseCaseError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ListPublishedEntriesUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private listPublishedEntriesUseCase: ListPublishedEntriesUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.listPublishedEntriesUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ListPublishedEntriesUseCase] +}); +``` + +### `MoveEntryToBinUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { MoveEntryToBinUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `MoveEntryToBinUseCase.Interface`:** + +```typescript +interface MoveEntryToBinUseCase.Interface { + execute(model: CmsModel, id: string): Promise<Result<void, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace MoveEntryToBinUseCase { + type Interface = IMoveEntryToBinUseCase; + type Error = UseCaseError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { MoveEntryToBinUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private moveEntryToBinUseCase: MoveEntryToBinUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.moveEntryToBinUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [MoveEntryToBinUseCase] +}); +``` + +### `MoveEntryUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { MoveEntryUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `MoveEntryUseCase.Interface`:** + +```typescript +interface MoveEntryUseCase.Interface { + execute<T extends CmsEntryValues = CmsEntryValues>( + model: CmsModel, + id: string, + folderId: string + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace MoveEntryUseCase { + type Interface = IMoveEntryUseCase; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { MoveEntryUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private moveEntryUseCase: MoveEntryUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.moveEntryUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [MoveEntryUseCase] +}); +``` + +### `PublishEntryUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { PublishEntryUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `PublishEntryUseCase.Interface`:** + +```typescript +interface PublishEntryUseCase.Interface { + execute<T extends CmsEntryValues = CmsEntryValues>( + model: CmsModel, + id: string + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace PublishEntryUseCase { + type Interface = IPublishEntryUseCase; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { PublishEntryUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private publishEntryUseCase: PublishEntryUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.publishEntryUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [PublishEntryUseCase] +}); +``` + +### `RepublishEntryUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { RepublishEntryUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `RepublishEntryUseCase.Interface`:** + +```typescript +interface RepublishEntryUseCase.Interface { + execute<T extends CmsEntryValues = CmsEntryValues>( + model: CmsModel, + id: string + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace RepublishEntryUseCase { + type Interface = IRepublishEntryUseCase; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { RepublishEntryUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private republishEntryUseCase: RepublishEntryUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.republishEntryUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [RepublishEntryUseCase] +}); +``` + +### `RestoreEntryFromBinUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { RestoreEntryFromBinUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `RestoreEntryFromBinUseCase.Interface`:** + +```typescript +interface RestoreEntryFromBinUseCase.Interface { + execute<T extends CmsEntryValues = CmsEntryValues>( + model: CmsModel, + id: string + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace RestoreEntryFromBinUseCase { + type Interface = IRestoreEntryFromBinUseCase; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { RestoreEntryFromBinUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private restoreEntryFromBinUseCase: RestoreEntryFromBinUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.restoreEntryFromBinUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [RestoreEntryFromBinUseCase] +}); +``` + +### `UnpublishEntryUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { UnpublishEntryUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `UnpublishEntryUseCase.Interface`:** + +```typescript +interface UnpublishEntryUseCase.Interface { + execute<T extends CmsEntryValues = CmsEntryValues>( + model: CmsModel, + id: string + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace UnpublishEntryUseCase { + type Interface = IUnpublishEntryUseCase; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { UnpublishEntryUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private unpublishEntryUseCase: UnpublishEntryUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.unpublishEntryUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [UnpublishEntryUseCase] +}); +``` + +### `UpdateEntryUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { UpdateEntryUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `UpdateEntryUseCase.Interface`:** + +```typescript +interface UpdateEntryUseCase.Interface { + execute<T extends CmsEntryValues = CmsEntryValues>( + model: CmsModel, + id: string, + input: UpdateCmsEntryInput<T>, + metaInput?: GenericRecord, + options?: UpdateCmsEntryOptionsInput + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace UpdateEntryUseCase { + type Interface = IUpdateEntryUseCase; + type Input = UpdateCmsEntryInput<T>; + type Meta = GenericRecord; + type Options = UpdateCmsEntryOptionsInput; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { UpdateEntryUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private updateEntryUseCase: UpdateEntryUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.updateEntryUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [UpdateEntryUseCase] +}); +``` + +### `UpdateSingletonEntryUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { UpdateSingletonEntryUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `UpdateSingletonEntryUseCase.Interface`:** + +```typescript +interface UpdateSingletonEntryUseCase.Interface { + execute<T extends CmsEntryValues = CmsEntryValues>( + model: CmsModel, + data: UpdateCmsEntryInput<T>, + options?: UpdateCmsEntryOptionsInput + ): Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace UpdateSingletonEntryUseCase { + type Interface = IUpdateSingletonEntryUseCase; + type Input = UpdateCmsEntryInput<T>; + type Options = UpdateCmsEntryOptionsInput; + type Error = UseCaseError; + type Return = Promise<Result<CmsEntry<T>, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { UpdateSingletonEntryUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private updateSingletonEntryUseCase: UpdateSingletonEntryUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.updateSingletonEntryUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [UpdateSingletonEntryUseCase] +}); +``` + +### `ValidateEntryUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { ValidateEntryUseCase } from "webiny/api/cms/entry"; +``` + +**Interface `ValidateEntryUseCase.Interface`:** + +```typescript +interface ValidateEntryUseCase.Interface { + execute<T extends CmsEntryValues = CmsEntryValues>( + model: CmsModel, + id: string | null | undefined, + input: UpdateCmsEntryInput<T> + ): IValidateEntryUseCaseExecuteResult; +} +``` + +**Types:** + +```typescript +namespace ValidateEntryUseCase { + type Interface = IValidateEntryUseCase; + type Input = UpdateCmsEntryInput<T>; + type Error = UseCaseError; + type Return = IValidateEntryUseCaseExecuteResult; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ValidateEntryUseCase } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private validateEntryUseCase: ValidateEntryUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.validateEntryUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ValidateEntryUseCase] +}); +``` + +## Event Handlers + +### `EntryAfterCreateEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryAfterCreateEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryAfterCreateEventHandler.Interface`:** + +```typescript +interface EntryAfterCreateEventHandler.Interface { + handle(event: EntryAfterCreateEvent): Promise<void>; +} +``` + +**Event payload `EntryAfterCreateEventPayload`:** + +```typescript +interface EntryAfterCreateEventPayload { + entry: CmsEntry; + input: CreateCmsEntryInput; + model: CmsModel; +} +``` + +**Types:** + +```typescript +namespace EntryAfterCreateEventHandler { + type Interface = IEventHandler<EntryAfterCreateEvent>; + type Event = EntryAfterCreateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryAfterCreateEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryAfterCreateEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryAfterCreateEventHandler.Event): Promise<void> { + const { entry, input, model } = event.payload; + } +} + +export default EntryAfterCreateEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryAfterDeleteEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryAfterDeleteEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryAfterDeleteEventHandler.Interface`:** + +```typescript +interface EntryAfterDeleteEventHandler.Interface { + handle(event: EntryAfterDeleteEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace EntryAfterDeleteEventHandler { + type Interface = IEventHandler<EntryAfterDeleteEvent>; + type Event = EntryAfterDeleteEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryAfterDeleteEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryAfterDeleteEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryAfterDeleteEventHandler.Event): Promise<void> { + // implementation + } +} + +export default EntryAfterDeleteEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryAfterDeleteMultipleEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryAfterDeleteMultipleEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryAfterDeleteMultipleEventHandler.Interface`:** + +```typescript +interface EntryAfterDeleteMultipleEventHandler.Interface { + handle(event: EntryAfterDeleteMultipleEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace EntryAfterDeleteMultipleEventHandler { + type Interface = IEventHandler<EntryAfterDeleteMultipleEvent>; + type Event = EntryAfterDeleteMultipleEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryAfterDeleteMultipleEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryAfterDeleteMultipleEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryAfterDeleteMultipleEventHandler.Event): Promise<void> { + // implementation + } +} + +export default EntryAfterDeleteMultipleEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryAfterMoveEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryAfterMoveEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryAfterMoveEventHandler.Interface`:** + +```typescript +interface EntryAfterMoveEventHandler.Interface { + handle(event: EntryAfterMoveEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace EntryAfterMoveEventHandler { + type Interface = IEventHandler<EntryAfterMoveEvent>; + type Event = EntryAfterMoveEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryAfterMoveEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryAfterMoveEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryAfterMoveEventHandler.Event): Promise<void> { + // implementation + } +} + +export default EntryAfterMoveEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryAfterPublishEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryAfterPublishEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryAfterPublishEventHandler.Interface`:** + +```typescript +interface EntryAfterPublishEventHandler.Interface { + handle(event: EntryAfterPublishEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace EntryAfterPublishEventHandler { + type Interface = IEventHandler<EntryAfterPublishEvent>; + type Event = EntryAfterPublishEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryAfterPublishEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryAfterPublishEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryAfterPublishEventHandler.Event): Promise<void> { + // implementation + } +} + +export default EntryAfterPublishEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryAfterRepublishEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryAfterRepublishEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryAfterRepublishEventHandler.Interface`:** + +```typescript +interface EntryAfterRepublishEventHandler.Interface { + handle(event: EntryAfterRepublishEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace EntryAfterRepublishEventHandler { + type Interface = IEventHandler<EntryAfterRepublishEvent>; + type Event = EntryAfterRepublishEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryAfterRepublishEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryAfterRepublishEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryAfterRepublishEventHandler.Event): Promise<void> { + // implementation + } +} + +export default EntryAfterRepublishEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryAfterRestoreFromBinEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryAfterRestoreFromBinEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryAfterRestoreFromBinEventHandler.Interface`:** + +```typescript +interface EntryAfterRestoreFromBinEventHandler.Interface { + handle(event: EntryAfterRestoreFromBinEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace EntryAfterRestoreFromBinEventHandler { + type Interface = IEventHandler<EntryAfterRestoreFromBinEvent>; + type Event = EntryAfterRestoreFromBinEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryAfterRestoreFromBinEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryAfterRestoreFromBinEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryAfterRestoreFromBinEventHandler.Event): Promise<void> { + // implementation + } +} + +export default EntryAfterRestoreFromBinEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryAfterUnpublishEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryAfterUnpublishEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryAfterUnpublishEventHandler.Interface`:** + +```typescript +interface EntryAfterUnpublishEventHandler.Interface { + handle(event: EntryAfterUnpublishEvent): Promise<void>; +} +``` + +**Event payload `EntryAfterUnpublishEventPayload`:** + +```typescript +interface EntryAfterUnpublishEventPayload { + entry: CmsEntry; + storageEntry: any; + model: CmsModel; +} +``` + +**Types:** + +```typescript +namespace EntryAfterUnpublishEventHandler { + type Interface = IEventHandler<EntryAfterUnpublishEvent>; + type Event = EntryAfterUnpublishEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryAfterUnpublishEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryAfterUnpublishEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryAfterUnpublishEventHandler.Event): Promise<void> { + const { entry, storageEntry, model } = event.payload; + } +} + +export default EntryAfterUnpublishEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryAfterUpdateEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryAfterUpdateEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryAfterUpdateEventHandler.Interface`:** + +```typescript +interface EntryAfterUpdateEventHandler.Interface { + handle(event: EntryAfterUpdateEvent): Promise<void>; +} +``` + +**Event payload `EntryAfterUpdateEventPayload`:** + +```typescript +interface EntryAfterUpdateEventPayload { + entry: CmsEntry; + original: CmsEntry; + input: UpdateCmsEntryInput; + model: CmsModel; +} +``` + +**Types:** + +```typescript +namespace EntryAfterUpdateEventHandler { + type Interface = IEventHandler<EntryAfterUpdateEvent>; + type Event = EntryAfterUpdateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryAfterUpdateEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryAfterUpdateEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryAfterUpdateEventHandler.Event): Promise<void> { + const { entry, original, input, model } = event.payload; + } +} + +export default EntryAfterUpdateEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryBeforeCreateEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryBeforeCreateEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryBeforeCreateEventHandler.Interface`:** + +```typescript +interface EntryBeforeCreateEventHandler.Interface { + handle(event: EntryBeforeCreateEvent): Promise<void>; +} +``` + +**Event payload `EntryBeforeCreateEventPayload`:** + +```typescript +interface EntryBeforeCreateEventPayload { + entry: CmsEntry; + input: CreateCmsEntryInput; + model: CmsModel; +} +``` + +**Types:** + +```typescript +namespace EntryBeforeCreateEventHandler { + type Interface = IEventHandler<EntryBeforeCreateEvent>; + type Event = EntryBeforeCreateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryBeforeCreateEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryBeforeCreateEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryBeforeCreateEventHandler.Event): Promise<void> { + const { entry, input, model } = event.payload; + } +} + +export default EntryBeforeCreateEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryBeforeDeleteEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryBeforeDeleteEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryBeforeDeleteEventHandler.Interface`:** + +```typescript +interface EntryBeforeDeleteEventHandler.Interface { + handle(event: EntryBeforeDeleteEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace EntryBeforeDeleteEventHandler { + type Interface = IEventHandler<EntryBeforeDeleteEvent>; + type Event = EntryBeforeDeleteEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryBeforeDeleteEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryBeforeDeleteEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryBeforeDeleteEventHandler.Event): Promise<void> { + // implementation + } +} + +export default EntryBeforeDeleteEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryBeforeDeleteMultipleEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryBeforeDeleteMultipleEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryBeforeDeleteMultipleEventHandler.Interface`:** + +```typescript +interface EntryBeforeDeleteMultipleEventHandler.Interface { + handle(event: EntryBeforeDeleteMultipleEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace EntryBeforeDeleteMultipleEventHandler { + type Interface = IEventHandler<EntryBeforeDeleteMultipleEvent>; + type Event = EntryBeforeDeleteMultipleEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryBeforeDeleteMultipleEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryBeforeDeleteMultipleEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryBeforeDeleteMultipleEventHandler.Event): Promise<void> { + // implementation + } +} + +export default EntryBeforeDeleteMultipleEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryBeforeMoveEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryBeforeMoveEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryBeforeMoveEventHandler.Interface`:** + +```typescript +interface EntryBeforeMoveEventHandler.Interface { + handle(event: EntryBeforeMoveEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace EntryBeforeMoveEventHandler { + type Interface = IEventHandler<EntryBeforeMoveEvent>; + type Event = EntryBeforeMoveEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryBeforeMoveEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryBeforeMoveEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryBeforeMoveEventHandler.Event): Promise<void> { + // implementation + } +} + +export default EntryBeforeMoveEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryBeforePublishEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryBeforePublishEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryBeforePublishEventHandler.Interface`:** + +```typescript +interface EntryBeforePublishEventHandler.Interface { + handle(event: EntryBeforePublishEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace EntryBeforePublishEventHandler { + type Interface = IEventHandler<EntryBeforePublishEvent>; + type Event = EntryBeforePublishEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryBeforePublishEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryBeforePublishEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryBeforePublishEventHandler.Event): Promise<void> { + // implementation + } +} + +export default EntryBeforePublishEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryBeforeRepublishEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryBeforeRepublishEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryBeforeRepublishEventHandler.Interface`:** + +```typescript +interface EntryBeforeRepublishEventHandler.Interface { + handle(event: EntryBeforeRepublishEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace EntryBeforeRepublishEventHandler { + type Interface = IEventHandler<EntryBeforeRepublishEvent>; + type Event = EntryBeforeRepublishEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryBeforeRepublishEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryBeforeRepublishEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryBeforeRepublishEventHandler.Event): Promise<void> { + // implementation + } +} + +export default EntryBeforeRepublishEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryBeforeRestoreFromBinEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryBeforeRestoreFromBinEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryBeforeRestoreFromBinEventHandler.Interface`:** + +```typescript +interface EntryBeforeRestoreFromBinEventHandler.Interface { + handle(event: EntryBeforeRestoreFromBinEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace EntryBeforeRestoreFromBinEventHandler { + type Interface = IEventHandler<EntryBeforeRestoreFromBinEvent>; + type Event = EntryBeforeRestoreFromBinEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryBeforeRestoreFromBinEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryBeforeRestoreFromBinEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryBeforeRestoreFromBinEventHandler.Event): Promise<void> { + // implementation + } +} + +export default EntryBeforeRestoreFromBinEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryBeforeUnpublishEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryBeforeUnpublishEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryBeforeUnpublishEventHandler.Interface`:** + +```typescript +interface EntryBeforeUnpublishEventHandler.Interface { + handle(event: EntryBeforeUnpublishEvent): Promise<void>; +} +``` + +**Event payload `EntryBeforeUnpublishEventPayload`:** + +```typescript +interface EntryBeforeUnpublishEventPayload { + entry: CmsEntry; + model: CmsModel; +} +``` + +**Types:** + +```typescript +namespace EntryBeforeUnpublishEventHandler { + type Interface = IEventHandler<EntryBeforeUnpublishEvent>; + type Event = EntryBeforeUnpublishEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryBeforeUnpublishEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryBeforeUnpublishEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryBeforeUnpublishEventHandler.Event): Promise<void> { + const { entry, model } = event.payload; + } +} + +export default EntryBeforeUnpublishEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryBeforeUpdateEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryBeforeUpdateEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryBeforeUpdateEventHandler.Interface`:** + +```typescript +interface EntryBeforeUpdateEventHandler.Interface { + handle(event: EntryBeforeUpdateEvent): Promise<void>; +} +``` + +**Event payload `EntryBeforeUpdateEventPayload`:** + +```typescript +interface EntryBeforeUpdateEventPayload { + entry: CmsEntry; + original: CmsEntry; + input: UpdateCmsEntryInput; + model: CmsModel; +} +``` + +**Types:** + +```typescript +namespace EntryBeforeUpdateEventHandler { + type Interface = IEventHandler<EntryBeforeUpdateEvent>; + type Event = EntryBeforeUpdateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryBeforeUpdateEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryBeforeUpdateEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryBeforeUpdateEventHandler.Event): Promise<void> { + const { entry, original, input, model } = event.payload; + } +} + +export default EntryBeforeUpdateEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryRevisionAfterCreateEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryRevisionAfterCreateEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryRevisionAfterCreateEventHandler.Interface`:** + +```typescript +interface EntryRevisionAfterCreateEventHandler.Interface { + handle(event: EntryRevisionAfterCreateEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace EntryRevisionAfterCreateEventHandler { + type Interface = IEventHandler<EntryRevisionAfterCreateEvent>; + type Event = EntryRevisionAfterCreateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryRevisionAfterCreateEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryRevisionAfterCreateEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryRevisionAfterCreateEventHandler.Event): Promise<void> { + // implementation + } +} + +export default EntryRevisionAfterCreateEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryRevisionAfterDeleteEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryRevisionAfterDeleteEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryRevisionAfterDeleteEventHandler.Interface`:** + +```typescript +interface EntryRevisionAfterDeleteEventHandler.Interface { + handle(event: EntryRevisionAfterDeleteEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace EntryRevisionAfterDeleteEventHandler { + type Interface = IEventHandler<EntryRevisionAfterDeleteEvent>; + type Event = EntryRevisionAfterDeleteEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryRevisionAfterDeleteEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryRevisionAfterDeleteEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryRevisionAfterDeleteEventHandler.Event): Promise<void> { + // implementation + } +} + +export default EntryRevisionAfterDeleteEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryRevisionBeforeCreateEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryRevisionBeforeCreateEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryRevisionBeforeCreateEventHandler.Interface`:** + +```typescript +interface EntryRevisionBeforeCreateEventHandler.Interface { + handle(event: EntryRevisionBeforeCreateEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace EntryRevisionBeforeCreateEventHandler { + type Interface = IEventHandler<EntryRevisionBeforeCreateEvent>; + type Event = EntryRevisionBeforeCreateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryRevisionBeforeCreateEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryRevisionBeforeCreateEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryRevisionBeforeCreateEventHandler.Event): Promise<void> { + // implementation + } +} + +export default EntryRevisionBeforeCreateEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `EntryRevisionBeforeDeleteEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryRevisionBeforeDeleteEventHandler } from "webiny/api/cms/entry"; +``` + +**Interface `EntryRevisionBeforeDeleteEventHandler.Interface`:** + +```typescript +interface EntryRevisionBeforeDeleteEventHandler.Interface { + handle(event: EntryRevisionBeforeDeleteEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace EntryRevisionBeforeDeleteEventHandler { + type Interface = IEventHandler<EntryRevisionBeforeDeleteEvent>; + type Event = EntryRevisionBeforeDeleteEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { EntryRevisionBeforeDeleteEventHandler } from "webiny/api/cms/entry"; + +class MyHandler implements EntryRevisionBeforeDeleteEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: EntryRevisionBeforeDeleteEventHandler.Event): Promise<void> { + // implementation + } +} + +export default EntryRevisionBeforeDeleteEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +## Services + +### `CmsSortMapper` + +**Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { CmsSortMapper } from "webiny/api/cms/entry"; +``` + +**Interface `CmsSortMapper.Interface`:** + +```typescript +interface CmsSortMapper.Interface { + map(params: ICmsSortMapperParams): CmsEntryListSort | undefined; +} +``` + +**Types:** + +```typescript +namespace CmsSortMapper { + type Interface = ICmsSortMapper; + type Params = ICmsSortMapperParams; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CmsSortMapper } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private cmsSortMapper: CmsSortMapper.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.cmsSortMapper.map(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CmsSortMapper] +}); +``` + +### `CmsWhereMapper` + +**Abstraction** — imported from `webiny/api/cms/entry` + +```typescript +import { CmsWhereMapper } from "webiny/api/cms/entry"; +``` + +**Interface `CmsWhereMapper.Interface`:** + +```typescript +interface CmsWhereMapper.Interface { + map<T extends GenericRecord>(params: ICmsWhereMapperParams<T>): CmsEntryListWhere | undefined; +} +``` + +**Types:** + +```typescript +namespace CmsWhereMapper { + type Interface = ICmsWhereMapper; + type Params = ICmsWhereMapperParams<T>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CmsWhereMapper } from "webiny/api/cms/entry"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private cmsWhereMapper: CmsWhereMapper.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.cmsWhereMapper.map(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CmsWhereMapper] +}); +``` + +## Types & Classes + +### `CmsEntry` + +**Type** — imported from `webiny/api/cms/entry` + +A content entry definition for and from the database. + +@category Database model +@category CmsEntry + +```typescript +import type { CmsEntry } from "webiny/api/cms/entry"; +``` + +```typescript +export interface CmsEntry<TValues extends CmsEntryValues = CmsEntryValues> { ... } +``` + +### `CmsEntryValues` + +**Type** — imported from `webiny/api/cms/entry` + +A content entry values definition for and from the database. + +@category Database model +@category CmsEntry + +```typescript +import type { CmsEntryValues } from "webiny/api/cms/entry"; +``` + +```typescript +export interface CmsEntryValues { + [key: string]: any; +} +``` + +### `EntryId` + +**Class** — imported from `webiny/api/cms/entry` + +```typescript +import { EntryId } from "webiny/api/cms/entry"; +``` + +```typescript +export class EntryId { + private constructor( + private _id: string, + private _version: number + ); + static create(); + static from(value: string); + toString(); + get id(); + get version(); + incrementVersion(); + decrementVersion(); + setVersion(version: number); +} +``` diff --git a/docs/developer-docs/6.0.x/reference/api/cms/group.ai.txt b/docs/developer-docs/6.0.x/reference/api/cms/group.ai.txt new file mode 100644 index 000000000..c3b7eaaf2 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/cms/group.ai.txt @@ -0,0 +1,34 @@ +AI Context: Group (reference/api/cms/group.mdx) + +Source of Information: +1. packages/webiny/src/api/cms/group.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModelGroup/shared/abstractions.ts — originating source +3. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/types/modelGroup.ts — originating source +4. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModelGroup/CreateGroup/abstractions.ts — originating source +5. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModelGroup/CreateGroup/events.ts — originating source +6. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModelGroup/UpdateGroup/abstractions.ts — originating source +7. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModelGroup/UpdateGroup/events.ts — originating source +8. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModelGroup/DeleteGroup/abstractions.ts — originating source +9. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModelGroup/DeleteGroup/events.ts — originating source +10. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModelGroup/ListGroups/abstractions.ts — originating source +11. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModelGroup/GetGroup/abstractions.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +ModelGroupFactory, CmsGroup, CmsModelGroup, CreateGroupUseCase, GroupBeforeCreateEventHandler, GroupAfterCreateEventHandler, UpdateGroupUseCase, GroupBeforeUpdateEventHandler, GroupAfterUpdateEventHandler, DeleteGroupUseCase, GroupBeforeDeleteEventHandler, GroupAfterDeleteEventHandler, ListGroupsUseCase, GetGroupUseCase + +Import Path: webiny/api/cms/group + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/cms/group.mdx b/docs/developer-docs/6.0.x/reference/api/cms/group.mdx new file mode 100644 index 000000000..2f74c063e --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/cms/group.mdx @@ -0,0 +1,694 @@ +--- +id: yxbpl2nt +title: Group +description: "CMS group use cases and event handlers" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What use cases are available in `webiny/api/cms/group`? +- Which event handlers can you implement? +- How to use the builder and factory APIs? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/cms/group`. Import any of the items below directly from this path in your Webiny extensions. + +**Use Cases** + +<SymbolList + symbols={[ + { name: "CreateGroupUseCase", anchor: "create-group-use-case" }, + { name: "DeleteGroupUseCase", anchor: "delete-group-use-case" }, + { name: "GetGroupUseCase", anchor: "get-group-use-case" }, + { name: "ListGroupsUseCase", anchor: "list-groups-use-case" }, + { name: "UpdateGroupUseCase", anchor: "update-group-use-case" } + ]} +/> + +**Event Handlers** + +<SymbolList + symbols={[ + { name: "GroupAfterCreateEventHandler", anchor: "group-after-create-event-handler" }, + { name: "GroupAfterDeleteEventHandler", anchor: "group-after-delete-event-handler" }, + { name: "GroupAfterUpdateEventHandler", anchor: "group-after-update-event-handler" }, + { name: "GroupBeforeCreateEventHandler", anchor: "group-before-create-event-handler" }, + { name: "GroupBeforeDeleteEventHandler", anchor: "group-before-delete-event-handler" }, + { name: "GroupBeforeUpdateEventHandler", anchor: "group-before-update-event-handler" } + ]} +/> + +**Services** + +<SymbolList symbols={[{ name: "ModelGroupFactory", anchor: "model-group-factory" }]} /> + +**Types & Classes** + +<SymbolList + symbols={[ + { name: "CmsGroup", anchor: "cms-group" }, + { name: "CmsModelGroup", anchor: "cms-model-group" } + ]} +/> + +## Use Cases + +### `CreateGroupUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/group` + +```typescript +import { CreateGroupUseCase } from "webiny/api/cms/group"; +``` + +**Interface `CreateGroupUseCase.Interface`:** + +```typescript +interface CreateGroupUseCase.Interface { + execute(input: CmsGroupCreateInput): Promise<Result<CmsGroup, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace CreateGroupUseCase { + type Interface = ICreateGroupUseCase; + type Input = CmsGroupCreateInput; + type Error = UseCaseError; + type Return = Promise<Result<CmsGroup, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CreateGroupUseCase } from "webiny/api/cms/group"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private createGroupUseCase: CreateGroupUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.createGroupUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CreateGroupUseCase] +}); +``` + +### `DeleteGroupUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/group` + +```typescript +import { DeleteGroupUseCase } from "webiny/api/cms/group"; +``` + +**Interface `DeleteGroupUseCase.Interface`:** + +```typescript +interface DeleteGroupUseCase.Interface { + execute(groupId: string): Promise<Result<void, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace DeleteGroupUseCase { + type Interface = IDeleteGroupUseCase; + type Error = UseCaseError; + type Return = Promise<Result<void, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { DeleteGroupUseCase } from "webiny/api/cms/group"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private deleteGroupUseCase: DeleteGroupUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.deleteGroupUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [DeleteGroupUseCase] +}); +``` + +### `GetGroupUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/group` + +```typescript +import { GetGroupUseCase } from "webiny/api/cms/group"; +``` + +**Interface `GetGroupUseCase.Interface`:** + +```typescript +interface GetGroupUseCase.Interface { + execute(groupId: string): Promise<Result<CmsGroup, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetGroupUseCase { + type Interface = IGetGroupUseCase; + type Error = UseCaseError; + type Return = Promise<Result<CmsGroup, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetGroupUseCase } from "webiny/api/cms/group"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getGroupUseCase: GetGroupUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getGroupUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetGroupUseCase] +}); +``` + +### `ListGroupsUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/group` + +```typescript +import { ListGroupsUseCase } from "webiny/api/cms/group"; +``` + +**Interface `ListGroupsUseCase.Interface`:** + +```typescript +interface ListGroupsUseCase.Interface { + execute(): Promise<Result<CmsGroup[], UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace ListGroupsUseCase { + type Interface = IListGroupsUseCase; + type Error = UseCaseError; + type Return = Promise<Result<CmsGroup[], UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ListGroupsUseCase } from "webiny/api/cms/group"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private listGroupsUseCase: ListGroupsUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.listGroupsUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ListGroupsUseCase] +}); +``` + +### `UpdateGroupUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/group` + +```typescript +import { UpdateGroupUseCase } from "webiny/api/cms/group"; +``` + +**Interface `UpdateGroupUseCase.Interface`:** + +```typescript +interface UpdateGroupUseCase.Interface { + execute(groupId: string, input: CmsGroupUpdateInput): Promise<Result<CmsGroup, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace UpdateGroupUseCase { + type Interface = IUpdateGroupUseCase; + type Input = CmsGroupUpdateInput; + type Error = UseCaseError; + type Return = Promise<Result<CmsGroup, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { UpdateGroupUseCase } from "webiny/api/cms/group"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private updateGroupUseCase: UpdateGroupUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.updateGroupUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [UpdateGroupUseCase] +}); +``` + +## Event Handlers + +### `GroupAfterCreateEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/group` + +```typescript +import { GroupAfterCreateEventHandler } from "webiny/api/cms/group"; +``` + +**Interface `GroupAfterCreateEventHandler.Interface`:** + +```typescript +interface GroupAfterCreateEventHandler.Interface { + handle(event: GroupAfterCreateEvent): Promise<void>; +} +``` + +**Event payload `GroupAfterCreateEventPayload`:** + +```typescript +interface GroupAfterCreateEventPayload { + group: CmsGroup; +} +``` + +**Types:** + +```typescript +namespace GroupAfterCreateEventHandler { + type Interface = IEventHandler<GroupAfterCreateEvent>; + type Event = GroupAfterCreateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { GroupAfterCreateEventHandler } from "webiny/api/cms/group"; + +class MyHandler implements GroupAfterCreateEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: GroupAfterCreateEventHandler.Event): Promise<void> { + const { group } = event.payload; + } +} + +export default GroupAfterCreateEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `GroupAfterDeleteEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/group` + +```typescript +import { GroupAfterDeleteEventHandler } from "webiny/api/cms/group"; +``` + +**Interface `GroupAfterDeleteEventHandler.Interface`:** + +```typescript +interface GroupAfterDeleteEventHandler.Interface { + handle(event: GroupAfterDeleteEvent): Promise<void>; +} +``` + +**Event payload `GroupAfterDeleteEventPayload`:** + +```typescript +interface GroupAfterDeleteEventPayload { + group: CmsGroup; +} +``` + +**Types:** + +```typescript +namespace GroupAfterDeleteEventHandler { + type Interface = IEventHandler<GroupAfterDeleteEvent>; + type Event = GroupAfterDeleteEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { GroupAfterDeleteEventHandler } from "webiny/api/cms/group"; + +class MyHandler implements GroupAfterDeleteEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: GroupAfterDeleteEventHandler.Event): Promise<void> { + const { group } = event.payload; + } +} + +export default GroupAfterDeleteEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `GroupAfterUpdateEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/group` + +```typescript +import { GroupAfterUpdateEventHandler } from "webiny/api/cms/group"; +``` + +**Interface `GroupAfterUpdateEventHandler.Interface`:** + +```typescript +interface GroupAfterUpdateEventHandler.Interface { + handle(event: GroupAfterUpdateEvent): Promise<void>; +} +``` + +**Event payload `GroupAfterUpdateEventPayload`:** + +```typescript +interface GroupAfterUpdateEventPayload { + original: CmsGroup; + group: CmsGroup; +} +``` + +**Types:** + +```typescript +namespace GroupAfterUpdateEventHandler { + type Interface = IEventHandler<GroupAfterUpdateEvent>; + type Event = GroupAfterUpdateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { GroupAfterUpdateEventHandler } from "webiny/api/cms/group"; + +class MyHandler implements GroupAfterUpdateEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: GroupAfterUpdateEventHandler.Event): Promise<void> { + const { original, group } = event.payload; + } +} + +export default GroupAfterUpdateEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `GroupBeforeCreateEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/group` + +```typescript +import { GroupBeforeCreateEventHandler } from "webiny/api/cms/group"; +``` + +**Interface `GroupBeforeCreateEventHandler.Interface`:** + +```typescript +interface GroupBeforeCreateEventHandler.Interface { + handle(event: GroupBeforeCreateEventEvent): Promise<void>; +} +``` + +**Event payload `GroupBeforeCreateEventPayload`:** + +```typescript +interface GroupBeforeCreateEventPayload { + group: CmsGroup; +} +``` + +**Types:** + +```typescript +namespace GroupBeforeCreateEventHandler { + type Interface = IEventHandler<GroupBeforeCreateEventEvent>; + type Event = GroupBeforeCreateEventEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { GroupBeforeCreateEventHandler } from "webiny/api/cms/group"; + +class MyHandler implements GroupBeforeCreateEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: GroupBeforeCreateEventHandler.Event): Promise<void> { + const { group } = event.payload; + } +} + +export default GroupBeforeCreateEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `GroupBeforeDeleteEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/group` + +```typescript +import { GroupBeforeDeleteEventHandler } from "webiny/api/cms/group"; +``` + +**Interface `GroupBeforeDeleteEventHandler.Interface`:** + +```typescript +interface GroupBeforeDeleteEventHandler.Interface { + handle(event: GroupBeforeDeleteEvent): Promise<void>; +} +``` + +**Event payload `GroupBeforeDeleteEventPayload`:** + +```typescript +interface GroupBeforeDeleteEventPayload { + group: CmsGroup; +} +``` + +**Types:** + +```typescript +namespace GroupBeforeDeleteEventHandler { + type Interface = IEventHandler<GroupBeforeDeleteEvent>; + type Event = GroupBeforeDeleteEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { GroupBeforeDeleteEventHandler } from "webiny/api/cms/group"; + +class MyHandler implements GroupBeforeDeleteEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: GroupBeforeDeleteEventHandler.Event): Promise<void> { + const { group } = event.payload; + } +} + +export default GroupBeforeDeleteEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `GroupBeforeUpdateEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/group` + +```typescript +import { GroupBeforeUpdateEventHandler } from "webiny/api/cms/group"; +``` + +**Interface `GroupBeforeUpdateEventHandler.Interface`:** + +```typescript +interface GroupBeforeUpdateEventHandler.Interface { + handle(event: GroupBeforeUpdateEvent): Promise<void>; +} +``` + +**Event payload `GroupBeforeUpdateEventPayload`:** + +```typescript +interface GroupBeforeUpdateEventPayload { + original: CmsGroup; + group: CmsGroup; +} +``` + +**Types:** + +```typescript +namespace GroupBeforeUpdateEventHandler { + type Interface = IEventHandler<GroupBeforeUpdateEvent>; + type Event = GroupBeforeUpdateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { GroupBeforeUpdateEventHandler } from "webiny/api/cms/group"; + +class MyHandler implements GroupBeforeUpdateEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: GroupBeforeUpdateEventHandler.Event): Promise<void> { + const { original, group } = event.payload; + } +} + +export default GroupBeforeUpdateEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +## Services + +### `ModelGroupFactory` + +**Abstraction** — imported from `webiny/api/cms/group` + +```typescript +import { ModelGroupFactory } from "webiny/api/cms/group"; +``` + +**Interface `ModelGroupFactory.Interface`:** + +```typescript +interface ModelGroupFactory.Interface { + execute(): Promise<IModelGroup[]>; +} +``` + +**Types:** + +```typescript +namespace ModelGroupFactory { + type Interface = IModelGroupFactory; + type Return = Promise<IModelGroup[]>; + type Group = IModelGroup; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ModelGroupFactory } from "webiny/api/cms/group"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private modelGroupFactory: ModelGroupFactory.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.modelGroupFactory.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ModelGroupFactory] +}); +``` + +## Types & Classes + +### `CmsGroup` + +**Type** — imported from `webiny/api/cms/group` + +A representation of content model group in the database. + +@category CmsGroup +@category Database model + +```typescript +import type { CmsGroup } from "webiny/api/cms/group"; +``` + +```typescript +export interface CmsGroup { ... } +``` + +### `CmsModelGroup` + +**Type** — imported from `webiny/api/cms/group` + +@category Database model +@category CmsModel + +```typescript +import type { CmsModelGroup } from "webiny/api/cms/group"; +``` + +```typescript +export interface CmsModelGroup { + /** + * Generated ID of the group + */ + id: string; + /** + * Name of the group + */ + name: string; +} +``` diff --git a/docs/developer-docs/6.0.x/reference/api/cms/model.ai.txt b/docs/developer-docs/6.0.x/reference/api/cms/model.ai.txt new file mode 100644 index 000000000..112f170b0 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/cms/model.ai.txt @@ -0,0 +1,41 @@ +AI Context: Model (reference/api/cms/model.mdx) + +Source of Information: +1. packages/webiny/src/api/cms/model.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/modelBuilder/abstractions.ts — originating source +3. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/modelBuilder/models/ModelBuilder.ts — originating source +4. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/modelBuilder/fields/FieldBuilder.ts — originating source +5. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/modelBuilder/fields/abstractions.ts — originating source +6. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/modelBuilder/LayoutBuilder.ts — originating source +7. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/types/model.ts — originating source +8. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/types/modelField.ts — originating source +9. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModel/CreateModel/abstractions.ts — originating source +10. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModel/CreateModel/events.ts — originating source +11. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModel/CreateModelFrom/abstractions.ts — originating source +12. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModel/CreateModelFrom/events.ts — originating source +13. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModel/UpdateModel/abstractions.ts — originating source +14. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModel/UpdateModel/events.ts — originating source +15. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModel/DeleteModel/abstractions.ts — originating source +16. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModel/DeleteModel/events.ts — originating source +17. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModel/GetModel/abstractions.ts — originating source +18. /Users/adrian/dev/wby-next/packages/api-headless-cms/src/features/contentModel/ListModels/abstractions.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +ModelFactory, ModelBuilder, FieldBuilder, FieldRendererRegistry, FieldType, LayoutBuilder, CmsModel, CmsModelField, CreateModelUseCase, ModelBeforeCreateEventHandler, ModelAfterCreateEventHandler, CreateModelFromUseCase, ModelBeforeCreateFromEventHandler, ModelAfterCreateFromEventHandler, UpdateModelUseCase, ModelBeforeUpdateEventHandler, ModelAfterUpdateEventHandler, DeleteModelUseCase, ModelBeforeDeleteEventHandler, ModelAfterDeleteEventHandler, GetModelUseCase, ListModelsUseCase + +Import Path: webiny/api/cms/model + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/cms/model.mdx b/docs/developer-docs/6.0.x/reference/api/cms/model.mdx new file mode 100644 index 000000000..643087f04 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/cms/model.mdx @@ -0,0 +1,1004 @@ +--- +id: yxbpl2nt +title: Model +description: "CMS model builders, factories, use cases and event handlers" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What use cases are available in `webiny/api/cms/model`? +- Which event handlers can you implement? +- How to use the builder and factory APIs? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/cms/model`. Import any of the items below directly from this path in your Webiny extensions. + +**Use Cases** + +<SymbolList + symbols={[ + { name: "CreateModelFromUseCase", anchor: "create-model-from-use-case" }, + { name: "CreateModelUseCase", anchor: "create-model-use-case" }, + { name: "DeleteModelUseCase", anchor: "delete-model-use-case" }, + { name: "GetModelUseCase", anchor: "get-model-use-case" }, + { name: "ListModelsUseCase", anchor: "list-models-use-case" }, + { name: "UpdateModelUseCase", anchor: "update-model-use-case" } + ]} +/> + +**Event Handlers** + +<SymbolList + symbols={[ + { name: "ModelAfterCreateEventHandler", anchor: "model-after-create-event-handler" }, + { name: "ModelAfterCreateFromEventHandler", anchor: "model-after-create-from-event-handler" }, + { name: "ModelAfterDeleteEventHandler", anchor: "model-after-delete-event-handler" }, + { name: "ModelAfterUpdateEventHandler", anchor: "model-after-update-event-handler" }, + { name: "ModelBeforeCreateEventHandler", anchor: "model-before-create-event-handler" }, + { name: "ModelBeforeCreateFromEventHandler", anchor: "model-before-create-from-event-handler" }, + { name: "ModelBeforeDeleteEventHandler", anchor: "model-before-delete-event-handler" }, + { name: "ModelBeforeUpdateEventHandler", anchor: "model-before-update-event-handler" } + ]} +/> + +**Services** + +<SymbolList + symbols={[ + { name: "FieldType", anchor: "field-type" }, + { name: "ModelFactory", anchor: "model-factory" } + ]} +/> + +**Types & Classes** + +<SymbolList + symbols={[ + { name: "CmsModel", anchor: "cms-model" }, + { name: "CmsModelField", anchor: "cms-model-field" }, + { name: "FieldBuilder", anchor: "field-builder" }, + { name: "FieldRendererRegistry", anchor: "field-renderer-registry" }, + { name: "LayoutBuilder", anchor: "layout-builder" }, + { name: "ModelBuilder", anchor: "model-builder" } + ]} +/> + +## Use Cases + +### `CreateModelFromUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/model` + +```typescript +import { CreateModelFromUseCase } from "webiny/api/cms/model"; +``` + +**Interface `CreateModelFromUseCase.Interface`:** + +```typescript +interface CreateModelFromUseCase.Interface { + execute( + modelId: string, + input: CmsModelCreateFromInput + ): Promise<Result<CmsModel, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace CreateModelFromUseCase { + type Interface = ICreateModelFromUseCase; + type Input = CmsModelCreateFromInput; + type Error = UseCaseError; + type Return = Promise<Result<CmsModel, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CreateModelFromUseCase } from "webiny/api/cms/model"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private createModelFromUseCase: CreateModelFromUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.createModelFromUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CreateModelFromUseCase] +}); +``` + +### `CreateModelUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/model` + +```typescript +import { CreateModelUseCase } from "webiny/api/cms/model"; +``` + +**Interface `CreateModelUseCase.Interface`:** + +```typescript +interface CreateModelUseCase.Interface { + execute(input: CmsModelCreateInput): Promise<Result<CmsModel, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace CreateModelUseCase { + type Interface = ICreateModelUseCase; + type Input = CmsModelCreateInput; + type Error = UseCaseError; + type Return = Promise<Result<CmsModel, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CreateModelUseCase } from "webiny/api/cms/model"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private createModelUseCase: CreateModelUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.createModelUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CreateModelUseCase] +}); +``` + +### `DeleteModelUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/model` + +```typescript +import { DeleteModelUseCase } from "webiny/api/cms/model"; +``` + +**Interface `DeleteModelUseCase.Interface`:** + +```typescript +interface DeleteModelUseCase.Interface { + execute(modelId: string): Promise<Result<void, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace DeleteModelUseCase { + type Interface = IDeleteModelUseCase; + type Error = UseCaseError; + type Return = Promise<Result<void, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { DeleteModelUseCase } from "webiny/api/cms/model"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private deleteModelUseCase: DeleteModelUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.deleteModelUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [DeleteModelUseCase] +}); +``` + +### `GetModelUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/model` + +```typescript +import { GetModelUseCase } from "webiny/api/cms/model"; +``` + +**Interface `GetModelUseCase.Interface`:** + +```typescript +interface GetModelUseCase.Interface { + execute(modelId: string): Promise<Result<CmsModel, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetModelUseCase { + type Interface = IGetModelUseCase; + type Error = UseCaseError; + type Return = Promise<Result<CmsModel, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetModelUseCase } from "webiny/api/cms/model"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getModelUseCase: GetModelUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getModelUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetModelUseCase] +}); +``` + +### `ListModelsUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/model` + +```typescript +import { ListModelsUseCase } from "webiny/api/cms/model"; +``` + +**Interface `ListModelsUseCase.Interface`:** + +```typescript +interface ListModelsUseCase.Interface { + execute(params?: ICmsModelListParams): Promise<Result<CmsModel[], UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace ListModelsUseCase { + type Interface = IListModelsUseCase; + type Params = ICmsModelListParams; + type Error = UseCaseError; + type Return = Promise<Result<CmsModel[], UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ListModelsUseCase } from "webiny/api/cms/model"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private listModelsUseCase: ListModelsUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.listModelsUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ListModelsUseCase] +}); +``` + +### `UpdateModelUseCase` + +**Use Case Abstraction** — imported from `webiny/api/cms/model` + +```typescript +import { UpdateModelUseCase } from "webiny/api/cms/model"; +``` + +**Interface `UpdateModelUseCase.Interface`:** + +```typescript +interface UpdateModelUseCase.Interface { + execute(modelId: string, input: CmsModelUpdateInput): Promise<Result<CmsModel, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace UpdateModelUseCase { + type Interface = IUpdateModelUseCase; + type Input = CmsModelUpdateInput; + type Error = UseCaseError; + type Return = Promise<Result<CmsModel, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { UpdateModelUseCase } from "webiny/api/cms/model"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private updateModelUseCase: UpdateModelUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.updateModelUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [UpdateModelUseCase] +}); +``` + +## Event Handlers + +### `ModelAfterCreateEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/model` + +```typescript +import { ModelAfterCreateEventHandler } from "webiny/api/cms/model"; +``` + +**Interface `ModelAfterCreateEventHandler.Interface`:** + +```typescript +interface ModelAfterCreateEventHandler.Interface { + handle(event: ModelAfterCreateEvent): Promise<void>; +} +``` + +**Event payload `ModelAfterCreateEventPayload`:** + +```typescript +interface ModelAfterCreateEventPayload { + model: CmsModel; +} +``` + +**Types:** + +```typescript +namespace ModelAfterCreateEventHandler { + type Interface = IEventHandler<ModelAfterCreateEvent>; + type Event = ModelAfterCreateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { ModelAfterCreateEventHandler } from "webiny/api/cms/model"; + +class MyHandler implements ModelAfterCreateEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ModelAfterCreateEventHandler.Event): Promise<void> { + const { model } = event.payload; + } +} + +export default ModelAfterCreateEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `ModelAfterCreateFromEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/model` + +```typescript +import { ModelAfterCreateFromEventHandler } from "webiny/api/cms/model"; +``` + +**Interface `ModelAfterCreateFromEventHandler.Interface`:** + +```typescript +interface ModelAfterCreateFromEventHandler.Interface { + handle(event: ModelAfterCreateFromEvent): Promise<void>; +} +``` + +**Event payload `ModelAfterCreateFromEventPayload`:** + +```typescript +interface ModelAfterCreateFromEventPayload { + model: CmsModel; + original: CmsModel; +} +``` + +**Types:** + +```typescript +namespace ModelAfterCreateFromEventHandler { + type Interface = IEventHandler<ModelAfterCreateFromEvent>; + type Event = ModelAfterCreateFromEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { ModelAfterCreateFromEventHandler } from "webiny/api/cms/model"; + +class MyHandler implements ModelAfterCreateFromEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ModelAfterCreateFromEventHandler.Event): Promise<void> { + const { model, original } = event.payload; + } +} + +export default ModelAfterCreateFromEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `ModelAfterDeleteEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/model` + +```typescript +import { ModelAfterDeleteEventHandler } from "webiny/api/cms/model"; +``` + +**Interface `ModelAfterDeleteEventHandler.Interface`:** + +```typescript +interface ModelAfterDeleteEventHandler.Interface { + handle(event: ModelAfterDeleteEvent): Promise<void>; +} +``` + +**Event payload `ModelAfterDeleteEventPayload`:** + +```typescript +interface ModelAfterDeleteEventPayload { + model: CmsModel; +} +``` + +**Types:** + +```typescript +namespace ModelAfterDeleteEventHandler { + type Interface = IEventHandler<ModelAfterDeleteEvent>; + type Event = ModelAfterDeleteEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { ModelAfterDeleteEventHandler } from "webiny/api/cms/model"; + +class MyHandler implements ModelAfterDeleteEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ModelAfterDeleteEventHandler.Event): Promise<void> { + const { model } = event.payload; + } +} + +export default ModelAfterDeleteEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `ModelAfterUpdateEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/model` + +```typescript +import { ModelAfterUpdateEventHandler } from "webiny/api/cms/model"; +``` + +**Interface `ModelAfterUpdateEventHandler.Interface`:** + +```typescript +interface ModelAfterUpdateEventHandler.Interface { + handle(event: ModelAfterUpdateEvent): Promise<void>; +} +``` + +**Event payload `ModelAfterUpdateEventPayload`:** + +```typescript +interface ModelAfterUpdateEventPayload { + model: CmsModel; + original: CmsModel; +} +``` + +**Types:** + +```typescript +namespace ModelAfterUpdateEventHandler { + type Interface = IEventHandler<ModelAfterUpdateEvent>; + type Event = ModelAfterUpdateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { ModelAfterUpdateEventHandler } from "webiny/api/cms/model"; + +class MyHandler implements ModelAfterUpdateEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ModelAfterUpdateEventHandler.Event): Promise<void> { + const { model, original } = event.payload; + } +} + +export default ModelAfterUpdateEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `ModelBeforeCreateEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/model` + +```typescript +import { ModelBeforeCreateEventHandler } from "webiny/api/cms/model"; +``` + +**Interface `ModelBeforeCreateEventHandler.Interface`:** + +```typescript +interface ModelBeforeCreateEventHandler.Interface { + handle(event: ModelBeforeCreateEvent): Promise<void>; +} +``` + +**Event payload `ModelBeforeCreateEventPayload`:** + +```typescript +interface ModelBeforeCreateEventPayload { + model: CmsModel; + input: CmsModelCreateInput; +} +``` + +**Types:** + +```typescript +namespace ModelBeforeCreateEventHandler { + type Interface = IEventHandler<ModelBeforeCreateEvent>; + type Event = ModelBeforeCreateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { ModelBeforeCreateEventHandler } from "webiny/api/cms/model"; + +class MyHandler implements ModelBeforeCreateEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ModelBeforeCreateEventHandler.Event): Promise<void> { + const { model, input } = event.payload; + } +} + +export default ModelBeforeCreateEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `ModelBeforeCreateFromEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/model` + +```typescript +import { ModelBeforeCreateFromEventHandler } from "webiny/api/cms/model"; +``` + +**Interface `ModelBeforeCreateFromEventHandler.Interface`:** + +```typescript +interface ModelBeforeCreateFromEventHandler.Interface { + handle(event: ModelBeforeCreateFromEvent): Promise<void>; +} +``` + +**Event payload `ModelBeforeCreateFromEventPayload`:** + +```typescript +interface ModelBeforeCreateFromEventPayload { + model: CmsModel; + original: CmsModel; + input: CmsModelCreateFromInput; +} +``` + +**Types:** + +```typescript +namespace ModelBeforeCreateFromEventHandler { + type Interface = IEventHandler<ModelBeforeCreateFromEvent>; + type Event = ModelBeforeCreateFromEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { ModelBeforeCreateFromEventHandler } from "webiny/api/cms/model"; + +class MyHandler implements ModelBeforeCreateFromEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ModelBeforeCreateFromEventHandler.Event): Promise<void> { + const { model, original, input } = event.payload; + } +} + +export default ModelBeforeCreateFromEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `ModelBeforeDeleteEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/model` + +```typescript +import { ModelBeforeDeleteEventHandler } from "webiny/api/cms/model"; +``` + +**Interface `ModelBeforeDeleteEventHandler.Interface`:** + +```typescript +interface ModelBeforeDeleteEventHandler.Interface { + handle(event: ModelBeforeDeleteEvent): Promise<void>; +} +``` + +**Event payload `ModelBeforeDeleteEventPayload`:** + +```typescript +interface ModelBeforeDeleteEventPayload { + model: CmsModel; +} +``` + +**Types:** + +```typescript +namespace ModelBeforeDeleteEventHandler { + type Interface = IEventHandler<ModelBeforeDeleteEvent>; + type Event = ModelBeforeDeleteEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { ModelBeforeDeleteEventHandler } from "webiny/api/cms/model"; + +class MyHandler implements ModelBeforeDeleteEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ModelBeforeDeleteEventHandler.Event): Promise<void> { + const { model } = event.payload; + } +} + +export default ModelBeforeDeleteEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `ModelBeforeUpdateEventHandler` + +**Event Handler Abstraction** — imported from `webiny/api/cms/model` + +```typescript +import { ModelBeforeUpdateEventHandler } from "webiny/api/cms/model"; +``` + +**Interface `ModelBeforeUpdateEventHandler.Interface`:** + +```typescript +interface ModelBeforeUpdateEventHandler.Interface { + handle(event: ModelBeforeUpdateEvent): Promise<void>; +} +``` + +**Event payload `ModelBeforeUpdateEventPayload`:** + +```typescript +interface ModelBeforeUpdateEventPayload { + model: CmsModel; + original: CmsModel; + input: CmsModelUpdateInput; +} +``` + +**Types:** + +```typescript +namespace ModelBeforeUpdateEventHandler { + type Interface = IEventHandler<ModelBeforeUpdateEvent>; + type Event = ModelBeforeUpdateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { ModelBeforeUpdateEventHandler } from "webiny/api/cms/model"; + +class MyHandler implements ModelBeforeUpdateEventHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ModelBeforeUpdateEventHandler.Event): Promise<void> { + const { model, original, input } = event.payload; + } +} + +export default ModelBeforeUpdateEventHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +## Services + +### `FieldType` + +**Abstraction** — imported from `webiny/api/cms/model` + +```typescript +import { FieldType } from "webiny/api/cms/model"; +``` + +**Interface `FieldType.Interface`:** + +```typescript +interface FieldType.Interface { + // Unique identifier for this field type + readonly type: string; + // Create a new field builder instance + create(registry: IFieldBuilderRegistry): BaseFieldBuilder<any>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { FieldType } from "webiny/api/cms/model"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private fieldType: FieldType.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.fieldType.create(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [FieldType] +}); +``` + +### `ModelFactory` + +**Abstraction** — imported from `webiny/api/cms/model` + +```typescript +import { ModelFactory } from "webiny/api/cms/model"; +``` + +**Interface `ModelFactory.Interface`:** + +```typescript +interface ModelFactory.Interface { + execute(builder: IModelBuilder): Promise<PrivateModelBuilder[] | PublicModelBuilder[]>; +} +``` + +**Types:** + +```typescript +namespace ModelFactory { + type Interface = IModelFactory; + type Return = Promise<PrivateModelBuilder[] | PublicModelBuilder[]>; + type Builder = IModelBuilder; + type FieldBuilder = FieldBuilderRegistry.Interface; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ModelFactory } from "webiny/api/cms/model"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private modelFactory: ModelFactory.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.modelFactory.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ModelFactory] +}); +``` + +## Types & Classes + +### `CmsModel` + +**Type** — imported from `webiny/api/cms/model` + +Base CMS Model. Should not be exported and used outside of this package. + +@category Database model +@category CmsModel + +```typescript +import type { CmsModel } from "webiny/api/cms/model"; +``` + +```typescript +export interface CmsModel { ... } +``` + +### `CmsModelField` + +**Type** — imported from `webiny/api/cms/model` + +A definition for content model field. This type exists on the app side as well. + +@category ModelField +@category Database model + +```typescript +import type { CmsModelField } from "webiny/api/cms/model"; +``` + +```typescript +export interface CmsModelField { ... } +``` + +### `FieldBuilder` + +**Class** — imported from `webiny/api/cms/model` + +DataFieldBuilder class for data fields that produce CmsModelField instances. +Provides storageId, list, validation, renderer, and other data-field methods. + +```typescript +import { FieldBuilder } from "webiny/api/cms/model"; +``` + +```typescript +export class DataFieldBuilder<TType extends string = string> extends BaseFieldBuilder<TType> { + protected override config: FieldBuilderConfig; + public constructor(type: TType, label?: string); + placeholder(text: string): this; + storageId(id: string): this; + defaultValue(value: any): this; + list(): this; + tags(tags: string[]): this; + listMinLength(value: number, message?: string): this; + listMaxLength(value: number, message?: string): this; + protected validation(validation: CmsModelFieldValidation): this; + protected listValidation(validation: CmsModelFieldValidation): this; + predefinedValues(values: CmsModelFieldPredefinedValues["values"]): this; + renderer<TName extends FieldRendererName<TType>>( + name: TName, + ...args: undefined extends FieldRendererSettings<TName> + ? [settings?: FieldRendererSettings<TName>] + : FieldRendererSettings<TName> extends undefined + ? [] + : [settings: FieldRendererSettings<TName>] + ): this; + settings(settings: Record<string, any>): this; + build(): DataFieldBuildResult; +} +``` + +### `FieldRendererRegistry` + +**Type** — imported from `webiny/api/cms/model` + +Augmentable renderer registry. +Each entry maps a renderer name to its applicable field type(s) and settings. + +Example: +declare module "@webiny/api-headless-cms/features/modelBuilder/fields/FieldBuilder" { +interface FieldRendererRegistry { +"my-renderer": { fieldType: "text" | "long-text"; settings: { color: string } }; +} +} + +```typescript +import type { FieldRendererRegistry } from "webiny/api/cms/model"; +``` + +```typescript +export interface FieldRendererRegistry { ... } +``` + +### `LayoutBuilder` + +**Class** — imported from `webiny/api/cms/model` + +LayoutBuilder provides a fluent API for modifying field layouts. +Supports adding fields to existing rows and inserting new rows at specific positions. +Callbacks can be queued and executed lazily for efficient composition. + +```typescript +import { LayoutBuilder } from "webiny/api/cms/model"; +``` + +```typescript +export class LayoutBuilder { + private layout: string[][]; + private modifiers: LayoutModifier[] = []; + constructor(existingLayout: string[][] = []); + setLayout(layout: string[][]): this; + addModifier(modifier: LayoutModifier): this; + addField(field: string, position:; + addRow(fields: string[]): this; + insertRow(fields: string[], position:; + getSnapshot():; + build(): string[][]; + private findFieldPosition(field: string):; +} +``` + +### `ModelBuilder` + +**Class** — imported from `webiny/api/cms/model` + +Entry point builder that allows selecting model type. +Call .private() or .public() to get the appropriate typed builder. + +```typescript +import { ModelBuilder } from "webiny/api/cms/model"; +``` + +```typescript +export class ModelBuilder { + public constructor(private registry: FieldBuilderRegistry.Interface); + public private(input: IModelBuilderPrivateInput): PrivateModelBuilder; + public public(input: IModelBuilderPublicInput): PublicModelBuilder; +} +``` diff --git a/docs/developer-docs/6.0.x/reference/api/event-publisher.ai.txt b/docs/developer-docs/6.0.x/reference/api/event-publisher.ai.txt new file mode 100644 index 000000000..01a27dfdf --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/event-publisher.ai.txt @@ -0,0 +1,25 @@ +AI Context: Event Publisher (reference/api/event-publisher.mdx) + +Source of Information: +1. packages/webiny/src/api/event-publisher.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-core/src/features/eventPublisher/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +DomainEvent, EventPublisher + +Import Path: webiny/api/event-publisher + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/event-publisher.mdx b/docs/developer-docs/6.0.x/reference/api/event-publisher.mdx new file mode 100644 index 000000000..5261348de --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/event-publisher.mdx @@ -0,0 +1,56 @@ +--- +id: yxbpl2v2 +title: Event Publisher +description: "Reference for webiny/api/event-publisher" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/api/event-publisher`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/event-publisher`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "DomainEvent", anchor: "domain-event" }, + { name: "EventPublisher", anchor: "event-publisher" } + ]} +/> + +## `DomainEvent` + +**Class** — imported from `webiny/api/event-publisher` + +```typescript +import { DomainEvent } from "webiny/api/event-publisher"; +``` + +```typescript +export abstract class DomainEvent<TPayload = void> { + public abstract readonly eventType: string; + public readonly occurredAt: Date; + public readonly payload: TPayload extends void ? undefined : TPayload; + constructor(payload?: never); + abstract getHandlerAbstraction(): Abstraction<IEventHandler<any>>; +} +``` + +## `EventPublisher` + +**Constant** — imported from `webiny/api/event-publisher` + +```typescript +import { EventPublisher } from "webiny/api/event-publisher"; +``` + +```typescript +export const EventPublisher = new Abstraction<IEventPublisher>("EventPublisher"); +``` diff --git a/docs/developer-docs/6.0.x/reference/api/eventPublisher.ai.txt b/docs/developer-docs/6.0.x/reference/api/eventPublisher.ai.txt new file mode 100644 index 000000000..19a802166 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/eventPublisher.ai.txt @@ -0,0 +1,25 @@ +AI Context: Event Publisher (reference/api/eventPublisher.mdx) + +Source of Information: +1. packages/webiny/src/api/eventPublisher.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-core/src/features/eventPublisher/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +DomainEvent, EventPublisher + +Import Path: webiny/api/eventPublisher + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/eventPublisher.mdx b/docs/developer-docs/6.0.x/reference/api/eventPublisher.mdx new file mode 100644 index 000000000..439a1a656 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/eventPublisher.mdx @@ -0,0 +1,56 @@ +--- +id: yxbpl2v2 +title: Event Publisher +description: "Domain event publishing primitives" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/api/eventPublisher`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/eventPublisher`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "DomainEvent", anchor: "domainevent" }, + { name: "EventPublisher", anchor: "eventpublisher" } + ]} +/> + +## `DomainEvent` + +**Class** — imported from `webiny/api/eventPublisher` + +```typescript +import { DomainEvent } from "webiny/api/eventPublisher"; +``` + +```typescript +export abstract class DomainEvent<TPayload = void> { + public abstract readonly eventType: string; + public readonly occurredAt: Date; + public readonly payload: TPayload extends void ? undefined : TPayload; + constructor(payload?: never); + abstract getHandlerAbstraction(): Abstraction<IEventHandler<any>>; +} +``` + +## `EventPublisher` + +**Constant** — imported from `webiny/api/eventPublisher` + +```typescript +import { EventPublisher } from "webiny/api/eventPublisher"; +``` + +```typescript +export const EventPublisher = new Abstraction<IEventPublisher>("EventPublisher"); +``` diff --git a/docs/developer-docs/6.0.x/reference/api/graphql.ai.txt b/docs/developer-docs/6.0.x/reference/api/graphql.ai.txt new file mode 100644 index 000000000..3c9483454 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/graphql.ai.txt @@ -0,0 +1,27 @@ +AI Context: GraphQL (reference/api/graphql.mdx) + +Source of Information: +1. packages/webiny/src/api/graphql.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-core/src/graphql/security/NotAuthorizedResponse.ts — originating source +3. /Users/adrian/dev/wby-next/packages/handler-graphql/src/graphql/abstractions.ts — originating source +4. /Users/adrian/dev/wby-next/packages/handler-graphql/src/responses.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +NotAuthorizedResponse, GraphQLSchemaFactory, ErrorResponse, ListResponse, Response, NotFoundResponse, ListErrorResponse + +Import Path: webiny/api/graphql + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/graphql.mdx b/docs/developer-docs/6.0.x/reference/api/graphql.mdx new file mode 100644 index 000000000..9387d9691 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/graphql.mdx @@ -0,0 +1,179 @@ +--- +id: yxbpl2dy +title: GraphQL +description: "GraphQL schema factory and response helpers" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to use the builder and factory APIs? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/graphql`. Import any of the items below directly from this path in your Webiny extensions. + +**Services** + +<SymbolList symbols={[{ name: "GraphQLSchemaFactory", anchor: "graph-ql-schema-factory" }]} /> + +**Types & Classes** + +<SymbolList + symbols={[ + { name: "ErrorResponse", anchor: "error-response" }, + { name: "ListErrorResponse", anchor: "list-error-response" }, + { name: "ListResponse", anchor: "list-response" }, + { name: "NotAuthorizedResponse", anchor: "not-authorized-response" }, + { name: "NotFoundResponse", anchor: "not-found-response" }, + { name: "Response", anchor: "response" } + ]} +/> + +## Services + +### `GraphQLSchemaFactory` + +**Abstraction** — imported from `webiny/api/graphql` + +```typescript +import { GraphQLSchemaFactory } from "webiny/api/graphql"; +``` + +**Interface `GraphQLSchemaFactory.Interface`:** + +```typescript +interface GraphQLSchemaFactory.Interface { + execute(builder: GraphQLSchemaBuilder.Interface): Promise<GraphQLSchemaBuilder.Interface>; +} +``` + +**Types:** + +```typescript +namespace GraphQLSchemaFactory { + type Interface = IGraphQLSchemaFactory; + type SchemaBuilder = GraphQLSchemaBuilder.Interface; + type Return = Promise<GraphQLSchemaBuilder.Interface>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GraphQLSchemaFactory } from "webiny/api/graphql"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private graphQLSchemaFactory: GraphQLSchemaFactory.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.graphQLSchemaFactory.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GraphQLSchemaFactory] +}); +``` + +## Types & Classes + +### `ErrorResponse` + +**Class** — imported from `webiny/api/graphql` + +```typescript +import { ErrorResponse } from "webiny/api/graphql"; +``` + +```typescript +export class ErrorResponse { + public readonly data: null; + public readonly error:; + constructor(params: ErrorResponseParams); +} +``` + +### `ListErrorResponse` + +**Class** — imported from `webiny/api/graphql` + +```typescript +import { ListErrorResponse } from "webiny/api/graphql"; +``` + +```typescript +export class ListErrorResponse { + public readonly data: null; + public readonly meta: null; + public readonly error:; + constructor(params: ErrorResponseParams); +} +``` + +### `ListResponse` + +**Class** — imported from `webiny/api/graphql` + +```typescript +import { ListResponse } from "webiny/api/graphql"; +``` + +```typescript +export class ListResponse<T, M> { + public readonly data: Array<T>; + public readonly meta: M; + public readonly error: null; + constructor(data: Array<T>, meta?: M); +} +``` + +### `NotAuthorizedResponse` + +**Class** — imported from `webiny/api/graphql` + +```typescript +import { NotAuthorizedResponse } from "webiny/api/graphql"; +``` + +```typescript +export class NotAuthorizedResponse extends ErrorResponse { + constructor(; +} +``` + +### `NotFoundResponse` + +**Class** — imported from `webiny/api/graphql` + +```typescript +import { NotFoundResponse } from "webiny/api/graphql"; +``` + +```typescript +export class NotFoundResponse extends ErrorResponse { + constructor(message: string); +} +``` + +### `Response` + +**Class** — imported from `webiny/api/graphql` + +```typescript +import { Response } from "webiny/api/graphql"; +``` + +```typescript +export class Response<T = any> { + public readonly data: T; + public readonly error: null; + constructor(data: T); +} +``` diff --git a/docs/developer-docs/6.0.x/reference/api/key-value-store.ai.txt b/docs/developer-docs/6.0.x/reference/api/key-value-store.ai.txt new file mode 100644 index 000000000..413f30ca3 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/key-value-store.ai.txt @@ -0,0 +1,25 @@ +AI Context: Key Value Store (reference/api/key-value-store.mdx) + +Source of Information: +1. packages/webiny/src/api/key-value-store.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-core/src/features/keyValueStore/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +GlobalKeyValueStore, KeyValueStore + +Import Path: webiny/api/key-value-store + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/key-value-store.mdx b/docs/developer-docs/6.0.x/reference/api/key-value-store.mdx new file mode 100644 index 000000000..ed1e87c39 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/key-value-store.mdx @@ -0,0 +1,130 @@ +--- +id: yxbpl2tl +title: Key Value Store +description: "Reference for webiny/api/key-value-store" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/api/key-value-store`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/key-value-store`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "GlobalKeyValueStore", anchor: "global-key-value-store" }, + { name: "KeyValueStore", anchor: "key-value-store" } + ]} +/> + +## `GlobalKeyValueStore` + +**Abstraction** — imported from `webiny/api/key-value-store` + +```typescript +import { GlobalKeyValueStore } from "webiny/api/key-value-store"; +``` + +**Interface `GlobalKeyValueStore.Interface`:** + +```typescript +interface GlobalKeyValueStore.Interface { + get<T = unknown>( + key: string, + options?: IGlobalKeyValueStoreOptions + ): Promise<Result<T, KeyValueStoreRepository.Error>>; + set( + key: string, + value: any, + options?: IGlobalKeyValueStoreOptions + ): Promise<Result<void, KeyValueStoreRepository.Error>>; + delete( + key: string, + options?: IGlobalKeyValueStoreOptions + ): Promise<Result<void, KeyValueStoreRepository.Error>>; +} +``` + +**Types:** + +```typescript +namespace GlobalKeyValueStore { + type Interface = IGlobalKeyValueStore; + type KeyValueRecord = IKeyValueRecord; + type Error = KeyValueStoreRepository.Error; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GlobalKeyValueStore } from "webiny/api/key-value-store"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private globalKeyValueStore: GlobalKeyValueStore.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.globalKeyValueStore.get(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GlobalKeyValueStore] +}); +``` + +## `KeyValueStore` + +**Abstraction** — imported from `webiny/api/key-value-store` + +```typescript +import { KeyValueStore } from "webiny/api/key-value-store"; +``` + +**Interface `KeyValueStore.Interface`:** + +```typescript +interface KeyValueStore.Interface { + get<T = unknown>(key: string): Promise<Result<T, KeyValueStoreRepository.Error>>; + set(key: string, value: any): Promise<Result<void, KeyValueStoreRepository.Error>>; + delete(key: string): Promise<Result<void, KeyValueStoreRepository.Error>>; +} +``` + +**Types:** + +```typescript +namespace KeyValueStore { + type Interface = IKeyValueStore; + type KeyValueRecord = IKeyValueRecord; + type Error = KeyValueStoreRepository.Error; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { KeyValueStore } from "webiny/api/key-value-store"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private keyValueStore: KeyValueStore.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.keyValueStore.get(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [KeyValueStore] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/api/keyValueStore.ai.txt b/docs/developer-docs/6.0.x/reference/api/keyValueStore.ai.txt new file mode 100644 index 000000000..dad3eca93 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/keyValueStore.ai.txt @@ -0,0 +1,25 @@ +AI Context: Key-Value Store (reference/api/keyValueStore.mdx) + +Source of Information: +1. packages/webiny/src/api/keyValueStore.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-core/src/features/keyValueStore/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +GlobalKeyValueStore, KeyValueStore + +Import Path: webiny/api/keyValueStore + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/keyValueStore.mdx b/docs/developer-docs/6.0.x/reference/api/keyValueStore.mdx new file mode 100644 index 000000000..0eea91669 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/keyValueStore.mdx @@ -0,0 +1,132 @@ +--- +id: yxbpl2tl +title: Key-Value Store +description: "Key-value store abstraction" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/api/keyValueStore`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/keyValueStore`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "GlobalKeyValueStore", anchor: "globalkeyvaluestore" }, + { name: "KeyValueStore", anchor: "keyvaluestore" } + ]} +/> + +## `GlobalKeyValueStore` + +**Abstraction** — imported from `webiny/api/keyValueStore` + +```typescript +import { GlobalKeyValueStore } from "webiny/api/keyValueStore"; +``` + +**Interface `GlobalKeyValueStore.Interface`:** + +```typescript +interface GlobalKeyValueStore.Interface { + get<T = unknown>( + key: string, + options?: IGlobalKeyValueStoreOptions + ): Promise<Result<T, KeyValueStoreRepository.Error>>; + set( + key: string, + value: any, + options?: IGlobalKeyValueStoreOptions + ): Promise<Result<void, KeyValueStoreRepository.Error>>; + delete( + key: string, + options?: IGlobalKeyValueStoreOptions + ): Promise<Result<void, KeyValueStoreRepository.Error>>; +} +``` + +**Types:** + +```typescript +namespace GlobalKeyValueStore { + type Interface = IGlobalKeyValueStore; + type KeyValueRecord = IKeyValueRecord; + type Error = KeyValueStoreRepository.Error; +} +``` + +**Usage:** + +```typescript +// extensions/MyImpl.ts +import { GlobalKeyValueStore } from "webiny/api/keyValueStore"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private globalKeyValueStore: GlobalKeyValueStore.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.globalKeyValueStore.get(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GlobalKeyValueStore] +}); +``` + +## `KeyValueStore` + +**Abstraction** — imported from `webiny/api/keyValueStore` + +```typescript +import { KeyValueStore } from "webiny/api/keyValueStore"; +``` + +**Interface `KeyValueStore.Interface`:** + +```typescript +interface KeyValueStore.Interface { + get<T = unknown>(key: string): Promise<Result<T, KeyValueStoreRepository.Error>>; + set(key: string, value: any): Promise<Result<void, KeyValueStoreRepository.Error>>; + delete(key: string): Promise<Result<void, KeyValueStoreRepository.Error>>; +} +``` + +**Types:** + +```typescript +namespace KeyValueStore { + type Interface = IKeyValueStore; + type KeyValueRecord = IKeyValueRecord; + type Error = KeyValueStoreRepository.Error; +} +``` + +**Usage:** + +```typescript +// extensions/MyImpl.ts +import { KeyValueStore } from "webiny/api/keyValueStore"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private keyValueStore: KeyValueStore.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.keyValueStore.get(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [KeyValueStore] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/api/logger.ai.txt b/docs/developer-docs/6.0.x/reference/api/logger.ai.txt new file mode 100644 index 000000000..53019e735 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/logger.ai.txt @@ -0,0 +1,25 @@ +AI Context: Logger (reference/api/logger.mdx) + +Source of Information: +1. packages/webiny/src/api/logger.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-core/src/features/logger/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +Logger + +Import Path: webiny/api/logger + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/logger.mdx b/docs/developer-docs/6.0.x/reference/api/logger.mdx new file mode 100644 index 000000000..ab14dd4ff --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/logger.mdx @@ -0,0 +1,70 @@ +--- +id: yxbpl2xv +title: Logger +description: "Logger abstraction for server-side logging" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/api/logger`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/logger`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList symbols={[{ name: "Logger", anchor: "logger" }]} /> + +## `Logger` + +**Abstraction** — imported from `webiny/api/logger` + +```typescript +import { Logger } from "webiny/api/logger"; +``` + +**Interface `Logger.Interface`:** + +```typescript +interface Logger.Interface { + trace(objOrMsg: object | string, ...args: any[]): void; + debug(objOrMsg: object | string, ...args: any[]): void; + info(objOrMsg: object | string, ...args: any[]): void; + warn(objOrMsg: object | string, ...args: any[]): void; + error(objOrMsg: object | string, ...args: any[]): void; + fatal(objOrMsg: object | string, ...args: any[]): void; + log(objOrMsg: object | string, ...args: any[]): void; +} +``` + +**Types:** + +```typescript +namespace Logger { + type Interface = ILogger; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { Logger } from "webiny/api/logger"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private logger: Logger.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.logger.info(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [Logger] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/api/security.ai.txt b/docs/developer-docs/6.0.x/reference/api/security.ai.txt new file mode 100644 index 000000000..603b3bddd --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/security.ai.txt @@ -0,0 +1,30 @@ +AI Context: Security (reference/api/security.mdx) + +Source of Information: +1. packages/webiny/src/api/security.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/IdentityContext/index.ts — originating source +3. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/apiKeys/shared/abstractions.ts — originating source +4. /Users/adrian/dev/wby-next/packages/api-core/src/domain/security/ApiToken.ts — originating source +5. /Users/adrian/dev/wby-next/packages/api-core/src/idp/index.ts — originating source +6. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/authentication/Authenticator/abstractions.ts — originating source +7. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/authorization/Authorizer/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +IdentityContext, ApiKeyFactory, ApiToken, IdentityProvider, OidcIdentityProvider, JwtIdentityProvider, Authenticator, Authorizer + +Import Path: webiny/api/security + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/security.mdx b/docs/developer-docs/6.0.x/reference/api/security.mdx new file mode 100644 index 000000000..8d4a7e8cf --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/security.mdx @@ -0,0 +1,385 @@ +--- +id: yxbpl3nl +title: Security +description: "Security primitives: Identity, Authenticator, Authorizer" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to use the builder and factory APIs? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/security`. Import any of the items below directly from this path in your Webiny extensions. + +**Services** + +<SymbolList + symbols={[ + { name: "ApiKeyFactory", anchor: "api-key-factory" }, + { name: "Authenticator", anchor: "authenticator" }, + { name: "Authorizer", anchor: "authorizer" }, + { name: "IdentityContext", anchor: "identity-context" }, + { name: "IdentityProvider", anchor: "identity-provider" }, + { name: "JwtIdentityProvider", anchor: "jwt-identity-provider" }, + { name: "OidcIdentityProvider", anchor: "oidc-identity-provider" } + ]} +/> + +**Types & Classes** + +<SymbolList symbols={[{ name: "ApiToken", anchor: "api-token" }]} /> + +## Services + +### `ApiKeyFactory` + +**Abstraction** — imported from `webiny/api/security` + +```typescript +import { ApiKeyFactory } from "webiny/api/security"; +``` + +**Interface `ApiKeyFactory.Interface`:** + +```typescript +interface ApiKeyFactory.Interface { + execute(): Promise<CodeApiKey[]> | CodeApiKey[]; +} +``` + +**Types:** + +```typescript +namespace ApiKeyFactory { + type Interface = IApiKeyFactory; + type Return = Promise<CodeApiKey[]> | CodeApiKey[]; + type ApiKey = CodeApiKey; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ApiKeyFactory } from "webiny/api/security"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private apiKeyFactory: ApiKeyFactory.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.apiKeyFactory.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ApiKeyFactory] +}); +``` + +### `Authenticator` + +**Abstraction** — imported from `webiny/api/security` + +```typescript +import { Authenticator } from "webiny/api/security"; +``` + +**Interface `Authenticator.Interface`:** + +```typescript +interface Authenticator.Interface { + authenticate(token: string): Promise<IdentityData | null>; +} +``` + +**Types:** + +```typescript +namespace Authenticator { + type Interface = IAuthenticator; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { Authenticator } from "webiny/api/security"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private authenticator: Authenticator.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.authenticator.authenticate(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [Authenticator] +}); +``` + +### `Authorizer` + +**Abstraction** — imported from `webiny/api/security` + +```typescript +import { Authorizer } from "webiny/api/security"; +``` + +**Interface `Authorizer.Interface`:** + +```typescript +interface Authorizer.Interface { + authorize(identity: Identity): Promise<SecurityPermission[] | null>; +} +``` + +**Types:** + +```typescript +namespace Authorizer { + type Interface = IAuthorizer; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { Authorizer } from "webiny/api/security"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private authorizer: Authorizer.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.authorizer.authorize(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [Authorizer] +}); +``` + +### `IdentityContext` + +**Abstraction** — imported from `webiny/api/security` + +```typescript +import { IdentityContext } from "webiny/api/security"; +``` + +**Interface `IdentityContext.Interface`:** + +```typescript +interface IdentityContext.Interface { + getIdentity(): Identity; + setIdentity(identity: Identity | undefined): void; + withIdentity<T>(identity: Identity | undefined, cb: () => Promise<T>): Promise<T>; + getPermission<TPermission extends SecurityPermission = SecurityPermission>( + name: string + ): Promise<TPermission | null>; + getPermissions<TPermission extends SecurityPermission = SecurityPermission>( + name: string + ): Promise<TPermission[]>; + listPermissions(): Promise<SecurityPermission[]>; + hasFullAccess(): Promise<boolean>; + withoutAuthorization<T>(cb: () => Promise<T>): Promise<T>; + isAuthorizationEnabled(): boolean; +} +``` + +**Types:** + +```typescript +namespace IdentityContext { + type Interface = IIdentityContext; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { IdentityContext } from "webiny/api/security"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private identityContext: IdentityContext.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.identityContext.getIdentity(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [IdentityContext] +}); +``` + +### `IdentityProvider` + +**Abstraction** — imported from `webiny/api/security` + +```typescript +import { IdentityProvider } from "webiny/api/security"; +``` + +**Interface `IdentityProvider.Interface`:** + +```typescript +interface IdentityProvider.Interface { + isApplicable(token: string): boolean; + getIdentity(token: string): Promise<IProviderIdentityData | null>; +} +``` + +**Types:** + +```typescript +namespace IdentityProvider { + type Interface = IIdentityProvider; + type IdentityData = IProviderIdentityData; + type JwtPayload = IJwtPayload; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { IdentityProvider } from "webiny/api/security"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private identityProvider: IdentityProvider.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.identityProvider.isApplicable(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [IdentityProvider] +}); +``` + +### `JwtIdentityProvider` + +**Abstraction** — imported from `webiny/api/security` + +```typescript +import { JwtIdentityProvider } from "webiny/api/security"; +``` + +**Interface `JwtIdentityProvider.Interface`:** + +```typescript +interface JwtIdentityProvider.Interface { + isApplicable(token: IJwtPayload): boolean; + getIdentity(token: string, jwt: IJwt): Promise<IProviderIdentityData | null>; +} +``` + +**Types:** + +```typescript +namespace JwtIdentityProvider { + type Interface = IJwtIdentityProvider; + type Jwt = IJwt; + type JwtPayload = IJwtPayload; + type JwtHeader = IJwtHeader; + type IdentityData = IProviderIdentityData; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { JwtIdentityProvider } from "webiny/api/security"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private jwtIdentityProvider: JwtIdentityProvider.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.jwtIdentityProvider.isApplicable(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [JwtIdentityProvider] +}); +``` + +### `OidcIdentityProvider` + +**Abstraction** — imported from `webiny/api/security` + +```typescript +import { OidcIdentityProvider } from "webiny/api/security"; +``` + +**Interface `OidcIdentityProvider.Interface`:** + +```typescript +interface OidcIdentityProvider.Interface { + issuer: string; + clientId: string; + isApplicable(token: IJwtPayload): boolean; + getIdentity(jwt: IJwtPayload): Promise<IProviderIdentityData>; + verifyToken?(token: string): Promise<IJwtPayload | undefined>; + verifyTokenClaims?(token: IJwtPayload): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace OidcIdentityProvider { + type Interface = IOidcIdentityProvider; + type JwtPayload = IJwtPayload; + type IdentityData = IProviderIdentityData; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { OidcIdentityProvider } from "webiny/api/security"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private oidcIdentityProvider: OidcIdentityProvider.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.oidcIdentityProvider.issuer: string(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [OidcIdentityProvider] +}); +``` + +## Types & Classes + +### `ApiToken` + +**Class** — imported from `webiny/api/security` + +```typescript +import { ApiToken } from "webiny/api/security"; +``` + +```typescript +export class ApiToken { + static validate(token: string): `wat_$; +} +``` diff --git a/docs/developer-docs/6.0.x/reference/api/security/api-key.ai.txt b/docs/developer-docs/6.0.x/reference/api/security/api-key.ai.txt new file mode 100644 index 000000000..4a6d1c36e --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/security/api-key.ai.txt @@ -0,0 +1,31 @@ +AI Context: Api Key (reference/api/security/api-key.mdx) + +Source of Information: +1. packages/webiny/src/api/security/api-key.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/apiKeys/CreateApiKey/index.ts — originating source +3. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/apiKeys/DeleteApiKey/index.ts — originating source +4. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/apiKeys/GetApiKey/index.ts — originating source +5. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/apiKeys/GetApiKeyByToken/index.ts — originating source +6. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/apiKeys/ListApiKeys/index.ts — originating source +7. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/apiKeys/UpdateApiKey/index.ts — originating source +8. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/apiKeys/shared/abstractions.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +ApiKeyAfterCreateHandler, ApiKeyBeforeCreateHandler, CreateApiKeyUseCase, ApiKeyAfterDeleteHandler, ApiKeyBeforeDeleteHandler, DeleteApiKeyUseCase, GetApiKeyUseCase, GetApiKeyByTokenUseCase, ListApiKeysUseCase, ApiKeyAfterUpdateHandler, ApiKeyBeforeUpdateHandler, UpdateApiKeyUseCase, ApiKeyFactory + +Import Path: webiny/api/security/api-key + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/security/api-key.mdx b/docs/developer-docs/6.0.x/reference/api/security/api-key.mdx new file mode 100644 index 000000000..6c3f88748 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/security/api-key.mdx @@ -0,0 +1,629 @@ +--- +id: yxbpl3nl +title: Api Key +description: "Reference for webiny/api/security/api-key" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What use cases are available in `webiny/api/security/api-key`? +- How to use the builder and factory APIs? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/security/api-key`. Import any of the items below directly from this path in your Webiny extensions. + +**Use Cases** + +<SymbolList + symbols={[ + { name: "CreateApiKeyUseCase", anchor: "create-api-key-use-case" }, + { name: "DeleteApiKeyUseCase", anchor: "delete-api-key-use-case" }, + { name: "GetApiKeyByTokenUseCase", anchor: "get-api-key-by-token-use-case" }, + { name: "GetApiKeyUseCase", anchor: "get-api-key-use-case" }, + { name: "ListApiKeysUseCase", anchor: "list-api-keys-use-case" }, + { name: "UpdateApiKeyUseCase", anchor: "update-api-key-use-case" } + ]} +/> + +**Event Handlers** + +<SymbolList + symbols={[ + { name: "ApiKeyAfterCreateHandler", anchor: "api-key-after-create-handler" }, + { name: "ApiKeyAfterDeleteHandler", anchor: "api-key-after-delete-handler" }, + { name: "ApiKeyAfterUpdateHandler", anchor: "api-key-after-update-handler" }, + { name: "ApiKeyBeforeCreateHandler", anchor: "api-key-before-create-handler" }, + { name: "ApiKeyBeforeDeleteHandler", anchor: "api-key-before-delete-handler" }, + { name: "ApiKeyBeforeUpdateHandler", anchor: "api-key-before-update-handler" } + ]} +/> + +**Services** + +<SymbolList symbols={[{ name: "ApiKeyFactory", anchor: "api-key-factory" }]} /> + +## Use Cases + +### `CreateApiKeyUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/api-key` + +```typescript +import { CreateApiKeyUseCase } from "webiny/api/security/api-key"; +``` + +**Interface `CreateApiKeyUseCase.Interface`:** + +```typescript +interface CreateApiKeyUseCase.Interface { + execute(input: CreateApiKeyInput): Promise<Result<ApiKey, CreateApiKeyError>>; +} +``` + +**Types:** + +```typescript +namespace CreateApiKeyUseCase { + type Interface = ICreateApiKey; + type Error = CreateApiKeyError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CreateApiKeyUseCase } from "webiny/api/security/api-key"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private createApiKeyUseCase: CreateApiKeyUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.createApiKeyUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CreateApiKeyUseCase] +}); +``` + +### `DeleteApiKeyUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/api-key` + +```typescript +import { DeleteApiKeyUseCase } from "webiny/api/security/api-key"; +``` + +**Interface `DeleteApiKeyUseCase.Interface`:** + +```typescript +interface DeleteApiKeyUseCase.Interface { + execute(id: string): Promise<Result<void, DeleteApiKeyError>>; +} +``` + +**Types:** + +```typescript +namespace DeleteApiKeyUseCase { + type Interface = IDeleteApiKey; + type Error = DeleteApiKeyError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { DeleteApiKeyUseCase } from "webiny/api/security/api-key"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private deleteApiKeyUseCase: DeleteApiKeyUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.deleteApiKeyUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [DeleteApiKeyUseCase] +}); +``` + +### `GetApiKeyByTokenUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/api-key` + +```typescript +import { GetApiKeyByTokenUseCase } from "webiny/api/security/api-key"; +``` + +**Interface `GetApiKeyByTokenUseCase.Interface`:** + +```typescript +interface GetApiKeyByTokenUseCase.Interface { + execute(token: string): Promise<Result<ApiKey | null, GetApiKeyByTokenError>>; +} +``` + +**Types:** + +```typescript +namespace GetApiKeyByTokenUseCase { + type Interface = IGetApiKeyByToken; + type Error = GetApiKeyByTokenError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetApiKeyByTokenUseCase } from "webiny/api/security/api-key"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getApiKeyByTokenUseCase: GetApiKeyByTokenUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getApiKeyByTokenUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetApiKeyByTokenUseCase] +}); +``` + +### `GetApiKeyUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/api-key` + +```typescript +import { GetApiKeyUseCase } from "webiny/api/security/api-key"; +``` + +**Interface `GetApiKeyUseCase.Interface`:** + +```typescript +interface GetApiKeyUseCase.Interface { + execute(id: string): Promise<Result<ApiKey | null, GetApiKeyError>>; +} +``` + +**Types:** + +```typescript +namespace GetApiKeyUseCase { + type Interface = IGetApiKey; + type Error = GetApiKeyError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetApiKeyUseCase } from "webiny/api/security/api-key"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getApiKeyUseCase: GetApiKeyUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getApiKeyUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetApiKeyUseCase] +}); +``` + +### `ListApiKeysUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/api-key` + +```typescript +import { ListApiKeysUseCase } from "webiny/api/security/api-key"; +``` + +**Interface `ListApiKeysUseCase.Interface`:** + +```typescript +interface ListApiKeysUseCase.Interface { + execute(params?: ListApiKeysInput): Promise<Result<ApiKey[], ListApiKeysError>>; +} +``` + +**Types:** + +```typescript +namespace ListApiKeysUseCase { + type Interface = IListApiKeys; + type Error = ListApiKeysError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ListApiKeysUseCase } from "webiny/api/security/api-key"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private listApiKeysUseCase: ListApiKeysUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.listApiKeysUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ListApiKeysUseCase] +}); +``` + +### `UpdateApiKeyUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/api-key` + +```typescript +import { UpdateApiKeyUseCase } from "webiny/api/security/api-key"; +``` + +**Interface `UpdateApiKeyUseCase.Interface`:** + +```typescript +interface UpdateApiKeyUseCase.Interface { + execute(id: string, input: UpdateApiKeyInput): Promise<Result<ApiKey, UpdateApiKeyError>>; +} +``` + +**Types:** + +```typescript +namespace UpdateApiKeyUseCase { + type Interface = IUpdateApiKey; + type Error = UpdateApiKeyError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { UpdateApiKeyUseCase } from "webiny/api/security/api-key"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private updateApiKeyUseCase: UpdateApiKeyUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.updateApiKeyUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [UpdateApiKeyUseCase] +}); +``` + +## Event Handlers + +### `ApiKeyAfterCreateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/api-key` + +```typescript +import { ApiKeyAfterCreateHandler } from "webiny/api/security/api-key"; +``` + +**Interface `ApiKeyAfterCreateHandler.Interface`:** + +```typescript +interface ApiKeyAfterCreateHandler.Interface { + handle(event: ApiKeyAfterCreateEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace ApiKeyAfterCreateHandler { + type Interface = IEventHandler<ApiKeyAfterCreateEvent>; + type Event = ApiKeyAfterCreateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { ApiKeyAfterCreateHandler } from "webiny/api/security/api-key"; + +class MyHandler implements ApiKeyAfterCreateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ApiKeyAfterCreateHandler.Event): Promise<void> { + // implementation + } +} + +export default ApiKeyAfterCreateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `ApiKeyAfterDeleteHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/api-key` + +```typescript +import { ApiKeyAfterDeleteHandler } from "webiny/api/security/api-key"; +``` + +**Interface `ApiKeyAfterDeleteHandler.Interface`:** + +```typescript +interface ApiKeyAfterDeleteHandler.Interface { + handle(event: ApiKeyAfterDeleteEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace ApiKeyAfterDeleteHandler { + type Interface = IEventHandler<ApiKeyAfterDeleteEvent>; + type Event = ApiKeyAfterDeleteEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { ApiKeyAfterDeleteHandler } from "webiny/api/security/api-key"; + +class MyHandler implements ApiKeyAfterDeleteHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ApiKeyAfterDeleteHandler.Event): Promise<void> { + // implementation + } +} + +export default ApiKeyAfterDeleteHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `ApiKeyAfterUpdateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/api-key` + +```typescript +import { ApiKeyAfterUpdateHandler } from "webiny/api/security/api-key"; +``` + +**Interface `ApiKeyAfterUpdateHandler.Interface`:** + +```typescript +interface ApiKeyAfterUpdateHandler.Interface { + handle(event: ApiKeyAfterUpdateEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace ApiKeyAfterUpdateHandler { + type Interface = IEventHandler<ApiKeyAfterUpdateEvent>; + type Event = ApiKeyAfterUpdateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { ApiKeyAfterUpdateHandler } from "webiny/api/security/api-key"; + +class MyHandler implements ApiKeyAfterUpdateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ApiKeyAfterUpdateHandler.Event): Promise<void> { + // implementation + } +} + +export default ApiKeyAfterUpdateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `ApiKeyBeforeCreateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/api-key` + +```typescript +import { ApiKeyBeforeCreateHandler } from "webiny/api/security/api-key"; +``` + +**Interface `ApiKeyBeforeCreateHandler.Interface`:** + +```typescript +interface ApiKeyBeforeCreateHandler.Interface { + handle(event: ApiKeyBeforeCreateEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace ApiKeyBeforeCreateHandler { + type Interface = IEventHandler<ApiKeyBeforeCreateEvent>; + type Event = ApiKeyBeforeCreateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { ApiKeyBeforeCreateHandler } from "webiny/api/security/api-key"; + +class MyHandler implements ApiKeyBeforeCreateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ApiKeyBeforeCreateHandler.Event): Promise<void> { + // implementation + } +} + +export default ApiKeyBeforeCreateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `ApiKeyBeforeDeleteHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/api-key` + +```typescript +import { ApiKeyBeforeDeleteHandler } from "webiny/api/security/api-key"; +``` + +**Interface `ApiKeyBeforeDeleteHandler.Interface`:** + +```typescript +interface ApiKeyBeforeDeleteHandler.Interface { + handle(event: ApiKeyBeforeDeleteEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace ApiKeyBeforeDeleteHandler { + type Interface = IEventHandler<ApiKeyBeforeDeleteEvent>; + type Event = ApiKeyBeforeDeleteEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { ApiKeyBeforeDeleteHandler } from "webiny/api/security/api-key"; + +class MyHandler implements ApiKeyBeforeDeleteHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ApiKeyBeforeDeleteHandler.Event): Promise<void> { + // implementation + } +} + +export default ApiKeyBeforeDeleteHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `ApiKeyBeforeUpdateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/api-key` + +```typescript +import { ApiKeyBeforeUpdateHandler } from "webiny/api/security/api-key"; +``` + +**Interface `ApiKeyBeforeUpdateHandler.Interface`:** + +```typescript +interface ApiKeyBeforeUpdateHandler.Interface { + handle(event: ApiKeyBeforeUpdateEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace ApiKeyBeforeUpdateHandler { + type Interface = IEventHandler<ApiKeyBeforeUpdateEvent>; + type Event = ApiKeyBeforeUpdateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { ApiKeyBeforeUpdateHandler } from "webiny/api/security/api-key"; + +class MyHandler implements ApiKeyBeforeUpdateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ApiKeyBeforeUpdateHandler.Event): Promise<void> { + // implementation + } +} + +export default ApiKeyBeforeUpdateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +## Services + +### `ApiKeyFactory` + +**Abstraction** — imported from `webiny/api/security/api-key` + +```typescript +import { ApiKeyFactory } from "webiny/api/security/api-key"; +``` + +**Interface `ApiKeyFactory.Interface`:** + +```typescript +interface ApiKeyFactory.Interface { + execute(): Promise<CodeApiKey[]> | CodeApiKey[]; +} +``` + +**Types:** + +```typescript +namespace ApiKeyFactory { + type Interface = IApiKeyFactory; + type Return = Promise<CodeApiKey[]> | CodeApiKey[]; + type ApiKey = CodeApiKey; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ApiKeyFactory } from "webiny/api/security/api-key"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private apiKeyFactory: ApiKeyFactory.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.apiKeyFactory.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ApiKeyFactory] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/api/security/apiKey.ai.txt b/docs/developer-docs/6.0.x/reference/api/security/apiKey.ai.txt new file mode 100644 index 000000000..d91e8a807 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/security/apiKey.ai.txt @@ -0,0 +1,31 @@ +AI Context: API Key (reference/api/security/apiKey.mdx) + +Source of Information: +1. packages/webiny/src/api/security/apiKey.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/apiKeys/CreateApiKey/index.ts — originating source +3. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/apiKeys/DeleteApiKey/index.ts — originating source +4. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/apiKeys/GetApiKey/index.ts — originating source +5. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/apiKeys/GetApiKeyByToken/index.ts — originating source +6. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/apiKeys/ListApiKeys/index.ts — originating source +7. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/apiKeys/UpdateApiKey/index.ts — originating source +8. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/apiKeys/shared/abstractions.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +ApiKeyAfterCreateHandler, ApiKeyBeforeCreateHandler, CreateApiKeyUseCase, ApiKeyAfterDeleteHandler, ApiKeyBeforeDeleteHandler, DeleteApiKeyUseCase, GetApiKeyUseCase, GetApiKeyByTokenUseCase, ListApiKeysUseCase, ApiKeyAfterUpdateHandler, ApiKeyBeforeUpdateHandler, UpdateApiKeyUseCase, ApiKeyFactory + +Import Path: webiny/api/security/apiKey + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/security/apiKey.mdx b/docs/developer-docs/6.0.x/reference/api/security/apiKey.mdx new file mode 100644 index 000000000..514ba86cc --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/security/apiKey.mdx @@ -0,0 +1,624 @@ +--- +id: yxbpl3nl +title: API Key +description: "API key use cases and event handlers" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What use cases are available in `webiny/api/security/apiKey`? +- How to use the builder and factory APIs? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/security/apiKey`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "ApiKeyAfterCreateHandler", anchor: "apikeyaftercreatehandler" }, + { name: "ApiKeyAfterDeleteHandler", anchor: "apikeyafterdeletehandler" }, + { name: "ApiKeyAfterUpdateHandler", anchor: "apikeyafterupdatehandler" }, + { name: "ApiKeyBeforeCreateHandler", anchor: "apikeybeforecreatehandler" }, + { name: "ApiKeyBeforeDeleteHandler", anchor: "apikeybeforedeletehandler" }, + { name: "ApiKeyBeforeUpdateHandler", anchor: "apikeybeforeupdatehandler" }, + { name: "ApiKeyFactory", anchor: "apikeyfactory" }, + { name: "CreateApiKeyUseCase", anchor: "createapikeyusecase" }, + { name: "DeleteApiKeyUseCase", anchor: "deleteapikeyusecase" }, + { name: "GetApiKeyByTokenUseCase", anchor: "getapikeybytokenusecase" }, + { name: "GetApiKeyUseCase", anchor: "getapikeyusecase" }, + { name: "ListApiKeysUseCase", anchor: "listapikeysusecase" }, + { name: "UpdateApiKeyUseCase", anchor: "updateapikeyusecase" } + ]} +/> + +## `ApiKeyAfterCreateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/apiKey` + +```typescript +import { ApiKeyAfterCreateHandler } from "webiny/api/security/apiKey"; +``` + +**Interface `ApiKeyAfterCreateHandler.Interface`:** + +```typescript +interface ApiKeyAfterCreateHandler.Interface { + handle(event: ApiKeyAfterCreateEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace ApiKeyAfterCreateHandler { + type Interface = IEventHandler<ApiKeyAfterCreateEvent>; + type Event = ApiKeyAfterCreateEvent; +} +``` + +**Usage:** + +```typescript +// extensions/MyHandler.ts +import { ApiKeyAfterCreateHandler } from "webiny/api/security/apiKey"; + +class MyHandler implements ApiKeyAfterCreateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ApiKeyAfterCreateHandler.Event): Promise<void> { + // implementation + } +} + +export default ApiKeyAfterCreateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +## `ApiKeyAfterDeleteHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/apiKey` + +```typescript +import { ApiKeyAfterDeleteHandler } from "webiny/api/security/apiKey"; +``` + +**Interface `ApiKeyAfterDeleteHandler.Interface`:** + +```typescript +interface ApiKeyAfterDeleteHandler.Interface { + handle(event: ApiKeyAfterDeleteEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace ApiKeyAfterDeleteHandler { + type Interface = IEventHandler<ApiKeyAfterDeleteEvent>; + type Event = ApiKeyAfterDeleteEvent; +} +``` + +**Usage:** + +```typescript +// extensions/MyHandler.ts +import { ApiKeyAfterDeleteHandler } from "webiny/api/security/apiKey"; + +class MyHandler implements ApiKeyAfterDeleteHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ApiKeyAfterDeleteHandler.Event): Promise<void> { + // implementation + } +} + +export default ApiKeyAfterDeleteHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +## `ApiKeyAfterUpdateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/apiKey` + +```typescript +import { ApiKeyAfterUpdateHandler } from "webiny/api/security/apiKey"; +``` + +**Interface `ApiKeyAfterUpdateHandler.Interface`:** + +```typescript +interface ApiKeyAfterUpdateHandler.Interface { + handle(event: ApiKeyAfterUpdateEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace ApiKeyAfterUpdateHandler { + type Interface = IEventHandler<ApiKeyAfterUpdateEvent>; + type Event = ApiKeyAfterUpdateEvent; +} +``` + +**Usage:** + +```typescript +// extensions/MyHandler.ts +import { ApiKeyAfterUpdateHandler } from "webiny/api/security/apiKey"; + +class MyHandler implements ApiKeyAfterUpdateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ApiKeyAfterUpdateHandler.Event): Promise<void> { + // implementation + } +} + +export default ApiKeyAfterUpdateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +## `ApiKeyBeforeCreateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/apiKey` + +```typescript +import { ApiKeyBeforeCreateHandler } from "webiny/api/security/apiKey"; +``` + +**Interface `ApiKeyBeforeCreateHandler.Interface`:** + +```typescript +interface ApiKeyBeforeCreateHandler.Interface { + handle(event: ApiKeyBeforeCreateEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace ApiKeyBeforeCreateHandler { + type Interface = IEventHandler<ApiKeyBeforeCreateEvent>; + type Event = ApiKeyBeforeCreateEvent; +} +``` + +**Usage:** + +```typescript +// extensions/MyHandler.ts +import { ApiKeyBeforeCreateHandler } from "webiny/api/security/apiKey"; + +class MyHandler implements ApiKeyBeforeCreateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ApiKeyBeforeCreateHandler.Event): Promise<void> { + // implementation + } +} + +export default ApiKeyBeforeCreateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +## `ApiKeyBeforeDeleteHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/apiKey` + +```typescript +import { ApiKeyBeforeDeleteHandler } from "webiny/api/security/apiKey"; +``` + +**Interface `ApiKeyBeforeDeleteHandler.Interface`:** + +```typescript +interface ApiKeyBeforeDeleteHandler.Interface { + handle(event: ApiKeyBeforeDeleteEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace ApiKeyBeforeDeleteHandler { + type Interface = IEventHandler<ApiKeyBeforeDeleteEvent>; + type Event = ApiKeyBeforeDeleteEvent; +} +``` + +**Usage:** + +```typescript +// extensions/MyHandler.ts +import { ApiKeyBeforeDeleteHandler } from "webiny/api/security/apiKey"; + +class MyHandler implements ApiKeyBeforeDeleteHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ApiKeyBeforeDeleteHandler.Event): Promise<void> { + // implementation + } +} + +export default ApiKeyBeforeDeleteHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +## `ApiKeyBeforeUpdateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/apiKey` + +```typescript +import { ApiKeyBeforeUpdateHandler } from "webiny/api/security/apiKey"; +``` + +**Interface `ApiKeyBeforeUpdateHandler.Interface`:** + +```typescript +interface ApiKeyBeforeUpdateHandler.Interface { + handle(event: ApiKeyBeforeUpdateEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace ApiKeyBeforeUpdateHandler { + type Interface = IEventHandler<ApiKeyBeforeUpdateEvent>; + type Event = ApiKeyBeforeUpdateEvent; +} +``` + +**Usage:** + +```typescript +// extensions/MyHandler.ts +import { ApiKeyBeforeUpdateHandler } from "webiny/api/security/apiKey"; + +class MyHandler implements ApiKeyBeforeUpdateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: ApiKeyBeforeUpdateHandler.Event): Promise<void> { + // implementation + } +} + +export default ApiKeyBeforeUpdateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +## `ApiKeyFactory` + +**Abstraction** — imported from `webiny/api/security/apiKey` + +```typescript +import { ApiKeyFactory } from "webiny/api/security/apiKey"; +``` + +**Interface `ApiKeyFactory.Interface`:** + +```typescript +interface ApiKeyFactory.Interface { + execute(): Promise<CodeApiKey[]> | CodeApiKey[]; +} +``` + +**Types:** + +```typescript +namespace ApiKeyFactory { + type Interface = IApiKeyFactory; + type Return = Promise<CodeApiKey[]> | CodeApiKey[]; + type ApiKey = CodeApiKey; +} +``` + +**Usage:** + +```typescript +// extensions/MyImpl.ts +import { ApiKeyFactory } from "webiny/api/security/apiKey"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private apiKeyFactory: ApiKeyFactory.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.apiKeyFactory.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ApiKeyFactory] +}); +``` + +## `CreateApiKeyUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/apiKey` + +```typescript +import { CreateApiKeyUseCase } from "webiny/api/security/apiKey"; +``` + +**Interface `CreateApiKeyUseCase.Interface`:** + +```typescript +interface CreateApiKeyUseCase.Interface { + execute(input: CreateApiKeyInput): Promise<Result<ApiKey, CreateApiKeyError>>; +} +``` + +**Types:** + +```typescript +namespace CreateApiKeyUseCase { + type Interface = ICreateApiKey; + type Error = CreateApiKeyError; +} +``` + +**Usage:** + +```typescript +// extensions/MyImpl.ts +import { CreateApiKeyUseCase } from "webiny/api/security/apiKey"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private createApiKeyUseCase: CreateApiKeyUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.createApiKeyUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CreateApiKeyUseCase] +}); +``` + +## `DeleteApiKeyUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/apiKey` + +```typescript +import { DeleteApiKeyUseCase } from "webiny/api/security/apiKey"; +``` + +**Interface `DeleteApiKeyUseCase.Interface`:** + +```typescript +interface DeleteApiKeyUseCase.Interface { + execute(id: string): Promise<Result<void, DeleteApiKeyError>>; +} +``` + +**Types:** + +```typescript +namespace DeleteApiKeyUseCase { + type Interface = IDeleteApiKey; + type Error = DeleteApiKeyError; +} +``` + +**Usage:** + +```typescript +// extensions/MyImpl.ts +import { DeleteApiKeyUseCase } from "webiny/api/security/apiKey"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private deleteApiKeyUseCase: DeleteApiKeyUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.deleteApiKeyUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [DeleteApiKeyUseCase] +}); +``` + +## `GetApiKeyByTokenUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/apiKey` + +```typescript +import { GetApiKeyByTokenUseCase } from "webiny/api/security/apiKey"; +``` + +**Interface `GetApiKeyByTokenUseCase.Interface`:** + +```typescript +interface GetApiKeyByTokenUseCase.Interface { + execute(token: string): Promise<Result<ApiKey | null, GetApiKeyByTokenError>>; +} +``` + +**Types:** + +```typescript +namespace GetApiKeyByTokenUseCase { + type Interface = IGetApiKeyByToken; + type Error = GetApiKeyByTokenError; +} +``` + +**Usage:** + +```typescript +// extensions/MyImpl.ts +import { GetApiKeyByTokenUseCase } from "webiny/api/security/apiKey"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getApiKeyByTokenUseCase: GetApiKeyByTokenUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getApiKeyByTokenUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetApiKeyByTokenUseCase] +}); +``` + +## `GetApiKeyUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/apiKey` + +```typescript +import { GetApiKeyUseCase } from "webiny/api/security/apiKey"; +``` + +**Interface `GetApiKeyUseCase.Interface`:** + +```typescript +interface GetApiKeyUseCase.Interface { + execute(id: string): Promise<Result<ApiKey | null, GetApiKeyError>>; +} +``` + +**Types:** + +```typescript +namespace GetApiKeyUseCase { + type Interface = IGetApiKey; + type Error = GetApiKeyError; +} +``` + +**Usage:** + +```typescript +// extensions/MyImpl.ts +import { GetApiKeyUseCase } from "webiny/api/security/apiKey"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getApiKeyUseCase: GetApiKeyUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getApiKeyUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetApiKeyUseCase] +}); +``` + +## `ListApiKeysUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/apiKey` + +```typescript +import { ListApiKeysUseCase } from "webiny/api/security/apiKey"; +``` + +**Interface `ListApiKeysUseCase.Interface`:** + +```typescript +interface ListApiKeysUseCase.Interface { + execute(params?: ListApiKeysInput): Promise<Result<ApiKey[], ListApiKeysError>>; +} +``` + +**Types:** + +```typescript +namespace ListApiKeysUseCase { + type Interface = IListApiKeys; + type Error = ListApiKeysError; +} +``` + +**Usage:** + +```typescript +// extensions/MyImpl.ts +import { ListApiKeysUseCase } from "webiny/api/security/apiKey"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private listApiKeysUseCase: ListApiKeysUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.listApiKeysUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ListApiKeysUseCase] +}); +``` + +## `UpdateApiKeyUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/apiKey` + +```typescript +import { UpdateApiKeyUseCase } from "webiny/api/security/apiKey"; +``` + +**Interface `UpdateApiKeyUseCase.Interface`:** + +```typescript +interface UpdateApiKeyUseCase.Interface { + execute(id: string, input: UpdateApiKeyInput): Promise<Result<ApiKey, UpdateApiKeyError>>; +} +``` + +**Types:** + +```typescript +namespace UpdateApiKeyUseCase { + type Interface = IUpdateApiKey; + type Error = UpdateApiKeyError; +} +``` + +**Usage:** + +```typescript +// extensions/MyImpl.ts +import { UpdateApiKeyUseCase } from "webiny/api/security/apiKey"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private updateApiKeyUseCase: UpdateApiKeyUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.updateApiKeyUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [UpdateApiKeyUseCase] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/api/security/authentication.ai.txt b/docs/developer-docs/6.0.x/reference/api/security/authentication.ai.txt new file mode 100644 index 000000000..5d082def1 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/security/authentication.ai.txt @@ -0,0 +1,25 @@ +AI Context: Authentication (reference/api/security/authentication.mdx) + +Source of Information: +1. packages/webiny/src/api/security/authentication.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/authentication/AuthenticationContext/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +AfterAuthenticationHandler, BeforeAuthenticationHandler + +Import Path: webiny/api/security/authentication + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/security/authentication.mdx b/docs/developer-docs/6.0.x/reference/api/security/authentication.mdx new file mode 100644 index 000000000..de9da6df2 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/security/authentication.mdx @@ -0,0 +1,114 @@ +--- +id: yxbpl3nl +title: Authentication +description: "Authentication event handlers" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/api/security/authentication`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/security/authentication`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "AfterAuthenticationHandler", anchor: "after-authentication-handler" }, + { name: "BeforeAuthenticationHandler", anchor: "before-authentication-handler" } + ]} +/> + +## `AfterAuthenticationHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/authentication` + +```typescript +import { AfterAuthenticationHandler } from "webiny/api/security/authentication"; +``` + +**Interface `AfterAuthenticationHandler.Interface`:** + +```typescript +interface AfterAuthenticationHandler.Interface { + handle(event: AfterAuthenticationEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace AfterAuthenticationHandler { + type Interface = IEventHandler<AfterAuthenticationEvent>; + type Event = AfterAuthenticationEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { AfterAuthenticationHandler } from "webiny/api/security/authentication"; + +class MyHandler implements AfterAuthenticationHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: AfterAuthenticationHandler.Event): Promise<void> { + // implementation + } +} + +export default AfterAuthenticationHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +## `BeforeAuthenticationHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/authentication` + +```typescript +import { BeforeAuthenticationHandler } from "webiny/api/security/authentication"; +``` + +**Interface `BeforeAuthenticationHandler.Interface`:** + +```typescript +interface BeforeAuthenticationHandler.Interface { + handle(event: BeforeAuthenticationEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace BeforeAuthenticationHandler { + type Interface = IEventHandler<BeforeAuthenticationEvent>; + type Event = BeforeAuthenticationEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { BeforeAuthenticationHandler } from "webiny/api/security/authentication"; + +class MyHandler implements BeforeAuthenticationHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: BeforeAuthenticationHandler.Event): Promise<void> { + // implementation + } +} + +export default BeforeAuthenticationHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/api/security/role.ai.txt b/docs/developer-docs/6.0.x/reference/api/security/role.ai.txt new file mode 100644 index 000000000..ac06970b3 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/security/role.ai.txt @@ -0,0 +1,29 @@ +AI Context: Role (reference/api/security/role.mdx) + +Source of Information: +1. packages/webiny/src/api/security/role.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/roles/CreateRole/index.ts — originating source +3. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/roles/DeleteRole/index.ts — originating source +4. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/roles/GetRole/index.ts — originating source +5. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/roles/ListRoles/index.ts — originating source +6. /Users/adrian/dev/wby-next/packages/api-core/src/features/security/roles/UpdateRole/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +CreateRoleUseCase, RoleAfterCreateHandler, RoleBeforeCreateHandler, DeleteRoleUseCase, RoleAfterDeleteHandler, RoleBeforeDeleteHandler, GetRoleUseCase, ListRolesUseCase, UpdateRoleUseCase, RoleAfterUpdateHandler, RoleBeforeUpdateHandler + +Import Path: webiny/api/security/role + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/security/role.mdx b/docs/developer-docs/6.0.x/reference/api/security/role.mdx new file mode 100644 index 000000000..1990f77d1 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/security/role.mdx @@ -0,0 +1,535 @@ +--- +id: yxbpl3nl +title: Role +description: "Role use cases and event handlers" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What use cases are available in `webiny/api/security/role`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/security/role`. Import any of the items below directly from this path in your Webiny extensions. + +**Use Cases** + +<SymbolList + symbols={[ + { name: "CreateRoleUseCase", anchor: "create-role-use-case" }, + { name: "DeleteRoleUseCase", anchor: "delete-role-use-case" }, + { name: "GetRoleUseCase", anchor: "get-role-use-case" }, + { name: "ListRolesUseCase", anchor: "list-roles-use-case" }, + { name: "UpdateRoleUseCase", anchor: "update-role-use-case" } + ]} +/> + +**Event Handlers** + +<SymbolList + symbols={[ + { name: "RoleAfterCreateHandler", anchor: "role-after-create-handler" }, + { name: "RoleAfterDeleteHandler", anchor: "role-after-delete-handler" }, + { name: "RoleAfterUpdateHandler", anchor: "role-after-update-handler" }, + { name: "RoleBeforeCreateHandler", anchor: "role-before-create-handler" }, + { name: "RoleBeforeDeleteHandler", anchor: "role-before-delete-handler" }, + { name: "RoleBeforeUpdateHandler", anchor: "role-before-update-handler" } + ]} +/> + +## Use Cases + +### `CreateRoleUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/role` + +```typescript +import { CreateRoleUseCase } from "webiny/api/security/role"; +``` + +**Interface `CreateRoleUseCase.Interface`:** + +```typescript +interface CreateRoleUseCase.Interface { + execute(input: CreateRoleInput): Promise<Result<Role, CreateRoleError>>; +} +``` + +**Types:** + +```typescript +namespace CreateRoleUseCase { + type Interface = ICreateRole; + type Error = CreateRoleError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CreateRoleUseCase } from "webiny/api/security/role"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private createRoleUseCase: CreateRoleUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.createRoleUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CreateRoleUseCase] +}); +``` + +### `DeleteRoleUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/role` + +```typescript +import { DeleteRoleUseCase } from "webiny/api/security/role"; +``` + +**Interface `DeleteRoleUseCase.Interface`:** + +```typescript +interface DeleteRoleUseCase.Interface { + execute(id: string): Promise<Result<void, DeleteRoleError>>; +} +``` + +**Types:** + +```typescript +namespace DeleteRoleUseCase { + type Interface = IDeleteRole; + type Error = DeleteRoleError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { DeleteRoleUseCase } from "webiny/api/security/role"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private deleteRoleUseCase: DeleteRoleUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.deleteRoleUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [DeleteRoleUseCase] +}); +``` + +### `GetRoleUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/role` + +```typescript +import { GetRoleUseCase } from "webiny/api/security/role"; +``` + +**Interface `GetRoleUseCase.Interface`:** + +```typescript +interface GetRoleUseCase.Interface { + execute(params: GetRoleInput): Promise<Result<Role, GetRoleError>>; +} +``` + +**Types:** + +```typescript +namespace GetRoleUseCase { + type Interface = IGetRole; + type Error = GetRoleError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetRoleUseCase } from "webiny/api/security/role"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getRoleUseCase: GetRoleUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getRoleUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetRoleUseCase] +}); +``` + +### `ListRolesUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/role` + +```typescript +import { ListRolesUseCase } from "webiny/api/security/role"; +``` + +**Interface `ListRolesUseCase.Interface`:** + +```typescript +interface ListRolesUseCase.Interface { + execute(params?: ListRolesInput): Promise<Result<Role[], ListRolesError>>; +} +``` + +**Types:** + +```typescript +namespace ListRolesUseCase { + type Interface = IListRoles; + type Error = ListRolesError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ListRolesUseCase } from "webiny/api/security/role"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private listRolesUseCase: ListRolesUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.listRolesUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ListRolesUseCase] +}); +``` + +### `UpdateRoleUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/role` + +```typescript +import { UpdateRoleUseCase } from "webiny/api/security/role"; +``` + +**Interface `UpdateRoleUseCase.Interface`:** + +```typescript +interface UpdateRoleUseCase.Interface { + execute( + id: string, + input: UpdateRoleUseCaseInput + ): Promise<Result<Role, UpdateRoleUseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace UpdateRoleUseCase { + type Interface = IUpdateRoleUseCase; + type Error = UpdateRoleUseCaseError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { UpdateRoleUseCase } from "webiny/api/security/role"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private updateRoleUseCase: UpdateRoleUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.updateRoleUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [UpdateRoleUseCase] +}); +``` + +## Event Handlers + +### `RoleAfterCreateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/role` + +```typescript +import { RoleAfterCreateHandler } from "webiny/api/security/role"; +``` + +**Interface `RoleAfterCreateHandler.Interface`:** + +```typescript +interface RoleAfterCreateHandler.Interface { + handle(event: RoleAfterCreateEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace RoleAfterCreateHandler { + type Interface = IEventHandler<RoleAfterCreateEvent>; + type Event = RoleAfterCreateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { RoleAfterCreateHandler } from "webiny/api/security/role"; + +class MyHandler implements RoleAfterCreateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: RoleAfterCreateHandler.Event): Promise<void> { + // implementation + } +} + +export default RoleAfterCreateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `RoleAfterDeleteHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/role` + +```typescript +import { RoleAfterDeleteHandler } from "webiny/api/security/role"; +``` + +**Interface `RoleAfterDeleteHandler.Interface`:** + +```typescript +interface RoleAfterDeleteHandler.Interface { + handle(event: RoleAfterDeleteEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace RoleAfterDeleteHandler { + type Interface = IEventHandler<RoleAfterDeleteEvent>; + type Event = RoleAfterDeleteEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { RoleAfterDeleteHandler } from "webiny/api/security/role"; + +class MyHandler implements RoleAfterDeleteHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: RoleAfterDeleteHandler.Event): Promise<void> { + // implementation + } +} + +export default RoleAfterDeleteHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `RoleAfterUpdateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/role` + +```typescript +import { RoleAfterUpdateHandler } from "webiny/api/security/role"; +``` + +**Interface `RoleAfterUpdateHandler.Interface`:** + +```typescript +interface RoleAfterUpdateHandler.Interface { + handle(event: RoleAfterUpdateEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace RoleAfterUpdateHandler { + type Interface = IEventHandler<RoleAfterUpdateEvent>; + type Event = RoleAfterUpdateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { RoleAfterUpdateHandler } from "webiny/api/security/role"; + +class MyHandler implements RoleAfterUpdateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: RoleAfterUpdateHandler.Event): Promise<void> { + // implementation + } +} + +export default RoleAfterUpdateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `RoleBeforeCreateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/role` + +```typescript +import { RoleBeforeCreateHandler } from "webiny/api/security/role"; +``` + +**Interface `RoleBeforeCreateHandler.Interface`:** + +```typescript +interface RoleBeforeCreateHandler.Interface { + handle(event: RoleBeforeCreateEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace RoleBeforeCreateHandler { + type Interface = IEventHandler<RoleBeforeCreateEvent>; + type Event = RoleBeforeCreateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { RoleBeforeCreateHandler } from "webiny/api/security/role"; + +class MyHandler implements RoleBeforeCreateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: RoleBeforeCreateHandler.Event): Promise<void> { + // implementation + } +} + +export default RoleBeforeCreateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `RoleBeforeDeleteHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/role` + +```typescript +import { RoleBeforeDeleteHandler } from "webiny/api/security/role"; +``` + +**Interface `RoleBeforeDeleteHandler.Interface`:** + +```typescript +interface RoleBeforeDeleteHandler.Interface { + handle(event: RoleBeforeDeleteEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace RoleBeforeDeleteHandler { + type Interface = IEventHandler<RoleBeforeDeleteEvent>; + type Event = RoleBeforeDeleteEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { RoleBeforeDeleteHandler } from "webiny/api/security/role"; + +class MyHandler implements RoleBeforeDeleteHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: RoleBeforeDeleteHandler.Event): Promise<void> { + // implementation + } +} + +export default RoleBeforeDeleteHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `RoleBeforeUpdateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/role` + +```typescript +import { RoleBeforeUpdateHandler } from "webiny/api/security/role"; +``` + +**Interface `RoleBeforeUpdateHandler.Interface`:** + +```typescript +interface RoleBeforeUpdateHandler.Interface { + handle(event: RoleBeforeUpdateEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace RoleBeforeUpdateHandler { + type Interface = IEventHandler<RoleBeforeUpdateEvent>; + type Event = RoleBeforeUpdateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { RoleBeforeUpdateHandler } from "webiny/api/security/role"; + +class MyHandler implements RoleBeforeUpdateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: RoleBeforeUpdateHandler.Event): Promise<void> { + // implementation + } +} + +export default RoleBeforeUpdateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/api/security/user.ai.txt b/docs/developer-docs/6.0.x/reference/api/security/user.ai.txt new file mode 100644 index 000000000..f7fbba011 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/security/user.ai.txt @@ -0,0 +1,30 @@ +AI Context: User (reference/api/security/user.mdx) + +Source of Information: +1. packages/webiny/src/api/security/user.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-core/src/features/users/CreateUser/index.ts — originating source +3. /Users/adrian/dev/wby-next/packages/api-core/src/features/users/DeleteUser/index.ts — originating source +4. /Users/adrian/dev/wby-next/packages/api-core/src/features/users/UpdateUser/index.ts — originating source +5. /Users/adrian/dev/wby-next/packages/api-core/src/features/users/GetUser/index.ts — originating source +6. /Users/adrian/dev/wby-next/packages/api-core/src/features/users/ListUsers/index.ts — originating source +7. /Users/adrian/dev/wby-next/packages/api-core/src/features/users/ListUserTeams/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +CreateUserUseCase, UserAfterCreateHandler, UserBeforeCreateHandler, DeleteUserUseCase, UserAfterDeleteHandler, UserBeforeDeleteHandler, UpdateUserUseCase, UserAfterUpdateHandler, UserBeforeUpdateHandler, GetUserUseCase, ListUsersUseCase, ListUserTeamsUseCase + +Import Path: webiny/api/security/user + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/security/user.mdx b/docs/developer-docs/6.0.x/reference/api/security/user.mdx new file mode 100644 index 000000000..869dc2402 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/security/user.mdx @@ -0,0 +1,578 @@ +--- +id: yxbpl3nl +title: User +description: "User use cases and event handlers" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What use cases are available in `webiny/api/security/user`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/security/user`. Import any of the items below directly from this path in your Webiny extensions. + +**Use Cases** + +<SymbolList + symbols={[ + { name: "CreateUserUseCase", anchor: "create-user-use-case" }, + { name: "DeleteUserUseCase", anchor: "delete-user-use-case" }, + { name: "GetUserUseCase", anchor: "get-user-use-case" }, + { name: "ListUsersUseCase", anchor: "list-users-use-case" }, + { name: "ListUserTeamsUseCase", anchor: "list-user-teams-use-case" }, + { name: "UpdateUserUseCase", anchor: "update-user-use-case" } + ]} +/> + +**Event Handlers** + +<SymbolList + symbols={[ + { name: "UserAfterCreateHandler", anchor: "user-after-create-handler" }, + { name: "UserAfterDeleteHandler", anchor: "user-after-delete-handler" }, + { name: "UserAfterUpdateHandler", anchor: "user-after-update-handler" }, + { name: "UserBeforeCreateHandler", anchor: "user-before-create-handler" }, + { name: "UserBeforeDeleteHandler", anchor: "user-before-delete-handler" }, + { name: "UserBeforeUpdateHandler", anchor: "user-before-update-handler" } + ]} +/> + +## Use Cases + +### `CreateUserUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/user` + +```typescript +import { CreateUserUseCase } from "webiny/api/security/user"; +``` + +**Interface `CreateUserUseCase.Interface`:** + +```typescript +interface CreateUserUseCase.Interface { + execute(input: CreateUserInput): Promise<Result<AdminUser, CreateUserError>>; +} +``` + +**Types:** + +```typescript +namespace CreateUserUseCase { + type Interface = ICreateUser; + type Input = CreateUserInput; + type Error = CreateUserError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CreateUserUseCase } from "webiny/api/security/user"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private createUserUseCase: CreateUserUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.createUserUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CreateUserUseCase] +}); +``` + +### `DeleteUserUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/user` + +```typescript +import { DeleteUserUseCase } from "webiny/api/security/user"; +``` + +**Interface `DeleteUserUseCase.Interface`:** + +```typescript +interface DeleteUserUseCase.Interface { + execute(id: string): Promise<Result<void, DeleteUserError>>; +} +``` + +**Types:** + +```typescript +namespace DeleteUserUseCase { + type Interface = IDeleteUser; + type Error = DeleteUserError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { DeleteUserUseCase } from "webiny/api/security/user"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private deleteUserUseCase: DeleteUserUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.deleteUserUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [DeleteUserUseCase] +}); +``` + +### `GetUserUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/user` + +```typescript +import { GetUserUseCase } from "webiny/api/security/user"; +``` + +**Interface `GetUserUseCase.Interface`:** + +```typescript +interface GetUserUseCase.Interface { + execute(input: GetUserInput): Promise<Result<AdminUser, GetUserError>>; +} +``` + +**Types:** + +```typescript +namespace GetUserUseCase { + type Interface = IGetUser; + type Error = GetUserError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetUserUseCase } from "webiny/api/security/user"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getUserUseCase: GetUserUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getUserUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetUserUseCase] +}); +``` + +### `ListUsersUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/user` + +```typescript +import { ListUsersUseCase } from "webiny/api/security/user"; +``` + +**Interface `ListUsersUseCase.Interface`:** + +```typescript +interface ListUsersUseCase.Interface { + execute(input?: ListUsersInput): Promise<Result<AdminUser[], ListUsersError>>; +} +``` + +**Types:** + +```typescript +namespace ListUsersUseCase { + type Interface = IListUsers; + type Error = ListUsersError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ListUsersUseCase } from "webiny/api/security/user"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private listUsersUseCase: ListUsersUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.listUsersUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ListUsersUseCase] +}); +``` + +### `ListUserTeamsUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/user` + +```typescript +import { ListUserTeamsUseCase } from "webiny/api/security/user"; +``` + +**Interface `ListUserTeamsUseCase.Interface`:** + +```typescript +interface ListUserTeamsUseCase.Interface { + execute(userId: string): Promise<Result<Team[], ListUserTeamsError>>; +} +``` + +**Types:** + +```typescript +namespace ListUserTeamsUseCase { + type Interface = IListUserTeams; + type Error = ListUserTeamsError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ListUserTeamsUseCase } from "webiny/api/security/user"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private listUserTeamsUseCase: ListUserTeamsUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.listUserTeamsUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ListUserTeamsUseCase] +}); +``` + +### `UpdateUserUseCase` + +**Use Case Abstraction** — imported from `webiny/api/security/user` + +```typescript +import { UpdateUserUseCase } from "webiny/api/security/user"; +``` + +**Interface `UpdateUserUseCase.Interface`:** + +```typescript +interface UpdateUserUseCase.Interface { + execute(id: string, input: UpdateUserInput): Promise<Result<AdminUser, UpdateUserError>>; +} +``` + +**Types:** + +```typescript +namespace UpdateUserUseCase { + type Interface = IUpdateUser; + type Error = UpdateUserError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { UpdateUserUseCase } from "webiny/api/security/user"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private updateUserUseCase: UpdateUserUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.updateUserUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [UpdateUserUseCase] +}); +``` + +## Event Handlers + +### `UserAfterCreateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/user` + +```typescript +import { UserAfterCreateHandler } from "webiny/api/security/user"; +``` + +**Interface `UserAfterCreateHandler.Interface`:** + +```typescript +interface UserAfterCreateHandler.Interface { + handle(event: UserAfterCreateEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace UserAfterCreateHandler { + type Interface = IEventHandler<UserAfterCreateEvent>; + type Event = UserAfterCreateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { UserAfterCreateHandler } from "webiny/api/security/user"; + +class MyHandler implements UserAfterCreateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: UserAfterCreateHandler.Event): Promise<void> { + // implementation + } +} + +export default UserAfterCreateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `UserAfterDeleteHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/user` + +```typescript +import { UserAfterDeleteHandler } from "webiny/api/security/user"; +``` + +**Interface `UserAfterDeleteHandler.Interface`:** + +```typescript +interface UserAfterDeleteHandler.Interface { + handle(event: UserAfterDeleteEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace UserAfterDeleteHandler { + type Interface = IEventHandler<UserAfterDeleteEvent>; + type Event = UserAfterDeleteEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { UserAfterDeleteHandler } from "webiny/api/security/user"; + +class MyHandler implements UserAfterDeleteHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: UserAfterDeleteHandler.Event): Promise<void> { + // implementation + } +} + +export default UserAfterDeleteHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `UserAfterUpdateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/user` + +```typescript +import { UserAfterUpdateHandler } from "webiny/api/security/user"; +``` + +**Interface `UserAfterUpdateHandler.Interface`:** + +```typescript +interface UserAfterUpdateHandler.Interface { + handle(event: UserAfterUpdateEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace UserAfterUpdateHandler { + type Interface = IEventHandler<UserAfterUpdateEvent>; + type Event = UserAfterUpdateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { UserAfterUpdateHandler } from "webiny/api/security/user"; + +class MyHandler implements UserAfterUpdateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: UserAfterUpdateHandler.Event): Promise<void> { + // implementation + } +} + +export default UserAfterUpdateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `UserBeforeCreateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/user` + +```typescript +import { UserBeforeCreateHandler } from "webiny/api/security/user"; +``` + +**Interface `UserBeforeCreateHandler.Interface`:** + +```typescript +interface UserBeforeCreateHandler.Interface { + handle(event: UserBeforeCreateEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace UserBeforeCreateHandler { + type Interface = IEventHandler<UserBeforeCreateEvent>; + type Event = UserBeforeCreateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { UserBeforeCreateHandler } from "webiny/api/security/user"; + +class MyHandler implements UserBeforeCreateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: UserBeforeCreateHandler.Event): Promise<void> { + // implementation + } +} + +export default UserBeforeCreateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `UserBeforeDeleteHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/user` + +```typescript +import { UserBeforeDeleteHandler } from "webiny/api/security/user"; +``` + +**Interface `UserBeforeDeleteHandler.Interface`:** + +```typescript +interface UserBeforeDeleteHandler.Interface { + handle(event: UserBeforeDeleteEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace UserBeforeDeleteHandler { + type Interface = IEventHandler<UserBeforeDeleteEvent>; + type Event = UserBeforeDeleteEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { UserBeforeDeleteHandler } from "webiny/api/security/user"; + +class MyHandler implements UserBeforeDeleteHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: UserBeforeDeleteHandler.Event): Promise<void> { + // implementation + } +} + +export default UserBeforeDeleteHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `UserBeforeUpdateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/security/user` + +```typescript +import { UserBeforeUpdateHandler } from "webiny/api/security/user"; +``` + +**Interface `UserBeforeUpdateHandler.Interface`:** + +```typescript +interface UserBeforeUpdateHandler.Interface { + handle(event: UserBeforeUpdateEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace UserBeforeUpdateHandler { + type Interface = IEventHandler<UserBeforeUpdateEvent>; + type Event = UserBeforeUpdateEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { UserBeforeUpdateHandler } from "webiny/api/security/user"; + +class MyHandler implements UserBeforeUpdateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: UserBeforeUpdateHandler.Event): Promise<void> { + // implementation + } +} + +export default UserBeforeUpdateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/api/system.ai.txt b/docs/developer-docs/6.0.x/reference/api/system.ai.txt new file mode 100644 index 000000000..263747a89 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/system.ai.txt @@ -0,0 +1,25 @@ +AI Context: System (reference/api/system.mdx) + +Source of Information: +1. packages/webiny/src/api/system.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-core/src/features/system/InstallSystem/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +InstallSystemUseCase, SystemInstalledHandler + +Import Path: webiny/api/system + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/system.mdx b/docs/developer-docs/6.0.x/reference/api/system.mdx new file mode 100644 index 000000000..b4f41dfa3 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/system.mdx @@ -0,0 +1,121 @@ +--- +id: yxbpl3n5 +title: System +description: "System installation abstractions" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What use cases are available in `webiny/api/system`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/system`. Import any of the items below directly from this path in your Webiny extensions. + +**Use Cases** + +<SymbolList symbols={[{ name: "InstallSystemUseCase", anchor: "install-system-use-case" }]} /> + +**Event Handlers** + +<SymbolList symbols={[{ name: "SystemInstalledHandler", anchor: "system-installed-handler" }]} /> + +## Use Cases + +### `InstallSystemUseCase` + +**Use Case Abstraction** — imported from `webiny/api/system` + +```typescript +import { InstallSystemUseCase } from "webiny/api/system"; +``` + +**Interface `InstallSystemUseCase.Interface`:** + +```typescript +interface InstallSystemUseCase.Interface { + execute( + input: InstallSystemInput + ): Promise<Result<void, IInstallSystemErrors[keyof IInstallSystemErrors]>>; +} +``` + +**Types:** + +```typescript +namespace InstallSystemUseCase { + type Interface = IInstallSystemUseCase; + type Input = InstallSystemInput; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { InstallSystemUseCase } from "webiny/api/system"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private installSystemUseCase: InstallSystemUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.installSystemUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [InstallSystemUseCase] +}); +``` + +## Event Handlers + +### `SystemInstalledHandler` + +**Event Handler Abstraction** — imported from `webiny/api/system` + +```typescript +import { SystemInstalledHandler } from "webiny/api/system"; +``` + +**Interface `SystemInstalledHandler.Interface`:** + +```typescript +interface SystemInstalledHandler.Interface { + handle(event: DomainEvent): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace SystemInstalledHandler { + type Interface = IEventHandler<DomainEvent>; + type Event = DomainEvent; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { SystemInstalledHandler } from "webiny/api/system"; + +class MyHandler implements SystemInstalledHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: SystemInstalledHandler.Event): Promise<void> { + // implementation + } +} + +export default SystemInstalledHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/api/tasks.ai.txt b/docs/developer-docs/6.0.x/reference/api/tasks.ai.txt new file mode 100644 index 000000000..209216738 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/tasks.ai.txt @@ -0,0 +1,26 @@ +AI Context: Tasks (reference/api/tasks.mdx) + +Source of Information: +1. packages/webiny/src/api/tasks.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-core/src/features/task/TaskService/index.ts — originating source +3. /Users/adrian/dev/wby-next/packages/api-core/src/features/task/TaskDefinition/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +TaskService, TaskDefinition + +Import Path: webiny/api/tasks + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/tasks.mdx b/docs/developer-docs/6.0.x/reference/api/tasks.mdx new file mode 100644 index 000000000..f117da051 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/tasks.mdx @@ -0,0 +1,160 @@ +--- +id: yxbpl3rh +title: Tasks +description: "Background task abstractions: TaskService, TaskDefinition" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/api/tasks`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/tasks`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "TaskDefinition", anchor: "task-definition" }, + { name: "TaskService", anchor: "task-service" } + ]} +/> + +## `TaskDefinition` + +**Abstraction** — imported from `webiny/api/tasks` + +```typescript +import { TaskDefinition } from "webiny/api/tasks"; +``` + +**Interface `TaskDefinition.Interface`:** + +```typescript +interface TaskDefinition.Interface { + id: string; + title: string; + description?: string; + maxIterations?: number; + databaseLogs?: boolean; + isPrivate?: boolean; + // Core run method - receives ONLY input params + // All runtime dependencies (logging, state management, etc.) come from TaskController + run(params: ITaskRunParams<I, O>): Promise<ITaskResult<I, O>>; + // Optional lifecycle hooks - receive task data, no context + onBeforeTrigger?(params: ITaskBeforeTriggerParams<I>): Promise<void>; + onDone?(params: ITaskLifecycleHook<I, O>): Promise<void>; + onError?(params: ITaskLifecycleHook<I, O>): Promise<void>; + onAbort?(params: ITaskLifecycleHook<I, O>): Promise<void>; + onMaxIterations?(params: ITaskLifecycleHook<I, O>): Promise<void>; + // Create a validation schema for the task input. + // This will be used to validate the input before the task is triggered. + createInputValidation?( + params: ITaskCreateInputValidationParams + ): GenericRecord<keyof I, zod.Schema> | zod.Schema; +} +``` + +**Types:** + +```typescript +namespace TaskDefinition { + type Interface = ITaskDefinition<I, O>; + type TaskInput = ITaskInput; + type TaskOutput = ITaskOutput; + type Runnable = IRunnableTaskDefinition<I, O>; + type RunParams = ITaskRunParams<I, O>; + type Result = ITaskResult<I, O>; + type Task = ITask<I, O>; + type ResultDone = ITaskResultDone<O>; + type ResultContinue = ITaskResultContinue<I>; + type ResultError = ITaskResultError; + type ResultAborted = ITaskResultAborted; + type CreateInputValidationParams = ITaskCreateInputValidationParams; + type TaskCreateData = ITaskCreateData<I>; + type BeforeTriggerParams = ITaskBeforeTriggerParams<I>; + type LifecycleHookParams = ITaskLifecycleHook<I, O>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { TaskDefinition } from "webiny/api/tasks"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private taskDefinition: TaskDefinition.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.taskDefinition.id: string(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [TaskDefinition] +}); +``` + +## `TaskService` + +**Abstraction** — imported from `webiny/api/tasks` + +```typescript +import { TaskService } from "webiny/api/tasks"; +``` + +**Interface `TaskService.Interface`:** + +```typescript +interface TaskService.Interface { + trigger: < + T extends TaskDefinition.TaskInput = TaskDefinition.TaskInput, + O extends IGenericOutput = IGenericOutput + >( + params: ITaskTriggerParams<T> + ) => Promise<Result<ITask<T, O>, BaseError>>; + abort: < + T extends TaskDefinition.TaskInput = TaskDefinition.TaskInput, + O extends IGenericOutput = IGenericOutput + >( + params: ITaskAbortParams + ) => Promise<Result<ITask<T, O>, BaseError>>; + fetchServiceInfo: (input: ITask<any, any> | string) => Promise<Result<IServiceInfo, BaseError>>; +} +``` + +**Types:** + +```typescript +namespace TaskService { + type Interface = ITaskService; + type GenericOutput = IGenericOutput; + type TaskInput = TaskDefinition.TaskInput; + type Task = ITask<I, O>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { TaskService } from "webiny/api/tasks"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private taskService: TaskService.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.taskService.trigger:(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [TaskService] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/api/tenancy.ai.txt b/docs/developer-docs/6.0.x/reference/api/tenancy.ai.txt new file mode 100644 index 000000000..c5639a4b9 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/tenancy.ai.txt @@ -0,0 +1,30 @@ +AI Context: Tenancy (reference/api/tenancy.mdx) + +Source of Information: +1. packages/webiny/src/api/tenancy.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-core/src/features/tenancy/TenantContext/index.ts — originating source +3. /Users/adrian/dev/wby-next/packages/api-core/src/features/tenancy/CreateTenant/index.ts — originating source +4. /Users/adrian/dev/wby-next/packages/api-core/src/features/tenancy/GetTenantById/index.ts — originating source +5. /Users/adrian/dev/wby-next/packages/api-core/src/features/tenancy/UpdateTenant/index.ts — originating source +6. /Users/adrian/dev/wby-next/packages/api-core/src/features/tenancy/DeleteTenant/index.ts — originating source +7. /Users/adrian/dev/wby-next/packages/api-core/src/features/tenancy/InstallTenant/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +TenantContext, CreateTenantUseCase, CreateTenantRepository, TenantBeforeCreateHandler, TenantAfterCreateHandler, GetTenantByIdUseCase, UpdateTenantUseCase, UpdateTenantRepository, TenantAfterUpdateHandler, TenantBeforeUpdateHandler, DeleteTenantUseCase, DeleteTenantRepository, TenantAfterDeleteHandler, TenantBeforeDeleteHandler, InstallTenantUseCase, AppInstaller, TenantInstalledHandler + +Import Path: webiny/api/tenancy + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/tenancy.mdx b/docs/developer-docs/6.0.x/reference/api/tenancy.mdx new file mode 100644 index 000000000..5715525d5 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/tenancy.mdx @@ -0,0 +1,825 @@ +--- +id: yxbpl3rl +title: Tenancy +description: "Tenancy context and tenant management" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What use cases are available in `webiny/api/tenancy`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/tenancy`. Import any of the items below directly from this path in your Webiny extensions. + +**Use Cases** + +<SymbolList + symbols={[ + { name: "CreateTenantRepository", anchor: "create-tenant-repository" }, + { name: "CreateTenantUseCase", anchor: "create-tenant-use-case" }, + { name: "DeleteTenantRepository", anchor: "delete-tenant-repository" }, + { name: "DeleteTenantUseCase", anchor: "delete-tenant-use-case" }, + { name: "GetTenantByIdUseCase", anchor: "get-tenant-by-id-use-case" }, + { name: "InstallTenantUseCase", anchor: "install-tenant-use-case" }, + { name: "UpdateTenantRepository", anchor: "update-tenant-repository" }, + { name: "UpdateTenantUseCase", anchor: "update-tenant-use-case" } + ]} +/> + +**Event Handlers** + +<SymbolList + symbols={[ + { name: "TenantAfterCreateHandler", anchor: "tenant-after-create-handler" }, + { name: "TenantAfterDeleteHandler", anchor: "tenant-after-delete-handler" }, + { name: "TenantAfterUpdateHandler", anchor: "tenant-after-update-handler" }, + { name: "TenantBeforeCreateHandler", anchor: "tenant-before-create-handler" }, + { name: "TenantBeforeDeleteHandler", anchor: "tenant-before-delete-handler" }, + { name: "TenantBeforeUpdateHandler", anchor: "tenant-before-update-handler" }, + { name: "TenantInstalledHandler", anchor: "tenant-installed-handler" } + ]} +/> + +**Services** + +<SymbolList + symbols={[ + { name: "AppInstaller", anchor: "app-installer" }, + { name: "TenantContext", anchor: "tenant-context" } + ]} +/> + +## Use Cases + +### `CreateTenantRepository` + +**Use Case Abstraction** — imported from `webiny/api/tenancy` + +```typescript +import { CreateTenantRepository } from "webiny/api/tenancy"; +``` + +**Interface `CreateTenantRepository.Interface`:** + +```typescript +interface CreateTenantRepository.Interface { + create(tenant: Tenant): Promise<Tenant>; +} +``` + +**Types:** + +```typescript +namespace CreateTenantRepository { + type Interface = ICreateTenantRepository; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CreateTenantRepository } from "webiny/api/tenancy"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private createTenantRepository: CreateTenantRepository.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.createTenantRepository.create(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CreateTenantRepository] +}); +``` + +### `CreateTenantUseCase` + +**Use Case Abstraction** — imported from `webiny/api/tenancy` + +```typescript +import { CreateTenantUseCase } from "webiny/api/tenancy"; +``` + +**Interface `CreateTenantUseCase.Interface`:** + +```typescript +interface CreateTenantUseCase.Interface { + execute( + data: CreateTenantInput + ): Promise<Result<Tenant, ICreateTenantErrors[keyof ICreateTenantErrors]>>; +} +``` + +**Types:** + +```typescript +namespace CreateTenantUseCase { + type Interface = ICreateTenantUseCase; + type Errors = ICreateTenantErrors[keyof ICreateTenantErrors]; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CreateTenantUseCase } from "webiny/api/tenancy"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private createTenantUseCase: CreateTenantUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.createTenantUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CreateTenantUseCase] +}); +``` + +### `DeleteTenantRepository` + +**Use Case Abstraction** — imported from `webiny/api/tenancy` + +```typescript +import { DeleteTenantRepository } from "webiny/api/tenancy"; +``` + +**Interface `DeleteTenantRepository.Interface`:** + +```typescript +interface DeleteTenantRepository.Interface { + delete(id: string): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace DeleteTenantRepository { + type Interface = IDeleteTenantRepository; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { DeleteTenantRepository } from "webiny/api/tenancy"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private deleteTenantRepository: DeleteTenantRepository.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.deleteTenantRepository.delete(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [DeleteTenantRepository] +}); +``` + +### `DeleteTenantUseCase` + +**Use Case Abstraction** — imported from `webiny/api/tenancy` + +```typescript +import { DeleteTenantUseCase } from "webiny/api/tenancy"; +``` + +**Interface `DeleteTenantUseCase.Interface`:** + +```typescript +interface DeleteTenantUseCase.Interface { + execute(id: string): Promise<boolean>; +} +``` + +**Types:** + +```typescript +namespace DeleteTenantUseCase { + type Interface = IDeleteTenantUseCase; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { DeleteTenantUseCase } from "webiny/api/tenancy"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private deleteTenantUseCase: DeleteTenantUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.deleteTenantUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [DeleteTenantUseCase] +}); +``` + +### `GetTenantByIdUseCase` + +**Use Case Abstraction** — imported from `webiny/api/tenancy` + +```typescript +import { GetTenantByIdUseCase } from "webiny/api/tenancy"; +``` + +**Interface `GetTenantByIdUseCase.Interface`:** + +```typescript +interface GetTenantByIdUseCase.Interface { + execute(id: string): Promise<Result<Tenant, GetTenantByIdError>>; +} +``` + +**Types:** + +```typescript +namespace GetTenantByIdUseCase { + type Interface = IGetTenantByIdUseCase; + type Error = GetTenantByIdError; + type Result = ReturnType<IGetTenantByIdUseCase["execute"]>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetTenantByIdUseCase } from "webiny/api/tenancy"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getTenantByIdUseCase: GetTenantByIdUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getTenantByIdUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetTenantByIdUseCase] +}); +``` + +### `InstallTenantUseCase` + +**Use Case Abstraction** — imported from `webiny/api/tenancy` + +```typescript +import { InstallTenantUseCase } from "webiny/api/tenancy"; +``` + +**Interface `InstallTenantUseCase.Interface`:** + +```typescript +interface InstallTenantUseCase.Interface { + execute( + input: TenantInstallationInput + ): Promise<Result<void, IInstallTenantErrors[keyof IInstallTenantErrors]>>; +} +``` + +**Types:** + +```typescript +namespace InstallTenantUseCase { + type Interface = IInstallTenantUseCase; + type Input = TenantInstallationInput; + type Errors = IInstallTenantErrors[keyof IInstallTenantErrors]; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { InstallTenantUseCase } from "webiny/api/tenancy"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private installTenantUseCase: InstallTenantUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.installTenantUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [InstallTenantUseCase] +}); +``` + +### `UpdateTenantRepository` + +**Use Case Abstraction** — imported from `webiny/api/tenancy` + +```typescript +import { UpdateTenantRepository } from "webiny/api/tenancy"; +``` + +**Interface `UpdateTenantRepository.Interface`:** + +```typescript +interface UpdateTenantRepository.Interface { + update(tenant: Tenant): Promise<Tenant>; +} +``` + +**Types:** + +```typescript +namespace UpdateTenantRepository { + type Interface = IUpdateTenantRepository; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { UpdateTenantRepository } from "webiny/api/tenancy"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private updateTenantRepository: UpdateTenantRepository.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.updateTenantRepository.update(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [UpdateTenantRepository] +}); +``` + +### `UpdateTenantUseCase` + +**Use Case Abstraction** — imported from `webiny/api/tenancy` + +```typescript +import { UpdateTenantUseCase } from "webiny/api/tenancy"; +``` + +**Interface `UpdateTenantUseCase.Interface`:** + +```typescript +interface UpdateTenantUseCase.Interface { + execute(id: string, data: Partial<Tenant>): Promise<Result<Tenant, UpdateTenantError>>; +} +``` + +**Types:** + +```typescript +namespace UpdateTenantUseCase { + type Interface = IUpdateTenantUseCase; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { UpdateTenantUseCase } from "webiny/api/tenancy"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private updateTenantUseCase: UpdateTenantUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.updateTenantUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [UpdateTenantUseCase] +}); +``` + +## Event Handlers + +### `TenantAfterCreateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/tenancy` + +```typescript +import { TenantAfterCreateHandler } from "webiny/api/tenancy"; +``` + +**Interface `TenantAfterCreateHandler.Interface`:** + +```typescript +interface TenantAfterCreateHandler.Interface { + handle(event: DomainEvent<TenantAfterCreatePayload>): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace TenantAfterCreateHandler { + type Interface = IEventHandler<DomainEvent<TenantAfterCreatePayload>>; + type Event = DomainEvent<TenantAfterCreatePayload>; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { TenantAfterCreateHandler } from "webiny/api/tenancy"; + +class MyHandler implements TenantAfterCreateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: TenantAfterCreateHandler.Event): Promise<void> { + // implementation + } +} + +export default TenantAfterCreateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `TenantAfterDeleteHandler` + +**Event Handler Abstraction** — imported from `webiny/api/tenancy` + +```typescript +import { TenantAfterDeleteHandler } from "webiny/api/tenancy"; +``` + +**Interface `TenantAfterDeleteHandler.Interface`:** + +```typescript +interface TenantAfterDeleteHandler.Interface { + handle(event: DomainEvent<TenantAfterDeletePayload>): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace TenantAfterDeleteHandler { + type Interface = IEventHandler<DomainEvent<TenantAfterDeletePayload>>; + type Event = DomainEvent<TenantAfterDeletePayload>; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { TenantAfterDeleteHandler } from "webiny/api/tenancy"; + +class MyHandler implements TenantAfterDeleteHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: TenantAfterDeleteHandler.Event): Promise<void> { + // implementation + } +} + +export default TenantAfterDeleteHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `TenantAfterUpdateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/tenancy` + +```typescript +import { TenantAfterUpdateHandler } from "webiny/api/tenancy"; +``` + +**Interface `TenantAfterUpdateHandler.Interface`:** + +```typescript +interface TenantAfterUpdateHandler.Interface { + handle(event: DomainEvent<TenantAfterUpdatePayload>): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace TenantAfterUpdateHandler { + type Interface = IEventHandler<DomainEvent<TenantAfterUpdatePayload>>; + type Event = DomainEvent<TenantAfterUpdatePayload>; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { TenantAfterUpdateHandler } from "webiny/api/tenancy"; + +class MyHandler implements TenantAfterUpdateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: TenantAfterUpdateHandler.Event): Promise<void> { + // implementation + } +} + +export default TenantAfterUpdateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `TenantBeforeCreateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/tenancy` + +```typescript +import { TenantBeforeCreateHandler } from "webiny/api/tenancy"; +``` + +**Interface `TenantBeforeCreateHandler.Interface`:** + +```typescript +interface TenantBeforeCreateHandler.Interface { + handle(event: DomainEvent<TenantBeforeCreatePayload>): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace TenantBeforeCreateHandler { + type Interface = IEventHandler<DomainEvent<TenantBeforeCreatePayload>>; + type Event = DomainEvent<TenantBeforeCreatePayload>; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { TenantBeforeCreateHandler } from "webiny/api/tenancy"; + +class MyHandler implements TenantBeforeCreateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: TenantBeforeCreateHandler.Event): Promise<void> { + // implementation + } +} + +export default TenantBeforeCreateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `TenantBeforeDeleteHandler` + +**Event Handler Abstraction** — imported from `webiny/api/tenancy` + +```typescript +import { TenantBeforeDeleteHandler } from "webiny/api/tenancy"; +``` + +**Interface `TenantBeforeDeleteHandler.Interface`:** + +```typescript +interface TenantBeforeDeleteHandler.Interface { + handle(event: DomainEvent<TenantBeforeDeletePayload>): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace TenantBeforeDeleteHandler { + type Interface = IEventHandler<DomainEvent<TenantBeforeDeletePayload>>; + type Event = DomainEvent<TenantBeforeDeletePayload>; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { TenantBeforeDeleteHandler } from "webiny/api/tenancy"; + +class MyHandler implements TenantBeforeDeleteHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: TenantBeforeDeleteHandler.Event): Promise<void> { + // implementation + } +} + +export default TenantBeforeDeleteHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `TenantBeforeUpdateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/tenancy` + +```typescript +import { TenantBeforeUpdateHandler } from "webiny/api/tenancy"; +``` + +**Interface `TenantBeforeUpdateHandler.Interface`:** + +```typescript +interface TenantBeforeUpdateHandler.Interface { + handle(event: DomainEvent<TenantBeforeUpdatePayload>): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace TenantBeforeUpdateHandler { + type Interface = IEventHandler<DomainEvent<TenantBeforeUpdatePayload>>; + type Event = DomainEvent<TenantBeforeUpdatePayload>; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { TenantBeforeUpdateHandler } from "webiny/api/tenancy"; + +class MyHandler implements TenantBeforeUpdateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: TenantBeforeUpdateHandler.Event): Promise<void> { + // implementation + } +} + +export default TenantBeforeUpdateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `TenantInstalledHandler` + +**Event Handler Abstraction** — imported from `webiny/api/tenancy` + +```typescript +import { TenantInstalledHandler } from "webiny/api/tenancy"; +``` + +**Interface `TenantInstalledHandler.Interface`:** + +```typescript +interface TenantInstalledHandler.Interface { + handle(event: DomainEvent<TenantInstalledPayload>): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace TenantInstalledHandler { + type Interface = IEventHandler<DomainEvent<TenantInstalledPayload>>; + type Event = DomainEvent<TenantInstalledPayload>; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { TenantInstalledHandler } from "webiny/api/tenancy"; + +class MyHandler implements TenantInstalledHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: TenantInstalledHandler.Event): Promise<void> { + // implementation + } +} + +export default TenantInstalledHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +## Services + +### `AppInstaller` + +**Abstraction** — imported from `webiny/api/tenancy` + +```typescript +import { AppInstaller } from "webiny/api/tenancy"; +``` + +**Interface `AppInstaller.Interface`:** + +```typescript +interface AppInstaller.Interface { + readonly alwaysRun?: boolean; + readonly appName: string; + readonly dependsOn: string[]; + // Perform the installation + // If this succeeds, uninstall() MUST be able to revert it + install(tenant: Tenant, data: TData): Promise<void>; + // Revert the installation + // Called if any subsequent installer fails + uninstall(tenant: Tenant): Promise<void>; +} +``` + +**Types:** + +```typescript +namespace AppInstaller { + type Interface = IAppInstaller<T>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { AppInstaller } from "webiny/api/tenancy"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private appInstaller: AppInstaller.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.appInstaller.readonly alwaysRun?: boolean(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [AppInstaller] +}); +``` + +### `TenantContext` + +**Abstraction** — imported from `webiny/api/tenancy` + +```typescript +import { TenantContext } from "webiny/api/tenancy"; +``` + +**Interface `TenantContext.Interface`:** + +```typescript +interface TenantContext.Interface { + setTenant(tenant: Tenant): void; + getTenant(): Tenant; + withRootTenant<T>(cb: () => T): Promise<T>; + withEachTenant<TReturn>( + tenants: Tenant[], + cb: (tenant: Tenant) => Promise<TReturn> + ): Promise<TReturn[]>; + withTenant<TReturn>(tenant: Tenant, cb: (tenant: Tenant) => Promise<TReturn>): Promise<TReturn>; +} +``` + +**Types:** + +```typescript +namespace TenantContext { + type Interface = ITenantContext; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { TenantContext } from "webiny/api/tenancy"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private tenantContext: TenantContext.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.tenantContext.setTenant(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [TenantContext] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/api/tenant-manager.ai.txt b/docs/developer-docs/6.0.x/reference/api/tenant-manager.ai.txt new file mode 100644 index 000000000..25bd8bfd8 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/tenant-manager.ai.txt @@ -0,0 +1,26 @@ +AI Context: Tenant Manager (reference/api/tenant-manager.mdx) + +Source of Information: +1. packages/webiny/src/api/tenant-manager.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/tenant-manager/src/api/domain/TenantModelExtension.ts — originating source +3. /Users/adrian/dev/wby-next/packages/tenant-manager/src/shared/Tenant.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +TenantModelExtension, TenantExtensions + +Import Path: webiny/api/tenant-manager + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/tenant-manager.mdx b/docs/developer-docs/6.0.x/reference/api/tenant-manager.mdx new file mode 100644 index 000000000..a0a619a12 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/tenant-manager.mdx @@ -0,0 +1,87 @@ +--- +id: yxbpl3rl +title: Tenant Manager +description: "Tenant manager abstractions" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/api/tenant-manager`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/tenant-manager`. Import any of the items below directly from this path in your Webiny extensions. + +**Services** + +<SymbolList symbols={[{ name: "TenantModelExtension", anchor: "tenant-model-extension" }]} /> + +**Types & Classes** + +<SymbolList symbols={[{ name: "TenantExtensions", anchor: "tenant-extensions" }]} /> + +## Services + +### `TenantModelExtension` + +**Abstraction** — imported from `webiny/api/tenant-manager` + +```typescript +import { TenantModelExtension } from "webiny/api/tenant-manager"; +``` + +**Interface `TenantModelExtension.Interface`:** + +```typescript +interface TenantModelExtension.Interface { + execute(extension: IExtension): void; +} +``` + +**Types:** + +```typescript +namespace TenantModelExtension { + type Interface = ITenantModelExtension; + type Extension = IExtension; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { TenantModelExtension } from "webiny/api/tenant-manager"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private tenantModelExtension: TenantModelExtension.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.tenantModelExtension.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [TenantModelExtension] +}); +``` + +## Types & Classes + +### `TenantExtensions` + +**Type** — imported from `webiny/api/tenant-manager` + +```typescript +import type { TenantExtensions } from "webiny/api/tenant-manager"; +``` + +```typescript +export interface TenantExtensions {} +``` diff --git a/docs/developer-docs/6.0.x/reference/api/website-builder/nextjs.ai.txt b/docs/developer-docs/6.0.x/reference/api/website-builder/nextjs.ai.txt new file mode 100644 index 000000000..7fbade54b --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/website-builder/nextjs.ai.txt @@ -0,0 +1,25 @@ +AI Context: Next.js (reference/api/website-builder/nextjs.mdx) + +Source of Information: +1. packages/webiny/src/api/website-builder/nextjs.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/nextjs/abstractions.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +NextjsConfig + +Import Path: webiny/api/website-builder/nextjs + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/website-builder/nextjs.mdx b/docs/developer-docs/6.0.x/reference/api/website-builder/nextjs.mdx new file mode 100644 index 000000000..4286cd219 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/website-builder/nextjs.mdx @@ -0,0 +1,65 @@ +--- +id: yxbpl3dl +title: Next.js +description: "Next.js configuration abstraction" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/api/website-builder/nextjs`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/website-builder/nextjs`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList symbols={[{ name: "NextjsConfig", anchor: "nextjs-config" }]} /> + +## `NextjsConfig` + +**Abstraction** — imported from `webiny/api/website-builder/nextjs` + +```typescript +import { NextjsConfig } from "webiny/api/website-builder/nextjs"; +``` + +**Interface `NextjsConfig.Interface`:** + +```typescript +interface NextjsConfig.Interface { + execute(): Promise<IMarkdownContentBuilder>; +} +``` + +**Types:** + +```typescript +namespace NextjsConfig { + type Interface = INextjsConfig; + type Return = Promise<IMarkdownContentBuilder>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { NextjsConfig } from "webiny/api/website-builder/nextjs"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private nextjsConfig: NextjsConfig.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.nextjsConfig.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [NextjsConfig] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/api/website-builder/page.ai.txt b/docs/developer-docs/6.0.x/reference/api/website-builder/page.ai.txt new file mode 100644 index 000000000..05fd95675 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/website-builder/page.ai.txt @@ -0,0 +1,36 @@ +AI Context: Page (reference/api/website-builder/page.mdx) + +Source of Information: +1. packages/webiny/src/api/website-builder/page.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/pages/CreatePage/abstractions.ts — originating source +3. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/pages/CreatePageRevisionFrom/abstractions.ts — originating source +4. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/pages/DeletePage/abstractions.ts — originating source +5. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/pages/DuplicatePage/abstractions.ts — originating source +6. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/pages/GetPageById/abstractions.ts — originating source +7. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/pages/GetPageByPath/abstractions.ts — originating source +8. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/pages/GetPageRevisions/abstractions.ts — originating source +9. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/pages/ListPages/abstractions.ts — originating source +10. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/pages/MovePage/abstractions.ts — originating source +11. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/pages/PublishPage/abstractions.ts — originating source +12. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/pages/UnpublishPage/abstractions.ts — originating source +13. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/pages/UpdatePage/abstractions.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +CreatePageUseCase, PageAfterCreateHandler, PageBeforeCreateHandler, CreatePageRevisionFromUseCase, PageAfterCreateRevisionFromHandler, PageBeforeCreateRevisionFromHandler, DeletePageUseCase, PageAfterDeleteHandler, PageBeforeDeleteHandler, DuplicatePageUseCase, PageAfterDuplicateHandler, PageBeforeDuplicateHandler, GetPageByIdUseCase, GetPageByPathUseCase, GetPageRevisionsUseCase, ListPagesUseCase, MovePageUseCase, PageAfterMoveHandler, PageBeforeMoveHandler, PublishPageUseCase, PageAfterPublishHandler, PageBeforePublishHandler, UnpublishPageUseCase, PageAfterUnpublishHandler, PageBeforeUnpublishHandler, UpdatePageUseCase, PageAfterUpdateHandler, PageBeforeUpdateHandler + +Import Path: webiny/api/website-builder/page + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/website-builder/page.mdx b/docs/developer-docs/6.0.x/reference/api/website-builder/page.mdx new file mode 100644 index 000000000..1c259af55 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/website-builder/page.mdx @@ -0,0 +1,1493 @@ +--- +id: yxbpl3dl +title: Page +description: "Website Builder page use cases and event handlers" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What use cases are available in `webiny/api/website-builder/page`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/website-builder/page`. Import any of the items below directly from this path in your Webiny extensions. + +**Use Cases** + +<SymbolList + symbols={[ + { name: "CreatePageRevisionFromUseCase", anchor: "create-page-revision-from-use-case" }, + { name: "CreatePageUseCase", anchor: "create-page-use-case" }, + { name: "DeletePageUseCase", anchor: "delete-page-use-case" }, + { name: "DuplicatePageUseCase", anchor: "duplicate-page-use-case" }, + { name: "GetPageByIdUseCase", anchor: "get-page-by-id-use-case" }, + { name: "GetPageByPathUseCase", anchor: "get-page-by-path-use-case" }, + { name: "GetPageRevisionsUseCase", anchor: "get-page-revisions-use-case" }, + { name: "ListPagesUseCase", anchor: "list-pages-use-case" }, + { name: "MovePageUseCase", anchor: "move-page-use-case" }, + { name: "PublishPageUseCase", anchor: "publish-page-use-case" }, + { name: "UnpublishPageUseCase", anchor: "unpublish-page-use-case" }, + { name: "UpdatePageUseCase", anchor: "update-page-use-case" } + ]} +/> + +**Event Handlers** + +<SymbolList + symbols={[ + { name: "PageAfterCreateHandler", anchor: "page-after-create-handler" }, + { + name: "PageAfterCreateRevisionFromHandler", + anchor: "page-after-create-revision-from-handler" + }, + { name: "PageAfterDeleteHandler", anchor: "page-after-delete-handler" }, + { name: "PageAfterDuplicateHandler", anchor: "page-after-duplicate-handler" }, + { name: "PageAfterMoveHandler", anchor: "page-after-move-handler" }, + { name: "PageAfterPublishHandler", anchor: "page-after-publish-handler" }, + { name: "PageAfterUnpublishHandler", anchor: "page-after-unpublish-handler" }, + { name: "PageAfterUpdateHandler", anchor: "page-after-update-handler" }, + { name: "PageBeforeCreateHandler", anchor: "page-before-create-handler" }, + { + name: "PageBeforeCreateRevisionFromHandler", + anchor: "page-before-create-revision-from-handler" + }, + { name: "PageBeforeDeleteHandler", anchor: "page-before-delete-handler" }, + { name: "PageBeforeDuplicateHandler", anchor: "page-before-duplicate-handler" }, + { name: "PageBeforeMoveHandler", anchor: "page-before-move-handler" }, + { name: "PageBeforePublishHandler", anchor: "page-before-publish-handler" }, + { name: "PageBeforeUnpublishHandler", anchor: "page-before-unpublish-handler" }, + { name: "PageBeforeUpdateHandler", anchor: "page-before-update-handler" } + ]} +/> + +## Use Cases + +### `CreatePageRevisionFromUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { CreatePageRevisionFromUseCase } from "webiny/api/website-builder/page"; +``` + +**Interface `CreatePageRevisionFromUseCase.Interface`:** + +```typescript +interface CreatePageRevisionFromUseCase.Interface { + execute(params: ICreateWbPageRevisionFromParams): Promise<Result<WbPage, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace CreatePageRevisionFromUseCase { + type Interface = ICreatePageRevisionFromUseCase; + type Params = ICreateWbPageRevisionFromParams; + type Return = Promise<Result<WbPage, UseCaseError>>; + type Error = UseCaseError; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CreatePageRevisionFromUseCase } from "webiny/api/website-builder/page"; + +class MyImpl implements MyUseCase.Interface { + public constructor( + private createPageRevisionFromUseCase: CreatePageRevisionFromUseCase.Interface + ) {} + + public async execute(/* ... */): Promise<void> { + await this.createPageRevisionFromUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CreatePageRevisionFromUseCase] +}); +``` + +### `CreatePageUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { CreatePageUseCase } from "webiny/api/website-builder/page"; +``` + +**Interface `CreatePageUseCase.Interface`:** + +```typescript +interface CreatePageUseCase.Interface { + execute(data: ICreateWbPageParams): Promise<Result<WbPage, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace CreatePageUseCase { + type Interface = ICreatePageUseCase; + type Params = ICreateWbPageParams; + type Return = Promise<Result<WbPage, UseCaseError>>; + type Error = UseCaseError; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CreatePageUseCase } from "webiny/api/website-builder/page"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private createPageUseCase: CreatePageUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.createPageUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CreatePageUseCase] +}); +``` + +### `DeletePageUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { DeletePageUseCase } from "webiny/api/website-builder/page"; +``` + +**Interface `DeletePageUseCase.Interface`:** + +```typescript +interface DeletePageUseCase.Interface { + execute(params: IDeleteWbPageParams): Promise<Result<void, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace DeletePageUseCase { + type Interface = IDeletePageUseCase; + type Params = IDeleteWbPageParams; + type Return = Promise<Result<void, UseCaseError>>; + type Error = UseCaseError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { DeletePageUseCase } from "webiny/api/website-builder/page"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private deletePageUseCase: DeletePageUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.deletePageUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [DeletePageUseCase] +}); +``` + +### `DuplicatePageUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { DuplicatePageUseCase } from "webiny/api/website-builder/page"; +``` + +**Interface `DuplicatePageUseCase.Interface`:** + +```typescript +interface DuplicatePageUseCase.Interface { + execute(params: IDuplicateWbPageParams): Promise<Result<WbPage, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace DuplicatePageUseCase { + type Interface = IDuplicatePageUseCase; + type Params = IDuplicateWbPageParams; + type Return = Promise<Result<WbPage, UseCaseError>>; + type Error = UseCaseError; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { DuplicatePageUseCase } from "webiny/api/website-builder/page"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private duplicatePageUseCase: DuplicatePageUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.duplicatePageUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [DuplicatePageUseCase] +}); +``` + +### `GetPageByIdUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { GetPageByIdUseCase } from "webiny/api/website-builder/page"; +``` + +**Interface `GetPageByIdUseCase.Interface`:** + +```typescript +interface GetPageByIdUseCase.Interface { + execute(id: string): Promise<Result<WbPage, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetPageByIdUseCase { + type Interface = IGetPageByIdUseCase; + type Return = Promise<Result<WbPage, UseCaseError>>; + type Error = UseCaseError; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetPageByIdUseCase } from "webiny/api/website-builder/page"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getPageByIdUseCase: GetPageByIdUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getPageByIdUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetPageByIdUseCase] +}); +``` + +### `GetPageByPathUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { GetPageByPathUseCase } from "webiny/api/website-builder/page"; +``` + +**Interface `GetPageByPathUseCase.Interface`:** + +```typescript +interface GetPageByPathUseCase.Interface { + execute(path: string): Promise<Result<WbPage, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetPageByPathUseCase { + type Interface = IGetPageByPathUseCase; + type Error = UseCaseError; + type Return = Promise<Result<WbPage, UseCaseError>>; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetPageByPathUseCase } from "webiny/api/website-builder/page"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getPageByPathUseCase: GetPageByPathUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getPageByPathUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetPageByPathUseCase] +}); +``` + +### `GetPageRevisionsUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { GetPageRevisionsUseCase } from "webiny/api/website-builder/page"; +``` + +**Interface `GetPageRevisionsUseCase.Interface`:** + +```typescript +interface GetPageRevisionsUseCase.Interface { + execute(entryId: string): Promise<Result<WbPage[], UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetPageRevisionsUseCase { + type Interface = IGetPageRevisionsUseCase; + type Error = UseCaseError; + type Return = Promise<Result<WbPage[], UseCaseError>>; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetPageRevisionsUseCase } from "webiny/api/website-builder/page"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getPageRevisionsUseCase: GetPageRevisionsUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getPageRevisionsUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetPageRevisionsUseCase] +}); +``` + +### `ListPagesUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { ListPagesUseCase } from "webiny/api/website-builder/page"; +``` + +**Interface `ListPagesUseCase.Interface`:** + +```typescript +interface ListPagesUseCase.Interface { + execute(params: IListPagesParams): Promise<Result<IListPagesResult, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace ListPagesUseCase { + type Interface = IListPagesUseCase; + type Error = UseCaseError; + type Params = IListPagesParams; + type Return = Promise<Result<IListPagesResult, UseCaseError>>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ListPagesUseCase } from "webiny/api/website-builder/page"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private listPagesUseCase: ListPagesUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.listPagesUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ListPagesUseCase] +}); +``` + +### `MovePageUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { MovePageUseCase } from "webiny/api/website-builder/page"; +``` + +**Interface `MovePageUseCase.Interface`:** + +```typescript +interface MovePageUseCase.Interface { + execute(params: IMoveWbPageParams): Promise<Result<WbPage, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace MovePageUseCase { + type Interface = IMovePageUseCase; + type Params = IMoveWbPageParams; + type Return = Promise<Result<WbPage, UseCaseError>>; + type Error = UseCaseError; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { MovePageUseCase } from "webiny/api/website-builder/page"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private movePageUseCase: MovePageUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.movePageUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [MovePageUseCase] +}); +``` + +### `PublishPageUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { PublishPageUseCase } from "webiny/api/website-builder/page"; +``` + +**Interface `PublishPageUseCase.Interface`:** + +```typescript +interface PublishPageUseCase.Interface { + execute(params: IPublishWbPageParams): Promise<Result<WbPage, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace PublishPageUseCase { + type Interface = IPublishPageUseCase; + type Params = IPublishWbPageParams; + type Return = Promise<Result<WbPage, UseCaseError>>; + type Error = UseCaseError; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { PublishPageUseCase } from "webiny/api/website-builder/page"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private publishPageUseCase: PublishPageUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.publishPageUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [PublishPageUseCase] +}); +``` + +### `UnpublishPageUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { UnpublishPageUseCase } from "webiny/api/website-builder/page"; +``` + +**Interface `UnpublishPageUseCase.Interface`:** + +```typescript +interface UnpublishPageUseCase.Interface { + execute(params: IUnpublishWbPageParams): Promise<Result<WbPage, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace UnpublishPageUseCase { + type Interface = IUnpublishPageUseCase; + type Params = IUnpublishWbPageParams; + type Return = Promise<Result<WbPage, UseCaseError>>; + type Error = UseCaseError; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { UnpublishPageUseCase } from "webiny/api/website-builder/page"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private unpublishPageUseCase: UnpublishPageUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.unpublishPageUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [UnpublishPageUseCase] +}); +``` + +### `UpdatePageUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { UpdatePageUseCase } from "webiny/api/website-builder/page"; +``` + +**Interface `UpdatePageUseCase.Interface`:** + +```typescript +interface UpdatePageUseCase.Interface { + execute(id: string, data: IUpdateWbPageData): Promise<Result<WbPage, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace UpdatePageUseCase { + type Interface = IUpdatePageUseCase; + type UpdateData = IUpdateWbPageData; + type Return = Promise<Result<WbPage, UseCaseError>>; + type Error = UseCaseError; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { UpdatePageUseCase } from "webiny/api/website-builder/page"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private updatePageUseCase: UpdatePageUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.updatePageUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [UpdatePageUseCase] +}); +``` + +## Event Handlers + +### `PageAfterCreateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { PageAfterCreateHandler } from "webiny/api/website-builder/page"; +``` + +**Interface `PageAfterCreateHandler.Interface`:** + +```typescript +interface PageAfterCreateHandler.Interface { + handle(event: DomainEvent<PageAfterCreatePayload>): Promise<void>; +} +``` + +**Event payload `PageAfterCreatePayload`:** + +```typescript +interface PageAfterCreatePayload { + page: WbPage; +} +``` + +**Types:** + +```typescript +namespace PageAfterCreateHandler { + type Interface = IEventHandler<DomainEvent<PageAfterCreatePayload>>; + type Event = DomainEvent<PageAfterCreatePayload>; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { PageAfterCreateHandler } from "webiny/api/website-builder/page"; + +class MyHandler implements PageAfterCreateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: PageAfterCreateHandler.Event): Promise<void> { + const { page } = event.payload; + } +} + +export default PageAfterCreateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `PageAfterCreateRevisionFromHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { PageAfterCreateRevisionFromHandler } from "webiny/api/website-builder/page"; +``` + +**Interface `PageAfterCreateRevisionFromHandler.Interface`:** + +```typescript +interface PageAfterCreateRevisionFromHandler.Interface { + handle(event: DomainEvent<PageAfterCreateRevisionFromPayload>): Promise<void>; +} +``` + +**Event payload `PageAfterCreateRevisionFromPayload`:** + +```typescript +interface PageAfterCreateRevisionFromPayload { + page: WbPage; +} +``` + +**Types:** + +```typescript +namespace PageAfterCreateRevisionFromHandler { + type Interface = IEventHandler<DomainEvent<PageAfterCreateRevisionFromPayload>>; + type Event = DomainEvent<PageAfterCreateRevisionFromPayload>; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { PageAfterCreateRevisionFromHandler } from "webiny/api/website-builder/page"; + +class MyHandler implements PageAfterCreateRevisionFromHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: PageAfterCreateRevisionFromHandler.Event): Promise<void> { + const { page } = event.payload; + } +} + +export default PageAfterCreateRevisionFromHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `PageAfterDeleteHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { PageAfterDeleteHandler } from "webiny/api/website-builder/page"; +``` + +**Interface `PageAfterDeleteHandler.Interface`:** + +```typescript +interface PageAfterDeleteHandler.Interface { + handle(event: DomainEvent<PageAfterDeletePayload>): Promise<void>; +} +``` + +**Event payload `PageAfterDeletePayload`:** + +```typescript +interface PageAfterDeletePayload { + page: WbPage; +} +``` + +**Types:** + +```typescript +namespace PageAfterDeleteHandler { + type Interface = IEventHandler<DomainEvent<PageAfterDeletePayload>>; + type Event = DomainEvent<PageAfterDeletePayload>; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { PageAfterDeleteHandler } from "webiny/api/website-builder/page"; + +class MyHandler implements PageAfterDeleteHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: PageAfterDeleteHandler.Event): Promise<void> { + const { page } = event.payload; + } +} + +export default PageAfterDeleteHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `PageAfterDuplicateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { PageAfterDuplicateHandler } from "webiny/api/website-builder/page"; +``` + +**Interface `PageAfterDuplicateHandler.Interface`:** + +```typescript +interface PageAfterDuplicateHandler.Interface { + handle(event: DomainEvent<PageAfterDuplicatePayload>): Promise<void>; +} +``` + +**Event payload `PageAfterDuplicatePayload`:** + +```typescript +interface PageAfterDuplicatePayload { + original: WbPage; + page: WbPage; +} +``` + +**Types:** + +```typescript +namespace PageAfterDuplicateHandler { + type Interface = IEventHandler<DomainEvent<PageAfterDuplicatePayload>>; + type Event = DomainEvent<PageAfterDuplicatePayload>; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { PageAfterDuplicateHandler } from "webiny/api/website-builder/page"; + +class MyHandler implements PageAfterDuplicateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: PageAfterDuplicateHandler.Event): Promise<void> { + const { original, page } = event.payload; + } +} + +export default PageAfterDuplicateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `PageAfterMoveHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { PageAfterMoveHandler } from "webiny/api/website-builder/page"; +``` + +**Interface `PageAfterMoveHandler.Interface`:** + +```typescript +interface PageAfterMoveHandler.Interface { + handle(event: DomainEvent<PageAfterMovePayload>): Promise<void>; +} +``` + +**Event payload `PageAfterMovePayload`:** + +```typescript +interface PageAfterMovePayload { + original: WbPage; + input: IMoveWbPageParams; + page: WbPage; +} +``` + +**Types:** + +```typescript +namespace PageAfterMoveHandler { + type Interface = IEventHandler<DomainEvent<PageAfterMovePayload>>; + type Event = DomainEvent<PageAfterMovePayload>; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { PageAfterMoveHandler } from "webiny/api/website-builder/page"; + +class MyHandler implements PageAfterMoveHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: PageAfterMoveHandler.Event): Promise<void> { + const { original, input, page } = event.payload; + } +} + +export default PageAfterMoveHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `PageAfterPublishHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { PageAfterPublishHandler } from "webiny/api/website-builder/page"; +``` + +**Interface `PageAfterPublishHandler.Interface`:** + +```typescript +interface PageAfterPublishHandler.Interface { + handle(event: DomainEvent<PageAfterPublishPayload>): Promise<void>; +} +``` + +**Event payload `PageAfterPublishPayload`:** + +```typescript +interface PageAfterPublishPayload { + page: WbPage; +} +``` + +**Types:** + +```typescript +namespace PageAfterPublishHandler { + type Interface = IEventHandler<DomainEvent<PageAfterPublishPayload>>; + type Event = DomainEvent<PageAfterPublishPayload>; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { PageAfterPublishHandler } from "webiny/api/website-builder/page"; + +class MyHandler implements PageAfterPublishHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: PageAfterPublishHandler.Event): Promise<void> { + const { page } = event.payload; + } +} + +export default PageAfterPublishHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `PageAfterUnpublishHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { PageAfterUnpublishHandler } from "webiny/api/website-builder/page"; +``` + +**Interface `PageAfterUnpublishHandler.Interface`:** + +```typescript +interface PageAfterUnpublishHandler.Interface { + handle(event: DomainEvent<PageAfterUnpublishPayload>): Promise<void>; +} +``` + +**Event payload `PageAfterUnpublishPayload`:** + +```typescript +interface PageAfterUnpublishPayload { + page: WbPage; +} +``` + +**Types:** + +```typescript +namespace PageAfterUnpublishHandler { + type Interface = IEventHandler<DomainEvent<PageAfterUnpublishPayload>>; + type Event = DomainEvent<PageAfterUnpublishPayload>; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { PageAfterUnpublishHandler } from "webiny/api/website-builder/page"; + +class MyHandler implements PageAfterUnpublishHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: PageAfterUnpublishHandler.Event): Promise<void> { + const { page } = event.payload; + } +} + +export default PageAfterUnpublishHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `PageAfterUpdateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { PageAfterUpdateHandler } from "webiny/api/website-builder/page"; +``` + +**Interface `PageAfterUpdateHandler.Interface`:** + +```typescript +interface PageAfterUpdateHandler.Interface { + handle(event: DomainEvent<PageAfterUpdatePayload>): Promise<void>; +} +``` + +**Event payload `PageAfterUpdatePayload`:** + +```typescript +interface PageAfterUpdatePayload { + original: WbPage; + input: { + id: string; + data: IUpdateWbPageData; + }; + page: WbPage; +} +``` + +**Types:** + +```typescript +namespace PageAfterUpdateHandler { + type Interface = IEventHandler<DomainEvent<PageAfterUpdatePayload>>; + type Event = DomainEvent<PageAfterUpdatePayload>; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { PageAfterUpdateHandler } from "webiny/api/website-builder/page"; + +class MyHandler implements PageAfterUpdateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: PageAfterUpdateHandler.Event): Promise<void> { + const { original, input, page } = event.payload; + } +} + +export default PageAfterUpdateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `PageBeforeCreateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { PageBeforeCreateHandler } from "webiny/api/website-builder/page"; +``` + +**Interface `PageBeforeCreateHandler.Interface`:** + +```typescript +interface PageBeforeCreateHandler.Interface { + handle(event: DomainEvent<PageBeforeCreatePayload>): Promise<void>; +} +``` + +**Event payload `PageBeforeCreatePayload`:** + +```typescript +interface PageBeforeCreatePayload { + input: ICreateWbPageParams; +} +``` + +**Types:** + +```typescript +namespace PageBeforeCreateHandler { + type Interface = IEventHandler<DomainEvent<PageBeforeCreatePayload>>; + type Event = DomainEvent<PageBeforeCreatePayload>; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { PageBeforeCreateHandler } from "webiny/api/website-builder/page"; + +class MyHandler implements PageBeforeCreateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: PageBeforeCreateHandler.Event): Promise<void> { + const { input } = event.payload; + } +} + +export default PageBeforeCreateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `PageBeforeCreateRevisionFromHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { PageBeforeCreateRevisionFromHandler } from "webiny/api/website-builder/page"; +``` + +**Interface `PageBeforeCreateRevisionFromHandler.Interface`:** + +```typescript +interface PageBeforeCreateRevisionFromHandler.Interface { + handle(event: DomainEvent<PageBeforeCreateRevisionFromPayload>): Promise<void>; +} +``` + +**Event payload `PageBeforeCreateRevisionFromPayload`:** + +```typescript +interface PageBeforeCreateRevisionFromPayload { + params: ICreateWbPageRevisionFromParams; +} +``` + +**Types:** + +```typescript +namespace PageBeforeCreateRevisionFromHandler { + type Interface = IEventHandler<DomainEvent<PageBeforeCreateRevisionFromPayload>>; + type Event = DomainEvent<PageBeforeCreateRevisionFromPayload>; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { PageBeforeCreateRevisionFromHandler } from "webiny/api/website-builder/page"; + +class MyHandler implements PageBeforeCreateRevisionFromHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: PageBeforeCreateRevisionFromHandler.Event): Promise<void> { + const { params } = event.payload; + } +} + +export default PageBeforeCreateRevisionFromHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `PageBeforeDeleteHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { PageBeforeDeleteHandler } from "webiny/api/website-builder/page"; +``` + +**Interface `PageBeforeDeleteHandler.Interface`:** + +```typescript +interface PageBeforeDeleteHandler.Interface { + handle(event: DomainEvent<PageBeforeDeletePayload>): Promise<void>; +} +``` + +**Event payload `PageBeforeDeletePayload`:** + +```typescript +interface PageBeforeDeletePayload { + page: WbPage; +} +``` + +**Types:** + +```typescript +namespace PageBeforeDeleteHandler { + type Interface = IEventHandler<DomainEvent<PageBeforeDeletePayload>>; + type Event = DomainEvent<PageBeforeDeletePayload>; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { PageBeforeDeleteHandler } from "webiny/api/website-builder/page"; + +class MyHandler implements PageBeforeDeleteHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: PageBeforeDeleteHandler.Event): Promise<void> { + const { page } = event.payload; + } +} + +export default PageBeforeDeleteHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `PageBeforeDuplicateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { PageBeforeDuplicateHandler } from "webiny/api/website-builder/page"; +``` + +**Interface `PageBeforeDuplicateHandler.Interface`:** + +```typescript +interface PageBeforeDuplicateHandler.Interface { + handle(event: DomainEvent<PageBeforeDuplicatePayload>): Promise<void>; +} +``` + +**Event payload `PageBeforeDuplicatePayload`:** + +```typescript +interface PageBeforeDuplicatePayload { + original: WbPage; +} +``` + +**Types:** + +```typescript +namespace PageBeforeDuplicateHandler { + type Interface = IEventHandler<DomainEvent<PageBeforeDuplicatePayload>>; + type Event = DomainEvent<PageBeforeDuplicatePayload>; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { PageBeforeDuplicateHandler } from "webiny/api/website-builder/page"; + +class MyHandler implements PageBeforeDuplicateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: PageBeforeDuplicateHandler.Event): Promise<void> { + const { original } = event.payload; + } +} + +export default PageBeforeDuplicateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `PageBeforeMoveHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { PageBeforeMoveHandler } from "webiny/api/website-builder/page"; +``` + +**Interface `PageBeforeMoveHandler.Interface`:** + +```typescript +interface PageBeforeMoveHandler.Interface { + handle(event: DomainEvent<PageBeforeMovePayload>): Promise<void>; +} +``` + +**Event payload `PageBeforeMovePayload`:** + +```typescript +interface PageBeforeMovePayload { + original: WbPage; + input: IMoveWbPageParams; +} +``` + +**Types:** + +```typescript +namespace PageBeforeMoveHandler { + type Interface = IEventHandler<DomainEvent<PageBeforeMovePayload>>; + type Event = DomainEvent<PageBeforeMovePayload>; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { PageBeforeMoveHandler } from "webiny/api/website-builder/page"; + +class MyHandler implements PageBeforeMoveHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: PageBeforeMoveHandler.Event): Promise<void> { + const { original, input } = event.payload; + } +} + +export default PageBeforeMoveHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `PageBeforePublishHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { PageBeforePublishHandler } from "webiny/api/website-builder/page"; +``` + +**Interface `PageBeforePublishHandler.Interface`:** + +```typescript +interface PageBeforePublishHandler.Interface { + handle(event: DomainEvent<PageBeforePublishPayload>): Promise<void>; +} +``` + +**Event payload `PageBeforePublishPayload`:** + +```typescript +interface PageBeforePublishPayload { + page: WbPage; +} +``` + +**Types:** + +```typescript +namespace PageBeforePublishHandler { + type Interface = IEventHandler<DomainEvent<PageBeforePublishPayload>>; + type Event = DomainEvent<PageBeforePublishPayload>; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { PageBeforePublishHandler } from "webiny/api/website-builder/page"; + +class MyHandler implements PageBeforePublishHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: PageBeforePublishHandler.Event): Promise<void> { + const { page } = event.payload; + } +} + +export default PageBeforePublishHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `PageBeforeUnpublishHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { PageBeforeUnpublishHandler } from "webiny/api/website-builder/page"; +``` + +**Interface `PageBeforeUnpublishHandler.Interface`:** + +```typescript +interface PageBeforeUnpublishHandler.Interface { + handle(event: DomainEvent<PageBeforeUnpublishPayload>): Promise<void>; +} +``` + +**Event payload `PageBeforeUnpublishPayload`:** + +```typescript +interface PageBeforeUnpublishPayload { + page: WbPage; +} +``` + +**Types:** + +```typescript +namespace PageBeforeUnpublishHandler { + type Interface = IEventHandler<DomainEvent<PageBeforeUnpublishPayload>>; + type Event = DomainEvent<PageBeforeUnpublishPayload>; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { PageBeforeUnpublishHandler } from "webiny/api/website-builder/page"; + +class MyHandler implements PageBeforeUnpublishHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: PageBeforeUnpublishHandler.Event): Promise<void> { + const { page } = event.payload; + } +} + +export default PageBeforeUnpublishHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `PageBeforeUpdateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/page` + +```typescript +import { PageBeforeUpdateHandler } from "webiny/api/website-builder/page"; +``` + +**Interface `PageBeforeUpdateHandler.Interface`:** + +```typescript +interface PageBeforeUpdateHandler.Interface { + handle(event: DomainEvent<PageBeforeUpdatePayload>): Promise<void>; +} +``` + +**Event payload `PageBeforeUpdatePayload`:** + +```typescript +interface PageBeforeUpdatePayload { + original: WbPage; + input: { + id: string; + data: IUpdateWbPageData; + }; +} +``` + +**Types:** + +```typescript +namespace PageBeforeUpdateHandler { + type Interface = IEventHandler<DomainEvent<PageBeforeUpdatePayload>>; + type Event = DomainEvent<PageBeforeUpdatePayload>; + type Page = WbPage; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { PageBeforeUpdateHandler } from "webiny/api/website-builder/page"; + +class MyHandler implements PageBeforeUpdateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: PageBeforeUpdateHandler.Event): Promise<void> { + const { original, input } = event.payload; + } +} + +export default PageBeforeUpdateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/api/website-builder/redirect.ai.txt b/docs/developer-docs/6.0.x/reference/api/website-builder/redirect.ai.txt new file mode 100644 index 000000000..15445aa98 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/website-builder/redirect.ai.txt @@ -0,0 +1,32 @@ +AI Context: Redirect (reference/api/website-builder/redirect.mdx) + +Source of Information: +1. packages/webiny/src/api/website-builder/redirect.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/redirects/CreateRedirect/abstractions.ts — originating source +3. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/redirects/DeleteRedirect/abstractions.ts — originating source +4. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/redirects/GetActiveRedirects/abstractions.ts — originating source +5. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/redirects/GetRedirectById/abstractions.ts — originating source +6. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/redirects/InvalidateRedirectsCache/abstractions.ts — originating source +7. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/redirects/ListRedirects/abstractions.ts — originating source +8. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/redirects/MoveRedirect/abstractions.ts — originating source +9. /Users/adrian/dev/wby-next/packages/api-website-builder/src/features/redirects/UpdateRedirect/abstractions.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +CreateRedirectUseCase, RedirectAfterCreateHandler, RedirectBeforeCreateHandler, DeleteRedirectUseCase, RedirectAfterDeleteHandler, RedirectBeforeDeleteHandler, GetActiveRedirectsUseCase, GetRedirectByIdUseCase, InvalidateRedirectsCacheUseCase, ListRedirectsUseCase, MoveRedirectUseCase, RedirectAfterMoveHandler, RedirectBeforeMoveHandler, UpdateRedirectUseCase, RedirectAfterUpdateHandler, RedirectBeforeUpdateHandler + +Import Path: webiny/api/website-builder/redirect + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/api/website-builder/redirect.mdx b/docs/developer-docs/6.0.x/reference/api/website-builder/redirect.mdx new file mode 100644 index 000000000..84b73d063 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/api/website-builder/redirect.mdx @@ -0,0 +1,862 @@ +--- +id: yxbpl3dl +title: Redirect +description: "Website Builder redirect use cases and event handlers" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What use cases are available in `webiny/api/website-builder/redirect`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/api/website-builder/redirect`. Import any of the items below directly from this path in your Webiny extensions. + +**Use Cases** + +<SymbolList + symbols={[ + { name: "CreateRedirectUseCase", anchor: "create-redirect-use-case" }, + { name: "DeleteRedirectUseCase", anchor: "delete-redirect-use-case" }, + { name: "GetActiveRedirectsUseCase", anchor: "get-active-redirects-use-case" }, + { name: "GetRedirectByIdUseCase", anchor: "get-redirect-by-id-use-case" }, + { name: "InvalidateRedirectsCacheUseCase", anchor: "invalidate-redirects-cache-use-case" }, + { name: "ListRedirectsUseCase", anchor: "list-redirects-use-case" }, + { name: "MoveRedirectUseCase", anchor: "move-redirect-use-case" }, + { name: "UpdateRedirectUseCase", anchor: "update-redirect-use-case" } + ]} +/> + +**Event Handlers** + +<SymbolList + symbols={[ + { name: "RedirectAfterCreateHandler", anchor: "redirect-after-create-handler" }, + { name: "RedirectAfterDeleteHandler", anchor: "redirect-after-delete-handler" }, + { name: "RedirectAfterMoveHandler", anchor: "redirect-after-move-handler" }, + { name: "RedirectAfterUpdateHandler", anchor: "redirect-after-update-handler" }, + { name: "RedirectBeforeCreateHandler", anchor: "redirect-before-create-handler" }, + { name: "RedirectBeforeDeleteHandler", anchor: "redirect-before-delete-handler" }, + { name: "RedirectBeforeMoveHandler", anchor: "redirect-before-move-handler" }, + { name: "RedirectBeforeUpdateHandler", anchor: "redirect-before-update-handler" } + ]} +/> + +## Use Cases + +### `CreateRedirectUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/redirect` + +```typescript +import { CreateRedirectUseCase } from "webiny/api/website-builder/redirect"; +``` + +**Interface `CreateRedirectUseCase.Interface`:** + +```typescript +interface CreateRedirectUseCase.Interface { + execute(data: ICreateWbRedirectData): Promise<Result<WbRedirect, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace CreateRedirectUseCase { + type Interface = ICreateRedirectUseCase; + type Params = ICreateWbRedirectData; + type Return = Promise<Result<WbRedirect, UseCaseError>>; + type Error = UseCaseError; + type Redirect = WbRedirect; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CreateRedirectUseCase } from "webiny/api/website-builder/redirect"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private createRedirectUseCase: CreateRedirectUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.createRedirectUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CreateRedirectUseCase] +}); +``` + +### `DeleteRedirectUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/redirect` + +```typescript +import { DeleteRedirectUseCase } from "webiny/api/website-builder/redirect"; +``` + +**Interface `DeleteRedirectUseCase.Interface`:** + +```typescript +interface DeleteRedirectUseCase.Interface { + execute(params: IDeleteWbRedirectParams): Promise<Result<void, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace DeleteRedirectUseCase { + type Interface = IDeleteRedirectUseCase; + type Params = IDeleteWbRedirectParams; + type Return = Promise<Result<void, UseCaseError>>; + type Error = UseCaseError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { DeleteRedirectUseCase } from "webiny/api/website-builder/redirect"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private deleteRedirectUseCase: DeleteRedirectUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.deleteRedirectUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [DeleteRedirectUseCase] +}); +``` + +### `GetActiveRedirectsUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/redirect` + +```typescript +import { GetActiveRedirectsUseCase } from "webiny/api/website-builder/redirect"; +``` + +**Interface `GetActiveRedirectsUseCase.Interface`:** + +```typescript +interface GetActiveRedirectsUseCase.Interface { + execute(): Promise<Result<WbRedirect[], UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetActiveRedirectsUseCase { + type Interface = IGetActiveRedirectsUseCase; + type Return = Promise<Result<WbRedirect[], UseCaseError>>; + type Error = UseCaseError; + type Redirect = WbRedirect; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetActiveRedirectsUseCase } from "webiny/api/website-builder/redirect"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getActiveRedirectsUseCase: GetActiveRedirectsUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getActiveRedirectsUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetActiveRedirectsUseCase] +}); +``` + +### `GetRedirectByIdUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/redirect` + +```typescript +import { GetRedirectByIdUseCase } from "webiny/api/website-builder/redirect"; +``` + +**Interface `GetRedirectByIdUseCase.Interface`:** + +```typescript +interface GetRedirectByIdUseCase.Interface { + execute(id: string): Promise<Result<WbRedirect, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace GetRedirectByIdUseCase { + type Interface = IGetRedirectByIdUseCase; + type Return = Promise<Result<WbRedirect, UseCaseError>>; + type Error = UseCaseError; + type Redirect = WbRedirect; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetRedirectByIdUseCase } from "webiny/api/website-builder/redirect"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getRedirectByIdUseCase: GetRedirectByIdUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getRedirectByIdUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetRedirectByIdUseCase] +}); +``` + +### `InvalidateRedirectsCacheUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/redirect` + +```typescript +import { InvalidateRedirectsCacheUseCase } from "webiny/api/website-builder/redirect"; +``` + +**Interface `InvalidateRedirectsCacheUseCase.Interface`:** + +```typescript +interface InvalidateRedirectsCacheUseCase.Interface { + execute(): Promise<Result<void, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace InvalidateRedirectsCacheUseCase { + type Interface = IInvalidateRedirectsCacheUseCase; + type Return = Promise<Result<void, UseCaseError>>; + type Error = UseCaseError; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { InvalidateRedirectsCacheUseCase } from "webiny/api/website-builder/redirect"; + +class MyImpl implements MyUseCase.Interface { + public constructor( + private invalidateRedirectsCacheUseCase: InvalidateRedirectsCacheUseCase.Interface + ) {} + + public async execute(/* ... */): Promise<void> { + await this.invalidateRedirectsCacheUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [InvalidateRedirectsCacheUseCase] +}); +``` + +### `ListRedirectsUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/redirect` + +```typescript +import { ListRedirectsUseCase } from "webiny/api/website-builder/redirect"; +``` + +**Interface `ListRedirectsUseCase.Interface`:** + +```typescript +interface ListRedirectsUseCase.Interface { + execute(params: ListWbRedirectsParams): Promise<Result<ListRedirectsResult, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace ListRedirectsUseCase { + type Interface = IListRedirectsUseCase; + type Params = ListWbRedirectsParams; + type Return = Promise<Result<ListRedirectsResult, UseCaseError>>; + type Error = UseCaseError; + type Redirect = WbRedirect; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ListRedirectsUseCase } from "webiny/api/website-builder/redirect"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private listRedirectsUseCase: ListRedirectsUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.listRedirectsUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ListRedirectsUseCase] +}); +``` + +### `MoveRedirectUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/redirect` + +```typescript +import { MoveRedirectUseCase } from "webiny/api/website-builder/redirect"; +``` + +**Interface `MoveRedirectUseCase.Interface`:** + +```typescript +interface MoveRedirectUseCase.Interface { + execute(params: IMoveWbRedirectParams): Promise<Result<WbRedirect, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace MoveRedirectUseCase { + type Interface = IMoveRedirectUseCase; + type Params = IMoveWbRedirectParams; + type Return = Promise<Result<WbRedirect, UseCaseError>>; + type Error = UseCaseError; + type Redirect = WbRedirect; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { MoveRedirectUseCase } from "webiny/api/website-builder/redirect"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private moveRedirectUseCase: MoveRedirectUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.moveRedirectUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [MoveRedirectUseCase] +}); +``` + +### `UpdateRedirectUseCase` + +**Use Case Abstraction** — imported from `webiny/api/website-builder/redirect` + +```typescript +import { UpdateRedirectUseCase } from "webiny/api/website-builder/redirect"; +``` + +**Interface `UpdateRedirectUseCase.Interface`:** + +```typescript +interface UpdateRedirectUseCase.Interface { + execute(id: string, data: IUpdateWbRedirectData): Promise<Result<WbRedirect, UseCaseError>>; +} +``` + +**Types:** + +```typescript +namespace UpdateRedirectUseCase { + type Interface = IUpdateRedirectUseCase; + type UpdateData = IUpdateWbRedirectData; + type Return = Promise<Result<WbRedirect, UseCaseError>>; + type Error = UseCaseError; + type Redirect = WbRedirect; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { UpdateRedirectUseCase } from "webiny/api/website-builder/redirect"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private updateRedirectUseCase: UpdateRedirectUseCase.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.updateRedirectUseCase.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [UpdateRedirectUseCase] +}); +``` + +## Event Handlers + +### `RedirectAfterCreateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/redirect` + +```typescript +import { RedirectAfterCreateHandler } from "webiny/api/website-builder/redirect"; +``` + +**Interface `RedirectAfterCreateHandler.Interface`:** + +```typescript +interface RedirectAfterCreateHandler.Interface { + handle(event: DomainEvent<RedirectAfterCreatePayload>): Promise<void>; +} +``` + +**Event payload `RedirectAfterCreatePayload`:** + +```typescript +interface RedirectAfterCreatePayload { + redirect: WbRedirect; +} +``` + +**Types:** + +```typescript +namespace RedirectAfterCreateHandler { + type Interface = IEventHandler<DomainEvent<RedirectAfterCreatePayload>>; + type Event = DomainEvent<RedirectAfterCreatePayload>; + type Redirect = WbRedirect; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { RedirectAfterCreateHandler } from "webiny/api/website-builder/redirect"; + +class MyHandler implements RedirectAfterCreateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: RedirectAfterCreateHandler.Event): Promise<void> { + const { redirect } = event.payload; + } +} + +export default RedirectAfterCreateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `RedirectAfterDeleteHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/redirect` + +```typescript +import { RedirectAfterDeleteHandler } from "webiny/api/website-builder/redirect"; +``` + +**Interface `RedirectAfterDeleteHandler.Interface`:** + +```typescript +interface RedirectAfterDeleteHandler.Interface { + handle(event: DomainEvent<RedirectAfterDeletePayload>): Promise<void>; +} +``` + +**Event payload `RedirectAfterDeletePayload`:** + +```typescript +interface RedirectAfterDeletePayload { + redirect: WbRedirect; +} +``` + +**Types:** + +```typescript +namespace RedirectAfterDeleteHandler { + type Interface = IEventHandler<DomainEvent<RedirectAfterDeletePayload>>; + type Event = DomainEvent<RedirectAfterDeletePayload>; + type Redirect = WbRedirect; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { RedirectAfterDeleteHandler } from "webiny/api/website-builder/redirect"; + +class MyHandler implements RedirectAfterDeleteHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: RedirectAfterDeleteHandler.Event): Promise<void> { + const { redirect } = event.payload; + } +} + +export default RedirectAfterDeleteHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `RedirectAfterMoveHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/redirect` + +```typescript +import { RedirectAfterMoveHandler } from "webiny/api/website-builder/redirect"; +``` + +**Interface `RedirectAfterMoveHandler.Interface`:** + +```typescript +interface RedirectAfterMoveHandler.Interface { + handle(event: DomainEvent<RedirectAfterMovePayload>): Promise<void>; +} +``` + +**Event payload `RedirectAfterMovePayload`:** + +```typescript +interface RedirectAfterMovePayload { + original: WbRedirect; + input: IMoveWbRedirectParams; + redirect: WbRedirect; +} +``` + +**Types:** + +```typescript +namespace RedirectAfterMoveHandler { + type Interface = IEventHandler<DomainEvent<RedirectAfterMovePayload>>; + type Event = DomainEvent<RedirectAfterMovePayload>; + type Redirect = WbRedirect; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { RedirectAfterMoveHandler } from "webiny/api/website-builder/redirect"; + +class MyHandler implements RedirectAfterMoveHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: RedirectAfterMoveHandler.Event): Promise<void> { + const { original, input, redirect } = event.payload; + } +} + +export default RedirectAfterMoveHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `RedirectAfterUpdateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/redirect` + +```typescript +import { RedirectAfterUpdateHandler } from "webiny/api/website-builder/redirect"; +``` + +**Interface `RedirectAfterUpdateHandler.Interface`:** + +```typescript +interface RedirectAfterUpdateHandler.Interface { + handle(event: DomainEvent<RedirectAfterUpdatePayload>): Promise<void>; +} +``` + +**Event payload `RedirectAfterUpdatePayload`:** + +```typescript +interface RedirectAfterUpdatePayload { + original: WbRedirect; + input: { + id: string; + data: IUpdateWbRedirectData; + }; + redirect: WbRedirect; +} +``` + +**Types:** + +```typescript +namespace RedirectAfterUpdateHandler { + type Interface = IEventHandler<DomainEvent<RedirectAfterUpdatePayload>>; + type Event = DomainEvent<RedirectAfterUpdatePayload>; + type Redirect = WbRedirect; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { RedirectAfterUpdateHandler } from "webiny/api/website-builder/redirect"; + +class MyHandler implements RedirectAfterUpdateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: RedirectAfterUpdateHandler.Event): Promise<void> { + const { original, input, redirect } = event.payload; + } +} + +export default RedirectAfterUpdateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `RedirectBeforeCreateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/redirect` + +```typescript +import { RedirectBeforeCreateHandler } from "webiny/api/website-builder/redirect"; +``` + +**Interface `RedirectBeforeCreateHandler.Interface`:** + +```typescript +interface RedirectBeforeCreateHandler.Interface { + handle(event: DomainEvent<RedirectBeforeCreatePayload>): Promise<void>; +} +``` + +**Event payload `RedirectBeforeCreatePayload`:** + +```typescript +interface RedirectBeforeCreatePayload { + input: ICreateWbRedirectData; +} +``` + +**Types:** + +```typescript +namespace RedirectBeforeCreateHandler { + type Interface = IEventHandler<DomainEvent<RedirectBeforeCreatePayload>>; + type Event = DomainEvent<RedirectBeforeCreatePayload>; + type Redirect = WbRedirect; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { RedirectBeforeCreateHandler } from "webiny/api/website-builder/redirect"; + +class MyHandler implements RedirectBeforeCreateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: RedirectBeforeCreateHandler.Event): Promise<void> { + const { input } = event.payload; + } +} + +export default RedirectBeforeCreateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `RedirectBeforeDeleteHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/redirect` + +```typescript +import { RedirectBeforeDeleteHandler } from "webiny/api/website-builder/redirect"; +``` + +**Interface `RedirectBeforeDeleteHandler.Interface`:** + +```typescript +interface RedirectBeforeDeleteHandler.Interface { + handle(event: DomainEvent<RedirectBeforeDeletePayload>): Promise<void>; +} +``` + +**Event payload `RedirectBeforeDeletePayload`:** + +```typescript +interface RedirectBeforeDeletePayload { + redirect: WbRedirect; +} +``` + +**Types:** + +```typescript +namespace RedirectBeforeDeleteHandler { + type Interface = IEventHandler<DomainEvent<RedirectBeforeDeletePayload>>; + type Event = DomainEvent<RedirectBeforeDeletePayload>; + type Redirect = WbRedirect; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { RedirectBeforeDeleteHandler } from "webiny/api/website-builder/redirect"; + +class MyHandler implements RedirectBeforeDeleteHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: RedirectBeforeDeleteHandler.Event): Promise<void> { + const { redirect } = event.payload; + } +} + +export default RedirectBeforeDeleteHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `RedirectBeforeMoveHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/redirect` + +```typescript +import { RedirectBeforeMoveHandler } from "webiny/api/website-builder/redirect"; +``` + +**Interface `RedirectBeforeMoveHandler.Interface`:** + +```typescript +interface RedirectBeforeMoveHandler.Interface { + handle(event: DomainEvent<RedirectBeforeMovePayload>): Promise<void>; +} +``` + +**Event payload `RedirectBeforeMovePayload`:** + +```typescript +interface RedirectBeforeMovePayload { + original: WbRedirect; + input: IMoveWbRedirectParams; +} +``` + +**Types:** + +```typescript +namespace RedirectBeforeMoveHandler { + type Interface = IEventHandler<DomainEvent<RedirectBeforeMovePayload>>; + type Event = DomainEvent<RedirectBeforeMovePayload>; + type Redirect = WbRedirect; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { RedirectBeforeMoveHandler } from "webiny/api/website-builder/redirect"; + +class MyHandler implements RedirectBeforeMoveHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: RedirectBeforeMoveHandler.Event): Promise<void> { + const { original, input } = event.payload; + } +} + +export default RedirectBeforeMoveHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` + +### `RedirectBeforeUpdateHandler` + +**Event Handler Abstraction** — imported from `webiny/api/website-builder/redirect` + +```typescript +import { RedirectBeforeUpdateHandler } from "webiny/api/website-builder/redirect"; +``` + +**Interface `RedirectBeforeUpdateHandler.Interface`:** + +```typescript +interface RedirectBeforeUpdateHandler.Interface { + handle(event: DomainEvent<RedirectBeforeUpdatePayload>): Promise<void>; +} +``` + +**Event payload `RedirectBeforeUpdatePayload`:** + +```typescript +interface RedirectBeforeUpdatePayload { + original: WbRedirect; + input: { + id: string; + data: IUpdateWbRedirectData; + }; +} +``` + +**Types:** + +```typescript +namespace RedirectBeforeUpdateHandler { + type Interface = IEventHandler<DomainEvent<RedirectBeforeUpdatePayload>>; + type Event = DomainEvent<RedirectBeforeUpdatePayload>; + type Redirect = WbRedirect; +} +``` + +**Usage:** + +```typescript extensions/MyHandler.ts +import { RedirectBeforeUpdateHandler } from "webiny/api/website-builder/redirect"; + +class MyHandler implements RedirectBeforeUpdateHandler.Interface { + public constructor(/* inject dependencies here */) {} + + public async handle(event: RedirectBeforeUpdateHandler.Event): Promise<void> { + const { original, input } = event.payload; + } +} + +export default RedirectBeforeUpdateHandler.createImplementation({ + implementation: MyHandler, + dependencies: [] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/cli/command.ai.txt b/docs/developer-docs/6.0.x/reference/cli/command.ai.txt new file mode 100644 index 000000000..cc682c3a9 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/cli/command.ai.txt @@ -0,0 +1,25 @@ +AI Context: Command (reference/cli/command.mdx) + +Source of Information: +1. packages/webiny/src/cli/command.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/cli-core/src/abstractions/features/CliCommand.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +CliCommandFactory + +Import Path: webiny/cli/command + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/cli/command.mdx b/docs/developer-docs/6.0.x/reference/cli/command.mdx new file mode 100644 index 000000000..111b264e2 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/cli/command.mdx @@ -0,0 +1,57 @@ +--- +id: y2xpl2nv +title: Command +description: "CLI command factory abstraction" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to use the builder and factory APIs? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/cli/command`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList symbols={[{ name: "CliCommandFactory", anchor: "cli-command-factory" }]} /> + +## `CliCommandFactory` + +**Abstraction** — imported from `webiny/cli/command` + +```typescript +import { CliCommandFactory } from "webiny/cli/command"; +``` + +**Types:** + +```typescript +namespace CliCommandFactory { + type Interface = ICliCommand<TCommandParams>; + type ParamDefinition = ICliCommandParamDefinition<TCommandParams>; + type OptionDefinition = ICliCommandOptionDefinition<TCommandParams>; + type CommandDefinition = ICliCommandDefinition<TCommandParams>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CliCommandFactory } from "webiny/cli/command"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private cliCommandFactory: CliCommandFactory.Interface) {} + + public async execute(/* ... */): Promise<void> {} +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CliCommandFactory] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/cli/overview.ai.txt b/docs/developer-docs/6.0.x/reference/cli/overview.ai.txt new file mode 100644 index 000000000..7eb8ede19 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/cli/overview.ai.txt @@ -0,0 +1,26 @@ +AI Context: CLI (reference/cli/index.mdx) + +Source of Information: +1. packages/webiny/src/cli/index.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/cli-core/src/abstractions/services/LoggerService.ts — originating source +3. /Users/adrian/dev/wby-next/packages/cli-core/src/abstractions/services/UiService.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +Logger, Ui + +Import Path: webiny/cli/index + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/cli/overview.mdx b/docs/developer-docs/6.0.x/reference/cli/overview.mdx new file mode 100644 index 000000000..dba8e26b1 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/cli/overview.mdx @@ -0,0 +1,126 @@ +--- +id: y2xpl2lu +title: CLI +description: "CLI-scoped Logger and Ui abstractions" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/cli/index`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/cli/index`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "Logger", anchor: "logger" }, + { name: "Ui", anchor: "ui" } + ]} +/> + +## `Logger` + +**Abstraction** — imported from `webiny/cli/index` + +```typescript +import { Logger } from "webiny/cli/index"; +``` + +**Interface `Logger.Interface`:** + +```typescript +interface Logger.Interface { + trace(objOrMsg: object | string, ...args: any[]): void; + debug(objOrMsg: object | string, ...args: any[]): void; + info(objOrMsg: object | string, ...args: any[]): void; + warn(objOrMsg: object | string, ...args: any[]): void; + error(objOrMsg: object | string, ...args: any[]): void; + fatal(objOrMsg: object | string, ...args: any[]): void; + log(objOrMsg: object | string, ...args: any[]): void; +} +``` + +**Types:** + +```typescript +namespace Logger { + type Interface = ILoggerService; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { Logger } from "webiny/cli/index"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private logger: Logger.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.logger.info(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [Logger] +}); +``` + +## `Ui` + +**Abstraction** — imported from `webiny/cli/index` + +```typescript +import { Ui } from "webiny/cli/index"; +``` + +**Interface `Ui.Interface`:** + +```typescript +interface Ui.Interface { + raw(text: string): void; + text(text: string): void; + textBold(text: string): void; + emptyLine(): void; + info(text: string, ...args: any[]): void; + success(text: string, ...args: any[]): void; + error(text: string, ...args: any[]): void; + warning(text: string, ...args: any[]): void; + debug(text: string, ...args: any[]): void; +} +``` + +**Types:** + +```typescript +namespace Ui { + type Interface = IUiService; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { Ui } from "webiny/cli/index"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private ui: Ui.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.ui.info(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [Ui] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/extensions.ai.txt b/docs/developer-docs/6.0.x/reference/extensions.ai.txt new file mode 100644 index 000000000..e064e8b8c --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/extensions.ai.txt @@ -0,0 +1,29 @@ +AI Context: Extensions (reference/extensions.mdx) + +Source of Information: +1. packages/webiny/src/extensions.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/project-aws/src/api.ts — originating source +3. /Users/adrian/dev/wby-next/packages/project-aws/src/admin.ts — originating source +4. /Users/adrian/dev/wby-next/packages/project-aws/src/cli.ts — originating source +5. /Users/adrian/dev/wby-next/packages/project-aws/src/infra.ts — originating source +6. /Users/adrian/dev/wby-next/packages/project-aws/src/project.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +Api, Admin, Cli, Infra, Project + +Import Path: webiny/extensions + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/extensions.mdx b/docs/developer-docs/6.0.x/reference/extensions.mdx new file mode 100644 index 000000000..26a7e5197 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/extensions.mdx @@ -0,0 +1,933 @@ +--- +id: zxh0zw5z +title: Extensions +description: "Reference for all webiny/extensions exports — React components used in webiny.config.tsx to wire extensions into the project." +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What extension components are available in `webiny/extensions`? +- What parameters does each extension accept? +- How to use each extension in your `webiny.config.tsx`? + +</Alert> + +## Overview + +The `webiny/extensions` package exports React components used inside `webiny.config.tsx` to wire extensions into your Webiny project. Each component corresponds to a `defineExtension()` call in the Webiny source and accepts typed props defined by its Zod schema. + +**Api** + +<SymbolList + symbols={[ + { name: "Api.Extension", anchor: "api-extension" }, + { name: "Api.BuildParam", anchor: "api-build-param" } + ]} +/> + +**Admin** + +<SymbolList + symbols={[ + { name: "Admin.Extension", anchor: "admin-extension" }, + { name: "Admin.BuildParam", anchor: "admin-build-param" } + ]} +/> + +**Cli** + +<SymbolList symbols={[{ name: "Cli.Command", anchor: "cli-command" }]} /> + +**Infra** + +<SymbolList + symbols={[ + { name: "Infra.Vpc", anchor: "infra-vpc" }, + { name: "Infra.BlueGreenDeployments", anchor: "infra-blue-green-deployments" }, + { name: "Infra.OpenSearch", anchor: "infra-open-search" }, + { name: "Infra.PulumiResourceNamePrefix", anchor: "infra-pulumi-resource-name-prefix" }, + { name: "Infra.ProductionEnvironments", anchor: "infra-production-environments" }, + { name: "Infra.Aws.DefaultRegion", anchor: "infra-aws-default-region" }, + { name: "Infra.Aws.Tags", anchor: "infra-aws-tags" }, + { name: "Infra.Admin.BeforeBuild", anchor: "infra-admin-before-build" }, + { name: "Infra.Admin.BeforeDeploy", anchor: "infra-admin-before-deploy" }, + { name: "Infra.Admin.BeforeWatch", anchor: "infra-admin-before-watch" }, + { name: "Infra.Admin.AfterBuild", anchor: "infra-admin-after-build" }, + { name: "Infra.Admin.AfterDeploy", anchor: "infra-admin-after-deploy" }, + { name: "Infra.Admin.Pulumi", anchor: "infra-admin-pulumi" }, + { name: "Infra.Admin.CustomDomains", anchor: "infra-admin-custom-domains" }, + { name: "Infra.Admin.StackOutputValue", anchor: "infra-admin-stack-output-value" }, + { name: "Infra.Api.BeforeBuild", anchor: "infra-api-before-build" }, + { name: "Infra.Api.BeforeDeploy", anchor: "infra-api-before-deploy" }, + { name: "Infra.Api.BeforeWatch", anchor: "infra-api-before-watch" }, + { name: "Infra.Api.AfterBuild", anchor: "infra-api-after-build" }, + { name: "Infra.Api.AfterDeploy", anchor: "infra-api-after-deploy" }, + { name: "Infra.Api.Pulumi", anchor: "infra-api-pulumi" }, + { name: "Infra.Api.StackOutputValue", anchor: "infra-api-stack-output-value" }, + { name: "Infra.Api.LambdaFunction", anchor: "infra-api-lambda-function" }, + { name: "Infra.Core.BeforeBuild", anchor: "infra-core-before-build" }, + { name: "Infra.Core.BeforeDeploy", anchor: "infra-core-before-deploy" }, + { name: "Infra.Core.BeforeWatch", anchor: "infra-core-before-watch" }, + { name: "Infra.Core.AfterBuild", anchor: "infra-core-after-build" }, + { name: "Infra.Core.AfterDeploy", anchor: "infra-core-after-deploy" }, + { name: "Infra.Core.Pulumi", anchor: "infra-core-pulumi" }, + { name: "Infra.Core.StackOutputValue", anchor: "infra-core-stack-output-value" } + ]} +/> + +**Project** + +<SymbolList + symbols={[ + { name: "Project.Id", anchor: "project-id" }, + { name: "Project.Telemetry", anchor: "project-telemetry" }, + { name: "Project.AutoInstall", anchor: "project-auto-install" }, + { name: "Project.FeatureFlags", anchor: "project-feature-flags" } + ]} +/> + +## Api + +### `Extension` + +Add any API extension. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Api } from "webiny/extensions"; + +export const Extensions = () => <Api.Extension src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ------------ | -------- | -------- | ----------- | +| `src` | `string` | yes | — | +| `exportName` | `string` | no | — | + +### `BuildParam` + +Add build-time parameter to API app. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Api } from "webiny/extensions"; + +export const Extensions = () => ( + <Api.BuildParam paramName="value" value={...} /> +); +``` + +**Props** + +| Prop | Type | Required | Description | +| ----------- | -------- | -------- | ----------- | +| `paramName` | `string` | yes | — | +| `value` | `union` | yes | — | + +## Admin + +### `Extension` + +Extend the Admin application with custom functionality. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Admin } from "webiny/extensions"; + +export const Extensions = () => <Admin.Extension src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ------------ | -------- | -------- | ----------- | +| `src` | `string` | yes | — | +| `exportName` | `string` | no | — | + +### `BuildParam` + +Add build-time parameter to Admin app. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Admin } from "webiny/extensions"; + +export const Extensions = () => ( + <Admin.BuildParam paramName="value" value={...} /> +); +``` + +**Props** + +| Prop | Type | Required | Description | +| ----------- | -------- | -------- | ----------- | +| `paramName` | `string` | yes | — | +| `value` | `union` | yes | — | + +## Cli + +### `Command` + +An extension for defining CLI commands. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Cli } from "webiny/extensions"; + +export const Extensions = () => <Cli.Command src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +## Infra + +### `Vpc` + +Apply VPC settings to AWS resources during deployment. + +Can only be used **once**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Vpc />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----------------- | ------------------------------------- | -------- | ---------------------- | +| `enabled` | `boolean` | no | Whether to enable VPC. | +| `useVpcEndpoints` | `boolean` | no | — | +| `useExistingVpc` | [object](#infra-vpc-use-existing-vpc) | no | — | + +<span id="infra-vpc-use-existing-vpc"></span> + +#### `useExistingVpc` + +| Field | Type | Required | Description | +| --------------------------- | ------------------------------------------------------------------- | -------- | --------------------------------------- | +| `openSearchDomainVpcConfig` | [object](#infra-vpc-use-existing-vpc-open-search-domain-vpc-config) | no | — | +| `lambdaFunctionsVpcConfig` | [object](#infra-vpc-use-existing-vpc-lambda-functions-vpc-config) | yes | VPC configuration for Lambda functions. | + +<span id="infra-vpc-use-existing-vpc-open-search-domain-vpc-config"></span> + +#### `openSearchDomainVpcConfig` + +| Field | Type | Required | Description | +| ------------------ | ---------- | -------- | ------------------------------------------------- | +| `securityGroupIds` | `string[]` | yes | The security group IDs for the OpenSearch domain. | +| `subnetIds` | `string[]` | yes | The subnet IDs for the OpenSearch domain. | + +<span id="infra-vpc-use-existing-vpc-lambda-functions-vpc-config"></span> + +#### `lambdaFunctionsVpcConfig` + +| Field | Type | Required | Description | +| ------------------ | ---------- | -------- | ------------------------------------------------ | +| `securityGroupIds` | `string[]` | yes | The security group IDs for the Lambda functions. | +| `subnetIds` | `string[]` | yes | The subnet IDs for the Lambda functions. | + +### `BlueGreenDeployments` + +Enable blue/green deployments for your Webiny project. + +Can only be used **once**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => ( + <Infra.BlueGreenDeployments domains={{}} deployments={...} /> +); +``` + +**Props** + +| Prop | Type | Required | Description | +| ------------- | -------------------------------------------------- | -------- | ----------- | +| `enabled` | `boolean` | no | — | +| `domains` | [object](#infra-blue-green-deployments-domains) | yes | — | +| `deployments` | [tuple](#infra-blue-green-deployments-deployments) | yes | — | + +<span id="infra-blue-green-deployments-domains"></span> + +#### `domains` + +| Field | Type | Required | Description | +| ------------------- | ------------------------------------------------------- | -------- | ----------- | --- | +| `acmCertificateArn` | `string` | yes | — | +| `sslSupportMethod` | `"sni-only" | "vip"` | yes | — | +| `domains` | [object](#infra-blue-green-deployments-domains-domains) | yes | — | + +<span id="infra-blue-green-deployments-domains-domains"></span> + +#### `domains` + +| Field | Type | Required | Description | +| --------- | ---------- | -------- | ----------- | +| `api` | `string[]` | yes | — | +| `admin` | `string[]` | yes | — | +| `website` | `string[]` | yes | — | +| `preview` | `string[]` | yes | — | + +<span id="infra-blue-green-deployments-deployments"></span> + +#### `deployments` + +A tuple: `[`object`, `object`]` + +### `OpenSearch` + +Enable and configure Opensearch integration with project-level setup. + +Can only be used **once**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.OpenSearch />; +``` + +**Props** + +| Prop | Type | Required | Description | +| --------------- | --------- | -------- | --------------------------------------------------------------------------------------------------------- | +| `enabled` | `boolean` | no | Whether to enable OpenSearch. | +| `domainName` | `string` | no | The name of the Opensearch domain. | +| `indexPrefix` | `string` | no | A prefix to be added to all Opensearch indexes. | +| `sharedIndexes` | `boolean` | no | Whether to use shared indexes across all environments (true) or separate indexes per environment (false). | + +### `PulumiResourceNamePrefix` + +Adjust the prefix for Pulumi resource names (default: "wby-"). + +Can only be used **once**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.PulumiResourceNamePrefix prefix="value" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| -------- | -------- | -------- | ----------- | +| `prefix` | `string` | yes | — | + +### `ProductionEnvironments` + +Provide names for environments that are considered production environments. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.ProductionEnvironments environments={[]} />; +``` + +**Props** + +| Prop | Type | Required | Description | +| -------------- | ------- | -------- | ----------- | +| `environments` | `array` | yes | — | + +### `Aws.DefaultRegion` + +Set the default AWS region for the project. + +Can only be used **once**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Aws.DefaultRegion name="value" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ------ | -------- | -------- | -------------------- | +| `name` | `string` | yes | The AWS region name. | + +### `Aws.Tags` + +Apply tags to AWS resources during deployment. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => ( + <Infra.Aws.Tags tags={...} /> +); +``` + +**Props** + +| Prop | Type | Required | Description | +| ------ | -------- | -------- | ----------- | +| `tags` | `record` | yes | — | + +### `Admin.BeforeBuild` + +Add custom logic to be executed before the ADMIN build process. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Admin.BeforeBuild src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +### `Admin.BeforeDeploy` + +Add custom logic to be executed before the ADMIN deployment process. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Admin.BeforeDeploy src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +### `Admin.BeforeWatch` + +Add custom logic to be executed before the Admin watch process. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Admin.BeforeWatch src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +### `Admin.AfterBuild` + +Add custom logic to be executed after the ADMIN build process. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Admin.AfterBuild src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +### `Admin.AfterDeploy` + +Add custom logic to be executed after the ADMIN deployment process. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Admin.AfterDeploy src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +### `Admin.Pulumi` + +Modify Admin app's cloud infrastructure using Pulumi. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Admin.Pulumi src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +### `Admin.CustomDomains` + +Configure custom domains for the Admin app. + +Can only be used **once**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Admin.CustomDomains domains={[]} certificateArn="value" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ---------------- | -------- | -------- | ----------------------------------------------------------------- | +| `domains` | `array` | yes | List of custom domains. | +| `sslMethod` | `enum` | no | The method to use for SSL/TLS certificate validation. | +| `certificateArn` | `string` | yes | The ARN of the SSL/TLS certificate to use for the custom domains. | + +### `Admin.StackOutputValue` + +Add custom output values to the Admin stack. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Admin.StackOutputValue key="value" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ------- | -------- | -------- | ---------------------------- | +| `key` | `string` | yes | The key for the output value | +| `value` | `any` | no | The value to output | + +### `Api.BeforeBuild` + +Add custom logic to be executed before the API build process. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Api.BeforeBuild src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +### `Api.BeforeDeploy` + +Add custom logic to be executed before the API deployment process. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Api.BeforeDeploy src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +### `Api.BeforeWatch` + +Add custom logic to be executed before the API watch process. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Api.BeforeWatch src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +### `Api.AfterBuild` + +Add custom logic to be executed after the API build process. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Api.AfterBuild src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +### `Api.AfterDeploy` + +Add custom logic to be executed after the API deployment process. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Api.AfterDeploy src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +### `Api.Pulumi` + +Modify Api app's cloud infrastructure using Pulumi. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Api.Pulumi src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +### `Api.StackOutputValue` + +Add custom output values to the Api stack. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Api.StackOutputValue key="value" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ------- | -------- | -------- | ---------------------------- | +| `key` | `string` | yes | The key for the output value | +| `value` | `any` | no | The value to output | + +### `Api.LambdaFunction` + +Add a custom Lambda function to the API app. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Api.LambdaFunction functionSrc="value" pulumiSrc="value" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ------------- | -------- | -------- | ----------- | +| `functionSrc` | `string` | yes | — | +| `pulumiSrc` | `string` | yes | — | + +### `Core.BeforeBuild` + +Add custom logic to be executed before the CORE build process. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Core.BeforeBuild src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +### `Core.BeforeDeploy` + +Add custom logic to be executed before the CORE deployment process. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Core.BeforeDeploy src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +### `Core.BeforeWatch` + +Add custom logic to be executed before the CORE watch process. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Core.BeforeWatch src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +### `Core.AfterBuild` + +Add custom logic to be executed after the CORE build process. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Core.AfterBuild src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +### `Core.AfterDeploy` + +Add custom logic to be executed after the CORE deployment process. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Core.AfterDeploy src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +### `Core.Pulumi` + +Modify Core app's cloud infrastructure using Pulumi. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Core.Pulumi src="/extensions/my-extension.ts" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----- | -------- | -------- | ----------- | +| `src` | `string` | yes | — | + +### `Core.StackOutputValue` + +Add custom output values to the Core stack. + +Can be used **multiple times**. + +```tsx webiny.config.tsx +import { Infra } from "webiny/extensions"; + +export const Extensions = () => <Infra.Core.StackOutputValue key="value" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ------- | -------- | -------- | ---------------------------- | +| `key` | `string` | yes | The key for the output value | +| `value` | `any` | no | The value to output | + +## Project + +### `Id` + +An extension for defining the project ID. + +Can only be used **once**. + +```tsx webiny.config.tsx +import { Project } from "webiny/extensions"; + +export const Extensions = () => <Project.Id id="value" />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ---- | -------- | -------- | ----------- | +| `id` | `string` | yes | — | + +### `Telemetry` + +This extension allows you to enable or disable telemetry for the project. + +Can only be used **once**. + +```tsx webiny.config.tsx +import { Project } from "webiny/extensions"; + +export const Extensions = () => <Project.Telemetry />; +``` + +**Props** + +| Prop | Type | Required | Description | +| --------- | --------- | -------- | ----------- | +| `enabled` | `boolean` | no | — | + +### `AutoInstall` + +Auto-install Webiny with admin user credentials on first deploy. + +Can only be used **once**. + +```tsx webiny.config.tsx +import { Project } from "webiny/extensions"; + +export const Extensions = () => <Project.AutoInstall adminUser={{}} />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ----------- | ------------------------------------------ | -------- | --------------------------------------- | +| `adminUser` | [object](#project-auto-install-admin-user) | yes | Admin user credentials for installation | + +<span id="project-auto-install-admin-user"></span> + +#### `adminUser` + +| Field | Type | Required | Description | +| ----------- | -------- | -------- | ------------------------------------------ | +| `firstName` | `string` | yes | Admin user first name | +| `lastName` | `string` | yes | Admin user last name | +| `email` | `string` | yes | Admin user email | +| `password` | `string` | yes | Admin user password (minimum 8 characters) | + +### `FeatureFlags` + +Enable or disable WCP features. + +Can only be used **once**. + +```tsx webiny.config.tsx +import { Project } from "webiny/extensions"; + +export const Extensions = () => <Project.FeatureFlags features={{}} />; +``` + +**Props** + +| Prop | Type | Required | Description | +| ---------- | ----------------------------------------- | -------- | ----------- | +| `features` | [object](#project-feature-flags-features) | yes | — | + +<span id="project-feature-flags-features"></span> + +#### `features` + +| Field | Type | Required | Description | +| ---------------------------- | ---------------------------------------------------------------------------------- | -------- | ----------- | +| `multiTenancy` | `boolean` | no | — | +| `advancedPublishingWorkflow` | `boolean` | no | — | +| `advancedAccessControlLayer` | [boolean \| object](#project-feature-flags-features-advanced-access-control-layer) | no | — | +| `auditLogs` | `boolean` | no | — | +| `recordLocking` | `boolean` | no | — | +| `fileManager` | [object](#project-feature-flags-features-file-manager) | no | — | + +<span id="project-feature-flags-features-advanced-access-control-layer"></span> + +#### `advancedAccessControlLayer` + +Accepts one of: + +- `boolean` +- [object](#project-feature-flags-features-advanced-access-control-layer-option-2) + +<span id="project-feature-flags-features-advanced-access-control-layer-option-2"></span> + +#### `advancedAccessControlLayer (option 2)` + +| Field | Type | Required | Description | +| ------------------------ | --------- | -------- | ----------- | +| `teams` | `boolean` | no | — | +| `privateFiles` | `boolean` | no | — | +| `folderLevelPermissions` | `boolean` | no | — | +| `hcmsFieldPermissions` | `boolean` | no | — | + +<span id="project-feature-flags-features-file-manager"></span> + +#### `fileManager` + +| Field | Type | Required | Description | +| ----------------- | --------- | -------- | ----------- | +| `threatDetection` | `boolean` | no | — | diff --git a/docs/developer-docs/6.0.x/reference/infra/admin.ai.txt b/docs/developer-docs/6.0.x/reference/infra/admin.ai.txt new file mode 100644 index 000000000..a4773af27 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/infra/admin.ai.txt @@ -0,0 +1,31 @@ +AI Context: Admin (reference/infra/admin.mdx) + +Source of Information: +1. packages/webiny/src/infra/admin.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/AdminAfterBuild.ts — originating source +3. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/AdminBeforeBuild.ts — originating source +4. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/AdminAfterDeploy.ts — originating source +5. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/AdminBeforeDeploy.ts — originating source +6. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/AdminBeforeWatch.ts — originating source +7. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/pulumi/AdminPulumi.ts — originating source +8. /Users/adrian/dev/wby-next/packages/project-aws/src/abstractions/services/AdminStackOutputService.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +AdminAfterBuildHook, AdminBeforeBuildHook, AdminAfterDeployHook, AdminBeforeDeployHook, AdminBeforeWatchHook, AdminPulumi, GetAdminStackOutput + +Import Path: webiny/infra/admin + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/infra/admin.mdx b/docs/developer-docs/6.0.x/reference/infra/admin.mdx new file mode 100644 index 000000000..b1a450ab6 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/infra/admin.mdx @@ -0,0 +1,329 @@ +--- +id: aw5mcmev +title: Admin +description: "Admin infrastructure lifecycle hooks and Pulumi abstraction" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/infra/admin`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/infra/admin`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "AdminAfterBuildHook", anchor: "admin-after-build-hook" }, + { name: "AdminAfterDeployHook", anchor: "admin-after-deploy-hook" }, + { name: "AdminBeforeBuildHook", anchor: "admin-before-build-hook" }, + { name: "AdminBeforeDeployHook", anchor: "admin-before-deploy-hook" }, + { name: "AdminBeforeWatchHook", anchor: "admin-before-watch-hook" }, + { name: "AdminPulumi", anchor: "admin-pulumi" }, + { name: "GetAdminStackOutput", anchor: "get-admin-stack-output" } + ]} +/> + +## `AdminAfterBuildHook` + +**Abstraction** — imported from `webiny/infra/admin` + +```typescript +import { AdminAfterBuildHook } from "webiny/infra/admin"; +``` + +**Interface `AdminAfterBuildHook.Interface`:** + +```typescript +interface AdminAfterBuildHook.Interface { + execute(params: BuildApp.Params): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace AdminAfterBuildHook { + type Interface = IAdminAfterBuild; + type Params = BuildApp.Params; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { AdminAfterBuildHook } from "webiny/infra/admin"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private adminAfterBuildHook: AdminAfterBuildHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.adminAfterBuildHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [AdminAfterBuildHook] +}); +``` + +## `AdminAfterDeployHook` + +**Abstraction** — imported from `webiny/infra/admin` + +```typescript +import { AdminAfterDeployHook } from "webiny/infra/admin"; +``` + +**Interface `AdminAfterDeployHook.Interface`:** + +```typescript +interface AdminAfterDeployHook.Interface { + execute(params: DeployApp.Params): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace AdminAfterDeployHook { + type Interface = IAdminAfterDeploy; + type Params = DeployApp.Params; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { AdminAfterDeployHook } from "webiny/infra/admin"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private adminAfterDeployHook: AdminAfterDeployHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.adminAfterDeployHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [AdminAfterDeployHook] +}); +``` + +## `AdminBeforeBuildHook` + +**Abstraction** — imported from `webiny/infra/admin` + +```typescript +import { AdminBeforeBuildHook } from "webiny/infra/admin"; +``` + +**Interface `AdminBeforeBuildHook.Interface`:** + +```typescript +interface AdminBeforeBuildHook.Interface { + execute(params: BuildApp.Params): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace AdminBeforeBuildHook { + type Interface = IAdminBeforeBuild; + type Params = BuildApp.Params; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { AdminBeforeBuildHook } from "webiny/infra/admin"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private adminBeforeBuildHook: AdminBeforeBuildHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.adminBeforeBuildHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [AdminBeforeBuildHook] +}); +``` + +## `AdminBeforeDeployHook` + +**Abstraction** — imported from `webiny/infra/admin` + +```typescript +import { AdminBeforeDeployHook } from "webiny/infra/admin"; +``` + +**Interface `AdminBeforeDeployHook.Interface`:** + +```typescript +interface AdminBeforeDeployHook.Interface { + execute(params: DeployApp.Params): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace AdminBeforeDeployHook { + type Interface = IAdminBeforeDeploy; + type Params = DeployApp.Params; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { AdminBeforeDeployHook } from "webiny/infra/admin"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private adminBeforeDeployHook: AdminBeforeDeployHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.adminBeforeDeployHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [AdminBeforeDeployHook] +}); +``` + +## `AdminBeforeWatchHook` + +**Abstraction** — imported from `webiny/infra/admin` + +```typescript +import { AdminBeforeWatchHook } from "webiny/infra/admin"; +``` + +**Interface `AdminBeforeWatchHook.Interface`:** + +```typescript +interface AdminBeforeWatchHook.Interface { + execute(params: Watch.WatchWithAppParams): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace AdminBeforeWatchHook { + type Interface = IAdminBeforeWatch; + type Params = Watch.WatchWithAppParams; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { AdminBeforeWatchHook } from "webiny/infra/admin"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private adminBeforeWatchHook: AdminBeforeWatchHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.adminBeforeWatchHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [AdminBeforeWatchHook] +}); +``` + +## `AdminPulumi` + +**Abstraction** — imported from `webiny/infra/admin` + +```typescript +import { AdminPulumi } from "webiny/infra/admin"; +``` + +**Types:** + +```typescript +namespace AdminPulumi { + type Interface = IAdminPulumi<unknown>; + type Params = unknown; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { AdminPulumi } from "webiny/infra/admin"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private adminPulumi: AdminPulumi.Interface) {} + + public async execute(/* ... */): Promise<void> {} +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [AdminPulumi] +}); +``` + +## `GetAdminStackOutput` + +**Abstraction** — imported from `webiny/infra/admin` + +```typescript +import { GetAdminStackOutput } from "webiny/infra/admin"; +``` + +**Interface `GetAdminStackOutput.Interface`:** + +```typescript +interface GetAdminStackOutput.Interface { + execute<TOutput extends IAdminStackOutput = IAdminStackOutput>(): Promise<TOutput | null>; +} +``` + +**Types:** + +```typescript +namespace GetAdminStackOutput { + type Interface = IAdminStackOutputService; + type Output = IAdminStackOutput; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetAdminStackOutput } from "webiny/infra/admin"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getAdminStackOutput: GetAdminStackOutput.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getAdminStackOutput.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetAdminStackOutput] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/infra/api.ai.txt b/docs/developer-docs/6.0.x/reference/infra/api.ai.txt new file mode 100644 index 000000000..faeadc4d2 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/infra/api.ai.txt @@ -0,0 +1,31 @@ +AI Context: API (reference/infra/api.mdx) + +Source of Information: +1. packages/webiny/src/infra/api.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/ApiAfterBuild.ts — originating source +3. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/ApiBeforeBuild.ts — originating source +4. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/ApiAfterDeploy.ts — originating source +5. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/ApiBeforeDeploy.ts — originating source +6. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/ApiBeforeWatch.ts — originating source +7. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/pulumi/ApiPulumi.ts — originating source +8. /Users/adrian/dev/wby-next/packages/project-aws/src/abstractions/services/ApiStackOutputService.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +ApiAfterBuildHook, ApiBeforeBuildHook, ApiAfterDeployHook, ApiBeforeDeployHook, ApiBeforeWatchHook, ApiPulumi, GetApiStackOutput + +Import Path: webiny/infra/api + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/infra/api.mdx b/docs/developer-docs/6.0.x/reference/infra/api.mdx new file mode 100644 index 000000000..3bf0545b9 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/infra/api.mdx @@ -0,0 +1,329 @@ +--- +id: aw5mcmev +title: API +description: "API infrastructure lifecycle hooks and Pulumi abstraction" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/infra/api`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/infra/api`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "ApiAfterBuildHook", anchor: "api-after-build-hook" }, + { name: "ApiAfterDeployHook", anchor: "api-after-deploy-hook" }, + { name: "ApiBeforeBuildHook", anchor: "api-before-build-hook" }, + { name: "ApiBeforeDeployHook", anchor: "api-before-deploy-hook" }, + { name: "ApiBeforeWatchHook", anchor: "api-before-watch-hook" }, + { name: "ApiPulumi", anchor: "api-pulumi" }, + { name: "GetApiStackOutput", anchor: "get-api-stack-output" } + ]} +/> + +## `ApiAfterBuildHook` + +**Abstraction** — imported from `webiny/infra/api` + +```typescript +import { ApiAfterBuildHook } from "webiny/infra/api"; +``` + +**Interface `ApiAfterBuildHook.Interface`:** + +```typescript +interface ApiAfterBuildHook.Interface { + execute(params: BuildApp.Params): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace ApiAfterBuildHook { + type Interface = IApiAfterBuild; + type Params = BuildApp.Params; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ApiAfterBuildHook } from "webiny/infra/api"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private apiAfterBuildHook: ApiAfterBuildHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.apiAfterBuildHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ApiAfterBuildHook] +}); +``` + +## `ApiAfterDeployHook` + +**Abstraction** — imported from `webiny/infra/api` + +```typescript +import { ApiAfterDeployHook } from "webiny/infra/api"; +``` + +**Interface `ApiAfterDeployHook.Interface`:** + +```typescript +interface ApiAfterDeployHook.Interface { + execute(params: DeployApp.Params): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace ApiAfterDeployHook { + type Interface = IApiAfterDeploy; + type Params = DeployApp.Params; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ApiAfterDeployHook } from "webiny/infra/api"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private apiAfterDeployHook: ApiAfterDeployHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.apiAfterDeployHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ApiAfterDeployHook] +}); +``` + +## `ApiBeforeBuildHook` + +**Abstraction** — imported from `webiny/infra/api` + +```typescript +import { ApiBeforeBuildHook } from "webiny/infra/api"; +``` + +**Interface `ApiBeforeBuildHook.Interface`:** + +```typescript +interface ApiBeforeBuildHook.Interface { + execute(params: BuildApp.Params): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace ApiBeforeBuildHook { + type Interface = IApiBeforeBuild; + type Params = BuildApp.Params; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ApiBeforeBuildHook } from "webiny/infra/api"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private apiBeforeBuildHook: ApiBeforeBuildHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.apiBeforeBuildHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ApiBeforeBuildHook] +}); +``` + +## `ApiBeforeDeployHook` + +**Abstraction** — imported from `webiny/infra/api` + +```typescript +import { ApiBeforeDeployHook } from "webiny/infra/api"; +``` + +**Interface `ApiBeforeDeployHook.Interface`:** + +```typescript +interface ApiBeforeDeployHook.Interface { + execute(params: DeployApp.Params): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace ApiBeforeDeployHook { + type Interface = IApiBeforeDeploy; + type Params = DeployApp.Params; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ApiBeforeDeployHook } from "webiny/infra/api"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private apiBeforeDeployHook: ApiBeforeDeployHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.apiBeforeDeployHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ApiBeforeDeployHook] +}); +``` + +## `ApiBeforeWatchHook` + +**Abstraction** — imported from `webiny/infra/api` + +```typescript +import { ApiBeforeWatchHook } from "webiny/infra/api"; +``` + +**Interface `ApiBeforeWatchHook.Interface`:** + +```typescript +interface ApiBeforeWatchHook.Interface { + execute(params: Watch.WatchWithAppParams): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace ApiBeforeWatchHook { + type Interface = IApiBeforeWatch; + type Params = Watch.WatchWithAppParams; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ApiBeforeWatchHook } from "webiny/infra/api"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private apiBeforeWatchHook: ApiBeforeWatchHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.apiBeforeWatchHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ApiBeforeWatchHook] +}); +``` + +## `ApiPulumi` + +**Abstraction** — imported from `webiny/infra/api` + +```typescript +import { ApiPulumi } from "webiny/infra/api"; +``` + +**Types:** + +```typescript +namespace ApiPulumi { + type Interface = IApiPulumi<unknown>; + type Params = unknown; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ApiPulumi } from "webiny/infra/api"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private apiPulumi: ApiPulumi.Interface) {} + + public async execute(/* ... */): Promise<void> {} +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ApiPulumi] +}); +``` + +## `GetApiStackOutput` + +**Abstraction** — imported from `webiny/infra/api` + +```typescript +import { GetApiStackOutput } from "webiny/infra/api"; +``` + +**Interface `GetApiStackOutput.Interface`:** + +```typescript +interface GetApiStackOutput.Interface { + execute<TOutput extends IApiStackOutput = IApiStackOutput>(): Promise<TOutput | null>; +} +``` + +**Types:** + +```typescript +namespace GetApiStackOutput { + type Interface = IApiStackOutputService; + type Output = IApiStackOutput; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetApiStackOutput } from "webiny/infra/api"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getApiStackOutput: GetApiStackOutput.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getApiStackOutput.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetApiStackOutput] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/infra/core.ai.txt b/docs/developer-docs/6.0.x/reference/infra/core.ai.txt new file mode 100644 index 000000000..9839e0a4e --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/infra/core.ai.txt @@ -0,0 +1,30 @@ +AI Context: Core (reference/infra/core.mdx) + +Source of Information: +1. packages/webiny/src/infra/core.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/CoreAfterBuild.ts — originating source +3. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/CoreBeforeBuild.ts — originating source +4. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/CoreAfterDeploy.ts — originating source +5. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/CoreBeforeDeploy.ts — originating source +6. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/pulumi/CorePulumi.ts — originating source +7. /Users/adrian/dev/wby-next/packages/project-aws/src/abstractions/services/CoreStackOutputService.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +CoreAfterBuildHook, CoreBeforeBuildHook, CoreAfterDeployHook, CoreBeforeDeployHook, CorePulumi, GetCoreStackOutput + +Import Path: webiny/infra/core + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/infra/core.mdx b/docs/developer-docs/6.0.x/reference/infra/core.mdx new file mode 100644 index 000000000..29bcd455a --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/infra/core.mdx @@ -0,0 +1,284 @@ +--- +id: aw5mcmev +title: Core +description: "Core infrastructure lifecycle hooks and Pulumi abstraction" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/infra/core`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/infra/core`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "CoreAfterBuildHook", anchor: "core-after-build-hook" }, + { name: "CoreAfterDeployHook", anchor: "core-after-deploy-hook" }, + { name: "CoreBeforeBuildHook", anchor: "core-before-build-hook" }, + { name: "CoreBeforeDeployHook", anchor: "core-before-deploy-hook" }, + { name: "CorePulumi", anchor: "core-pulumi" }, + { name: "GetCoreStackOutput", anchor: "get-core-stack-output" } + ]} +/> + +## `CoreAfterBuildHook` + +**Abstraction** — imported from `webiny/infra/core` + +```typescript +import { CoreAfterBuildHook } from "webiny/infra/core"; +``` + +**Interface `CoreAfterBuildHook.Interface`:** + +```typescript +interface CoreAfterBuildHook.Interface { + execute(params: BuildApp.Params): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace CoreAfterBuildHook { + type Interface = ICoreAfterBuild; + type Params = BuildApp.Params; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CoreAfterBuildHook } from "webiny/infra/core"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private coreAfterBuildHook: CoreAfterBuildHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.coreAfterBuildHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CoreAfterBuildHook] +}); +``` + +## `CoreAfterDeployHook` + +**Abstraction** — imported from `webiny/infra/core` + +```typescript +import { CoreAfterDeployHook } from "webiny/infra/core"; +``` + +**Interface `CoreAfterDeployHook.Interface`:** + +```typescript +interface CoreAfterDeployHook.Interface { + execute(params: DeployApp.Params): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace CoreAfterDeployHook { + type Interface = ICoreAfterDeploy; + type Params = DeployApp.Params; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CoreAfterDeployHook } from "webiny/infra/core"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private coreAfterDeployHook: CoreAfterDeployHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.coreAfterDeployHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CoreAfterDeployHook] +}); +``` + +## `CoreBeforeBuildHook` + +**Abstraction** — imported from `webiny/infra/core` + +```typescript +import { CoreBeforeBuildHook } from "webiny/infra/core"; +``` + +**Interface `CoreBeforeBuildHook.Interface`:** + +```typescript +interface CoreBeforeBuildHook.Interface { + execute(params: BuildApp.Params): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace CoreBeforeBuildHook { + type Interface = ICoreBeforeBuild; + type Params = BuildApp.Params; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CoreBeforeBuildHook } from "webiny/infra/core"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private coreBeforeBuildHook: CoreBeforeBuildHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.coreBeforeBuildHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CoreBeforeBuildHook] +}); +``` + +## `CoreBeforeDeployHook` + +**Abstraction** — imported from `webiny/infra/core` + +```typescript +import { CoreBeforeDeployHook } from "webiny/infra/core"; +``` + +**Interface `CoreBeforeDeployHook.Interface`:** + +```typescript +interface CoreBeforeDeployHook.Interface { + execute(params: DeployApp.Params): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace CoreBeforeDeployHook { + type Interface = ICoreBeforeDeploy; + type Params = DeployApp.Params; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CoreBeforeDeployHook } from "webiny/infra/core"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private coreBeforeDeployHook: CoreBeforeDeployHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.coreBeforeDeployHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CoreBeforeDeployHook] +}); +``` + +## `CorePulumi` + +**Abstraction** — imported from `webiny/infra/core` + +```typescript +import { CorePulumi } from "webiny/infra/core"; +``` + +**Types:** + +```typescript +namespace CorePulumi { + type Interface = ICorePulumi<unknown>; + type Params = unknown; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CorePulumi } from "webiny/infra/core"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private corePulumi: CorePulumi.Interface) {} + + public async execute(/* ... */): Promise<void> {} +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CorePulumi] +}); +``` + +## `GetCoreStackOutput` + +**Abstraction** — imported from `webiny/infra/core` + +```typescript +import { GetCoreStackOutput } from "webiny/infra/core"; +``` + +**Interface `GetCoreStackOutput.Interface`:** + +```typescript +interface GetCoreStackOutput.Interface { + execute<TOutput extends ICoreStackOutput = ICoreStackOutput>(): Promise<TOutput | null>; +} +``` + +**Types:** + +```typescript +namespace GetCoreStackOutput { + type Interface = ICoreStackOutputService; + type Output = ICoreStackOutput; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { GetCoreStackOutput } from "webiny/infra/core"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private getCoreStackOutput: GetCoreStackOutput.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.getCoreStackOutput.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [GetCoreStackOutput] +}); +``` diff --git a/docs/developer-docs/6.0.x/reference/infra/overview.ai.txt b/docs/developer-docs/6.0.x/reference/infra/overview.ai.txt new file mode 100644 index 000000000..3b6b33c9b --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/infra/overview.ai.txt @@ -0,0 +1,33 @@ +AI Context: Infrastructure (reference/infra/index.mdx) + +Source of Information: +1. packages/webiny/src/infra/index.ts — barrel re-export file +2. /Users/adrian/dev/wby-next/packages/project/src/abstractions/services/LoggerService.ts — originating source +3. /Users/adrian/dev/wby-next/packages/project/src/abstractions/services/UiService.ts — originating source +4. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/AfterBuild.ts — originating source +5. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/BeforeBuild.ts — originating source +6. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/AfterDeploy.ts — originating source +7. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/BeforeDeploy.ts — originating source +8. /Users/adrian/dev/wby-next/packages/project/src/abstractions/features/hooks/BeforeWatch.ts — originating source +9. /Users/adrian/dev/wby-next/packages/project/src/extensions/EnvVar.ts — originating source +10. /Users/adrian/dev/wby-next/packages/project-aws/src/abstractions/index.ts — originating source + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +Logger, Ui, AfterBuildHook, BeforeBuildHook, AfterDeployHook, BeforeDeployHook, BeforeWatchHook, EnvVar, ApiStackOutput, CoreStackOutput, ApiGqlClient, AdminStackOutput, InvokeLambdaFunction + +Import Path: webiny/infra/index + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those diff --git a/docs/developer-docs/6.0.x/reference/infra/overview.mdx b/docs/developer-docs/6.0.x/reference/infra/overview.mdx new file mode 100644 index 000000000..33b1bff02 --- /dev/null +++ b/docs/developer-docs/6.0.x/reference/infra/overview.mdx @@ -0,0 +1,605 @@ +--- +id: aw5mcmev +title: Infrastructure +description: "Infrastructure primitives: Logger, Ui, lifecycle hooks" +--- + +import { Alert } from "@/components/Alert"; +import { SymbolList } from "@/components/SymbolList"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What is exported from `webiny/infra/index`? +- How to import and use each exported item? + +</Alert> + +## Overview + +This page documents everything exported from `webiny/infra/index`. Import any of the items below directly from this path in your Webiny extensions. + +<SymbolList + symbols={[ + { name: "AdminStackOutput", anchor: "admin-stack-output" }, + { name: "AfterBuildHook", anchor: "after-build-hook" }, + { name: "AfterDeployHook", anchor: "after-deploy-hook" }, + { name: "ApiGqlClient", anchor: "api-gql-client" }, + { name: "ApiStackOutput", anchor: "api-stack-output" }, + { name: "BeforeBuildHook", anchor: "before-build-hook" }, + { name: "BeforeDeployHook", anchor: "before-deploy-hook" }, + { name: "BeforeWatchHook", anchor: "before-watch-hook" }, + { name: "CoreStackOutput", anchor: "core-stack-output" }, + { name: "EnvVar", anchor: "env-var" }, + { name: "InvokeLambdaFunction", anchor: "invoke-lambda-function" }, + { name: "Logger", anchor: "logger" }, + { name: "Ui", anchor: "ui" } + ]} +/> + +## `AdminStackOutput` + +**Abstraction** — imported from `webiny/infra/index` + +```typescript +import { AdminStackOutput } from "webiny/infra/index"; +``` + +**Interface `AdminStackOutput.Interface`:** + +```typescript +interface AdminStackOutput.Interface { + execute<TOutput extends IAdminStackOutput = IAdminStackOutput>(): Promise<TOutput | null>; +} +``` + +**Types:** + +```typescript +namespace AdminStackOutput { + type Interface = IAdminStackOutputService; + type Output = IAdminStackOutput; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { AdminStackOutput } from "webiny/infra/index"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private adminStackOutput: AdminStackOutput.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.adminStackOutput.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [AdminStackOutput] +}); +``` + +## `AfterBuildHook` + +**Abstraction** — imported from `webiny/infra/index` + +```typescript +import { AfterBuildHook } from "webiny/infra/index"; +``` + +**Interface `AfterBuildHook.Interface`:** + +```typescript +interface AfterBuildHook.Interface { + execute(params: BuildApp.Params): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace AfterBuildHook { + type Interface = IAfterBuild; + type Params = BuildApp.Params; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { AfterBuildHook } from "webiny/infra/index"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private afterBuildHook: AfterBuildHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.afterBuildHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [AfterBuildHook] +}); +``` + +## `AfterDeployHook` + +**Abstraction** — imported from `webiny/infra/index` + +```typescript +import { AfterDeployHook } from "webiny/infra/index"; +``` + +**Interface `AfterDeployHook.Interface`:** + +```typescript +interface AfterDeployHook.Interface { + execute(params: DeployApp.Params): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace AfterDeployHook { + type Interface = IAfterDeploy; + type Params = DeployApp.Params; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { AfterDeployHook } from "webiny/infra/index"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private afterDeployHook: AfterDeployHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.afterDeployHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [AfterDeployHook] +}); +``` + +## `ApiGqlClient` + +**Abstraction** — imported from `webiny/infra/index` + +```typescript +import { ApiGqlClient } from "webiny/infra/index"; +``` + +**Interface `ApiGqlClient.Interface`:** + +```typescript +interface ApiGqlClient.Interface { + query<T = any>(params: { + query: string; + variables?: Record<string, any>; + }): Promise<IApiGqlClientResponse<T>>; + mutation<T = any>(params: { + mutation: string; + variables?: Record<string, any>; + }): Promise<IApiGqlClientResponse<T>>; +} +``` + +**Types:** + +```typescript +namespace ApiGqlClient { + type Interface = IApiGqlClient; + type Response = IApiGqlClientResponse<T>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ApiGqlClient } from "webiny/infra/index"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private apiGqlClient: ApiGqlClient.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.apiGqlClient.query(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ApiGqlClient] +}); +``` + +## `ApiStackOutput` + +**Abstraction** — imported from `webiny/infra/index` + +```typescript +import { ApiStackOutput } from "webiny/infra/index"; +``` + +**Interface `ApiStackOutput.Interface`:** + +```typescript +interface ApiStackOutput.Interface { + execute<TOutput extends IApiStackOutput = IApiStackOutput>(): Promise<TOutput | null>; +} +``` + +**Types:** + +```typescript +namespace ApiStackOutput { + type Interface = IApiStackOutputService; + type Output = IApiStackOutput; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { ApiStackOutput } from "webiny/infra/index"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private apiStackOutput: ApiStackOutput.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.apiStackOutput.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [ApiStackOutput] +}); +``` + +## `BeforeBuildHook` + +**Abstraction** — imported from `webiny/infra/index` + +```typescript +import { BeforeBuildHook } from "webiny/infra/index"; +``` + +**Interface `BeforeBuildHook.Interface`:** + +```typescript +interface BeforeBuildHook.Interface { + execute(params: BuildApp.Params): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace BeforeBuildHook { + type Interface = IBeforeBuild; + type Params = BuildApp.Params; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { BeforeBuildHook } from "webiny/infra/index"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private beforeBuildHook: BeforeBuildHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.beforeBuildHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [BeforeBuildHook] +}); +``` + +## `BeforeDeployHook` + +**Abstraction** — imported from `webiny/infra/index` + +```typescript +import { BeforeDeployHook } from "webiny/infra/index"; +``` + +**Interface `BeforeDeployHook.Interface`:** + +```typescript +interface BeforeDeployHook.Interface { + execute(params: DeployApp.Params): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace BeforeDeployHook { + type Interface = IBeforeDeploy; + type Params = DeployApp.Params; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { BeforeDeployHook } from "webiny/infra/index"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private beforeDeployHook: BeforeDeployHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.beforeDeployHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [BeforeDeployHook] +}); +``` + +## `BeforeWatchHook` + +**Abstraction** — imported from `webiny/infra/index` + +```typescript +import { BeforeWatchHook } from "webiny/infra/index"; +``` + +**Interface `BeforeWatchHook.Interface`:** + +```typescript +interface BeforeWatchHook.Interface { + execute(params: Watch.Params): void | Promise<void>; +} +``` + +**Types:** + +```typescript +namespace BeforeWatchHook { + type Interface = IBeforeWatch; + type Params = Watch.Params; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { BeforeWatchHook } from "webiny/infra/index"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private beforeWatchHook: BeforeWatchHook.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.beforeWatchHook.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [BeforeWatchHook] +}); +``` + +## `CoreStackOutput` + +**Abstraction** — imported from `webiny/infra/index` + +```typescript +import { CoreStackOutput } from "webiny/infra/index"; +``` + +**Interface `CoreStackOutput.Interface`:** + +```typescript +interface CoreStackOutput.Interface { + execute<TOutput extends ICoreStackOutput = ICoreStackOutput>(): Promise<TOutput | null>; +} +``` + +**Types:** + +```typescript +namespace CoreStackOutput { + type Interface = ICoreStackOutputService; + type Output = ICoreStackOutput; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { CoreStackOutput } from "webiny/infra/index"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private coreStackOutput: CoreStackOutput.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.coreStackOutput.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [CoreStackOutput] +}); +``` + +## `EnvVar` + +**Constant** — imported from `webiny/infra/index` + +```typescript +import { EnvVar } from "webiny/infra/index"; +``` + +```typescript +export const EnvVar = defineExtension({ + type: "Project/EnvVar", + tags: { runtimeContext: "project" }, + description: "Set an environment variable in the project context.", + multiple: true, + paramsSchema: z.object({ + // TODO: enable using `name` instead of `varName` for better consistency. + varName: z.string().describe("The environment variable name."), + value: z +``` + +## `InvokeLambdaFunction` + +**Abstraction** — imported from `webiny/infra/index` + +```typescript +import { InvokeLambdaFunction } from "webiny/infra/index"; +``` + +**Interface `InvokeLambdaFunction.Interface`:** + +```typescript +interface InvokeLambdaFunction.Interface { + execute<T = any>(params: IInvokeLambdaFunctionParams): Promise<IInvokeLambdaFunctionResult<T>>; +} +``` + +**Types:** + +```typescript +namespace InvokeLambdaFunction { + type Interface = IInvokeLambdaFunction; + type Params = IInvokeLambdaFunctionParams; + type Result = IInvokeLambdaFunctionResult<T>; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { InvokeLambdaFunction } from "webiny/infra/index"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private invokeLambdaFunction: InvokeLambdaFunction.Interface) {} + + public async execute(/* ... */): Promise<void> { + await this.invokeLambdaFunction.execute(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [InvokeLambdaFunction] +}); +``` + +## `Logger` + +**Abstraction** — imported from `webiny/infra/index` + +```typescript +import { Logger } from "webiny/infra/index"; +``` + +**Interface `Logger.Interface`:** + +```typescript +interface Logger.Interface { + trace(objOrMsg: object | string, ...args: any[]): void; + debug(objOrMsg: object | string, ...args: any[]): void; + info(objOrMsg: object | string, ...args: any[]): void; + warn(objOrMsg: object | string, ...args: any[]): void; + error(objOrMsg: object | string, ...args: any[]): void; + fatal(objOrMsg: object | string, ...args: any[]): void; + log(objOrMsg: object | string, ...args: any[]): void; +} +``` + +**Types:** + +```typescript +namespace Logger { + type Interface = ILoggerService; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { Logger } from "webiny/infra/index"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private logger: Logger.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.logger.info(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [Logger] +}); +``` + +## `Ui` + +**Abstraction** — imported from `webiny/infra/index` + +```typescript +import { Ui } from "webiny/infra/index"; +``` + +**Interface `Ui.Interface`:** + +```typescript +interface Ui.Interface { + raw(text: string): void; + text(text: string): void; + textBold(text: string): void; + emptyLine(): void; + info(text: string, ...args: any[]): void; + success(text: string, ...args: any[]): void; + error(text: string, ...args: any[]): void; + warning(text: string, ...args: any[]): void; + debug(text: string, ...args: any[]): void; +} +``` + +**Types:** + +```typescript +namespace Ui { + type Interface = IUiService; +} +``` + +**Usage:** + +```typescript extensions/MyImpl.ts +import { Ui } from "webiny/infra/index"; + +class MyImpl implements MyUseCase.Interface { + public constructor(private ui: Ui.Interface) {} + + public async execute(/* ... */): Promise<void> { + this.ui.info(/* ... */); + } +} + +export default MyUseCase.createImplementation({ + implementation: MyImpl, + dependencies: [Ui] +}); +``` diff --git a/docs/developer-docs/6.0.x/tasks/about.ai.txt b/docs/developer-docs/6.0.x/tasks/about.ai.txt new file mode 100644 index 000000000..953899e5a --- /dev/null +++ b/docs/developer-docs/6.0.x/tasks/about.ai.txt @@ -0,0 +1,71 @@ +AI Context: Background Tasks - About (tasks/about.mdx) + +Source of Information: +1. Read tasks/reference.mdx to understand the implementation details +2. Analyzed the background tasks system architecture from reference examples +3. Examined the task runner, context, and controller patterns +4. Extracted high-level concepts from the technical reference + +Understanding Background Tasks: +Background tasks are operations that run asynchronously, outside the normal HTTP request/response cycle. Heavy work happens in the background while users get immediate responses. + +Why Use Background Tasks: +- Don't Block Users: Heavy operations don't slow down page loads +- Handle Long Operations: Data processing that takes minutes or hours +- Retry on Failure: Automatic retry on failures +- Scale Better: Process many tasks in parallel + +When to Use Background Tasks: +- Data import/export (processing CSV files, etc.) +- Batch email sending +- Image/video processing +- Report generation +- External API integrations +- Cleanup jobs (delete old data) + +Key Documentation Decisions: +- Created an introductory/overview document explaining what background tasks are +- Focused on the "why" and "when" rather than "how" (that's in reference.mdx) +- Explained the core concepts: + - Tasks run asynchronously outside HTTP request/response cycle + - Event-driven architecture + - Task definition, triggering, and execution + - Runner, controller, context pattern +- Kept it simple and accessible +- Explained common use cases (data processing, external API calls, batch operations) +- Linked to the reference document for implementation details + +Document Structure: +- Overview: What are background tasks +- What You'll Learn +- Key concepts explanation +- When to use background tasks +- Architecture overview +- Link to reference documentation + +Architecture Components: +- Runner: Finds tasks to process and executes them (iterate + run methods) +- Context: Provides access to task data and operations (read task properties, call task methods) +- Controller: Manages task status and output (success, error, abort methods) + +Simple Flow: +1. Trigger a task (creates a task with name and input data) +2. Runner finds pending tasks (iterate method) +3. Runner processes each task (run method) +4. Controller updates task status (success/error/aborted) + +Key Terms: +- Outside HTTP cycle: Doesn't block web requests, runs independently +- Event-driven: Triggered by events (like "entry created"), not time-based schedules +- Async: Runs in the background while other things continue + +Related Documents: +- tasks/reference.mdx - Complete implementation guide +- tasks/management.mdx - Task CRUD operations + +Tone Guidelines: +- Conceptual, not implementation-focused +- Accessible explanations +- Motivate the "why" before the "how" +- Link to reference.mdx for implementation details + diff --git a/docs/developer-docs/6.0.x/tasks/about.mdx b/docs/developer-docs/6.0.x/tasks/about.mdx new file mode 100644 index 000000000..5d4e0efdb --- /dev/null +++ b/docs/developer-docs/6.0.x/tasks/about.mdx @@ -0,0 +1,57 @@ +--- +id: ifggwkus +title: About +description: About Tasks +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- What are Tasks? +- What methods are available in a task definition? +- When to use lifecycle hooks? + +</Alert> + +## Overview + +Tasks allow you to run long operations asynchronously without blocking your application. You can process batches, migrate data, or perform bulk operations in the background. + +To create a background task, you implement the `TaskDefinition.Interface` and register it using `TaskDefinition.createImplementation()`. + +## Available Methods + +When creating a background task, you implement the following methods: + +### Core Methods + +- **`run()`** - The main method where your task logic executes. Required. +- **`createInputValidation()`** - Validates the input data before the task runs. Optional. + +### Lifecycle Hooks + +These hooks are called at different stages of task execution: + +- **`onBeforeTrigger()`** - Called before the task is triggered. +- **`onDone()`** - Called when the task completes successfully. +- **`onError()`** - Called when the task fails with an error. +- **`onAbort()`** - Called when the task is manually aborted. +- **`onMaxIterations()`** - Called when the task reaches the maximum iteration limit. + +## Task Responses + +Inside the `run()` method, you receive a `controller` object that helps you control task execution. You use it to return different responses: + +- **`controller.response.done()`** - Task completed successfully. +- **`controller.response.continue()`** - Task needs more time, will resume in the next iteration. +- **`controller.response.error()`** - Task encountered an error and should stop. +- **`controller.response.aborted()`** - Task was manually stopped. + +## Controller Runtime Methods + +The controller also provides runtime methods to check the task's execution state: + +- **`controller.runtime.isAborted()`** - Returns `true` if the task was manually aborted. +- **`controller.runtime.isCloseToTimeout()`** - Returns `true` if the task is running out of time. Use this to return `continue()` and preserve your progress. + diff --git a/docs/developer-docs/6.0.x/tasks/management.ai.txt b/docs/developer-docs/6.0.x/tasks/management.ai.txt new file mode 100644 index 000000000..773162ad5 --- /dev/null +++ b/docs/developer-docs/6.0.x/tasks/management.ai.txt @@ -0,0 +1,88 @@ +AI Context: Background Tasks - Management (tasks/management.mdx) + +Source of Information: +1. Analyzed the background tasks reference.mdx for available operations +2. Identified task management operations (get, list, update, delete) +3. Examined the ITasks interface and its methods +4. Understood the task lifecycle and status management + +Key Documentation Decisions: +- Created a practical guide for managing tasks +- Documented each CRUD operation separately +- Showed how to retrieve task information +- Explained task status updates +- Demonstrated task deletion +- Used the ITasks interface from the context +- Included practical examples for each operation +- Added usage descriptions explaining when and why to use each operation + +Operations Documented: +1. Get Task - Retrieve a single task by ID +2. List Tasks - Query multiple tasks +3. Update Task - Modify task properties (status, output, error) +4. Delete Task - Remove completed/failed tasks + +Pattern Observed: +- All operations accessed through context.tasks +- Result pattern used consistently +- Task status management (pending, success, failed, aborted) +- Each operation returns Result<Task | Task[], Error> + +Related Documents: +- tasks/reference.mdx - Task definition and execution +- tasks/about.mdx - Background tasks concepts + +Task Management Pattern: +```typescript +// Get single task +const result = await context.tasks.get(taskId); +if (result.isOk()) { + const task = result.value; + console.log(task.status, task.output); +} + +// List tasks with filters +const listResult = await context.tasks.list({ + where: { name: "myTask", status: "pending" }, + limit: 10 +}); + +// Update task +const updateResult = await context.tasks.update(taskId, { + status: "aborted", + error: { message: "Manual abort" } +}); + +// Delete task +const deleteResult = await context.tasks.delete(taskId); +``` + +Operations to Document: +1. Get Task - Retrieve by ID +2. List Tasks - Query with filters (name, status, date range) +3. Update Task - Modify status, output, error +4. Delete Task - Remove completed/failed tasks + +Task Status Values: +- "pending": Waiting to be processed +- "success": Completed successfully +- "failed": Encountered error +- "aborted": Manually stopped + +Common Use Cases: +- Monitoring task progress +- Debugging failed tasks +- Manual task cancellation +- Cleanup of old tasks +- Custom dashboards/reporting + +Result Pattern: +All operations return Result<Task | Task[], Error> +Always check isFail() before accessing value + +Tone Guidelines: +- Practical operation-focused +- Show complete examples +- Explain when to use each operation +- Include error handling + diff --git a/docs/developer-docs/6.0.x/tasks/management.mdx b/docs/developer-docs/6.0.x/tasks/management.mdx new file mode 100644 index 000000000..569fcecb5 --- /dev/null +++ b/docs/developer-docs/6.0.x/tasks/management.mdx @@ -0,0 +1,223 @@ +--- +id: mk20cz91 +title: Management +description: Task Management +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to list available task definitions? +- How to trigger tasks via GraphQL? +- How to monitor task execution and logs? +- How to abort running tasks? +- How to trigger tasks programmatically via code? + +</Alert> + +## Overview + +Once you've created background tasks, you need to manage them - trigger execution, monitor progress, view logs, and abort tasks when needed. System provides two ways to manage tasks: + +1. **GraphQL API** - Use GraphQL queries and mutations to manage tasks from your frontend applications or external tools +2. **Programmatic API** - Trigger tasks directly from your backend code using the `TaskService` + +### What You Can Do + +- **List available task definitions** - See all registered background tasks in your system +- **Trigger task execution** - Start a task with custom input parameters +- **Monitor task runs** - Check status, iterations, start/finish times, and results +- **View task logs** - Debug issues by reviewing detailed execution logs +- **Abort running tasks** - Stop tasks that are running too long or are no longer needed + +## Management of Tasks via GraphQL + +### List Available Task Definitions + +Use this query to see all registered background tasks in your system. Each definition includes the task ID, title, and description you defined when creating the task. + +```graphql +query ListTaskDefinitions { + backgroundTasks { + listDefinitions { + data { + id + title + description + } + error { + message + code + data + stack + } + } + } +} +``` + +### List All Task Runs + +Use this query to see all task executions. Each task run includes its status, timestamps, iterations, input/output data, and more. This helps you monitor task progress and troubleshoot issues. + +```graphql +query ListTasks { + backgroundTasks { + listTasks { + data { + id + startedOn + finishedOn + name + definitionId + iterations + parentId + executionName + eventResponse + taskStatus + input + output + # ...more fields available + } + error { + message + code + data + stack + } + } + } +} +``` + +### List All Task Logs + +Use this query to view detailed execution logs for debugging. You can filter logs by task ID to see what happened during a specific task execution. Logs include messages, timestamps, types, and error details. + +```graphql +query ListBackgroundTaskLogs { + backgroundTasks { + listLogs(where: { + # you can list logs from a certain task if you like + task: "yourTaskId" + }) { + data { + id + createdOn + executionName + iteration + items { + message + createdOn + type + data + error + } + } + } + } +} +``` + +### Trigger a Task + +Use this mutation to start a task execution with custom input parameters. The task will be queued and executed asynchronously. You can track its progress using the task ID returned in the response. + +```graphql +mutation TriggerATask { + backgroundTasks { + triggerTask(definition: testingRun, input: { + someVariableForTestingRunTaskToReceive: "someValue", + yetAnotherVariableForTestingRunTaskToReceive: "anotherValue" + }) { + data { + id + definitionId + executionName + eventResponse + taskStatus + input + # ... more fields available + } + error { + message + code + data + stack + } + } + } +} +``` + +### Abort a Task + +Use this mutation to stop a running task. Provide the task ID and optionally a message explaining why the task is being aborted. The task will stop at the next safe checkpoint. + +```graphql +mutation AbortATask { + backgroundTasks { + # message is optional + abortTask(id: "yourTaskId", message: "My Reason for aborting the task") { + data { + id + createdOn + savedOn + startedOn + finishedOn + definitionId + iterations + name + input + output + # ... more fields available + } + error { + message + code + data + stack + } + } + } +} +``` + +## Managing via Code + +### Triggering a Task Programmatically + +Use the `TaskService` to trigger tasks directly from your backend code. This is useful when you need to start background tasks as part of your application logic, such as after a user action or during a scheduled process. You can specify the task definition ID, custom input data, delay, parent task relationship, and a display name. + +```typescript +import { TaskService } from "webiny/api/tasks"; +const service = // resolved TaskService + +const result = service.trigger({ + definition: "aTaskDefinitionId", + delay: 0, + parent: { + id: "parentTaskId" + }, + name: "My Task", + input: { + some: "data", + for: "the task" + } +}); +``` + +### Aborting a Task Programmatically + +Use the `TaskService` to abort a running task from your backend code. This is useful when you need to stop tasks programmatically based on application state or business logic. Provide the task ID and optionally a message explaining why the task is being aborted. + +```typescript +import { TaskService } from "webiny/api/tasks"; +const service = // resolved TaskService + +const result = service.abort({ + id: "taskIdToAbort", + message: "Optional reason for aborting the task" +}); +``` diff --git a/docs/developer-docs/6.0.x/tasks/reference.ai.txt b/docs/developer-docs/6.0.x/tasks/reference.ai.txt new file mode 100644 index 000000000..de1100fb1 --- /dev/null +++ b/docs/developer-docs/6.0.x/tasks/reference.ai.txt @@ -0,0 +1,101 @@ +AI Context: Background Tasks - Reference (tasks/reference.mdx) + +Source of Information: +1. Analyzed code examples showing background task implementation +2. Examined the task runner pattern with context and controller +3. Studied the ITasks interface and its methods +4. Reviewed task definition, triggering, and execution patterns +5. Understood the event-driven architecture with onBefore/onAfter hooks + +Key Documentation Decisions: +- Comprehensive reference documentation covering all aspects +- Explained the three main components: Runner, Context, Controller +- Documented task definition structure +- Showed how to trigger tasks +- Explained task execution flow +- Included event handlers (onBeforeRun, onAfterRun) +- Added task management operations (get, list, update, delete) +- Used practical examples throughout +- Maintained junior-friendly explanations while being technically complete + +Main Sections: +1. Task Definition - Structure and properties (id, name, input, etc.) +2. Triggering Tasks - Using context.tasks.trigger() +3. Task Execution - Runner pattern with iterate() and run() +4. Task Context - Available properties and methods +5. Task Controller - Control flow (abort, success, error, status) +6. Event Handlers - Lifecycle hooks +7. Task Management - CRUD operations + +Pattern Observed: +- Tasks defined with name and input +- Triggered via context.tasks.trigger() +- Executed by runners using iterate() pattern +- Context provides access to task data and operations +- Controller manages task status and output +- Result pattern used throughout + +Note: Document was refined after user feedback to ensure reader understand all concepts (async, iteration, controllers, triggering, etc.) + +Related Documents: +- tasks/about.mdx - Conceptual introduction +- tasks/management.mdx - Task CRUD operations +- All event-handler/*.mdx files use similar patterns + +Task Runner Pattern to Follow: +```typescript +export const MyTaskRunner = { + async iterate(context) { + const tasks = await context.tasks.getTasks({ name: "myTask" }); + return tasks; + }, + async run(task, context, controller) { + logger.info("Running task", { taskId: task.id }); + + // Process task + const result = await doWork(task.input); + + if (result.isFail()) { + return controller.error(result.error); + } + + return controller.success(result.value); + } +}; +``` + +Task Triggering Pattern: +```typescript +const result = await context.tasks.trigger({ + name: "myTask", + input: { data: "value" } +}); +``` + +Task Definition Structure: +- id: string (auto-generated) +- name: string (task type identifier) +- input: any (task-specific data) +- status: "pending" | "success" | "failed" | "aborted" +- output: any (result data) +- error: any (error information) + +Common Patterns: +1. Use iterate() to find tasks to process +2. Use run() to execute individual tasks +3. Controller methods: success(), error(), abort(), status() +4. Always use logger for debugging +5. Handle errors gracefully + +Reader Notes: +- Tasks are async operations outside HTTP cycle +- Runner.iterate() finds tasks to process +- Runner.run() processes one task +- Controller manages task status +- Context provides access to task operations + +Tone Guidelines: +- Explain concepts clearly +- Provide complete examples +- Show the full lifecycle (define → trigger → execute) + diff --git a/docs/developer-docs/6.0.x/tasks/reference.mdx b/docs/developer-docs/6.0.x/tasks/reference.mdx new file mode 100644 index 000000000..0cb4552ae --- /dev/null +++ b/docs/developer-docs/6.0.x/tasks/reference.mdx @@ -0,0 +1,183 @@ +--- +id: b5h5l7x0 +title: Reference +description: Tasks Reference +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to create your own background tasks? +- How to implement the `TaskDefinition` interface? +- How to handle task lifecycle hooks? +- How to validate task input parameters? +- How to control task execution and handle errors? + +</Alert> + +## Overview + +Tasks in the system allow you to execute long-running operations asynchronously without blocking the main request-response cycle. By implementing the `TaskDefinition.Interface` and registering it with `TaskDefinition.createImplementation()`, you can create custom background tasks that handle complex operations like batch processing, data migrations, or bulk actions. + +A task definition includes: + +- **Task metadata** - Unique ID, title, description, and configuration options (max iterations, logging, visibility) +- **Main execution method** - The `run()` method that processes the task with input/output type safety +- **Runtime control** - Check execution status with `controller.runtime.isAborted()` and `controller.runtime.isCloseToTimeout()` +- **Lifecycle hooks** - Methods triggered at different stages: `onBeforeTrigger`, `onDone`, `onError`, `onAbort`, and `onMaxIterations` +- **Input validation** - Schema-based validation using the `createInputValidation()` method +- **Dependency injection** - Access to use cases and services through `createImplementation()` + +The `TaskDefinition` namespace provides all the necessary types for implementing your task, while `TaskDefinition.createImplementation()` handles the registration with dependency injection. The task controller provides runtime control methods to check if execution should be aborted or is close to timeout, and response methods to return different task states: + +- **`controller.response.done()`** - Task completed successfully +- **`controller.response.continue()`** - Task needs to continue in the next iteration (useful for long-running operations) +- **`controller.response.error()`** - Task failed with an error +- **`controller.response.aborted()`** - Task was manually aborted + +This pattern keeps background tasks modular, testable, and easy to monitor. + +## Usage Example + +```typescript +import { TaskDefinition } from "webiny/api/tasks"; +import { GetModelUseCase } from "webiny/api/cms/model"; +import { PublishEntryUseCase } from "webiny/api/cms/entry"; + +interface Input { + model: string; + list: string[]; + last?: string; +} + +interface OutputItem { + id: string; + error?: string; +} +interface Output { + list: OutputItem[]; +} + +class PublishEntriesBackgroundTask implements TaskDefinition.Interface { + // id of a task - must be unique across the entire system + public readonly id = "publishEntriesBackgroundTask"; + // title of the task - to be displayed in a list of tasks + public readonly title = "Publish Entries Task"; + // description of the task - a brief explanation of what the task does + public readonly description = "A background task to publish CMS entries."; + // maximum number of iterations before the task goes into the error state + public readonly maxIterations = 100; + // disable logging + public readonly disableDatabaseLogs = true; + // make the task private so it doesn't show publicly (graphql api, etc...) + public readonly isPrivate = true; + + public constructor( + private getModel: GetModelUseCase.Interface, + private publishEntry: PublishEntryUseCase.Interface + ) {} + /** + * On each task run, this method is called with the input parameters. + * The method must return one of the TaskDefinition.Result types. + */ + public async run({ + input, + controller + }: TaskDefinition.RunParams<Input, Output>): Promise<TaskDefinition.Result<Input, Output>> { + const { model, list } = input; + + const modelResult = await this.getModel.execute(model); + if (modelResult.isFail()) { + return controller.response.error(modelResult.error); + } + const cmsModel = modelResult.value; + + const results: OutputItem[] = []; + let last = input.last; + const startList = last ? list.slice(list.indexOf(last) + 1) : list; + + for (const entryId of startList) { + if (controller.runtime.isAborted()) { + return controller.response.aborted(); + } else if (controller.runtime.isCloseToTimeout()) { + return controller.response.continue({ + ...input, + last + }); + } + + last = entryId; + + try { + const publishEntryResult = await this.publishEntry.execute(cmsModel, entryId); + if (publishEntryResult.isFail()) { + results.push({ + id: entryId, + error: publishEntryResult.error.message + }); + continue; + } + results.push({ + id: entryId + }); + } catch (ex) { + results.push({ + id: entryId, + error: ex.message + }); + } + } + return controller.response.done({ + list: results + }); + } + /** + * Before the task is triggered, this method is called. + * Users can do some preparation or checks here and break the execution by throwing an error. + */ + public async onBeforeTrigger(params: TaskDefinition.BeforeTriggerParams<Input>): Promise<void> { + // + } + /** + * When the task ends with a done status, this method is called. + */ + public async onDone(params: TaskDefinition.LifecycleHookParams<Input, Output>): Promise<void> { + // + } + /** + * When the task ends with an error status, this method is called. + */ + public async onError(params: TaskDefinition.LifecycleHookParams<Input, Output>): Promise<void> { + // + } + /** + * When the task ends with an abort status, this method is called. + */ + public async onAbort(params: TaskDefinition.LifecycleHookParams<Input, Output>): Promise<void> { + // + } + /** + * When the maximum number of iterations is reached, this method is called. + */ + public async onMaxIterations( + params: TaskDefinition.LifecycleHookParams<Input, Output> + ): Promise<void> { + // + } + /** + * A method to create input validation schema based on the input interface. + */ + public createInputValidation({ validator }: TaskDefinition.CreateInputValidationParams) { + return validator.object({ + model: validator.string().min(1), + list: validator.array(validator.string()).min(1).max(10000) + }); + } +} + +export default TaskDefinition.createImplementation({ + implementation: PublishEntriesBackgroundTask, + dependencies: [GetModelUseCase, PublishEntryUseCase] +}); +``` diff --git a/docs/developer-docs/6.0.x/tenant-manager/extend-tenant-model.mdx b/docs/developer-docs/6.0.x/tenant-manager/extend-tenant-model.mdx new file mode 100644 index 000000000..53ba82590 --- /dev/null +++ b/docs/developer-docs/6.0.x/tenant-manager/extend-tenant-model.mdx @@ -0,0 +1,95 @@ +--- +id: c4e5667a +title: Extend the Tenant Model +description: Learn how to add custom fields to the tenant model +--- + +import { Alert } from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to add custom fields to the tenant model + +</Alert> + +The `TenantModelExtension` allows you to add custom fields to the Tenant model. These fields are stored under the `tenant.extensions` object — you cannot add fields to the root of the model. Once added, these fields automatically appear in the Tenant form in the Admin UI, as well as in the GraphQL schema. + +## Create an Extension + +Import the `TenantModelExtension` and implement the `execute` method. The `extension` parameter provides two methods: `fields()` and `layout()`. + +```ts +import { TenantModelExtension as ModelExtension } from "webiny/api/tenant-manager"; + +class TenantModelExtension implements ModelExtension.Interface { + execute(extension: ModelExtension.Extension) { + extension + .fields(fields => ({ + websiteTitle: fields + .text() + .label("Website Title") + .description("Enter a website title") + .renderer("text-input"), + primaryColor: fields + .text() + .label("Primary Color") + .description("Enter a color code (e.g., #000000)") + .renderer("text-input") + .defaultValue(""), + additionalColors: fields + .text() + .list() + .label("Additional Colors") + .description("Enter a color code (e.g., #000000)") + .defaultValue([]) + .renderer("text-inputs"), + font: fields + .text() + .label("Font") + .description("Select a font") + .renderer("radio-buttons") + .predefinedValues([ + { value: "InterVariable, sans-serif", label: "Inter" }, + { value: "Menlo, Consolas, Monaco, monospace", label: "Menlo" }, + { value: "Roboto, sans-serif", label: "Roboto" } + ]) + })) + .layout([["websiteTitle"], ["primaryColor"], ["additionalColors"], ["font"]]); + } +} + +export default ModelExtension.createImplementation({ + implementation: TenantModelExtension, + dependencies: [] +}); +``` + +## Register Your Extension + +Register your extension in `webiny.config.tsx`: + +```tsx +import React from "react"; +import { Api } from "webiny/extensions"; + +export const Extensions = () => { + return ( + <> + {/* Your extensions here */} + <Api.Extension src={"@/extensions/TenantModelExtension.ts"} /> + </> + ); +}; +``` + +## How It Works + +The Tenant model has an `extensions` field. Every `TenantModelExtension` implementation adds its fields as nested fields within that `extensions` object. This means: + +- Your fields are stored at `tenant.extensions.yourFieldName`. +- You cannot add fields to the root of the Tenant model — only inside `extensions`. +- All fields added via extensions automatically render in the Tenant form in the Admin UI, and are added to the GraphQL schema. + +--- + +For all the available field types, visit a dedicated article on [CMS model fields](/docs/{version}/headless-cms/builder/field). diff --git a/docs/developer-docs/6.0.x/tenant-manager/manage-tenants.mdx b/docs/developer-docs/6.0.x/tenant-manager/manage-tenants.mdx new file mode 100644 index 000000000..12b3eaa22 --- /dev/null +++ b/docs/developer-docs/6.0.x/tenant-manager/manage-tenants.mdx @@ -0,0 +1,344 @@ +--- +id: 17d4de88 +title: Tenant Management via GraphQL API +description: Learn how to manage tenants within system via the GraphQL API +--- + +import { Alert } from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to create, install, and suspend tenants using the GraphQL API + +</Alert> + +This guide covers the core tenant management operations available through the GraphQL API. + +## Prerequisites + +- Access to your GraphQL API endpoint +- Valid API token with Tenant Manager permissions + +## Mutations + +All tenant operations are available under the `tenantManager` field in the root `Mutation` type: + +```graphql +mutation { + tenantManager { + # operations here + } +} +``` + +--- + +## Create Tenant + +Creates a new tenant in the system. + +### Input + +```graphql +input CreateTenantInput { + id: ID + name: String! + description: String +} +``` + +**Fields:** + +- `id` (optional) - Custom tenant ID. If not provided, one will be generated automatically +- `name` (required) - Display name for the tenant +- `description` (optional) - Tenant description + +### Request + +```graphql +mutation CreateTenant($input: CreateTenantInput!) { + tenantManager { + createTenant(input: $input) { + data + error { + message + code + } + } + } +} +``` + +### Variables + +```json +{ + "input": { + "name": "Acme Corporation", + "description": "Main tenant for Acme Corp" + } +} +``` + +### Response + +```json +{ + "data": { + "tenantManager": { + "createTenant": { + "data": true, + "error": null + } + } + } +} +``` + +--- + +## Install Tenant + +Installs and provisions a tenant with default settings and configurations. + +### Input + +- `tenantId` (required) - ID of the tenant to install + +### Request + +```graphql +mutation InstallTenant($tenantId: ID!) { + tenantManager { + installTenant(tenantId: $tenantId) { + data + error { + message + code + } + } + } +} +``` + +### Variables + +```json +{ + "tenantId": "root" +} +``` + +### Response + +```json +{ + "data": { + "tenantManager": { + "installTenant": { + "data": true, + "error": null + } + } + } +} +``` + +--- + +## Disable Tenant + +Disables a tenant, preventing access to its resources. + +### Input + +- `tenantId` (required) - ID of the tenant to disable + +### Request + +```graphql +mutation DisableTenant($tenantId: ID!) { + tenantManager { + disableTenant(tenantId: $tenantId) { + data + error { + message + code + } + } + } +} +``` + +### Variables + +```json +{ + "tenantId": "acme-corp" +} +``` + +### Response + +```json +{ + "data": { + "tenantManager": { + "disableTenant": { + "data": true, + "error": null + } + } + } +} +``` + +--- + +## Enable Tenant + +Re-enables a previously disabled tenant. + +### Input + +- `tenantId` (required) - ID of the tenant to enable + +### Request + +```graphql +mutation EnableTenant($tenantId: ID!) { + tenantManager { + enableTenant(tenantId: $tenantId) { + data + error { + message + code + } + } + } +} +``` + +### Variables + +```json +{ + "tenantId": "acme-corp" +} +``` + +### Response + +```json +{ + "data": { + "tenantManager": { + "enableTenant": { + "data": true, + "error": null + } + } + } +} +``` + +--- + +## Error Handling + +All mutations return a `BooleanResponse` type with the following structure: + +```graphql +type BooleanResponse { + data: Boolean + error: Error +} + +type Error { + message: String + code: String + data: JSON +} +``` + +When an operation fails, check the `error` field for details: + +```json +{ + "data": { + "tenantManager": { + "createTenant": { + "data": null, + "error": { + "message": "Tenant with this name already exists", + "code": "TENANT_EXISTS" + } + } + } + } +} +``` + +--- + +## Complete Example + +Here's a complete workflow for creating and setting up a new tenant: + +```javascript +// 1. Create the tenant +const createResult = await graphqlClient.mutate({ + mutation: gql` + mutation CreateTenant($input: CreateTenantInput!) { + tenantManager { + createTenant(input: $input) { + data + error { + message + code + } + } + } + } + `, + variables: { + input: { + id: "acme-corp", + name: "Acme Corporation", + description: "Production tenant for Acme Corp" + } + } +}); + +if (createResult.data.tenantManager.createTenant.error) { + console.error("Failed to create tenant:", createResult.data.tenantManager.createTenant.error); + return; +} + +// 2. Install the tenant (requires admin privileges) +const installResult = await graphqlClient.mutate({ + mutation: gql` + mutation InstallTenant($tenantId: ID!) { + tenantManager { + installTenant(tenantId: $tenantId) { + data + error { + message + code + } + } + } + } + `, + variables: { + tenantId: "acme-corp" + } +}); + +if (installResult.data.tenantManager.installTenant.error) { + console.error("Failed to install tenant:", installResult.data.tenantManager.installTenant.error); + return; +} + +console.log("Tenant created and installed successfully"); +``` diff --git a/docs/developer-docs/6.0.x/website-builder/event-handler/pages.ai.txt b/docs/developer-docs/6.0.x/website-builder/event-handler/pages.ai.txt new file mode 100644 index 000000000..0e79d53e3 --- /dev/null +++ b/docs/developer-docs/6.0.x/website-builder/event-handler/pages.ai.txt @@ -0,0 +1,121 @@ +AI Context: Page Event Handlers (website-builder/event-handler/pages.mdx) + +Source of Information: +1. Analyzed existing page event handler implementations +2. Examined the event handler patterns (before/after create, update, delete, publish, unpublish) +3. Studied page-specific validation and business logic +4. Followed the pattern established in CMS event handlers + +Key Documentation Decisions: +- Document all page lifecycle events +- Follow the established event handler pattern (logger, Result) +- Include page-specific validations (URL paths, SEO, templates) +- Show practical examples for each event type +- Demonstrate integration points +- Cover publishing workflow +- Include error handling patterns + +Events Documented: +1. Before Create - Validation before page creation (URL validation, template checks) +2. After Create - Post-creation actions (indexing, cache warming) +3. Before Update - Validation before updates (URL conflicts, breaking changes) +4. After Update - Post-update actions (cache invalidation) +5. Before Delete - Authorization and dependency checks +6. After Delete - Cleanup operations (remove from index) +7. Before Publish - Pre-publish validation (required fields, SEO) +8. After Publish - Post-publish actions (CDN invalidation, sitemap update) +9. Before Unpublish - Pre-unpublish checks +10. After Unpublish - Post-unpublish cleanup + +Pattern Used: +- Logger from @webiny/api/logger +- Result pattern for validation errors +- Page-specific validation logic +- URL path validation +- SEO checks +- Template validation +- Publishing workflow integration + +Page-Specific Validations: +- URL path format and conflicts +- SEO metadata completeness +- Template existence +- Required field validation +- Publishing prerequisites + +Related Documents: +- headless-cms/event-handler/entry.mdx - Similar lifecycle pattern +- website-builder/use-case/pages.mdx - Use case integration +- website-builder/event-handler/redirects.mdx - Related website builder events + +Key Code Locations: +- Logger import: @webiny/api/logger +- Result import: @webiny/feature/api +- Page types and interfaces in the codebase + +To examine source code implementations in detail, access to the Webiny project repository is needed. + +Page Event Handler Pattern: +```typescript +import { logger } from "@webiny/api/logger"; +import { Result } from "@webiny/feature/api"; + +export const PageBeforeCreateEventHandler = async ({ page, context }) => { + logger.info("Before creating page", { pageId: page.id }); + + // URL validation + if (!page.path.startsWith("/")) { + return Result.fail(new ValidationError("Page path must start with /")); + } + + // Check for URL conflicts + const existing = await context.pages.getByPath(page.path); + if (existing) { + return Result.fail(new ValidationError("Page with this path already exists")); + } + + // Template validation + if (!await context.templates.exists(page.templateId)) { + return Result.fail(new ValidationError("Template does not exist")); + } +}; +``` + +Page-Specific Validations: +1. URL path format and conflicts +2. SEO metadata completeness +3. Template existence +4. Required field validation +5. Publishing prerequisites (SEO, content complete) + +Publishing Workflow Events: +- Before Publish: Validate SEO, content, prerequisites +- After Publish: CDN invalidation, sitemap update, notifications +- Before Unpublish: Check dependencies +- After Unpublish: Cache cleanup + +Events to Document: +1. Before Create - URL, template validation +2. After Create - Indexing, cache warming +3. Before Update - URL conflicts, breaking changes +4. After Update - Cache invalidation +5. Before Delete - Authorization, dependencies +6. After Delete - Index removal +7. Before Publish - SEO, completeness checks +8. After Publish - CDN, sitemap updates +9. Before Unpublish - Pre-checks +10. After Unpublish - Cleanup + +Common Patterns: +1. Validate URL paths (format, conflicts) +2. Check template existence +3. Validate SEO requirements before publish +4. Invalidate caches after changes +5. Update external systems (CDN, sitemap) + +Tone Guidelines: +- Show page-specific validations +- Include publishing workflow examples +- Explain integration points (CDN, sitemap) +- Production-ready patterns + diff --git a/docs/developer-docs/6.0.x/website-builder/event-handler/pages.mdx b/docs/developer-docs/6.0.x/website-builder/event-handler/pages.mdx new file mode 100644 index 000000000..a5199721d --- /dev/null +++ b/docs/developer-docs/6.0.x/website-builder/event-handler/pages.mdx @@ -0,0 +1,372 @@ +--- +id: k2slf5hu +title: Page Event Handlers +description: Page Event Handlers +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- Which event handlers are available for pages? +- How to hook into page lifecycle events? +- How to modify page data before operations? +- How to react to page operations after they occur? + +</Alert> + +## Overview + +Website Builder provides event handlers that allow you to hook into various page lifecycle operations. These handlers let you modify page data before operations occur (using "Before" handlers) or react to completed operations (using "After" handlers). + +Event handlers are available for all page operations: create, update, delete, publish, unpublish, duplicate, move, and revision creation. + +## On Before Page Create + +```typescript +import { PageBeforeCreateHandler } from "webiny/api/website-builder/page"; +import { MyCustomPageModifier } from "./MyCustomPageModifier.js"; + +class OnPageBeforeCreateHandler implements PageBeforeCreateHandler.Interface { + public constructor(private modifier: MyCustomPageModifier.Interface) {} + + public async handle(params: PageBeforeCreateHandler.Event) { + const { payload } = params; + const page = payload.input; + await this.modifier.execute({ + input: page + }); + } +} + +export default PageBeforeCreateHandler.createImplementation({ + implementation: OnPageBeforeCreateHandler, + dependencies: [MyCustomPageModifier] +}); +``` + +## On After Page Create + +```typescript +import { PageAfterCreateHandler } from "webiny/api/website-builder/page"; +import { Logger } from "webiny/api/logger"; + +class OnPageAfterCreateHandler implements PageAfterCreateHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: PageAfterCreateHandler.Event) { + const { payload } = params; + this.logger.info("Page created", { page: payload.page }); + } +} + +export default PageAfterCreateHandler.createImplementation({ + implementation: OnPageAfterCreateHandler, + dependencies: [Logger] +}); +``` + +## On Before Page Create Revision From + +```typescript +import { PageBeforeCreateRevisionFromHandler } from "webiny/api/website-builder/page"; +import { MyCustomPageModifier } from "./MyCustomPageModifier.js"; + +class OnPageBeforeCreateRevisionFromHandler implements PageBeforeCreateRevisionFromHandler.Interface { + public constructor(private modifier: MyCustomPageModifier.Interface) {} + + public async handle(params: PageBeforeCreateRevisionFromHandler.Event) { + const { payload } = params; + const page = payload.input; + await this.modifier.execute({ + input: page + }); + } +} + +export default PageBeforeCreateRevisionFromHandler.createImplementation({ + implementation: OnPageBeforeCreateRevisionFromHandler, + dependencies: [MyCustomPageModifier] +}); +``` + +## On After Page Create Revision From + +```typescript +import { PageAfterCreateRevisionFromHandler } from "webiny/api/website-builder/page"; +import { Logger } from "webiny/api/logger"; + +class OnPageAfterCreateRevisionFromHandler implements PageAfterCreateRevisionFromHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: PageAfterCreateRevisionFromHandler.Event) { + const { payload } = params; + this.logger.info("Page revision created", { page: payload.page }); + } +} + +export default PageAfterCreateRevisionFromHandler.createImplementation({ + implementation: OnPageAfterCreateRevisionFromHandler, + dependencies: [Logger] +}); +``` + + +## On Before Page Update + +```typescript +import { PageBeforeUpdateHandler } from "webiny/api/website-builder/page"; +import { MyCustomPageModifier } from "./MyCustomPageModifier.js"; + +class OnPageBeforeUpdateHandler implements PageBeforeUpdateHandler.Interface { + public constructor(private modifier: MyCustomPageModifier.Interface) {} + + public async handle(params: PageBeforeUpdateHandler.Event) { + const { payload } = params; + const page = payload.input; + await this.modifier.execute({ + input: page + }); + } +} + +export default PageBeforeUpdateHandler.createImplementation({ + implementation: OnPageBeforeUpdateHandler, + dependencies: [MyCustomPageModifier] +}); +``` + +## On After Page Update + +```typescript +import { PageAfterUpdateHandler } from "webiny/api/website-builder/page"; +import { Logger } from "webiny/api/logger"; + +class OnPageAfterUpdateHandler implements PageAfterUpdateHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: PageAfterUpdateHandler.Event) { + const { payload } = params; + this.logger.info("Page updated", { page: payload.page }); + } +} + +export default PageAfterUpdateHandler.createImplementation({ + implementation: OnPageAfterUpdateHandler, + dependencies: [Logger] +}); +``` + +## On Before Page Delete + +```typescript +import { PageBeforeDeleteHandler } from "webiny/api/website-builder/page"; +import { Logger } from "webiny/api/logger"; + +class OnPageBeforeDeleteHandler implements PageBeforeDeleteHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: PageBeforeDeleteHandler.Event) { + const { payload } = params; + this.logger.info("Trying to delete page", { page: payload.page }); + } +} + +export default PageBeforeDeleteHandler.createImplementation({ + implementation: OnPageBeforeDeleteHandler, + dependencies: [Logger] +}); +``` + +## On After Page Delete + +```typescript +import { PageAfterDeleteHandler } from "webiny/api/website-builder/page"; +import { Logger } from "webiny/api/logger"; + +class OnPageAfterDeleteHandler implements PageAfterDeleteHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: PageAfterDeleteHandler.Event) { + const { payload } = params; + this.logger.info("Page deleted", { page: payload.page }); + } +} + +export default PageAfterDeleteHandler.createImplementation({ + implementation: OnPageAfterDeleteHandler, + dependencies: [Logger] +}); +``` + +## On Before Page Duplicate + +```typescript +import { PageBeforeDuplicateHandler } from "webiny/api/website-builder/page"; +import { MyCustomPageModifier } from "./MyCustomPageModifier.js"; + +class OnPageBeforeDuplicateHandler implements PageBeforeDuplicateHandler.Interface { + public constructor(private modifier: MyCustomPageModifier.Interface) {} + + public async handle(params: PageBeforeDuplicateHandler.Event) { + const { payload } = params; + const page = payload.input; + await this.modifier.execute({ + input: page + }); + } +} + +export default PageBeforeDuplicateHandler.createImplementation({ + implementation: OnPageBeforeDuplicateHandler, + dependencies: [MyCustomPageModifier] +}); +``` + +## On After Page Duplicate + +```typescript +import { PageAfterDuplicateHandler } from "webiny/api/website-builder/page"; +import { Logger } from "webiny/api/logger"; + +class OnPageAfterDuplicateHandler implements PageAfterDuplicateHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: PageAfterDuplicateHandler.Event) { + const { payload } = params; + this.logger.info("Page duplicated", { page: payload.page }); + } +} + +export default PageAfterDuplicateHandler.createImplementation({ + implementation: OnPageAfterDuplicateHandler, + dependencies: [Logger] +}); +``` + +## On Before Page Move + +```typescript +import { PageBeforeMoveHandler } from "webiny/api/website-builder/page"; +import { Logger } from "webiny/api/logger"; + +class OnPageBeforeMoveHandler implements PageBeforeMoveHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: PageBeforeMoveHandler.Event) { + const { payload } = params; + this.logger.info("Trying to move page", { page: payload.page }); + } +} + +export default PageBeforeMoveHandler.createImplementation({ + implementation: OnPageBeforeMoveHandler, + dependencies: [Logger] +}); +``` + +## On After Page Move + +```typescript +import { PageAfterMoveHandler } from "webiny/api/website-builder/page"; +import { Logger } from "webiny/api/logger"; + +class OnPageAfterMoveHandler implements PageAfterMoveHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: PageAfterMoveHandler.Event) { + const { payload } = params; + this.logger.info("Page moved", { page: payload.page }); + } +} + +export default PageAfterMoveHandler.createImplementation({ + implementation: OnPageAfterMoveHandler, + dependencies: [Logger] +}); +``` + +## On Before Page Publish + +```typescript +import { PageBeforePublishHandler } from "webiny/api/website-builder/page"; +import { Logger } from "webiny/api/logger"; + +class OnPageBeforePublishHandler implements PageBeforePublishHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: PageBeforePublishHandler.Event) { + const { payload } = params; + this.logger.info("Trying to publish page", { page: payload.page }); + } +} + +export default PageBeforePublishHandler.createImplementation({ + implementation: OnPageBeforePublishHandler, + dependencies: [Logger] +}); +``` + +## On After Page Publish + +```typescript +import { PageAfterPublishHandler } from "webiny/api/website-builder/page"; +import { Logger } from "webiny/api/logger"; + +class OnPageAfterPublishHandler implements PageAfterPublishHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: PageAfterPublishHandler.Event) { + const { payload } = params; + this.logger.info("Page published", { page: payload.page }); + } +} + +export default PageAfterPublishHandler.createImplementation({ + implementation: OnPageAfterPublishHandler, + dependencies: [Logger] +}); +``` + +## On Before Page Unpublish + +```typescript +import { PageBeforeUnpublishHandler } from "webiny/api/website-builder/page"; +import { Logger } from "webiny/api/logger"; + +class OnPageBeforeUnpublishHandler implements PageBeforeUnpublishHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: PageBeforeUnpublishHandler.Event) { + const { payload } = params; + this.logger.info("Trying to unpublish page", { page: payload.page }); + } +} + +export default PageBeforeUnpublishHandler.createImplementation({ + implementation: OnPageBeforeUnpublishHandler, + dependencies: [Logger] +}); +``` + +## On After Page Unpublish + +```typescript +import { PageAfterUnpublishHandler } from "webiny/api/website-builder/page"; +import { Logger } from "webiny/api/logger"; + +class OnPageAfterUnpublishHandler implements PageAfterUnpublishHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: PageAfterUnpublishHandler.Event) { + const { payload } = params; + this.logger.info("Page unpublished", { page: payload.page }); + } +} + +export default PageAfterUnpublishHandler.createImplementation({ + implementation: OnPageAfterUnpublishHandler, + dependencies: [Logger] +}); +``` + diff --git a/docs/developer-docs/6.0.x/website-builder/event-handler/redirects.ai.txt b/docs/developer-docs/6.0.x/website-builder/event-handler/redirects.ai.txt new file mode 100644 index 000000000..dcec0c6cb --- /dev/null +++ b/docs/developer-docs/6.0.x/website-builder/event-handler/redirects.ai.txt @@ -0,0 +1,123 @@ +AI Context: Redirect Event Handlers (website-builder/event-handler/redirects.mdx) + +Source of Information: +1. Analyzed existing redirect event handler implementations +2. Examined redirect lifecycle events (create, update, delete) +3. Studied redirect-specific validation (URLs, status codes, patterns) +4. Followed the established event handler pattern + +Key Documentation Decisions: +- Document all redirect lifecycle events +- Follow the established event handler pattern (logger, Result) +- Include redirect-specific validations (URL format, status codes, circular redirects) +- Show practical examples for each event type +- Demonstrate validation patterns +- Cover error handling + +Events Documented: +1. Before Create - Validation before redirect creation (URL format, status code, circular redirect check) +2. After Create - Post-creation actions (cache invalidation, logging) +3. Before Update - Validation before updates (breaking changes, conflicts) +4. After Update - Post-update actions (cache refresh) +5. Before Delete - Authorization checks +6. After Delete - Cleanup operations (cache invalidation) + +Pattern Used: +- Logger from @webiny/api/logger +- Result pattern for validation errors +- Redirect-specific validation logic +- URL format validation +- Status code validation (301, 302, 307, 308) +- Circular redirect detection +- Pattern matching validation + +Redirect-Specific Validations: +- Source URL format +- Target URL validation +- Valid HTTP status codes +- Circular redirect prevention +- Wildcard pattern validation +- Duplicate redirect checks + +Related Documents: +- website-builder/event-handler/pages.mdx - Similar website builder patterns +- website-builder/use-case/redirects.mdx - Use case integration + +Key Code Locations: +- Logger import: @webiny/api/logger +- Result import: @webiny/feature/api +- Redirect types and interfaces in the codebase + +To examine source code implementations in detail, access to the Webiny project repository is needed. + +Redirect Event Handler Pattern: +```typescript +import { logger } from "@webiny/api/logger"; +import { Result } from "@webiny/feature/api"; + +export const RedirectBeforeCreateEventHandler = async ({ redirect, context }) => { + logger.info("Before creating redirect", { + source: redirect.source, + target: redirect.target + }); + + // URL format validation + if (!redirect.source.startsWith("/")) { + return Result.fail(new ValidationError("Source must start with /")); + } + + // Status code validation + const validCodes = [301, 302, 307, 308]; + if (!validCodes.includes(redirect.statusCode)) { + return Result.fail(new ValidationError("Invalid status code")); + } + + // Circular redirect detection + const wouldCreateCircular = await checkCircular(redirect, context); + if (wouldCreateCircular) { + return Result.fail(new ValidationError("Would create circular redirect")); + } +}; +``` + +Redirect-Specific Validations: +1. Source URL format (must start with /) +2. Target URL validation +3. Valid HTTP status codes (301, 302, 307, 308) +4. Circular redirect detection +5. Wildcard pattern validation +6. Duplicate redirect checks + +Status Codes: +- 301: Permanent redirect +- 302: Temporary redirect +- 307: Temporary redirect (preserves method) +- 308: Permanent redirect (preserves method) + +Events to Document: +1. Before Create - URL format, status code, circular check +2. After Create - Cache invalidation, logging +3. Before Update - Validation of changes, conflict check +4. After Update - Cache refresh +5. Before Delete - Authorization +6. After Delete - Cache cleanup + +Common Patterns: +1. Validate URL formats +2. Check status code validity +3. Detect circular redirects +4. Prevent duplicate redirects +5. Invalidate caches on changes + +Circular Redirect Detection: +```typescript +// Check if source would redirect to itself through chain +// A → B → A (circular) +``` + +Tone Guidelines: +- Focus on redirect-specific concerns +- Explain status codes +- Show circular detection logic +- Production validation patterns + diff --git a/docs/developer-docs/6.0.x/website-builder/event-handler/redirects.mdx b/docs/developer-docs/6.0.x/website-builder/event-handler/redirects.mdx new file mode 100644 index 000000000..0c4a752fe --- /dev/null +++ b/docs/developer-docs/6.0.x/website-builder/event-handler/redirects.mdx @@ -0,0 +1,225 @@ +--- +id: nagmhubo +title: Redirect Event Handlers +description: Redirect Event Handlers +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- Which event handlers are available for redirects? +- How to hook into redirect lifecycle events? +- How to modify redirect data before operations? +- How to react to redirect operations after they occur? + +</Alert> + +## Overview + +Website Builder provides event handlers that allow you to hook into various redirect lifecycle operations. These handlers let you modify redirect data before operations occur (using "Before" handlers) or react to completed operations (using "After" handlers). + +Event handlers are available for all redirect operations: create, update, delete, and move. + +## On Before Redirect Create + +```typescript +import { RedirectBeforeCreateHandler } from "webiny/api/website-builder/redirect"; +import { Logger } from "webiny/api/logger"; + +class OnRedirectBeforeCreateHandler implements RedirectBeforeCreateHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: RedirectBeforeCreateHandler.Event) { + const { payload, occurredAt, eventType } = params; + this.logger.info("Trying to create a redirect:", { + input: payload.input, + occurredAt, + eventType + }); + } +} + +export default RedirectBeforeCreateHandler.createImplementation({ + implementation: OnRedirectBeforeCreateHandler, + dependencies: [Logger] +}); +``` + +## On After Redirect Create + +```typescript +import { RedirectAfterCreateHandler } from "webiny/api/website-builder/redirect"; +import { Logger } from "webiny/api/logger"; + +class OnRedirectAfterCreateHandler implements RedirectAfterCreateHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: RedirectAfterCreateHandler.Event) { + const { payload, occurredAt, eventType } = params; + this.logger.info("Created a redirect:", { + redirect: payload.redirect, + occurredAt, + eventType + }); + } +} + +export default RedirectAfterCreateHandler.createImplementation({ + implementation: OnRedirectAfterCreateHandler, + dependencies: [Logger] +}); +``` + +## On Before Redirect Update + +```typescript +import { RedirectBeforeUpdateHandler } from "webiny/api/website-builder/redirect"; +import { Logger } from "webiny/api/logger"; + +class OnRedirectBeforeUpdateHandler implements RedirectBeforeUpdateHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: RedirectBeforeUpdateHandler.Event) { + const { payload, occurredAt, eventType } = params; + this.logger.info("Trying to update a redirect:", { + original: payload.original, + input: payload.input, + occurredAt, + eventType + }); + } +} + +export default RedirectBeforeUpdateHandler.createImplementation({ + implementation: OnRedirectBeforeUpdateHandler, + dependencies: [Logger] +}); +``` + +## On After Redirect Update + +```typescript +import { RedirectAfterUpdateHandler } from "webiny/api/website-builder/redirect"; +import { Logger } from "webiny/api/logger"; + +class OnRedirectAfterUpdateHandler implements RedirectAfterUpdateHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: RedirectAfterUpdateHandler.Event) { + const { payload, occurredAt, eventType } = params; + this.logger.info("Updated a redirect:", { + redirect: payload.redirect, + occurredAt, + eventType + }); + } +} + +export default RedirectAfterUpdateHandler.createImplementation({ + implementation: OnRedirectAfterUpdateHandler, + dependencies: [Logger] +}); +``` + +## On Before Redirect Delete + +```typescript +import { RedirectBeforeDeleteHandler } from "webiny/api/website-builder/redirect"; +import { Logger } from "webiny/api/logger"; + +class OnRedirectBeforeDeleteHandler implements RedirectBeforeDeleteHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: RedirectBeforeDeleteHandler.Event) { + const { payload, occurredAt, eventType } = params; + this.logger.info("Trying to delete a redirect:", { + redirect: payload.redirect, + occurredAt, + eventType + }); + } +} + +export default RedirectBeforeDeleteHandler.createImplementation({ + implementation: OnRedirectBeforeDeleteHandler, + dependencies: [Logger] +}); +``` + +## On After Redirect Delete + +```typescript +import { RedirectAfterDeleteHandler } from "webiny/api/website-builder/redirect"; +import { Logger } from "webiny/api/logger"; + +class OnRedirectAfterDeleteHandler implements RedirectAfterDeleteHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: RedirectAfterDeleteHandler.Event) { + const { payload, occurredAt, eventType } = params; + this.logger.info("Deleted a redirect:", { + redirect: payload.redirect, + occurredAt, + eventType + }); + } +} + +export default RedirectAfterDeleteHandler.createImplementation({ + implementation: OnRedirectAfterDeleteHandler, + dependencies: [Logger] +}); +``` + +## On Before Redirect Move + +```typescript +import { RedirectBeforeMoveHandler } from "webiny/api/website-builder/redirect"; +import { Logger } from "webiny/api/logger"; + +class OnRedirectBeforeMoveHandler implements RedirectBeforeMoveHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: RedirectBeforeMoveHandler.Event) { + const { payload, occurredAt, eventType } = params; + this.logger.info("Trying to move a redirect:", { + redirect: payload.redirect, + folderId: payload.folderId, + occurredAt, + eventType + }); + } +} + +export default RedirectBeforeMoveHandler.createImplementation({ + implementation: OnRedirectBeforeMoveHandler, + dependencies: [Logger] +}); +``` + +## On After Redirect Move + +```typescript +import { RedirectAfterMoveHandler } from "webiny/api/website-builder/redirect"; +import { Logger } from "webiny/api/logger"; + +class OnRedirectAfterMoveHandler implements RedirectAfterMoveHandler.Interface { + public constructor(private logger: Logger.Interface) {} + + public async handle(params: RedirectAfterMoveHandler.Event) { + const { payload, occurredAt, eventType } = params; + this.logger.info("Moved a redirect:", { + redirect: payload.redirect, + occurredAt, + eventType + }); + } +} + +export default RedirectAfterMoveHandler.createImplementation({ + implementation: OnRedirectAfterMoveHandler, + dependencies: [Logger] +}); +``` + diff --git a/docs/developer-docs/6.0.x/website-builder/use-case/pages.ai.txt b/docs/developer-docs/6.0.x/website-builder/use-case/pages.ai.txt new file mode 100644 index 000000000..c08f1928c --- /dev/null +++ b/docs/developer-docs/6.0.x/website-builder/use-case/pages.ai.txt @@ -0,0 +1,107 @@ +AI Context: Page Use Cases (website-builder/use-case/pages.mdx) + +Source of Information: +1. Analyzed page use case implementations (create, update, delete, publish, unpublish, get, list) +2. Examined the use case pattern and structure +3. Studied page-specific business logic and validations +4. Reviewed repository integration patterns + +Key Documentation Decisions: +- Document all page-related use cases +- Follow the established use case pattern from CMS documentation +- Show abstraction and implementation patterns +- Include page-specific business logic +- Demonstrate publishing workflow integration +- Cover CRUD and publishing operations +- Include error handling with Result pattern + +Use Cases Documented: +1. Create Page - Create new pages with validation +2. Update Page - Modify existing pages +3. Delete Page - Remove pages with dependency checks +4. Get Page - Retrieve single page +5. List Pages - Query multiple pages with filters +6. Publish Page - Make page public with validation +7. Unpublish Page - Remove page from public view +8. Clone Page - Duplicate existing pages + +Pattern Used: +- Interface definition +- Error types (validation, authorization, repository, publishing errors) +- createAbstraction call +- Namespace export with all types +- createImplementation pattern +- Repository dependency injection +- Result pattern for error handling +- Page-specific validation (URL, template, SEO) +- Publishing workflow logic + +Page-Specific Logic: +- URL path validation and conflict resolution +- Template validation +- SEO metadata validation +- Publishing prerequisites check +- Version management +- Draft/published state management + +Related Documents: +- headless-cms/use-case/entry.mdx - Similar use case patterns +- headless-cms/use-case/model.mdx - Use case structure reference +- website-builder/event-handler/pages.mdx - Event integration +- basic/di.mdx - Abstraction creation patterns +- basic/result.mdx - Result pattern usage + +Key Code Locations: +- Use case implementations: extensions/websiteBuilder/pages/useCase/ +- Event handlers: extensions/websiteBuilder/pages/eventHandler/ +- Abstraction pattern references in CMS use cases + +To examine source code implementations in detail, access to the Webiny project repository is needed. + +Use Case Structure to Follow: +```typescript +// 1. Define interface +export interface ICreatePageUseCase { + execute(input: Input): Promise<Result<Page, Error>>; +} + +// 2. Define errors +export interface ICreatePageUseCaseErrors { + validation: ValidationError; + authorization: AuthorizationError; +} +type UseCaseError = ICreatePageUseCaseErrors[keyof ICreatePageUseCaseErrors]; + +// 3. Create abstraction +export const CreatePageUseCase = createAbstraction<ICreatePageUseCase>("WebsiteBuilder/CreatePage"); + +// 4. Export namespace with everything +export namespace CreatePageUseCase { + export type Interface = ICreatePageUseCase; + export type Input = CreatePageInput; + export type Error = UseCaseError; + export type Return = Promise<Result<Page, UseCaseError>>; +} + +// 5. Create implementation +export const createPageUseCase = CreatePageUseCase.createImplementation({ + async execute(input) { + // implementation + } +}); +``` + +Common Patterns: +1. Follow the 5-step structure above +2. Use namespace for all type exports +3. Inject dependencies via createImplementation +4. Validate in use cases, persist in repositories +5. Trigger events where appropriate +6. Always use Result pattern + +Tone Guidelines: +- Technical and precise +- Show complete patterns +- Include page-specific validations +- Reference actual implementation files + diff --git a/docs/developer-docs/6.0.x/website-builder/use-case/pages.mdx b/docs/developer-docs/6.0.x/website-builder/use-case/pages.mdx new file mode 100644 index 000000000..125dc8cb6 --- /dev/null +++ b/docs/developer-docs/6.0.x/website-builder/use-case/pages.mdx @@ -0,0 +1,599 @@ +--- +id: ph98paes +title: Page Use Cases +description: Use cases for pages in the Website Builder. +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- How to create custom page use cases? +- How to wrap existing page use cases? +- How to handle page operations with proper error handling? +- How to use the Result pattern with page use cases? + +</Alert> + +## Overview + +Website Builder provides use cases for all page operations. You can create custom use cases that wrap the built-in use cases to add your own business logic, validation, or error handling. + +All examples show how to create an abstraction, implement it by wrapping the use case, and handle results properly using the Result pattern. + +## Create Page + +```typescript abstractions.ts +import { createAbstraction } from "webiny/api"; +import type { CreatePageUseCase } from "webiny/api/website-builder/page"; + +export interface ICreatePageParams { + input: CreatePageUseCase.Params; +} + +export type ICreatePageReturn = Promise<CreatePageUseCase.Page>; + +export interface ICreatePage { + execute(params: ICreatePageParams): ICreatePageReturn; +} + +export const CreatePage = createAbstraction<ICreatePage>("CreatePage"); + +export namespace CreatePage { + export type Interface = ICreatePage; + export type Params = ICreatePageParams; + export type Return = ICreatePageReturn; +} +``` + +```typescript implementation.ts +import { CreatePageUseCase } from "webiny/api/website-builder/page"; +import { CreatePage } from "./abstractions.js"; + +class CreatePageImpl implements CreatePage.Interface { + constructor(private createPageUseCase: CreatePageUseCase.Interface) {} + + async execute({ input }: CreatePage.Params): CreatePage.Return { + const result = await this.createPageUseCase.execute(input); + if (result.isFail()) { + throw result.error; + } + return result.value; + } +} + +export default CreatePage.createImplementation({ + implementation: CreatePageImpl, + dependencies: [CreatePageUseCase] +}); +``` + +## Create Revision From + +```typescript abstractions.ts +import { createAbstraction } from "webiny/api"; +import type { CreatePageRevisionFromUseCase } from "webiny/api/website-builder/page"; + +export interface ICreatePageRevisionFromParams { + input: CreatePageRevisionFromUseCase.Params; +} + +export type ICreatePageRevisionFromReturn = Promise<CreatePageRevisionFromUseCase.Page>; + +export interface ICreatePageRevisionFrom { + execute(params: ICreatePageRevisionFromParams): ICreatePageRevisionFromReturn; +} + +export const CreatePageRevisionFrom = createAbstraction<ICreatePageRevisionFrom>("CreatePageRevisionFrom"); + +export namespace CreatePageRevisionFrom { + export type Interface = ICreatePageRevisionFrom; + export type Params = ICreatePageRevisionFromParams; + export type Return = ICreatePageRevisionFromReturn; +} +``` + +```typescript implementation.ts +import { CreatePageRevisionFromUseCase } from "webiny/api/website-builder/page"; +import { CreatePageRevisionFrom } from "./abstractions.js"; + +class CreatePageRevisionFromImpl implements CreatePageRevisionFrom.Interface { + constructor(private createPageRevisionFromUseCase: CreatePageRevisionFromUseCase.Interface) {} + + async execute({ input }: CreatePageRevisionFrom.Params): CreatePageRevisionFrom.Return { + const result = await this.createPageRevisionFromUseCase.execute(input); + if (result.isFail()) { + throw result.error; + } + return result.value; + } +} + +export default CreatePageRevisionFrom.createImplementation({ + implementation: CreatePageRevisionFromImpl, + dependencies: [CreatePageRevisionFromUseCase] +}); +``` + +## Update Page + +```typescript abstractions.ts +import { createAbstraction } from "webiny/api"; +import type { UpdatePageUseCase } from "webiny/api/website-builder/page"; + +export interface IUpdatePageParams { + id: string; + data: UpdatePageUseCase.UpdateData; +} + +export type IUpdatePageReturn = Promise<UpdatePageUseCase.Page>; + +export interface IUpdatePage { + execute(params: IUpdatePageParams): IUpdatePageReturn; +} + +export const UpdatePage = createAbstraction<IUpdatePage>("UpdatePage"); + +export namespace UpdatePage { + export type Interface = IUpdatePage; + export type Params = IUpdatePageParams; + export type Return = IUpdatePageReturn; +} +``` + +```typescript implementation.ts +import { UpdatePageUseCase } from "webiny/api/website-builder/page"; +import { UpdatePage } from "./abstractions.js"; + +class UpdatePageImpl implements UpdatePage.Interface { + constructor(private updatePageUseCase: UpdatePageUseCase.Interface) {} + + async execute({ id, data }: UpdatePage.Params): UpdatePage.Return { + const result = await this.updatePageUseCase.execute(id, data); + if (result.isFail()) { + throw result.error; + } + return result.value; + } +} + +export default UpdatePage.createImplementation({ + implementation: UpdatePageImpl, + dependencies: [UpdatePageUseCase] +}); +``` + +## Delete Page + +```typescript abstractions.ts +import { createAbstraction } from "webiny/api"; + +export interface IDeletePageParams { + id: string; +} + +export type IDeletePageReturn = Promise<void>; + +export interface IDeletePage { + execute(params: IDeletePageParams): IDeletePageReturn; +} + +export const DeletePage = createAbstraction<IDeletePage>("DeletePage"); + +export namespace DeletePage { + export type Interface = IDeletePage; + export type Params = IDeletePageParams; + export type Return = IDeletePageReturn; +} +``` + +```typescript implementation.ts +import { DeletePageUseCase } from "webiny/api/website-builder/page"; +import { DeletePage } from "./abstractions.js"; + +class DeletePageImpl implements DeletePage.Interface { + constructor(private deletePageUseCase: DeletePageUseCase.Interface) {} + + async execute({ id }: DeletePage.Params): DeletePage.Return { + const result = await this.deletePageUseCase.execute({ + id + }); + if (result.isFail()) { + throw result.error; + } + } +} + +export default DeletePage.createImplementation({ + implementation: DeletePageImpl, + dependencies: [DeletePageUseCase] +}); +``` + +## Publish Page + +```typescript abstractions.ts +import { createAbstraction } from "webiny/api"; +import type { PublishPageUseCase } from "webiny/api/website-builder/page"; + +export interface IPublishPageParams { + id: string; +} + +export type IPublishPageReturn = Promise<PublishPageUseCase.Page>; + +export interface IPublishPage { + execute(params: IPublishPageParams): IPublishPageReturn; +} + +export const PublishPage = createAbstraction<IPublishPage>("PublishPage"); + +export namespace PublishPage { + export type Interface = IPublishPage; + export type Params = IPublishPageParams; + export type Return = IPublishPageReturn; +} +``` + +```typescript implementation.ts +import { PublishPageUseCase } from "webiny/api/website-builder/page"; +import { PublishPage } from "./abstractions.js"; + +class PublishPageImpl implements PublishPage.Interface { + constructor(private publishPageUseCase: PublishPageUseCase.Interface) {} + + async execute({ id }: PublishPage.Params): PublishPage.Return { + const result = await this.publishPageUseCase.execute({ + id + }); + if (result.isFail()) { + throw result.error; + } + return result.value; + } +} + +export default PublishPage.createImplementation({ + implementation: PublishPageImpl, + dependencies: [PublishPageUseCase] +}); +``` + +## Unpublish Page + +```typescript abstractions.ts +import { createAbstraction } from "webiny/api"; +import type { UnpublishPageUseCase } from "webiny/api/website-builder/page"; + +export interface IUnpublishPageParams { + id: string; +} + +export type IUnpublishPageReturn = Promise<UnpublishPageUseCase.Page>; + +export interface IUnpublishPage { + execute(params: IUnpublishPageParams): IUnpublishPageReturn; +} + +export const UnpublishPage = createAbstraction<IUnpublishPage>("UnpublishPage"); + +export namespace UnpublishPage { + export type Interface = IUnpublishPage; + export type Params = IUnpublishPageParams; + export type Return = IUnpublishPageReturn; +} +``` + +```typescript implementation.ts +import { UnpublishPageUseCase } from "webiny/api/website-builder/page"; +import { UnpublishPage } from "./abstractions.js"; + +class UnpublishPageImpl implements UnpublishPage.Interface { + constructor(private unpublishPageUseCase: UnpublishPageUseCase.Interface) {} + + async execute({ id }: UnpublishPage.Params): UnpublishPage.Return { + const result = await this.unpublishPageUseCase.execute({ + id + }); + if (result.isFail()) { + throw result.error; + } + return result.value; + } +} + +export default UnpublishPage.createImplementation({ + implementation: UnpublishPageImpl, + dependencies: [UnpublishPageUseCase] +}); +``` + +## Duplicate Page + +```typescript abstractions.ts +import { createAbstraction } from "webiny/api"; +import type { DuplicatePageUseCase } from "webiny/api/website-builder/page"; + +export interface IDuplicatePageParams { + id: string; +} + +export type IDuplicatePageReturn = Promise<DuplicatePageUseCase.Page>; + +export interface IDuplicatePage { + execute(params: IDuplicatePageParams): IDuplicatePageReturn; +} + +export const DuplicatePage = createAbstraction<IDuplicatePage>("DuplicatePage"); + +export namespace DuplicatePage { + export type Interface = IDuplicatePage; + export type Params = IDuplicatePageParams; + export type Return = IDuplicatePageReturn; +} +``` + +```typescript implementation.ts +import { DuplicatePageUseCase } from "webiny/api/website-builder/page"; +import { DuplicatePage } from "./abstractions.js"; + +class DuplicatePageImpl implements DuplicatePage.Interface { + constructor(private duplicatePageUseCase: DuplicatePageUseCase.Interface) {} + + async execute({ id }: DuplicatePage.Params): DuplicatePage.Return { + const result = await this.duplicatePageUseCase.execute({ + id + }); + if (result.isFail()) { + throw result.error; + } + return result.value; + } +} + +export default DuplicatePage.createImplementation({ + implementation: DuplicatePageImpl, + dependencies: [DuplicatePageUseCase] +}); +``` + +## Move Page + +```typescript abstractions.ts +import { createAbstraction } from "webiny/api"; +import type { MovePageUseCase } from "webiny/api/website-builder/page"; + +export interface IMovePageParams { + id: string; + folderId: string; +} + +export type IMovePageReturn = Promise<MovePageUseCase.Page>; + +export interface IMovePage { + execute(params: IMovePageParams): IMovePageReturn; +} + +export const MovePage = createAbstraction<IMovePage>("MovePage"); + +export namespace MovePage { + export type Interface = IMovePage; + export type Params = IMovePageParams; + export type Return = IMovePageReturn; +} +``` + +```typescript implementation.ts +import { MovePageUseCase } from "webiny/api/website-builder/page"; +import { MovePage } from "./abstractions.js"; + +class MovePageImpl implements MovePage.Interface { + constructor(private movePageUseCase: MovePageUseCase.Interface) {} + + async execute({ id, folderId }: MovePage.Params): MovePage.Return { + const result = await this.movePageUseCase.execute({ + id, + folderId + }); + if (result.isFail()) { + throw result.error; + } + return result.value; + } +} + +export default MovePage.createImplementation({ + implementation: MovePageImpl, + dependencies: [MovePageUseCase] +}); +``` + +## Get Page By ID + +```typescript abstractions.ts +import { createAbstraction } from "webiny/api"; +import type { GetPageByIdUseCase } from "webiny/api/website-builder/page"; + +export interface IGetPageByIdParams { + id: string; +} + +export type IGetPageByIdReturn = Promise<GetPageByIdUseCase.Page | null>; + +export interface IGetPageById { + execute(params: IGetPageByIdParams): IGetPageByIdReturn; +} + +export const GetPageById = createAbstraction<IGetPageById>("GetPageById"); + +export namespace GetPageById { + export type Interface = IGetPageById; + export type Params = IGetPageByIdParams; + export type Return = IGetPageByIdReturn; +} +``` + +```typescript implementation.ts +import { GetPageByIdUseCase } from "webiny/api/website-builder/page"; +import { GetPageById } from "./abstractions.js"; + +class GetPageByIdImpl implements GetPageById.Interface { + constructor(private getPageByIdUseCase: GetPageByIdUseCase.Interface) {} + + async execute({ id }: GetPageById.Params): GetPageById.Return { + const result = await this.getPageByIdUseCase.execute(id); + if (result.isFail()) { + return null; + } + return result.value; + } +} + +export default GetPageById.createImplementation({ + implementation: GetPageByIdImpl, + dependencies: [GetPageByIdUseCase] +}); +``` + +## Get Page By Path + +```typescript abstractions.ts +import { createAbstraction } from "webiny/api"; +import type { GetPageByPathUseCase } from "webiny/api/website-builder/page"; + +export interface IGetPageByPathParams { + path: string; +} + +export type IGetPageByPathReturn = Promise<GetPageByPathUseCase.Page | null>; + +export interface IGetPageByPath { + execute(params: IGetPageByPathParams): IGetPageByPathReturn; +} + +export const GetPageByPath = createAbstraction<IGetPageByPath>("GetPageByPath"); + +export namespace GetPageByPath { + export type Interface = IGetPageByPath; + export type Params = IGetPageByPathParams; + export type Return = IGetPageByPathReturn; +} +``` + +```typescript implementation.ts +import { GetPageByPathUseCase } from "webiny/api/website-builder/page"; +import { GetPageByPath } from "./abstractions.js"; + +class GetPageByPathImpl implements GetPageByPath.Interface { + constructor(private getPageByPathUseCase: GetPageByPathUseCase.Interface) {} + + async execute({ path }: GetPageByPath.Params): GetPageByPath.Return { + const result = await this.getPageByPathUseCase.execute(path); + if (result.isFail()) { + return null; + } + return result.value; + } +} + +export default GetPageByPath.createImplementation({ + implementation: GetPageByPathImpl, + dependencies: [GetPageByPathUseCase] +}); +``` + +## Get Page Revisions + +```typescript abstractions.ts +import { createAbstraction } from "webiny/api"; +import type { GetPageRevisionsUseCase } from "webiny/api/website-builder/page"; + +export interface IGetPageRevisionsParams { + id: string; +} + +export type IGetPageRevisionsReturn = Promise<GetPageRevisionsUseCase.Page[]>; + +export interface IGetPageRevisions { + execute(params: IGetPageRevisionsParams): IGetPageRevisionsReturn; +} + +export const GetPageRevisions = createAbstraction<IGetPageRevisions>("GetPageRevisions"); + +export namespace GetPageRevisions { + export type Interface = IGetPageRevisions; + export type Params = IGetPageRevisionsParams; + export type Return = IGetPageRevisionsReturn; +} +``` + +```typescript implementation.ts +import { GetPageRevisionsUseCase } from "webiny/api/website-builder/page"; +import { GetPageRevisions } from "./abstractions.js"; + +class GetPageRevisionsImpl implements GetPageRevisions.Interface { + constructor(private getPageRevisionsUseCase: GetPageRevisionsUseCase.Interface) {} + + async execute({ id }: GetPageRevisions.Params): GetPageRevisions.Return { + const result = await this.getPageRevisionsUseCase.execute(id); + if (result.isFail()) { + return []; + } + return result.value; + } +} + +export default GetPageRevisions.createImplementation({ + implementation: GetPageRevisionsImpl, + dependencies: [GetPageRevisionsUseCase] +}); +``` + +## List Pages + +```typescript abstractions.ts +import { createAbstraction, Result } from "webiny/api"; +import type { ListPagesUseCase } from "webiny/api/website-builder/page"; + +export interface IListPagesParams { + params: ListPagesUseCase.Params; +} + +export type IListPagesReturn = Promise<Result.UnwrapResult<ListPagesUseCase.Return>>; + +export interface IListPages { + execute(params: IListPagesParams): IListPagesReturn; +} + +export const ListPages = createAbstraction<IListPages>("ListPages"); + +export namespace ListPages { + export type Interface = IListPages; + export type Params = IListPagesParams; + export type Return = IListPagesReturn; +} +``` + +```typescript implementation.ts +import { ListPagesUseCase } from "webiny/api/website-builder/page"; +import { ListPages } from "./abstractions.js"; + +class ListPagesImpl implements ListPages.Interface { + constructor(private listPagesUseCase: ListPagesUseCase.Interface) {} + + async execute({ params }: ListPages.Params): ListPages.Return { + const result = await this.listPagesUseCase.execute({ + ...params + }); + if (result.isFail()) { + throw result.error; + } + return result.value; + } +} + +export default ListPages.createImplementation({ + implementation: ListPagesImpl, + dependencies: [ListPagesUseCase] +}); +``` diff --git a/docs/developer-docs/6.0.x/website-builder/use-case/redirects.ai.txt b/docs/developer-docs/6.0.x/website-builder/use-case/redirects.ai.txt new file mode 100644 index 000000000..0f67c6dc0 --- /dev/null +++ b/docs/developer-docs/6.0.x/website-builder/use-case/redirects.ai.txt @@ -0,0 +1,135 @@ +AI Context: Redirect Use Cases (website-builder/use-case/redirects.mdx) + +Source of Information: +1. Analyzed redirect use case implementations +2. Examined redirect use cases (create, update, delete, get, list) +3. Studied redirect-specific business logic and validations +4. Followed the established use case pattern from CMS and pages documentation +5. Understood redirect management requirements + +Key Documentation Decisions: +- Document all redirect-related use cases +- Follow the established use case pattern +- Show abstraction and implementation patterns +- Include redirect-specific validation logic +- Demonstrate URL pattern matching +- Cover CRUD operations +- Include error handling with Result pattern + +Use Cases Documented: +1. Create Redirect - Create new redirects with validation +2. Update Redirect - Modify existing redirects +3. Delete Redirect - Remove redirects +4. Get Redirect - Retrieve single redirect +5. List Redirects - Query multiple redirects with filters + +Pattern Used: +- Interface definition +- Error types (validation, authorization, repository errors) +- createAbstraction call +- Namespace export with all types +- createImplementation pattern +- Repository dependency injection +- Result pattern for error handling +- Redirect-specific validation (URL format, status codes, circular redirects) + +Redirect-Specific Logic: +- Source URL validation +- Target URL validation +- HTTP status code validation (301, 302, 307, 308) +- Circular redirect detection +- Wildcard pattern validation +- Duplicate redirect prevention +- URL normalization + +Related Documents: +- website-builder/use-case/pages.mdx - Page use cases (similar pattern) +- website-builder/event-handler/redirects.mdx - Redirect events +- headless-cms/use-case/entry.mdx - Use case pattern reference +- basic/di.mdx - Abstraction patterns + +Key Code Locations: +- Use case implementations: extensions/websiteBuilder/redirects/useCase/ +- Event handlers: extensions/websiteBuilder/redirects/eventHandler/ + +To examine source code implementations in detail, access to the Webiny project repository is needed. + +Redirect Use Case Pattern: +```typescript +// 1. Interface +export interface ICreateRedirectUseCase { + execute(input: CreateRedirectInput): Promise<Result<Redirect, UseCaseError>>; +} + +// 2. Errors +export interface ICreateRedirectUseCaseErrors { + validation: RedirectValidationError; + authorization: RedirectAuthorizationError; + repository: RepositoryError; +} +type UseCaseError = ICreateRedirectUseCaseErrors[keyof ICreateRedirectUseCaseErrors]; + +// 3. Abstraction +export const CreateRedirectUseCase = createAbstraction<ICreateRedirectUseCase>("WebsiteBuilder/CreateRedirect"); + +// 4. Namespace +export namespace CreateRedirectUseCase { + export type Interface = ICreateRedirectUseCase; + export type Input = CreateRedirectInput; + export type Error = UseCaseError; + export type Return = Promise<Result<Redirect, UseCaseError>>; +} +``` + +Use Cases to Document: +1. Create Redirect - New redirect with validation +2. Update Redirect - Modify existing redirect +3. Delete Redirect - Remove redirect +4. Get Redirect - Retrieve single redirect +5. List Redirects - Query with filters + +Redirect-Specific Validations: +```typescript +// URL format +if (!input.source.startsWith("/")) { + return Result.fail(new ValidationError("Source must start with /")); +} + +// Status code validation +const validCodes = [301, 302, 307, 308]; +if (!validCodes.includes(input.statusCode)) { + return Result.fail(new ValidationError("Invalid status code")); +} + +// Circular redirect detection +const circular = await detectCircular(input.source, input.target, context); +if (circular) { + return Result.fail(new ValidationError("Circular redirect detected")); +} + +// Duplicate check +const existing = await repository.getBySource(input.source); +if (existing.isOk()) { + return Result.fail(new ValidationError("Redirect already exists")); +} +``` + +HTTP Status Codes: +- 301: Permanent redirect (SEO juice transfer) +- 302: Temporary redirect (no SEO transfer) +- 307: Temporary redirect (preserve method) +- 308: Permanent redirect (preserve method) + +Common Patterns: +1. URL normalization +2. Wildcard pattern validation +3. Circular redirect prevention +4. Duplicate detection +5. Cache invalidation after changes + +Tone Guidelines: +- Follow established use case pattern +- Show redirect-specific validations +- Explain status code implications +- Include circular detection logic + diff --git a/docs/developer-docs/6.0.x/website-builder/use-case/redirects.mdx b/docs/developer-docs/6.0.x/website-builder/use-case/redirects.mdx new file mode 100644 index 000000000..8f51fa7e3 --- /dev/null +++ b/docs/developer-docs/6.0.x/website-builder/use-case/redirects.mdx @@ -0,0 +1,17 @@ +--- +id: feejfk3z +title: Redirect Use Cases +description: Use cases for redirects in the Website Builder. +--- + +import {Alert} from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- TBD + +</Alert> + +## Overview + +TBD diff --git a/docs/developer-docs/shared/release-management/branching-strategy.mdx b/docs/developer-docs/shared/release-management/branching-strategy.mdx index 00c1c7e54..60258ec0e 100644 --- a/docs/developer-docs/shared/release-management/branching-strategy.mdx +++ b/docs/developer-docs/shared/release-management/branching-strategy.mdx @@ -45,4 +45,4 @@ Notice the green **sync commits**, they're necessary to pull in the files modifi The strategies described in this article should make releases more predictable, upgrades more reliable, and our users more confident when they do get to upgrading their projects. -If you're interested in test-driving the latest unstable features of Webiny, the ones that live in the `next` branch, read the article about [unstable releases](/docs/release-management/unstable-releases). +If you're interested in test-driving the latest unstable features of Webiny, the ones that live in the `next` branch, read the article about [unstable releases](/docs/{version}/release-management/unstable-releases). diff --git a/docs/developer-docs/shared/release-management/unstable-releases.mdx b/docs/developer-docs/shared/release-management/unstable-releases.mdx index b609811fc..87f7c8dea 100644 --- a/docs/developer-docs/shared/release-management/unstable-releases.mdx +++ b/docs/developer-docs/shared/release-management/unstable-releases.mdx @@ -12,7 +12,7 @@ description: Learn how to install and test unstable features. ## Overview -As described in the [Branching Strategy](/docs/release-management/branching-strategy) article, features that are scheduled to be released in the next quarterly release are published under the `unstable` tag to NPM. If you're interested in taking that release for a spin, follow the instructions below. +As described in the [Branching Strategy](/docs/{version}/release-management/branching-strategy) article, features that are scheduled to be released in the next quarterly release are published under the `unstable` tag to NPM. If you're interested in taking that release for a spin, follow the instructions below. ## Setup the Unstable Release diff --git a/docs/messages/missing-stack-output.mdx b/docs/messages/missing-stack-output.mdx index 6bb125ba2..df4506e4b 100644 --- a/docs/messages/missing-stack-output.mdx +++ b/docs/messages/missing-stack-output.mdx @@ -5,7 +5,7 @@ title: Could not assign required environment variables. API project application' import stackOutputSuccess from "./assets/stack-output-success.png"; -Looks like you wanted to start the **Admin** or **Website** app locally via the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command. But, upon doing that, the required environment variables that define values like the GraphQL API URL, or Amazon Cognito User Pool Client ID, could not be assigned. +Looks like you wanted to start the **Admin** or **Website** app locally via the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command. But, upon doing that, the required environment variables that define values like the GraphQL API URL, or Amazon Cognito User Pool Client ID, could not be assigned. Because of this, your locally running app will not be able to communicate with Webiny's backend services like its GraphQL API, and you will see errors in the console. diff --git a/docs/release-notes/5.10.0/changelog.mdx b/docs/release-notes/5.10.0/changelog.mdx index c1bb3319e..77335b2e6 100644 --- a/docs/release-notes/5.10.0/changelog.mdx +++ b/docs/release-notes/5.10.0/changelog.mdx @@ -74,15 +74,15 @@ From now on, files whose content didn't change simply won't be uploaded. This wi <Alert type="info" title="Project Applications"> -Learn more about project applications and project organization in general, in the [Project Applications and Packages](/docs/core-development-concepts/project-organization/project-applications-and-packages) key topic. +Learn more about project applications and project organization in general, in the [Project Applications and Packages](/docs/{version}/core-development-concepts/project-organization/project-applications-and-packages) key topic. </Alert> ### Improved Existing Scaffolds ([#1739](https://github.com/webiny/webiny-js/pull/1739)) -A couple of minor fixes and improvements were made to the [scaffolding utilities](/docs/core-development-concepts/scaffolding/introduction), introduced in the previous [Webiny 5.9.0](/docs/release-notes/5.9.0/changelog) release. +A couple of minor fixes and improvements were made to the [scaffolding utilities](/docs/{version}/core-development-concepts/scaffolding/introduction), introduced in the previous [Webiny 5.9.0](/docs/release-notes/5.9.0/changelog) release. -For example, if you already had the chance to use the [Extend GraphQL API](/docs/core-development-concepts/scaffolding/extend-graphql-api) scaffold, you might notice that the default location in which the application code is generated has been changed: +For example, if you already had the chance to use the [Extend GraphQL API](/docs/{version}/core-development-concepts/scaffolding/extend-graphql-api) scaffold, you might notice that the default location in which the application code is generated has been changed: ```bash # Previously, all of the application code would be generated within the following path: diff --git a/docs/release-notes/5.10.0/upgrade-guide.mdx b/docs/release-notes/5.10.0/upgrade-guide.mdx index 84469b212..b888e82fc 100644 --- a/docs/release-notes/5.10.0/upgrade-guide.mdx +++ b/docs/release-notes/5.10.0/upgrade-guide.mdx @@ -78,6 +78,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="success"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.11.0/changelog.mdx b/docs/release-notes/5.11.0/changelog.mdx index 95de22911..fe75b8645 100644 --- a/docs/release-notes/5.11.0/changelog.mdx +++ b/docs/release-notes/5.11.0/changelog.mdx @@ -46,7 +46,7 @@ Shout out to [Karthick Raja](https://github.com/karthick3018) for getting the ba From now on, all new Webiny projects will benefit from improved security, due to fine-grained policies used with AWS Lambda roles (instead of using the default `AdministratorAccess` policy, which was previously the case). -In addition to that, you can also use a fine-grained policy for the [CLI user](/docs/infrastructure/aws/configure-aws-credentials#deploy-webiny-project-aws-cloud-formation-template), which is important for making secure deploys of your Webiny project. +In addition to that, you can also use a fine-grained policy for the [CLI user](/docs/{version}/infrastructure/aws/configure-aws-credentials#deploy-webiny-project-aws-cloud-formation-template), which is important for making secure deploys of your Webiny project. At the moment, for existing projects we don’t offer a migration path, but if you’re interested in applying this improvement to your Webiny project, you can contact us via our community [Slack](https://webiny.com/slack). @@ -54,7 +54,7 @@ At the moment, for existing projects we don’t offer a migration path, but if y ### Pulumi v3 Upgrade ([#1787](https://github.com/webiny/webiny-js/pull/1787)) -From now on, all Webiny projects will use [Pulumi](/docs/infrastructure/pulumi-iac/iac-with-pulumi) v3. +From now on, all Webiny projects will use [Pulumi](/docs/{version}/infrastructure/pulumi-iac/iac-with-pulumi) v3. For Webiny users, this will make it possible to have access to all of the new features and fixes that the framework will receive in the future. @@ -66,7 +66,7 @@ A couple of useful updates were made to the existing CI/CD scaffold. <Alert type="success"> -Learn more about CI/CD and how to set it up for your Webiny project in our [CI/CD key topics](/docs/core-development-concepts/ci-cd/introduction). +Learn more about CI/CD and how to set it up for your Webiny project in our [CI/CD key topics](/docs/{version}/core-development-concepts/ci-cd/introduction). </Alert> diff --git a/docs/release-notes/5.11.0/upgrade-guide.mdx b/docs/release-notes/5.11.0/upgrade-guide.mdx index a720fb81d..f8991a9bf 100644 --- a/docs/release-notes/5.11.0/upgrade-guide.mdx +++ b/docs/release-notes/5.11.0/upgrade-guide.mdx @@ -67,7 +67,7 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="success"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> @@ -81,11 +81,11 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product </Alert> -As mentioned in the [changelog](/docs/release-notes/5.11.0/changelog), from the 5.11.0 release, all Webiny projects will use [Pulumi](/docs/infrastructure/pulumi-iac/iac-with-pulumi) v3. +As mentioned in the [changelog](/docs/release-notes/5.11.0/changelog), from the 5.11.0 release, all Webiny projects will use [Pulumi](/docs/{version}/infrastructure/pulumi-iac/iac-with-pulumi) v3. In terms of existing projects and upgrading, there shouldn't be any major changes or extra steps that you'll need to perform. But, there are a couple of things to have in mind. -Once you've run the above shown `webiny upgrade` command, the existing Pulumi CLI should automatically be removed from your project. And, upon redeploying your Webiny project (using the [`webiny deploy`](/docs/core-development-concepts/basics/project-deployment) command), the new Pulumi CLI should be downloaded and installed, again automatically. +Once you've run the above shown `webiny upgrade` command, the existing Pulumi CLI should automatically be removed from your project. And, upon redeploying your Webiny project (using the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command), the new Pulumi CLI should be downloaded and installed, again automatically. Furthermore, during the first deployment, in case you didn't make any changes that would affect the deployment, you should only see a change in `provider` for each cloud infrastructure resource: diff --git a/docs/release-notes/5.11.1/upgrade-guide.mdx b/docs/release-notes/5.11.1/upgrade-guide.mdx index 02b576ff0..35db8a1d4 100644 --- a/docs/release-notes/5.11.1/upgrade-guide.mdx +++ b/docs/release-notes/5.11.1/upgrade-guide.mdx @@ -51,7 +51,7 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="success"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.12.0/changelog.mdx b/docs/release-notes/5.12.0/changelog.mdx index dbc9b2586..792f30995 100644 --- a/docs/release-notes/5.12.0/changelog.mdx +++ b/docs/release-notes/5.12.0/changelog.mdx @@ -68,7 +68,7 @@ Scaffolds are backwards compatible, so you can continue using them. But in the f In this release, we've introduced the ability to define content models and content model groups via plugins. This brings a couple of cool benefits, like having both stored in your version control, in some cases additional flexibility, and more. -Be sure to check out the [Define Content Models via Plugins](/docs/headless-cms/extending/content-models-via-code) guide to learn more. +Be sure to check out the [Define Content Models via Plugins](/docs/{version}/headless-cms/extending/content-models-via-code) guide to learn more. ### Compress Data That Is Stored in DynamoDB Table for ES ([#1821](https://github.com/webiny/webiny-js/pull/1821)) diff --git a/docs/release-notes/5.12.0/upgrade-guide.mdx b/docs/release-notes/5.12.0/upgrade-guide.mdx index 021c23cd0..1f89fe3e3 100644 --- a/docs/release-notes/5.12.0/upgrade-guide.mdx +++ b/docs/release-notes/5.12.0/upgrade-guide.mdx @@ -67,6 +67,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="success"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.13.0/changelog.mdx b/docs/release-notes/5.13.0/changelog.mdx index 7fe076773..d574e9121 100644 --- a/docs/release-notes/5.13.0/changelog.mdx +++ b/docs/release-notes/5.13.0/changelog.mdx @@ -23,7 +23,7 @@ Please check the [Webiny 5.13.0 migration guide](/docs/release-notes/5.13.0/upgr The highlight of this release - we bring you three brand new scaffolds that are focused on aiding developers in custom application development. The three scaffolds are: - [Full Stack Application](/docs/5.28.x/core-development-concepts/scaffolding/full-stack-application) -- [GraphQL API](/docs/core-development-concepts/scaffolding/extend-graphql-api) +- [GraphQL API](/docs/{version}/core-development-concepts/scaffolding/extend-graphql-api) - [React Application](/docs/5.28.x/core-development-concepts/scaffolding/full-stack-application) To get started, simply run the existing `webiny scaffold` command and pick the scaffold you need. On the other hand, if you'd like to learn more, you can check out the linked how-to guides. @@ -65,7 +65,7 @@ export default new GraphQLSchemaPlugin<Context>({ Except for the ability to interact with the `context` object in a type-safe manner, another benefit of this approach is easier usage. All of the properties of the `context` object will now be shown by your IDE, in an autocomplete dropdown menu. -The existing guides that cover extending GraphQL APIs were also updated, so make sure to [check them out](/docs/core-development-concepts/extending-and-customizing/extend-graphql-api) to learn more: +The existing guides that cover extending GraphQL APIs were also updated, so make sure to [check them out](/docs/{version}/core-development-concepts/extending-and-customizing/extend-graphql-api) to learn more: ### Yarn 3 Support ([#1862](https://github.com/webiny/webiny-js/pull/1862)) @@ -79,13 +79,13 @@ This has now been taken care of and you should be able to successfully deploy yo <Alert type="info"> -Check out the [Use AWS Profiles](/docs/infrastructure/aws/use-aws-profiles) how-to guide to learn how to use different AWS profiles upon deploying your Webiny project. +Check out the [Use AWS Profiles](/docs/{version}/infrastructure/aws/use-aws-profiles) how-to guide to learn how to use different AWS profiles upon deploying your Webiny project. </Alert> ### Fix `watch` on Windows ([#1848](https://github.com/webiny/webiny-js/pull/1848)) -There's currently a bug in the Pulumi path detection for file watching, so on Windows, where paths start with **C:**, etc., Pulumi thinks it's a relative path, and constructs a wrong file path to watch. To bypass this issue, and get the [watch](/docs/core-development-concepts/basics/watch-command#webiny-watch-command) command to work on Windows, we've temporarily disabled path filtering on Windows. +There's currently a bug in the Pulumi path detection for file watching, so on Windows, where paths start with **C:**, etc., Pulumi thinks it's a relative path, and constructs a wrong file path to watch. To bypass this issue, and get the [watch](/docs/{version}/core-development-concepts/basics/watch-command#webiny-watch-command) command to work on Windows, we've temporarily disabled path filtering on Windows. Watch works just a good, but you might experience a case of double update on Lambda functions. Not a major problem, just a little detail you'll most likely not even notice, if you don't pay attention to deploy logs. diff --git a/docs/release-notes/5.13.0/upgrade-guide.mdx b/docs/release-notes/5.13.0/upgrade-guide.mdx index 92a92cdc6..e466bdbcb 100644 --- a/docs/release-notes/5.13.0/upgrade-guide.mdx +++ b/docs/release-notes/5.13.0/upgrade-guide.mdx @@ -67,6 +67,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="success"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.14.0/changelog.mdx b/docs/release-notes/5.14.0/changelog.mdx index 6858fde3e..4f03b3362 100644 --- a/docs/release-notes/5.14.0/changelog.mdx +++ b/docs/release-notes/5.14.0/changelog.mdx @@ -61,7 +61,7 @@ The file in question is now correctly updated during the scaffolding process, so #### All Existing Repositories Visible ([@IzioDev](https://github.com/IzioDev), [#1877](https://github.com/webiny/webiny-js/pull/1877)) -While going through the [CI/CD](/docs/core-development-concepts/ci-cd/setup) scaffold's setup wizard, if a user wanted to use an existing GitHub repository, the repositories list would only show the first one hundred entries. So, if a user had more than one hundred repositories, she/he would not be able to pick the wanted one, forcing the user to perform all kinds of workarounds to be able to complete the wizard. +While going through the [CI/CD](/docs/{version}/core-development-concepts/ci-cd/setup) scaffold's setup wizard, if a user wanted to use an existing GitHub repository, the repositories list would only show the first one hundred entries. So, if a user had more than one hundred repositories, she/he would not be able to pick the wanted one, forcing the user to perform all kinds of workarounds to be able to complete the wizard. Special thanks to [IzioDev](https://github.com/IzioDev) for taking care of this. diff --git a/docs/release-notes/5.14.0/upgrade-guide.mdx b/docs/release-notes/5.14.0/upgrade-guide.mdx index f6779e1f7..d47caf383 100644 --- a/docs/release-notes/5.14.0/upgrade-guide.mdx +++ b/docs/release-notes/5.14.0/upgrade-guide.mdx @@ -57,6 +57,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="success"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.15.0/changelog.mdx b/docs/release-notes/5.15.0/changelog.mdx index f7112ed63..24010a250 100644 --- a/docs/release-notes/5.15.0/changelog.mdx +++ b/docs/release-notes/5.15.0/changelog.mdx @@ -24,7 +24,7 @@ The majority of changes that were introduced in this release are related to the <Alert type="success" title="Amazon DynamoDB-only version of Webiny"> -[In case you missed it](/docs/architecture/api/overview), at the moment, Webiny relies on both [Amazon DynamoDB](https://aws.amazon.com/dynamodb/) and [Amazon OpenSearch Service](https://aws.amazon.com/opensearch-service/the-elk-stack/what-is-elasticsearch/) databases in order to store and retrieve data. And while this is definitely a good choice for larger projects, for smaller and mid-sized projects, we'll be introducing an Amazon DynamoDB-only version of Webiny. For now there are no official estimates when this will be available, but we can definitely say that a very large amount of work has already been done. +[In case you missed it](/docs/{version}/architecture/api/overview), at the moment, Webiny relies on both [Amazon DynamoDB](https://aws.amazon.com/dynamodb/) and [Amazon OpenSearch Service](https://aws.amazon.com/opensearch-service/the-elk-stack/what-is-elasticsearch/) databases in order to store and retrieve data. And while this is definitely a good choice for larger projects, for smaller and mid-sized projects, we'll be introducing an Amazon DynamoDB-only version of Webiny. For now there are no official estimates when this will be available, but we can definitely say that a very large amount of work has already been done. </Alert> @@ -91,7 +91,7 @@ A special shout out to [@nelsonchen5](https://github.com/nelsonchen5) for sortin <Alert type="success"> -Learn more about different types of the Headless CMS GraphQL API in [this key topic](/docs/headless-cms/basics/graphql-api). +Learn more about different types of the Headless CMS GraphQL API in [this key topic](/docs/{version}/headless-cms/basics/graphql-api). </Alert> diff --git a/docs/release-notes/5.15.0/upgrade-guide.mdx b/docs/release-notes/5.15.0/upgrade-guide.mdx index fc1c585b0..a68fd6748 100644 --- a/docs/release-notes/5.15.0/upgrade-guide.mdx +++ b/docs/release-notes/5.15.0/upgrade-guide.mdx @@ -67,6 +67,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="success"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.16.0/changelog.mdx b/docs/release-notes/5.16.0/changelog.mdx index 300861043..99f1bad5d 100644 --- a/docs/release-notes/5.16.0/changelog.mdx +++ b/docs/release-notes/5.16.0/changelog.mdx @@ -31,7 +31,7 @@ Once completed, the exported pages can be imported in a different environment or <Alert type="info"> -To learn more about environments in general, check out the [Environments](/docs/infrastructure/basics/environments) key topic. +To learn more about environments in general, check out the [Environments](/docs/{version}/infrastructure/basics/environments) key topic. </Alert> @@ -102,7 +102,7 @@ Available options to send are `createdOn_ASC`, `createdOn_DESC`, `savedOn_ASC` a ### Pulumi CLI Is Now Downloaded Into Project Root's `.webiny` Folder ([#1947](https://github.com/webiny/webiny-js/pull/1947)) -To deploy necessary cloud infrastructure, by default, Webiny relies on [Pulumi](/docs/infrastructure/pulumi-iac/iac-with-pulumi), a modern infrastructure as code framework. +To deploy necessary cloud infrastructure, by default, Webiny relies on [Pulumi](/docs/{version}/infrastructure/pulumi-iac/iac-with-pulumi), a modern infrastructure as code framework. For every Webiny project, the framework is downloaded automatically, and, prior to this release, all of the related binaries would be downloaded into project's `node_modules/@webiny/pulumi-sdk/pulumi` folder. And although this works, over time, we've noticed a couple of interesting issues with this solution: @@ -113,7 +113,7 @@ Because of these, from now on, all the Pulumi CLI related binaries will be downl <Alert type="info"> -Once your project has been upgraded to `5.16.0`, upon running the [`webiny deploy`](/docs/core-development-concepts/basics/project-deployment) or the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command, the Pulumi CLI will be re-downloaded. This is normal and will happen even if you already had the Pulumi CLI downloaded in the mentioned `node_modules/@webiny/pulumi-sdk/pulumi` folder. +Once your project has been upgraded to `5.16.0`, upon running the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) or the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command, the Pulumi CLI will be re-downloaded. This is normal and will happen even if you already had the Pulumi CLI downloaded in the mentioned `node_modules/@webiny/pulumi-sdk/pulumi` folder. </Alert> @@ -121,9 +121,9 @@ Once your project has been upgraded to `5.16.0`, upon running the [`webiny deplo Webiny CLI also received a couple of neat improvements. -For starters, we've introduced the `--allow-production` flag for the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command, which allows the user to run the command even with `prod` and `production` environments (by default, the command doesn't allow that). +For starters, we've introduced the `--allow-production` flag for the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command, which allows the user to run the command even with `prod` and `production` environments (by default, the command doesn't allow that). -Speaking of the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command, we've also made the logs displayed in the **Deploy** pane a bit cleaner and nicer: +Speaking of the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command, we've also made the logs displayed in the **Deploy** pane a bit cleaner and nicer: <Image src={watchDeployPaneImprovement} title={"webiny watch Command - The Improved Deploy Pane"} /> diff --git a/docs/release-notes/5.16.0/upgrade-guide.mdx b/docs/release-notes/5.16.0/upgrade-guide.mdx index 19ce45b87..fc0a5c0f6 100644 --- a/docs/release-notes/5.16.0/upgrade-guide.mdx +++ b/docs/release-notes/5.16.0/upgrade-guide.mdx @@ -73,6 +73,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="success"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.17.0/upgrade-guide.mdx b/docs/release-notes/5.17.0/upgrade-guide.mdx index 786d06f8b..52744b5fd 100644 --- a/docs/release-notes/5.17.0/upgrade-guide.mdx +++ b/docs/release-notes/5.17.0/upgrade-guide.mdx @@ -95,7 +95,7 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="success"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.18.0/changelog.mdx b/docs/release-notes/5.18.0/changelog.mdx index 3d3f5212c..f4f1f321f 100644 --- a/docs/release-notes/5.18.0/changelog.mdx +++ b/docs/release-notes/5.18.0/changelog.mdx @@ -50,7 +50,7 @@ We really hope you'll give this new version of Webiny Serverless CMS a try and t ### Overhaul of Existing Development Tools ([#1990](https://github.com/webiny/webiny-js/pull/1990), [#2028](https://github.com/webiny/webiny-js/pull/2028), [#1998](https://github.com/webiny/webiny-js/pull/1998), [#1989](https://github.com/webiny/webiny-js/pull/1989)) -A complete overhaul was done on the most important development-related Webiny CLI commands - [`webiny deploy`](/docs/core-development-concepts/basics/project-deployment) and [`webiny watch`](/docs/core-development-concepts/basics/watch-command). In short, you can expect both of these to be faster and also consume significantly less system resources. +A complete overhaul was done on the most important development-related Webiny CLI commands - [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) and [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command). In short, you can expect both of these to be faster and also consume significantly less system resources. In case you would like to learn more, feel free to check out the links to closed pull requests: @@ -83,7 +83,7 @@ For more information on this change, make sure to check out the [Additional Info ### Pulumi Command - Improved Handling of `--json` Flag -Previously, when invoking the Pulumi CLI via the [`webiny pulumi`](/docs/core-development-concepts/basics/webiny-cli#yarn-webiny-pulumi-folder---env-env----command) command and passing the `--json` flag to it, the final output would still include informative messages: +Previously, when invoking the Pulumi CLI via the [`webiny pulumi`](/docs/{version}/core-development-concepts/basics/webiny-cli#yarn-webiny-pulumi-folder---env-env----command) command and passing the `--json` flag to it, the final output would still include informative messages: ![Inappropriate output of the webiny pulumi command.](./images/pulumi-cli-json-issue.png) @@ -101,7 +101,7 @@ The existing `--logs` flag now serves a different purpose - it enables the code <Alert type="success"> -Learn more about remote runtime logs (logs forwarding) in the [Use the Watch Command](/docs/core-development-concepts/basics/watch-command#enabling-logs-forwarding) how-to guide. +Learn more about remote runtime logs (logs forwarding) in the [Use the Watch Command](/docs/{version}/core-development-concepts/basics/watch-command#enabling-logs-forwarding) how-to guide. </Alert> @@ -111,7 +111,7 @@ Learn more about remote runtime logs (logs forwarding) in the [Use the Watch Com The existing `InstallationPlugin`, `CmsContentModelHookPlugin` and `CmsContentEntryHookPlugin` plugins, used to hook into the lifecycle of the Headless CMS installation process, content models and content entries, were removed and replaced with a simpler publish/subscribe (pub/sub) approach. -To learn more more about it, please read our [Lifecycle Events](/docs/headless-cms/references/lifecycle-events) key topic. +To learn more more about it, please read our [Lifecycle Events](/docs/{version}/headless-cms/references/lifecycle-events) key topic. ### Renamed Plugins, Types and Interfaces diff --git a/docs/release-notes/5.18.0/upgrade-guide.mdx b/docs/release-notes/5.18.0/upgrade-guide.mdx index 874e291b9..007b9d606 100644 --- a/docs/release-notes/5.18.0/upgrade-guide.mdx +++ b/docs/release-notes/5.18.0/upgrade-guide.mdx @@ -67,7 +67,7 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="success"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.19.0/changelog.mdx b/docs/release-notes/5.19.0/changelog.mdx index 3953f2a98..93cefc17d 100644 --- a/docs/release-notes/5.19.0/changelog.mdx +++ b/docs/release-notes/5.19.0/changelog.mdx @@ -16,7 +16,7 @@ In attempt to make things a bit more stable, we've decided to put a lock on the <Alert type="info"> -`@pulumi/*` NPM packages are being utilized by Pulumi, the underlying infrastructure-as-code (IaC) solution Webiny relies on. To learn more, check out the [Infrastructure as Code With Pulumi](/docs/infrastructure/pulumi-iac/iac-with-pulumi) key topic. +`@pulumi/*` NPM packages are being utilized by Pulumi, the underlying infrastructure-as-code (IaC) solution Webiny relies on. To learn more, check out the [Infrastructure as Code With Pulumi](/docs/{version}/infrastructure/pulumi-iac/iac-with-pulumi) key topic. </Alert> @@ -34,7 +34,7 @@ Thank you goes to [**@snstanton**](https://github.com/snstanton) for discovering ### Fixed Incorrect AWS Profile Being Logged During Deployment ([#2078](https://github.com/webiny/webiny-js/pull/2078)) -In order to use the [`webiny deploy`](/docs/core-development-concepts/basics/project-deployment) command, AWS credentials need to be set, which can be done in [multiple ways](/docs/infrastructure/aws/configure-aws-credentials). +In order to use the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command, AWS credentials need to be set, which can be done in [multiple ways](/docs/{version}/infrastructure/aws/configure-aws-credentials). When relying on environment variables, users can choose to either use a combination of `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`, or a single `AWS_PROFILE` variable. In case of the former, we've noticed that, during deployment, an incorrect message would get displayed in the terminal, saying AWS profile "undefined" is being used. @@ -56,7 +56,7 @@ The `acl` property lets you set **Canned ACL** for every uploaded file. To learn ### `webiny deploy` Command - Introduced `--deploy` Flag ([#2096](https://github.com/webiny/webiny-js/pull/2096)) -A new `--deploy` flag has been added to the [`webiny deploy`](/docs/core-development-concepts/basics/project-deployment). +A new `--deploy` flag has been added to the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment). By setting it to false (by passing `--no-deploy`), this small addition allows users to skip the deployment step, which can be useful if they only want to build the specified project application. For example: @@ -66,7 +66,7 @@ yarn webiny deploy api --env dev --no-deploy ### `webiny watch` Command - Fixed Multiline Logs ([#2103](https://github.com/webiny/webiny-js/pull/2103)) -Previously, if you were to add multiline logs in your cloud infrastructure (Pulumi) code, the [`webiny watch`](/docs/core-development-concepts/basics/watch-command#can-i-use-the-webiny-watch-command-to-start-a-watch-process-on-frontend-react-apps) command's terminal output would get truncated. This has now been addressed, so you can freely add any additional multiline logs that you might need. +Previously, if you were to add multiline logs in your cloud infrastructure (Pulumi) code, the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command#can-i-use-the-webiny-watch-command-to-start-a-watch-process-on-frontend-react-apps) command's terminal output would get truncated. This has now been addressed, so you can freely add any additional multiline logs that you might need. ![The highlight of this release - the new Amazon DynamoDB-only version of Webiny!](./images/truncation-fixed.png) diff --git a/docs/release-notes/5.19.0/upgrade-guide.mdx b/docs/release-notes/5.19.0/upgrade-guide.mdx index 4241a3a7b..21e3950ca 100644 --- a/docs/release-notes/5.19.0/upgrade-guide.mdx +++ b/docs/release-notes/5.19.0/upgrade-guide.mdx @@ -73,6 +73,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="success"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.19.1/upgrade-guide.mdx b/docs/release-notes/5.19.1/upgrade-guide.mdx index 23ca4fd90..ceec94670 100644 --- a/docs/release-notes/5.19.1/upgrade-guide.mdx +++ b/docs/release-notes/5.19.1/upgrade-guide.mdx @@ -57,6 +57,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="success"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.20.0/changelog.mdx b/docs/release-notes/5.20.0/changelog.mdx index f43922b86..f9dd368f8 100644 --- a/docs/release-notes/5.20.0/changelog.mdx +++ b/docs/release-notes/5.20.0/changelog.mdx @@ -22,7 +22,7 @@ We've resolved an issue that would occur when a user created a content model pro <Alert type="info"> -To learn more about creating content models via code, check out the [Define Content Models via Code](/docs/headless-cms/extending/content-models-via-code) guide. +To learn more about creating content models via code, check out the [Define Content Models via Code](/docs/{version}/headless-cms/extending/content-models-via-code) guide. </Alert> @@ -91,7 +91,7 @@ The `PagePlugin` plugin that was previously used is no longer supported. If you' ### Fixed `webiny watch` Command's `--remoteRuntimeLogs` (`-r`) Argument ([#2124](https://github.com/webiny/webiny-js/pull/2124)) -In a couple of scenarios, upon running the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command, adding the `--remoteRuntimeLogs` (`-r`) argument would not properly return runtime logs in user's terminal. This has now been addressed. +In a couple of scenarios, upon running the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command, adding the `--remoteRuntimeLogs` (`-r`) argument would not properly return runtime logs in user's terminal. This has now been addressed. ### Fixed React Component Scaffold's `webiny.config.ts` File ([#2123](https://github.com/webiny/webiny-js/pull/2123)) @@ -99,7 +99,7 @@ The [`webiny.config.ts`](https://github.com/webiny/webiny-js/blob/next/packages/ ### Two New `webiny deploy` Hooks ([#2079](https://github.com/webiny/webiny-js/pull/2079)) -You can now hook onto the pre-build and post-build events that are emitted during the [`webiny deploy`](/docs/core-development-concepts/basics/project-deployment) command. More information about all related hooks can be found in the new [Build and Deploy Hooks](/docs/infrastructure/basics/build-and-deploy-hooks) guide. +You can now hook onto the pre-build and post-build events that are emitted during the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command. More information about all related hooks can be found in the new [Build and Deploy Hooks](/docs/{version}/infrastructure/basics/build-and-deploy-hooks) guide. ## Documentation diff --git a/docs/release-notes/5.20.0/upgrade-guide.mdx b/docs/release-notes/5.20.0/upgrade-guide.mdx index 9e3dd293a..1766aad7a 100644 --- a/docs/release-notes/5.20.0/upgrade-guide.mdx +++ b/docs/release-notes/5.20.0/upgrade-guide.mdx @@ -57,6 +57,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="success"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.21.0/changelog.mdx b/docs/release-notes/5.21.0/changelog.mdx index a48e01ee8..00c5d28f8 100644 --- a/docs/release-notes/5.21.0/changelog.mdx +++ b/docs/release-notes/5.21.0/changelog.mdx @@ -70,11 +70,11 @@ A good example of this can be found in our [Extend Page Settings](/docs/page-bui ### Added Webiny Version Header To GraphQL Response ([#2143](https://github.com/webiny/webiny-js/pull/2143)) -We added the Webiny version header to every GraphQL response. By default, header is not added. To add it into the output, read our article about [environment variables](/docs/core-development-concepts/basics/environment-variables#enable-webiny-version-header-environment-variable). +We added the Webiny version header to every GraphQL response. By default, header is not added. To add it into the output, read our article about [environment variables](/docs/{version}/core-development-concepts/basics/environment-variables#enable-webiny-version-header-environment-variable). ### Stop The Deploy Process On Errors in Deploy Hooks ([#2161](https://github.com/webiny/webiny-js/pull/2161)) -Prior to this PR, if one of the [deploy hooks](/docs/infrastructure/basics/build-and-deploy-hooks) threw an error, the deploy process would not be stopped, which is incorrect. This PR ensures that any error encountered in the deploy process, including hooks, will stop the whole deploy process. +Prior to this PR, if one of the [deploy hooks](/docs/{version}/infrastructure/basics/build-and-deploy-hooks) threw an error, the deploy process would not be stopped, which is incorrect. This PR ensures that any error encountered in the deploy process, including hooks, will stop the whole deploy process. ## Visual Improvements diff --git a/docs/release-notes/5.21.0/upgrade-guide.mdx b/docs/release-notes/5.21.0/upgrade-guide.mdx index fc2093eb2..5d210f392 100644 --- a/docs/release-notes/5.21.0/upgrade-guide.mdx +++ b/docs/release-notes/5.21.0/upgrade-guide.mdx @@ -67,6 +67,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="success"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.22.0/upgrade-guide.mdx b/docs/release-notes/5.22.0/upgrade-guide.mdx index 83ba18b01..0f23560e4 100644 --- a/docs/release-notes/5.22.0/upgrade-guide.mdx +++ b/docs/release-notes/5.22.0/upgrade-guide.mdx @@ -66,6 +66,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="success"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.22.1/upgrade-guide.mdx b/docs/release-notes/5.22.1/upgrade-guide.mdx index c85720e64..7406d8915 100644 --- a/docs/release-notes/5.22.1/upgrade-guide.mdx +++ b/docs/release-notes/5.22.1/upgrade-guide.mdx @@ -46,6 +46,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="success"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.23.0/upgrade-guide.mdx b/docs/release-notes/5.23.0/upgrade-guide.mdx index 4a785a648..44b7265f1 100644 --- a/docs/release-notes/5.23.0/upgrade-guide.mdx +++ b/docs/release-notes/5.23.0/upgrade-guide.mdx @@ -65,6 +65,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="success"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.24.0/upgrade-guide.mdx b/docs/release-notes/5.24.0/upgrade-guide.mdx index 7cba8ace5..b2dca7db3 100644 --- a/docs/release-notes/5.24.0/upgrade-guide.mdx +++ b/docs/release-notes/5.24.0/upgrade-guide.mdx @@ -53,6 +53,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.25.0/upgrade-guide.mdx b/docs/release-notes/5.25.0/upgrade-guide.mdx index 4fdfe6a28..cfeb10fb1 100644 --- a/docs/release-notes/5.25.0/upgrade-guide.mdx +++ b/docs/release-notes/5.25.0/upgrade-guide.mdx @@ -59,6 +59,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.26.0/changelog.mdx b/docs/release-notes/5.26.0/changelog.mdx index 734c6f61a..50c3434f5 100644 --- a/docs/release-notes/5.26.0/changelog.mdx +++ b/docs/release-notes/5.26.0/changelog.mdx @@ -46,14 +46,14 @@ The check is still being run on the API side, but this way we do not need to cal ### Customize The Elasticsearch Index Settings And Mappings For Your Deployment ([#2316](https://github.com/webiny/webiny-js/pull/2316)) We added plugins to customize your Elasticsearch Index creation for any of our applications. -To find out more, read [How To Customize Elasticsearch Index](/docs/core-development-concepts/extending-and-customizing/how-to-customize-elasticsearch-index). +To find out more, read [How To Customize Elasticsearch Index](/docs/{version}/core-development-concepts/extending-and-customizing/how-to-customize-elasticsearch-index). ### Split The Elasticsearch Index For Each Of The Locales ([#2323](https://github.com/webiny/webiny-js/pull/2323)) We added an option to split each Elasticsearch Index to per-locale one. In all new Webiny deployments where the Elasticsearch is used, it is the default behavior. -On all old systems, if you want to change how the indexes are created, and change the existing ones, please read [How To Change Elasticsearch Index Name To Contain Locale](/docs/core-development-concepts/extending-and-customizing/how-to-change-elasticsearch-index-name-to-contain-locale). +On all old systems, if you want to change how the indexes are created, and change the existing ones, please read [How To Change Elasticsearch Index Name To Contain Locale](/docs/{version}/core-development-concepts/extending-and-customizing/how-to-change-elasticsearch-index-name-to-contain-locale). ### Add Japanese Elasticsearch Index Configuration ([#2326](https://github.com/webiny/webiny-js/pull/2326)) diff --git a/docs/release-notes/5.26.0/upgrade-guide.mdx b/docs/release-notes/5.26.0/upgrade-guide.mdx index 2ae3a8c6b..d4eb38d2e 100644 --- a/docs/release-notes/5.26.0/upgrade-guide.mdx +++ b/docs/release-notes/5.26.0/upgrade-guide.mdx @@ -59,6 +59,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.27.0/upgrade-guide.mdx b/docs/release-notes/5.27.0/upgrade-guide.mdx index 5daa14d04..12cc0a565 100644 --- a/docs/release-notes/5.27.0/upgrade-guide.mdx +++ b/docs/release-notes/5.27.0/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.28.0/upgrade-guide.mdx b/docs/release-notes/5.28.0/upgrade-guide.mdx index 7329150b7..dddbe9144 100644 --- a/docs/release-notes/5.28.0/upgrade-guide.mdx +++ b/docs/release-notes/5.28.0/upgrade-guide.mdx @@ -59,6 +59,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.29.0/changelog.mdx b/docs/release-notes/5.29.0/changelog.mdx index 2a379079f..574bcca59 100644 --- a/docs/release-notes/5.29.0/changelog.mdx +++ b/docs/release-notes/5.29.0/changelog.mdx @@ -100,13 +100,13 @@ When it comes to existing Webiny projects, at the moment, there isn't an upgrade ### Removed Unnecessary Files and Folders -Prior to this release, once a new Webiny project has been created, developers would immediately be presented with (or intimidated by) lots of different folders and files. For example, if we were to look into the [`api`](https://github.com/webiny/webiny-js/tree/v5.28.0/api/code) folder ([the API project application](/docs/architecture/api/overview)), we would be able to find five different folders which contain application code for 14 different AWS Lambda functions. Together, these functions form Webiny's GraphQL APIs. +Prior to this release, once a new Webiny project has been created, developers would immediately be presented with (or intimidated by) lots of different folders and files. For example, if we were to look into the [`api`](https://github.com/webiny/webiny-js/tree/v5.28.0/api/code) folder ([the API project application](/docs/{version}/architecture/api/overview)), we would be able to find five different folders which contain application code for 14 different AWS Lambda functions. Together, these functions form Webiny's GraphQL APIs. And while this approach does give developers the ability to customize every aspect of Webiny, in practice, we've learned that the majority of these are not really something developers are concerned with. When talking about the [`api`](https://github.com/webiny/webiny-js/tree/v5.28.0/api/code) folder, almost always, the only two folders developers change are [`api/code/graphql`](https://github.com/webiny/webiny-js/tree/v5.28.0/api/code/graphql) and [`api/code/headlessCms`](https://github.com/webiny/webiny-js/tree/v5.28.0/api/code/headlessCms). <Alert type="info" title="Project Applications"> -The [`api/code/graphql`](https://github.com/webiny/webiny-js/tree/v5.28.0/api/code/graphql) and [`api/code/headlessCms`](https://github.com/webiny/webiny-js/tree/v5.28.0/api/code/headlessCms) folders contain code for the two GraphQL APIs - the Main GraphQL API and the [Headless CMS GraphQL API](/docs/headless-cms/basics/using-graphql-api). +The [`api/code/graphql`](https://github.com/webiny/webiny-js/tree/v5.28.0/api/code/graphql) and [`api/code/headlessCms`](https://github.com/webiny/webiny-js/tree/v5.28.0/api/code/headlessCms) folders contain code for the two GraphQL APIs - the Main GraphQL API and the [Headless CMS GraphQL API](/docs/{version}/headless-cms/basics/using-graphql-api). </Alert> @@ -121,7 +121,7 @@ With this, and a couple of other use cases in mind, we've decided to drastically With the changes listed in the [Removed Unnecessary Files and Folders](/docs/release-notes/5.29.0/changelog#removed-unnecessary-files-and-folders) section in mind, one might ask themselves: -> If there are only 2 AWS Lambda functions in my [API project application](/docs/architecture/api/overview) now, what happened to other 12? Do they still exist? +> If there are only 2 AWS Lambda functions in my [API project application](/docs/{version}/architecture/api/overview) now, what happened to other 12? Do they still exist? Well, these functions still do exist, but, from now on, they will actually be prebuilt for developers' projects! @@ -131,11 +131,11 @@ To be more precise, you can expect a **~70%** reduction in time it takes to buil ### API Project Application Moved To `apps` Folder -Previously, the `api` folder ([the API project application](/docs/architecture/api/overview)) was located in the project root. This is no longer the case. All project applications are now located in the [`apps`](https://github.com/webiny/webiny-js/tree/v5/apps) folder. +Previously, the `api` folder ([the API project application](/docs/{version}/architecture/api/overview)) was located in the project root. This is no longer the case. All project applications are now located in the [`apps`](https://github.com/webiny/webiny-js/tree/v5/apps) folder. <Alert type="info" title="Project Applications"> -Learn more about project applications and project organization in general, in the [Project Applications and Packages](/docs/core-development-concepts/project-organization/project-applications-and-packages) key topic. +Learn more about project applications and project organization in general, in the [Project Applications and Packages](/docs/{version}/core-development-concepts/project-organization/project-applications-and-packages) key topic. </Alert> @@ -143,7 +143,7 @@ Learn more about project applications and project organization in general, in th With this release, we are introducing the new [Core](https://github.com/webiny/webiny-js/tree/v5/apps/core) project application, whose main purpose is to define and encapsulate the stateful cloud infrastructure resources. These are your [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) and [Amazon Elasticsearch](https://aws.amazon.com/opensearch-service/) databases, [Amazon S3](https://aws.amazon.com/s3/) for storing files, [Amazon Cognito](https://aws.amazon.com/cognito/) for user information, and also [Amazon EventBridge](https://aws.amazon.com/eventbridge/) which we've introduced with this release, to manage events via event buses. -The [API project application](/docs/architecture/api/overview) still exists, but, from now on, it strictly defines the stateless resources responsible for hosting your project's GraphQL APIs. These include [Amazon API Gateway](https://aws.amazon.com/api-gateway/), [Amazon Cloudfront](https://aws.amazon.com/cloudfront/), and multiple [AWS Lambda](https://aws.amazon.com/lambda/) functions. +The [API project application](/docs/{version}/architecture/api/overview) still exists, but, from now on, it strictly defines the stateless resources responsible for hosting your project's GraphQL APIs. These include [Amazon API Gateway](https://aws.amazon.com/api-gateway/), [Amazon Cloudfront](https://aws.amazon.com/cloudfront/), and multiple [AWS Lambda](https://aws.amazon.com/lambda/) functions. This new organization will enable us to create some really interesting features in the near future, so stay tuned for that! @@ -207,7 +207,7 @@ This one belongs to the "small annoyances" department. The issue was only visibl ### Removed Pulumi Version Restriction -Prior to this release, via the project root's [`package.json`](https://github.com/webiny/webiny-js/blob/v5.28.0/packages/cwp-template-aws/template/ddb/dependencies.json#L92-L93) file and its `resolutions` property, the versions of Pulumi NPM packages were locked for quite some time now. As the time passed by, these versions became more and more outdated, so we made sure this is no longer the case. From now on, every Webiny project will be accompanied by the latest version of the [Pulumi](/docs/infrastructure/pulumi-iac/iac-with-pulumi) CLI and related NPM packages. +Prior to this release, via the project root's [`package.json`](https://github.com/webiny/webiny-js/blob/v5.28.0/packages/cwp-template-aws/template/ddb/dependencies.json#L92-L93) file and its `resolutions` property, the versions of Pulumi NPM packages were locked for quite some time now. As the time passed by, these versions became more and more outdated, so we made sure this is no longer the case. From now on, every Webiny project will be accompanied by the latest version of the [Pulumi](/docs/{version}/infrastructure/pulumi-iac/iac-with-pulumi) CLI and related NPM packages. ### Automatic Download of Pulumi Resource Plugin diff --git a/docs/release-notes/5.29.0/project-setup-migration.mdx b/docs/release-notes/5.29.0/project-setup-migration.mdx index 1fe3abeba..b8666593b 100644 --- a/docs/release-notes/5.29.0/project-setup-migration.mdx +++ b/docs/release-notes/5.29.0/project-setup-migration.mdx @@ -128,7 +128,7 @@ With the new project structure, all of the project applications are located with 3. **Admin** ([`apps/admin/webiny.application.ts`](https://github.com/webiny/webiny-js/blob/v5.29.0/packages/cwp-template-aws/template/common/apps/admin/webiny.application.ts)) 4. **Website** ([`apps/website/webiny.application.ts`](https://github.com/webiny/webiny-js/blob/v5.29.0/packages/cwp-template-aws/template/common/apps/website/webiny.application.ts)) -These are the files via which the cloud infrastructure adjustments can be applied. To learn more, we suggest you take a look at the [Modify Cloud Infrastructure](/docs/infrastructure/basics/modify-cloud-infrastructure) +These are the files via which the cloud infrastructure adjustments can be applied. To learn more, we suggest you take a look at the [Modify Cloud Infrastructure](/docs/{version}/infrastructure/basics/modify-cloud-infrastructure) ### 3. Pulumi State Files Migration @@ -149,7 +149,7 @@ In the new project, we now have four project apps, thus four sets of state files <Alert type={"info"}> -More info on the new cloud architecture can be found [here](https://www.webiny.com/docs/architecture/introduction). +More info on the new cloud architecture can be found [here](https://www.webiny.com/docs/{version}/architecture/introduction). </Alert> diff --git a/docs/release-notes/5.29.0/upgrade-guide.mdx b/docs/release-notes/5.29.0/upgrade-guide.mdx index d2b91b2ca..2f7685d71 100644 --- a/docs/release-notes/5.29.0/upgrade-guide.mdx +++ b/docs/release-notes/5.29.0/upgrade-guide.mdx @@ -65,6 +65,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.3.0/changelog.mdx b/docs/release-notes/5.3.0/changelog.mdx index 4e66d4380..3caf55911 100644 --- a/docs/release-notes/5.3.0/changelog.mdx +++ b/docs/release-notes/5.3.0/changelog.mdx @@ -12,7 +12,7 @@ This document highlights the most important fixes, improvements, and features, t ### Improved the `contains` GraphQL Operator [(#1531)](https://github.com/webiny/webiny-js/pull/1531) -While querying data via the [Headless CMS GraphQL API](/docs/headless-cms/basics/graphql-api), and using the `contains` query operator on a **text** field, [reserved ElasticSearch characters](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#_reserved_characters) are now properly escaped. Without it, users could receive unexpected results or even errors, thrown by the ElasticSearch itself. +While querying data via the [Headless CMS GraphQL API](/docs/{version}/headless-cms/basics/graphql-api), and using the `contains` query operator on a **text** field, [reserved ElasticSearch characters](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#_reserved_characters) are now properly escaped. Without it, users could receive unexpected results or even errors, thrown by the ElasticSearch itself. ### Fixed Search Bar [(#1532)](https://github.com/webiny/webiny-js/pull/1532) diff --git a/docs/release-notes/5.30.0/changelog.mdx b/docs/release-notes/5.30.0/changelog.mdx index 88b089f35..e896619de 100644 --- a/docs/release-notes/5.30.0/changelog.mdx +++ b/docs/release-notes/5.30.0/changelog.mdx @@ -65,7 +65,7 @@ export default createWebsiteApp({ ### `webiny watch` Command - Redeploying Now Works Correctly ([#2538](https://github.com/webiny/webiny-js/pull/2538)) -With the [5.29.0](/docs/release-notes/5.29.0/changelog) release, a regression was introduced to the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command. +With the [5.29.0](/docs/release-notes/5.29.0/changelog) release, a regression was introduced to the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command. Instead of redeploying the AWS Lambda function code once after a source code change has been applied, the command would redeploy it twice. diff --git a/docs/release-notes/5.30.0/upgrade-guide.mdx b/docs/release-notes/5.30.0/upgrade-guide.mdx index ea0700163..34b379d3f 100644 --- a/docs/release-notes/5.30.0/upgrade-guide.mdx +++ b/docs/release-notes/5.30.0/upgrade-guide.mdx @@ -65,6 +65,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.31.0/changelog.mdx b/docs/release-notes/5.31.0/changelog.mdx index 741bb77db..bc61ae7f7 100644 --- a/docs/release-notes/5.31.0/changelog.mdx +++ b/docs/release-notes/5.31.0/changelog.mdx @@ -17,7 +17,7 @@ With this version, we switched all event routing and normalization to [Fastify]( This change will also help us refactor the system to use one Lambda function for handling of various GraphQL schemas, and share the entire Webiny context (all app SDKs) within a single Lambda event lifecycle. This means easier maintenance, easier customization, easier integration with various Webiny lifecycle events, etc. -To find out more about the new handlers, read our [Routes and Events](/docs/core-development-concepts/basics/routes-and-events) article. +To find out more about the new handlers, read our [Routes and Events](/docs/{version}/core-development-concepts/basics/routes-and-events) article. ### Make all S3 buckets private [#2558](https://github.com/webiny/webiny-js/pull/2558) @@ -80,8 +80,8 @@ Terraform (used internally by Pulumi), has [some issues](https://yaleman.org/pos ### CI/CD Scaffold Improvements ([#2586](https://github.com/webiny/webiny-js/pull/2586)) -For this release, we've also revisited the existing [CI/CD scaffold](/docs/core-development-concepts/ci-cd/setup), which sets up essential CI/CD workflows for your Webiny project. +For this release, we've also revisited the existing [CI/CD scaffold](/docs/{version}/core-development-concepts/ci-cd/setup), which sets up essential CI/CD workflows for your Webiny project. The main improvement we've implemented is the ability to use the scaffold with any type of a GitHub account and repository. Previously, the scaffold only worked with public repositories and private repositories under a GitHub Enterprise account. -The scaffold's [documentation](/docs/core-development-concepts/ci-cd/setup) has also been updated, so make sure to check it out if you'll be giving the scaffold another chance. +The scaffold's [documentation](/docs/{version}/core-development-concepts/ci-cd/setup) has also been updated, so make sure to check it out if you'll be giving the scaffold another chance. diff --git a/docs/release-notes/5.31.0/upgrade-guide.mdx b/docs/release-notes/5.31.0/upgrade-guide.mdx index d1bb0b9fc..709961236 100644 --- a/docs/release-notes/5.31.0/upgrade-guide.mdx +++ b/docs/release-notes/5.31.0/upgrade-guide.mdx @@ -71,6 +71,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.32.0/changelog.mdx b/docs/release-notes/5.32.0/changelog.mdx index 2a4df2e1d..78134c0b1 100644 --- a/docs/release-notes/5.32.0/changelog.mdx +++ b/docs/release-notes/5.32.0/changelog.mdx @@ -11,7 +11,7 @@ import dashboardWidgets from "./assets/dashboard-widgets.png"; ### Watch Command - Removed Redundant Logs ([#2603](https://github.com/webiny/webiny-js/pull/2603)) -When running the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command with the [logs forwarding option](/docs/core-development-concepts/basics/watch-command#enabling-logs-forwarding), except for the actual logs, developers would also receive the underlying local tunnel URL, over which the logs would get forwarded to the developer's machine. +When running the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command with the [logs forwarding option](/docs/{version}/core-development-concepts/basics/watch-command#enabling-logs-forwarding), except for the actual logs, developers would also receive the underlying local tunnel URL, over which the logs would get forwarded to the developer's machine. <Image src={watchCmdLogsBug} title={"Removed Redundant Logs"} /> @@ -19,7 +19,7 @@ With this release, the redundant URL won't be appearing anymore. ### Destroy Command Now Works Even If the Project Wasn't Previously Deployed -With this release, we've fixed an issue with the [`webiny destroy`](/docs/infrastructure/basics/destroy-cloud-infrastructure) command, where, in order for it to work correctly, a Webiny project application had to be previously deployed. +With this release, we've fixed an issue with the [`webiny destroy`](/docs/{version}/infrastructure/basics/destroy-cloud-infrastructure) command, where, in order for it to work correctly, a Webiny project application had to be previously deployed. This is no longer the case. A Webiny project application doesn't need to be previously deployed in order for the command to work. @@ -27,27 +27,27 @@ Thanks goes to [@ryohei-kamiya](https://github.com/ryohei-kamiya) for discoverin <Alert type="info" title="Project Applications"> -Learn more about project applications and project organization in general, in the [Project Applications and Packages](/docs/core-development-concepts/project-organization/project-applications-and-packages) key topic. +Learn more about project applications and project organization in general, in the [Project Applications and Packages](/docs/{version}/core-development-concepts/project-organization/project-applications-and-packages) key topic. </Alert> ### CI/CD Scaffold - Workflow Files Are Now Correctly Deployed ([#2601](https://github.com/webiny/webiny-js/pull/2601)) -Prior to this release, upon using the [CI/CD scaffold](/docs/core-development-concepts/ci-cd/setup), the GitHub Actions workflow files would not be correctly generated in developer's GitHub repository. +Prior to this release, upon using the [CI/CD scaffold](/docs/{version}/core-development-concepts/ci-cd/setup), the GitHub Actions workflow files would not be correctly generated in developer's GitHub repository. This has now been addressed. All the GitHub Actions workflow files should be generated correctly. ### Watch Command - Introduced the `hook-before-watch` Lifecycle Event ([#2607](https://github.com/webiny/webiny-js/pull/2607)) -We've introduced the new `hook-before-watch` lifecycle event to the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command. +We've introduced the new `hook-before-watch` lifecycle event to the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command. -The [Build and Deploy Hooks](/docs/infrastructure/basics/build-and-deploy-hooks) has been updated to reflect this change, so check it out to learn more. +The [Build and Deploy Hooks](/docs/{version}/infrastructure/basics/build-and-deploy-hooks) has been updated to reflect this change, so check it out to learn more. ### Ensure WCP-related Environment Variables Are Correctly Assigned With the Watch Command ([#2609](https://github.com/webiny/webiny-js/pull/2609)) -While using the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command, we've noticed that the relevant Webiny Control Panel (WCP) environment variables would get removed from the previously deployed AWS Lambda functions, which causes the link between developer's Webiny project and WCP to be temporarily broken. +While using the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command, we've noticed that the relevant Webiny Control Panel (WCP) environment variables would get removed from the previously deployed AWS Lambda functions, which causes the link between developer's Webiny project and WCP to be temporarily broken. -This has now been addressed. The link between the Webiny project and WCP should stay persistent, no matter if the project has been deployed via the [`webiny deploy`](/docs/core-development-concepts/basics/project-deployment) command, or a developer is just doing development with the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command. +This has now been addressed. The link between the Webiny project and WCP should stay persistent, no matter if the project has been deployed via the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command, or a developer is just doing development with the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command. ## Admin App diff --git a/docs/release-notes/5.32.0/upgrade-guide.mdx b/docs/release-notes/5.32.0/upgrade-guide.mdx index 91b3f2b31..9838a5f6b 100644 --- a/docs/release-notes/5.32.0/upgrade-guide.mdx +++ b/docs/release-notes/5.32.0/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.33.0/changelog.mdx b/docs/release-notes/5.33.0/changelog.mdx index cb238663a..65b8d0de6 100644 --- a/docs/release-notes/5.33.0/changelog.mdx +++ b/docs/release-notes/5.33.0/changelog.mdx @@ -14,7 +14,7 @@ import cmsContext from "./assets/cms-context.png"; Starting with the v5.33.0, we are allowing our users to change the `Field ID` (`fieldId`) property of the CMS Model Field definition, which serves as the field identifier in the GraphQL API and in the code. As the `fieldId` property is now changeable, we needed another property to identify the field in the database, so we introduced the `storageId` property. -If you have existing CMS Models defined via plugins, please read the **Upgrading CMS Model Plugin Definitions** of [this](/docs/headless-cms/extending/content-models-via-code-storage-id#upgrading-cms-model-plugin-definitions) article before you start the upgrade. +If you have existing CMS Models defined via plugins, please read the **Upgrading CMS Model Plugin Definitions** of [this](/docs/{version}/headless-cms/extending/content-models-via-code-storage-id#upgrading-cms-model-plugin-definitions) article before you start the upgrade. ## Development @@ -149,13 +149,13 @@ This issue has been addressed. Upon doing a new deployment, you can expect to se With the VPC option enabled or with the production deployment mode, the `AWSLambdaVPCAccessExecutionRole` policy will still be used, as usual. -To learn more about different deployment modes, check out the [Deployment Modes](/docs/architecture/deployment-modes/introduction) article. +To learn more about different deployment modes, check out the [Deployment Modes](/docs/{version}/architecture/deployment-modes/introduction) article. </Alert> ### Webiny CLI - Easier to Debug AWS-related Auth Errors ([#2677](https://github.com/webiny/webiny-js/pull/2677)) -Upon running the [`webiny deploy`](/docs/core-development-concepts/basics/project-deployment) command, if a user experienced an AWS auth-related error, it was hard to debug it. Mainly because the actual underlying error wasn't printed in the terminal, even in the presence of the `--debug` flag. +Upon running the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command, if a user experienced an AWS auth-related error, it was hard to debug it. Mainly because the actual underlying error wasn't printed in the terminal, even in the presence of the `--debug` flag. That is no longer the case. From now on, by passing the `--debug` flag upon running the command, users will be able to see the actual underlying error and, hopefully, resolve the issue faster than before. diff --git a/docs/release-notes/5.33.0/upgrade-guide.mdx b/docs/release-notes/5.33.0/upgrade-guide.mdx index 8d56b6a05..3d5ef3ce0 100644 --- a/docs/release-notes/5.33.0/upgrade-guide.mdx +++ b/docs/release-notes/5.33.0/upgrade-guide.mdx @@ -38,7 +38,7 @@ If you do not have CMS Models defined via code (via `CmsModelPlugin`), you can s Since we introduced a new property, `storageId`, into CMS Model Field definition, you must add it to your existing CMS Model Field definitions. This is only for the CMS models which are created prior to the 5.33.0. -Please read the **Upgrading CMS Model Plugin Definitions** of [this](/docs/headless-cms/extending/content-models-via-code-storage-id#upgrading-cms-model-plugin-definitions) article. +Please read the **Upgrading CMS Model Plugin Definitions** of [this](/docs/{version}/headless-cms/extending/content-models-via-code-storage-id#upgrading-cms-model-plugin-definitions) article. ## 3. Deploy Your Project @@ -71,6 +71,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.33.1/upgrade-guide.mdx b/docs/release-notes/5.33.1/upgrade-guide.mdx index 0db0be26a..ae2dc7418 100644 --- a/docs/release-notes/5.33.1/upgrade-guide.mdx +++ b/docs/release-notes/5.33.1/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.33.2/changelog.mdx b/docs/release-notes/5.33.2/changelog.mdx index 9c1ae86c1..ab6539682 100644 --- a/docs/release-notes/5.33.2/changelog.mdx +++ b/docs/release-notes/5.33.2/changelog.mdx @@ -38,19 +38,19 @@ This now allows users to access raw `where` object, received from the GraphQL. ### Updated "Deploy Webiny Project" CloudFormation Template ([#2773](https://github.com/webiny/webiny-js/pull/2773)) -In order to reflect the changes we've recently introduced in the cloud infrastructure that Webiny deploys, with this release, we've revisited the `DeployWebinyProject` [AWS CloudFormation template](/docs/infrastructure/aws/configure-aws-credentials#deploy-webiny-project-aws-cloud-formation-template) and updated the set of permissions it deploys. With these updates, users should now be able to use the template and expect their Webiny project to be fully deployed. +In order to reflect the changes we've recently introduced in the cloud infrastructure that Webiny deploys, with this release, we've revisited the `DeployWebinyProject` [AWS CloudFormation template](/docs/{version}/infrastructure/aws/configure-aws-credentials#deploy-webiny-project-aws-cloud-formation-template) and updated the set of permissions it deploys. With these updates, users should now be able to use the template and expect their Webiny project to be fully deployed. <br /> <br /> <Alert type="info" title="Already Used the Template?"> -In case you've already deployed the previous version of the `DeployWebinyProject` AWS CloudFormation template, we suggest you first destroy the deployed stack, via the AWS Console. Then, via the link to the [AWS CloudFormation template](/docs/infrastructure/aws/configure-aws-credentials#deploy-webiny-project-aws-cloud-formation-template), you again perform a fresh deploy. +In case you've already deployed the previous version of the `DeployWebinyProject` AWS CloudFormation template, we suggest you first destroy the deployed stack, via the AWS Console. Then, via the link to the [AWS CloudFormation template](/docs/{version}/infrastructure/aws/configure-aws-credentials#deploy-webiny-project-aws-cloud-formation-template), you again perform a fresh deploy. </Alert> <Alert type="info" title="More Information"> -In case you missed it, in order to deploy your Webiny project in a more controlled and secure manner, you can utilize our `DeployWebinyProject` [AWS CloudFormation template](/docs/infrastructure/aws/configure-aws-credentials#deploy-webiny-project-aws-cloud-formation-template). The template deploys necessary ([least-privilege](https://en.wikipedia.org/wiki/Principle_of_least_privilege)) set of permissions into your AWS account, which also automatically get linked with an Amazon IAM user of your choosing (the user you plan to use upon running deployments). +In case you missed it, in order to deploy your Webiny project in a more controlled and secure manner, you can utilize our `DeployWebinyProject` [AWS CloudFormation template](/docs/{version}/infrastructure/aws/configure-aws-credentials#deploy-webiny-project-aws-cloud-formation-template). The template deploys necessary ([least-privilege](https://en.wikipedia.org/wiki/Principle_of_least_privilege)) set of permissions into your AWS account, which also automatically get linked with an Amazon IAM user of your choosing (the user you plan to use upon running deployments). </Alert> diff --git a/docs/release-notes/5.33.2/upgrade-guide.mdx b/docs/release-notes/5.33.2/upgrade-guide.mdx index 298fffa76..108a4d768 100644 --- a/docs/release-notes/5.33.2/upgrade-guide.mdx +++ b/docs/release-notes/5.33.2/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.33.3/changelog.mdx b/docs/release-notes/5.33.3/changelog.mdx index e185eb676..d16546c9e 100644 --- a/docs/release-notes/5.33.3/changelog.mdx +++ b/docs/release-notes/5.33.3/changelog.mdx @@ -13,15 +13,15 @@ import fieldRenderer from "./assets/object-renderer-name.png"; ### Webiny Production Mode - All AWS Lambda Functions Are Now Assigned to VPC ([#2798](https://github.com/webiny/webiny-js/pull/2798)) -When deploying your Webiny project in [production mode](/docs/architecture/introduction#development-and-production-deployment-modes), for better security posture, all AWS Lambda functions are deployed into a [Virtual Private Cloud (VPC)](https://aws.amazon.com/vpc/) with private subnets. +When deploying your Webiny project in [production mode](/docs/{version}/architecture/introduction#development-and-production-deployment-modes), for better security posture, all AWS Lambda functions are deployed into a [Virtual Private Cloud (VPC)](https://aws.amazon.com/vpc/) with private subnets. -And while our initial intention was to have this cloud infrastructure configuration automatically be applied when a project is being [deployed](/docs/core-development-concepts/basics/project-deployment#the-deploy-command) into the production environment, due to a issue in an internal Webiny package, that just wasn't the case. +And while our initial intention was to have this cloud infrastructure configuration automatically be applied when a project is being [deployed](/docs/{version}/core-development-concepts/basics/project-deployment#the-deploy-command) into the production environment, due to a issue in an internal Webiny package, that just wasn't the case. With this release, the issue has been resolved. You can expect all the relevant AWS Lambda functions to be correctly deployed into a VPC when deploying your project into the production environment. <Alert type="info"> -To learn more about development and production deployment modes, check out the [Deployment Modes](/docs/architecture/deployment-modes/introduction) section. +To learn more about development and production deployment modes, check out the [Deployment Modes](/docs/{version}/architecture/deployment-modes/introduction) section. </Alert> diff --git a/docs/release-notes/5.33.3/upgrade-guide.mdx b/docs/release-notes/5.33.3/upgrade-guide.mdx index d15f21118..334bb036f 100644 --- a/docs/release-notes/5.33.3/upgrade-guide.mdx +++ b/docs/release-notes/5.33.3/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.33.4/changelog.mdx b/docs/release-notes/5.33.4/changelog.mdx index b5e575820..02527500d 100644 --- a/docs/release-notes/5.33.4/changelog.mdx +++ b/docs/release-notes/5.33.4/changelog.mdx @@ -10,7 +10,7 @@ import lambdaFunctions from "./assets/lambdaFunctions.png"; ### Improved "Deploy Webiny Project" AWS CloudFormation Template ([#2856](https://github.com/webiny/webiny-js/pull/2856)) -In case you missed it, in our previous [5.33.2](/docs/release-notes/5.33.2/changelog#updated-deploy-webiny-project-cloud-formation-template-2773) release, we've revisited our `DeployWebinyProject` [AWS CloudFormation template](/docs/infrastructure/aws/configure-aws-credentials#deploy-webiny-project-aws-cloud-formation-template) and updated the set of permissions it deploys through multiple Amazon IAM policies. +In case you missed it, in our previous [5.33.2](/docs/release-notes/5.33.2/changelog#updated-deploy-webiny-project-cloud-formation-template-2773) release, we've revisited our `DeployWebinyProject` [AWS CloudFormation template](/docs/{version}/infrastructure/aws/configure-aws-credentials#deploy-webiny-project-aws-cloud-formation-template) and updated the set of permissions it deploys through multiple Amazon IAM policies. But, we didn't stop there! With this release, we've taken it even further and ensured that the template and the list of permissions it includes fully follows the [Principle of least privilege](https://en.wikipedia.org/wiki/Principle_of_least_privilege), making it more secure and easier for organizations to adopt it. @@ -18,13 +18,13 @@ To quickly check out the changes, you can visit our [GitHub repository](https:// <Alert type="info" title="More Information"> -In case you missed it, in order to deploy your Webiny project in a more controlled and secure manner, you can utilize our `DeployWebinyProject` [AWS CloudFormation template](/docs/infrastructure/aws/configure-aws-credentials#deploy-webiny-project-aws-cloud-formation-template). The template deploys necessary ([least-privilege](https://en.wikipedia.org/wiki/Principle_of_least_privilege)) set of permissions into your AWS account, which also automatically get linked with an Amazon IAM user of your choosing (the user you plan to use upon running deployments). +In case you missed it, in order to deploy your Webiny project in a more controlled and secure manner, you can utilize our `DeployWebinyProject` [AWS CloudFormation template](/docs/{version}/infrastructure/aws/configure-aws-credentials#deploy-webiny-project-aws-cloud-formation-template). The template deploys necessary ([least-privilege](https://en.wikipedia.org/wiki/Principle_of_least_privilege)) set of permissions into your AWS account, which also automatically get linked with an Amazon IAM user of your choosing (the user you plan to use upon running deployments). </Alert> ### Introduced Prefixed Cloud Infrastructure (Pulumi) Resource Names ([#2858](https://github.com/webiny/webiny-js/pull/2858)) -In order to make it easier to distinguish between Webiny-related deployed cloud infrastructure resources and other resources you already might have in your AWS account, apart from the [default tags](/docs/core-development-concepts/basics/project-deployment#tagged-resources), we're now also prefixing every resource name with the `wby-` prefix. For example, if we were to take a look at the list of deployed AWS Lambda functions, we'd be able to see the following: +In order to make it easier to distinguish between Webiny-related deployed cloud infrastructure resources and other resources you already might have in your AWS account, apart from the [default tags](/docs/{version}/core-development-concepts/basics/project-deployment#tagged-resources), we're now also prefixing every resource name with the `wby-` prefix. For example, if we were to take a look at the list of deployed AWS Lambda functions, we'd be able to see the following: <Image title="Introduced Prefixed Cloud Infrastructure (Pulumi) Resource Names" @@ -57,4 +57,4 @@ The exact same addition then needs to be made in the remaining three `webiny.app 2. `apps/admin/webiny.application.ts` 3. `apps/website/webiny.application.ts` -Once performed, the final step is to redeploy your Webiny project, as usual, via the [`webiny deploy`](/docs/core-development-concepts/basics/project-deployment) command. +Once performed, the final step is to redeploy your Webiny project, as usual, via the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command. diff --git a/docs/release-notes/5.33.4/upgrade-guide.mdx b/docs/release-notes/5.33.4/upgrade-guide.mdx index 9c10b6ef9..785d307c7 100644 --- a/docs/release-notes/5.33.4/upgrade-guide.mdx +++ b/docs/release-notes/5.33.4/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.33.5/upgrade-guide.mdx b/docs/release-notes/5.33.5/upgrade-guide.mdx index b291b2b31..ae636835e 100644 --- a/docs/release-notes/5.33.5/upgrade-guide.mdx +++ b/docs/release-notes/5.33.5/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.34.0/changelog.mdx b/docs/release-notes/5.34.0/changelog.mdx index 228080ea7..800836d53 100644 --- a/docs/release-notes/5.34.0/changelog.mdx +++ b/docs/release-notes/5.34.0/changelog.mdx @@ -82,7 +82,7 @@ This field also pushed us to improve handling of field validators. Having a vali Users can now run the conditional (`AND` and `OR`) filtering in both DynamoDB and DynamoDB + Elasticsearch systems. -To find out more about the advanced filtering, read this [article](/docs/headless-cms/basics/using-graphql-api-advanced-filtering). +To find out more about the advanced filtering, read this [article](/docs/{version}/headless-cms/basics/using-graphql-api-advanced-filtering). ### Nested Object Field Filtering ([#2853](https://github.com/webiny/webiny-js/pull/2853)) ([#2905](https://github.com/webiny/webiny-js/pull/2905)) @@ -210,7 +210,7 @@ Until now, when some code error happened (for example: reading property of `null By default, we now output the error `message`, `code` and `data` properties in the response, but users can modify that if they want to. -To find out how to add your own error handler, please read [this article](/docs/core-development-concepts/extending-and-customizing/customizing-the-error-output). +To find out how to add your own error handler, please read [this article](/docs/{version}/core-development-concepts/extending-and-customizing/customizing-the-error-output). ### Infrastructure Deploy Preview diff --git a/docs/release-notes/5.34.0/page-builder-pe-rendering-engine-migration.mdx b/docs/release-notes/5.34.0/page-builder-pe-rendering-engine-migration.mdx index aacaa2fe9..cb40ead17 100644 --- a/docs/release-notes/5.34.0/page-builder-pe-rendering-engine-migration.mdx +++ b/docs/release-notes/5.34.0/page-builder-pe-rendering-engine-migration.mdx @@ -71,7 +71,7 @@ The project also doesn't have any customizations, like custom typography, colors <Alert type={"info"}> -There's no need to run the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command +There's no need to run the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command immediately. We'll highlight when that's needed in one of the following sections. </Alert> @@ -177,7 +177,7 @@ Any other styling is completely handled via the mentioned [Emotion](https://emot ### First Look - Not Exactly What We Expected -At this point, we should be able to start up our Admin app locally, via the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command: +At this point, we should be able to start up our Admin app locally, via the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command: ```bash yarn webiny watch admin --env dev diff --git a/docs/release-notes/5.34.0/upgrade-guide.mdx b/docs/release-notes/5.34.0/upgrade-guide.mdx index 0427a8f6f..ed44ace97 100644 --- a/docs/release-notes/5.34.0/upgrade-guide.mdx +++ b/docs/release-notes/5.34.0/upgrade-guide.mdx @@ -72,7 +72,7 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.34.1/changelog.mdx b/docs/release-notes/5.34.1/changelog.mdx index d74562b4d..6b23dc1a9 100644 --- a/docs/release-notes/5.34.1/changelog.mdx +++ b/docs/release-notes/5.34.1/changelog.mdx @@ -105,7 +105,7 @@ This has now been addressed. The generated application code should now work with Users can now add custom sort options into the Schema for user defined CMS Models. The support for custom sorting, we also added the plugins for both DynamoDB and DynamoDB + Elasticsearch systems. -To find out more about custom sorting, please read this [article](/docs/headless-cms/extending/custom-sorting). +To find out more about custom sorting, please read this [article](/docs/{version}/headless-cms/extending/custom-sorting). ### Control Whether a Referenced Field Value Is Populated ([#2987](https://github.com/webiny/webiny-js/pull/2987)) diff --git a/docs/release-notes/5.34.1/upgrade-guide.mdx b/docs/release-notes/5.34.1/upgrade-guide.mdx index f96a6627e..80f9bce12 100644 --- a/docs/release-notes/5.34.1/upgrade-guide.mdx +++ b/docs/release-notes/5.34.1/upgrade-guide.mdx @@ -55,6 +55,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.34.2/upgrade-guide.mdx b/docs/release-notes/5.34.2/upgrade-guide.mdx index beafc4d6c..a706b0154 100644 --- a/docs/release-notes/5.34.2/upgrade-guide.mdx +++ b/docs/release-notes/5.34.2/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.34.3/changelog.mdx b/docs/release-notes/5.34.3/changelog.mdx index cc4c65b5f..41567f2a5 100644 --- a/docs/release-notes/5.34.3/changelog.mdx +++ b/docs/release-notes/5.34.3/changelog.mdx @@ -40,7 +40,7 @@ In the page editor, reordering existing page elements via drag and drop method n ### Ability To Define Multiple Production Environments Via `webiny.application.ts` ([#3014](https://github.com/webiny/webiny-js/pull/3014)) -Upon running the [`webiny deploy`](/docs/{exact:5.34.x}/core-development-concepts/basics/project-deployment) command, when `prod` is passed as the environment name, a Webiny project is deployed in the so-called [production deployment mode](https://www.webiny.com/docs/architecture/deployment-modes/production). +Upon running the [`webiny deploy`](/docs/{exact:5.34.x}/core-development-concepts/basics/project-deployment) command, when `prod` is passed as the environment name, a Webiny project is deployed in the so-called [production deployment mode](https://www.webiny.com/docs/{version}/architecture/deployment-modes/production). But, if a user wanted to use the same mode for, say, `staging`, that would not be easily possible. diff --git a/docs/release-notes/5.34.3/upgrade-guide.mdx b/docs/release-notes/5.34.3/upgrade-guide.mdx index 53780c462..6911f136c 100644 --- a/docs/release-notes/5.34.3/upgrade-guide.mdx +++ b/docs/release-notes/5.34.3/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.34.4/upgrade-guide.mdx b/docs/release-notes/5.34.4/upgrade-guide.mdx index 5cc526436..47df76109 100644 --- a/docs/release-notes/5.34.4/upgrade-guide.mdx +++ b/docs/release-notes/5.34.4/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.34.5/upgrade-guide.mdx b/docs/release-notes/5.34.5/upgrade-guide.mdx index 11f7f12f7..718e544b7 100644 --- a/docs/release-notes/5.34.5/upgrade-guide.mdx +++ b/docs/release-notes/5.34.5/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.34.6/changelog.mdx b/docs/release-notes/5.34.6/changelog.mdx index 48fdb9093..acf8c30c6 100644 --- a/docs/release-notes/5.34.6/changelog.mdx +++ b/docs/release-notes/5.34.6/changelog.mdx @@ -50,7 +50,7 @@ For all users that experienced this issue, deployment should start working corre ### Introduced `webiny build` Command ([#3074](https://github.com/webiny/webiny-js/pull/3074)) -As the name itself suggests, the new [`webiny build`](/docs/core-development-concepts/basics/webiny-cli#common-commands) command enables users to simply build their project application. The command can be useful when a project application needs to be just built, and not also deployed, which was previously not possible. +As the name itself suggests, the new [`webiny build`](/docs/{version}/core-development-concepts/basics/webiny-cli#common-commands) command enables users to simply build their project application. The command can be useful when a project application needs to be just built, and not also deployed, which was previously not possible. ### Improved Error Reporting When There's No Internal Workspace Folder ([#3075](https://github.com/webiny/webiny-js/pull/3075)) @@ -62,6 +62,6 @@ So, with this release, we've improved the error message, ensuring that the user ### Deploy Command - Always Execute Before/After Deploy Hooks ([#3078](https://github.com/webiny/webiny-js/pull/3078)) -Prior to this release, executing the [`webiny deploy`](/docs/core-development-concepts/basics/project-deployment) command with the `--preview` flag would cause the pre-deployment and post-deployment hooks not to be executed. In some cases, this could affect the result of the preview results, making them different from the deployment that would eventually happen. +Prior to this release, executing the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command with the `--preview` flag would cause the pre-deployment and post-deployment hooks not to be executed. In some cases, this could affect the result of the preview results, making them different from the deployment that would eventually happen. With this release, mentioned hooks will get triggered, no matter if the command was executed with the `--preview` flag or without it. diff --git a/docs/release-notes/5.34.6/upgrade-guide.mdx b/docs/release-notes/5.34.6/upgrade-guide.mdx index 38a69b254..a9ffe6452 100644 --- a/docs/release-notes/5.34.6/upgrade-guide.mdx +++ b/docs/release-notes/5.34.6/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.34.7/upgrade-guide.mdx b/docs/release-notes/5.34.7/upgrade-guide.mdx index 6729143d9..5991a2a11 100644 --- a/docs/release-notes/5.34.7/upgrade-guide.mdx +++ b/docs/release-notes/5.34.7/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.35.0/changelog.mdx b/docs/release-notes/5.35.0/changelog.mdx index e47f20e0f..284310053 100644 --- a/docs/release-notes/5.35.0/changelog.mdx +++ b/docs/release-notes/5.35.0/changelog.mdx @@ -55,7 +55,7 @@ import lexicalEditor from "./assets/lexical-editor.png"; ### Removed the Headless CMS AWS Lambda Function ([#2945](https://github.com/webiny/webiny-js/pull/2945)) -Prior to 5.35.0 version of Webiny, all remote GraphQL API HTTP requests were handled by two separate AWS Lambda functions. One function was responsible for serving the Default GraphQL API (accessible via the `/graphql` endpoint), while the other was responsible for serving the [Headless CMS GraphQL API](/docs/headless-cms/basics/graphql-api) (accessible via the `/cms/{type}/{locale}` endpoint). +Prior to 5.35.0 version of Webiny, all remote GraphQL API HTTP requests were handled by two separate AWS Lambda functions. One function was responsible for serving the Default GraphQL API (accessible via the `/graphql` endpoint), while the other was responsible for serving the [Headless CMS GraphQL API](/docs/{version}/headless-cms/basics/graphql-api) (accessible via the `/cms/{type}/{locale}` endpoint). Starting with 5.35.0, all remote GraphQL API HTTP requests are handled by a single AWS Lambda function. In other words, the function is responsible for serving both the Default and Headless CMS GraphQL APIs. Note that the mentioned `/graphql` and `/cms/{type}/{locale}` endpoints remain unchanged. @@ -175,7 +175,7 @@ By the default, the checkbox defining the default fields creation is checked, bu ### Model Icon ([#3142](https://github.com/webiny/webiny-js/pull/3142)) -We've introduced the ability to add an icon when creating or editing a content model. Within the Admin app, an icon picker will be shown when creating or editing content models. For models [defined via code](/docs/headless-cms/extending/content-models-via-code), users will need to type in the icon pack identifier and the icon identifier, in form of `packId/iconId`. For example, a newspaper icon is `fas/newspaper`. +We've introduced the ability to add an icon when creating or editing a content model. Within the Admin app, an icon picker will be shown when creating or editing content models. For models [defined via code](/docs/{version}/headless-cms/extending/content-models-via-code), users will need to type in the icon pack identifier and the icon identifier, in form of `packId/iconId`. For example, a newspaper icon is `fas/newspaper`. We have a few icon packs by default: `@fortawesome/free-brands-svg-icons` (`fab`), `@fortawesome/free-solid-svg-icons` (`fas`) and `@fortawesome/free-regular-svg-icons` (`far`). diff --git a/docs/release-notes/5.35.0/removing-the-headless-cms-lambda-function.mdx b/docs/release-notes/5.35.0/removing-the-headless-cms-lambda-function.mdx index a315696af..ab26aef61 100644 --- a/docs/release-notes/5.35.0/removing-the-headless-cms-lambda-function.mdx +++ b/docs/release-notes/5.35.0/removing-the-headless-cms-lambda-function.mdx @@ -14,7 +14,7 @@ Before starting with the migration, make sure you're using Webiny version 5.35.0 ## Introduction -Prior to 5.35.0 version of Webiny, remote GraphQL API HTTP requests were handled by two separate AWS Lambda functions. One function was responsible for serving the Default GraphQL API (accessible via the `/graphql` endpoint), while the other was responsible for serving the [Headless CMS GraphQL API](/docs/headless-cms/basics/graphql-api) (accessible via the `/cms/{type}/{locale}` endpoint). +Prior to 5.35.0 version of Webiny, remote GraphQL API HTTP requests were handled by two separate AWS Lambda functions. One function was responsible for serving the Default GraphQL API (accessible via the `/graphql` endpoint), while the other was responsible for serving the [Headless CMS GraphQL API](/docs/{version}/headless-cms/basics/graphql-api) (accessible via the `/cms/{type}/{locale}` endpoint). Starting with 5.35.0, all remote GraphQL API HTTP requests are handled by a single AWS Lambda function. In other words, the function is responsible for serving both the Default and Headless CMS GraphQL APIs. Note that the mentioned `/graphql` and `/cms/{type}/{locale}` endpoints remain unchanged. diff --git a/docs/release-notes/5.35.0/upgrade-guide.mdx b/docs/release-notes/5.35.0/upgrade-guide.mdx index 258d02d7d..b4d11bf29 100644 --- a/docs/release-notes/5.35.0/upgrade-guide.mdx +++ b/docs/release-notes/5.35.0/upgrade-guide.mdx @@ -103,7 +103,7 @@ first deploy your changes into one of your pre-production environments, like `de <Alert type="info"> Learn more about different deployment environments in the [CI/CD / -Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> @@ -248,7 +248,7 @@ With the new version, the following changes should be made: + const Heading = styled.div(({ theme }) => theme.styles.typography["heading1"]); ``` -Note that the upgrade command will try to detect legacy usages of the `theme` object and will try to adjust them automatically. However, if you have custom code that uses the `theme` object, you might need to make the necessary adjustments manually. You will notice this as, upon running the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command against the Admin or the Website application, errors will be reported. +Note that the upgrade command will try to detect legacy usages of the `theme` object and will try to adjust them automatically. However, if you have custom code that uses the `theme` object, you might need to make the necessary adjustments manually. You will notice this as, upon running the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command against the Admin or the Website application, errors will be reported. #### Default Form Layout Replaced diff --git a/docs/release-notes/5.35.1/upgrade-guide.mdx b/docs/release-notes/5.35.1/upgrade-guide.mdx index 0026a6768..3bb58f78c 100644 --- a/docs/release-notes/5.35.1/upgrade-guide.mdx +++ b/docs/release-notes/5.35.1/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.35.2/upgrade-guide.mdx b/docs/release-notes/5.35.2/upgrade-guide.mdx index ef5a7085a..bd707065f 100644 --- a/docs/release-notes/5.35.2/upgrade-guide.mdx +++ b/docs/release-notes/5.35.2/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.35.3/upgrade-guide.mdx b/docs/release-notes/5.35.3/upgrade-guide.mdx index ef93618cb..22df4f9ce 100644 --- a/docs/release-notes/5.35.3/upgrade-guide.mdx +++ b/docs/release-notes/5.35.3/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.35.4/upgrade-guide.mdx b/docs/release-notes/5.35.4/upgrade-guide.mdx index a19e59740..74e833aa0 100644 --- a/docs/release-notes/5.35.4/upgrade-guide.mdx +++ b/docs/release-notes/5.35.4/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.36.0/upgrade-guide.mdx b/docs/release-notes/5.36.0/upgrade-guide.mdx index b12808f54..e9981ee43 100644 --- a/docs/release-notes/5.36.0/upgrade-guide.mdx +++ b/docs/release-notes/5.36.0/upgrade-guide.mdx @@ -85,6 +85,6 @@ first deploy your changes into one of your pre-production environments, like `de <Alert type="info"> Learn more about different deployment environments in the [CI/CD / -Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.36.1/changelog.mdx b/docs/release-notes/5.36.1/changelog.mdx index 1a440915d..7b9dd83ad 100644 --- a/docs/release-notes/5.36.1/changelog.mdx +++ b/docs/release-notes/5.36.1/changelog.mdx @@ -63,6 +63,6 @@ The fix specifically targets instances where the migration failed due to this pa ### `webiny info` Command Now Works As Expected ([#3331](https://github.com/webiny/webiny-js/pull/3331)) -Prior to this release, the [`webiny info`](/docs/core-development-concepts/basics/webiny-cli#common-commands) command would not work if an environment wasn't passed (in which case the command should internally retrieve a list of all environments). +Prior to this release, the [`webiny info`](/docs/{version}/core-development-concepts/basics/webiny-cli#common-commands) command would not work if an environment wasn't passed (in which case the command should internally retrieve a list of all environments). This issue has now been addressed. diff --git a/docs/release-notes/5.36.1/upgrade-guide.mdx b/docs/release-notes/5.36.1/upgrade-guide.mdx index 0468c2d5f..bd3c6071b 100644 --- a/docs/release-notes/5.36.1/upgrade-guide.mdx +++ b/docs/release-notes/5.36.1/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.36.2/changelog.mdx b/docs/release-notes/5.36.2/changelog.mdx index cc1f25708..85b759f19 100644 --- a/docs/release-notes/5.36.2/changelog.mdx +++ b/docs/release-notes/5.36.2/changelog.mdx @@ -66,7 +66,7 @@ On the back of the improvements listed in the [Page Builder](http://localhost:80 ### Fully Destroy Your Project With the Improved `webiny destroy` Command ([#3353](https://github.com/webiny/webiny-js/pull/3353)) -Prior to this release, in order to fully destroy a deployed Webiny project, users would need to destroy all four project applications (**Website**, **Admin**, **API**, and **Core**), by sequentially running four separate [`webiny destroy`](/docs/infrastructure/basics/destroy-cloud-infrastructure#the-destroy-command) commands. +Prior to this release, in order to fully destroy a deployed Webiny project, users would need to destroy all four project applications (**Website**, **Admin**, **API**, and **Core**), by sequentially running four separate [`webiny destroy`](/docs/{version}/infrastructure/basics/destroy-cloud-infrastructure#the-destroy-command) commands. <br /> <br /> @@ -76,7 +76,7 @@ And although this was made a bit easier with the ability to [specify multiple ap <br /> <br /> -So, with this release, users can now run the [`webiny destroy`](/docs/infrastructure/basics/destroy-cloud-infrastructure) command without specifying the project application. This will destroy all four applications in the correct order, and in a single command execution. In other words, the command will fully destroy your Webiny project, deployed into the specified environment. +So, with this release, users can now run the [`webiny destroy`](/docs/{version}/infrastructure/basics/destroy-cloud-infrastructure) command without specifying the project application. This will destroy all four applications in the correct order, and in a single command execution. In other words, the command will fully destroy your Webiny project, deployed into the specified environment. For example: diff --git a/docs/release-notes/5.36.2/upgrade-guide.mdx b/docs/release-notes/5.36.2/upgrade-guide.mdx index bc6e7b964..884c5b5e1 100644 --- a/docs/release-notes/5.36.2/upgrade-guide.mdx +++ b/docs/release-notes/5.36.2/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.37.0/changelog.mdx b/docs/release-notes/5.37.0/changelog.mdx index 5b27e19c8..c3dbfc085 100644 --- a/docs/release-notes/5.37.0/changelog.mdx +++ b/docs/release-notes/5.37.0/changelog.mdx @@ -79,8 +79,8 @@ The Headless CMS offers various default features that developers may want to twe With this release, we present developers with a fresh approach to engage with a few of the Headless CMS's core features: -1. [Entry List Filters](/docs/headless-cms/extending/customize-entry-list-filters) -2. [Entry Editor Actions](/docs/headless-cms/extending/customize-entry-editor-actions) +1. [Entry List Filters](/docs/{version}/headless-cms/extending/customize-entry-list-filters) +2. [Entry Editor Actions](/docs/{version}/headless-cms/extending/customize-entry-editor-actions) <Gallery> <Image title={"Entry List default Filter"} src={hcmsFilters} /> diff --git a/docs/release-notes/5.37.1/changelog.mdx b/docs/release-notes/5.37.1/changelog.mdx index 662b13ab7..62ec658f7 100644 --- a/docs/release-notes/5.37.1/changelog.mdx +++ b/docs/release-notes/5.37.1/changelog.mdx @@ -48,7 +48,7 @@ This has now been addressed. ### 5.37.0 Migration Improvement ([#3469](https://github.com/webiny/webiny-js/pull/3469)) -We've received a couple of reports of 5.37.0 migration sometimes failing for users using the [Amazon DynamoDB + Amazon ElasticSearch database setup](/docs/architecture/introduction#different-database-setups). Essentially, upon ElasticSearch index creation, the migration would fail with the `resource_already_exists_exception` error being thrown, and this was happening despite the fact that the existence of the index was properly checked prior to its creation. +We've received a couple of reports of 5.37.0 migration sometimes failing for users using the [Amazon DynamoDB + Amazon ElasticSearch database setup](/docs/{version}/architecture/introduction#different-database-setups). Essentially, upon ElasticSearch index creation, the migration would fail with the `resource_already_exists_exception` error being thrown, and this was happening despite the fact that the existence of the index was properly checked prior to its creation. In order to try to resolve this issue, we've added more robust checks for the existence of the index. diff --git a/docs/release-notes/5.37.1/upgrade-guide.mdx b/docs/release-notes/5.37.1/upgrade-guide.mdx index 3d9c5e38f..8b7b188a0 100644 --- a/docs/release-notes/5.37.1/upgrade-guide.mdx +++ b/docs/release-notes/5.37.1/upgrade-guide.mdx @@ -57,6 +57,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.37.2/upgrade-guide.mdx b/docs/release-notes/5.37.2/upgrade-guide.mdx index a7983e2e1..f5116012c 100644 --- a/docs/release-notes/5.37.2/upgrade-guide.mdx +++ b/docs/release-notes/5.37.2/upgrade-guide.mdx @@ -57,6 +57,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.37.3/upgrade-guide.mdx b/docs/release-notes/5.37.3/upgrade-guide.mdx index 7dbabca7e..a0cde95c3 100644 --- a/docs/release-notes/5.37.3/upgrade-guide.mdx +++ b/docs/release-notes/5.37.3/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.37.4/upgrade-guide.mdx b/docs/release-notes/5.37.4/upgrade-guide.mdx index dd2bfcbf0..9374be20c 100644 --- a/docs/release-notes/5.37.4/upgrade-guide.mdx +++ b/docs/release-notes/5.37.4/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.37.5/upgrade-guide.mdx b/docs/release-notes/5.37.5/upgrade-guide.mdx index e9b8277ab..344cd417f 100644 --- a/docs/release-notes/5.37.5/upgrade-guide.mdx +++ b/docs/release-notes/5.37.5/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.37.6/upgrade-guide.mdx b/docs/release-notes/5.37.6/upgrade-guide.mdx index c74616581..542e15d2b 100644 --- a/docs/release-notes/5.37.6/upgrade-guide.mdx +++ b/docs/release-notes/5.37.6/upgrade-guide.mdx @@ -51,6 +51,6 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="info"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/5.38.0/changelog.mdx b/docs/release-notes/5.38.0/changelog.mdx index 4f84d9af6..7f6994931 100644 --- a/docs/release-notes/5.38.0/changelog.mdx +++ b/docs/release-notes/5.38.0/changelog.mdx @@ -27,7 +27,7 @@ import fnShiftSelect from "./assets/fm-shift-select.mp4"; ### Removal of `WEBINY_ELASTICSEARCH_INDEX_LOCALE` Environment Variable ([#3672](https://github.com/webiny/webiny-js/pull/3672)) -Used only with [Amazon DynamoDB + Amazon ElasticSearch](/docs/architecture/introduction#different-database-setups) database setup, the `WEBINY_ELASTICSEARCH_INDEX_LOCALE` environment variable would allow users to choose whether they want their ElasticSearch indexes to include a locale code in their names. +Used only with [Amazon DynamoDB + Amazon ElasticSearch](/docs/{version}/architecture/introduction#different-database-setups) database setup, the `WEBINY_ELASTICSEARCH_INDEX_LOCALE` environment variable would allow users to choose whether they want their ElasticSearch indexes to include a locale code in their names. Today, there is really no reason to not set this to `true`, so we've decided to hide this environment variable altogether, and always include the locale code in the index name. @@ -211,7 +211,7 @@ Often, you need to import or export data to and from Webiny, but you only have, ### Revamped Watch Command Output -We've revamped the output for the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command. +We've revamped the output for the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command. <Image src={watchCmd} alt={"Revamped Watch Command Output"} /> diff --git a/docs/release-notes/5.39.0/changelog.mdx b/docs/release-notes/5.39.0/changelog.mdx index eba7413fd..dadb9f304 100644 --- a/docs/release-notes/5.39.0/changelog.mdx +++ b/docs/release-notes/5.39.0/changelog.mdx @@ -36,7 +36,7 @@ On top of that, searching for entries and sorting based on the date/time or iden <Alert type={"info"}> -Content entries created with Webiny's Headless CMS are versioned. In other words, they consist of one or more revisions. For more info, check out the related [user guides](/docs/user-guides/headless-cms/essentials/glossary). +Content entries created with Webiny's Headless CMS are versioned. In other words, they consist of one or more revisions. For more info, check out the related [user guides](/docs/{version}/user-guides/headless-cms/essentials/glossary). </Alert> @@ -46,7 +46,7 @@ Revision-specific fields contain the `revision` prefix in their name, and, as th On the other hand, entry-specific fields do not contain any prefix, and contain entry-level information. For example, the `createdOn` meta field contains the date/time when an entry was initially created. The value of this field will not change even if the entry is updated or new revisions are created. -For the full list of new meta fields and additional information, please refer to the new [Date/Time and Identity (On/By) Meta Fields](/docs/headless-cms/references/date-time-and-identity-meta-fields) reference article. +For the full list of new meta fields and additional information, please refer to the new [Date/Time and Identity (On/By) Meta Fields](/docs/{version}/headless-cms/references/date-time-and-identity-meta-fields) reference article. #### Backwards Compatibility @@ -187,7 +187,7 @@ Finally, note that, at the moment, we do not provide a migration path from Amazo <Alert type={"info"}> -Visit the [Different Database Setups](/docs/architecture/introduction#different-database-setups) article to learn more +Visit the [Different Database Setups](/docs/{version}/architecture/introduction#different-database-setups) article to learn more about the different database setups Webiny supports. </Alert> @@ -220,7 +220,7 @@ For example, if you wanted to have a Lambda function which handled the **S3** ev From now on, for all AWS events we support, you can use the `createHandler` function from `@webiny/handler-aws` package. You can still use the old way of importing specific handler factories (s3, dynamodb, etc...), so this change is completely backwards compatible. -To find out more about our Lambda event handlers, please read [this](/docs/core-development-concepts/basics/routes-and-events) article. +To find out more about our Lambda event handlers, please read [this](/docs/{version}/core-development-concepts/basics/routes-and-events) article. ### Webiny CLI - Introducing the `webiny open` Command @@ -236,11 +236,11 @@ yarn webiny open admin --env dev yarn webiny open website --env dev ``` -This way, it's a bit easier to open the Admin or Website app. Users no longer need to first retrieve relevant URLs via the [`webiny info`](/docs/core-development-concepts/basics/webiny-cli#common-commands) or [`webiny output`](/docs/core-development-concepts/basics/webiny-cli#yarn-webiny-output-folder---env-env) command and then manually copy/paste them into the browser. +This way, it's a bit easier to open the Admin or Website app. Users no longer need to first retrieve relevant URLs via the [`webiny info`](/docs/{version}/core-development-concepts/basics/webiny-cli#common-commands) or [`webiny output`](/docs/{version}/core-development-concepts/basics/webiny-cli#yarn-webiny-output-folder---env-env) command and then manually copy/paste them into the browser. <Alert type={"info"}> -Note that, for local development, the apps are still spun up locally in the same way - via the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command. +Note that, for local development, the apps are still spun up locally in the same way - via the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command. </Alert> diff --git a/docs/release-notes/5.39.0/date-time-and-identity-meta-fields.mdx b/docs/release-notes/5.39.0/date-time-and-identity-meta-fields.mdx index 3e6b197fb..a1ddc1cd4 100644 --- a/docs/release-notes/5.39.0/date-time-and-identity-meta-fields.mdx +++ b/docs/release-notes/5.39.0/date-time-and-identity-meta-fields.mdx @@ -13,13 +13,13 @@ As mentioned in the [changelog](docs/release-notes/5.39.0/changelog#headless-cms Will these breaking changes affect you? It depends on if you've been adding custom code in your project, in which you are also relying on the existing content entry meta fields, like `ownedBy`, `publishedOn`, or `createdOn`. For example, you may have have been using these in your: 1. custom Headless CMS-related GraphQL API queries or mutations -2. custom Headless CMS-related JavaScript (TypeScript) code (for example, [lifecycle events](/docs/headless-cms/references/lifecycle-events)) +2. custom Headless CMS-related JavaScript (TypeScript) code (for example, [lifecycle events](/docs/{version}/headless-cms/references/lifecycle-events)) If you don't have any of the above, you can safely skip this article. Otherwise, please read on. <Alert type={"info"}> To learn more about the new date/time and identity-related meta fields, please refer to the{" "} - <a href={"/docs/headless-cms/references/date-time-and-identity-meta-fields"}> + <a href={"/docs/{version}/headless-cms/references/date-time-and-identity-meta-fields"}> Entry Date/Time and Identity (On/By) Meta Fields </a>{" "} guide. diff --git a/docs/release-notes/5.39.0/upgrade-guide.mdx b/docs/release-notes/5.39.0/upgrade-guide.mdx index 972a4e1ec..90fb5d6c2 100644 --- a/docs/release-notes/5.39.0/upgrade-guide.mdx +++ b/docs/release-notes/5.39.0/upgrade-guide.mdx @@ -50,7 +50,7 @@ As mentioned in the [changelog](docs/release-notes/5.39.0/changelog#headless-cms Will these breaking changes affect you? It depends on if you've been adding custom code in your project, in which you are also relying on the existing content entry meta fields, like `ownedBy`, `publishedOn`, or `createdOn`. For example, you may have have been using these in your: 1. custom Headless CMS-related GraphQL API queries or mutations -2. custom Headless CMS-related JavaScript (TypeScript) code (for example, [lifecycle events](/docs/headless-cms/references/lifecycle-events)) +2. custom Headless CMS-related JavaScript (TypeScript) code (for example, [lifecycle events](/docs/{version}/headless-cms/references/lifecycle-events)) If you don't have any of the above, you can safely skip this section. Otherwise, please take a look at the [Date/Time and Identity (On/By) Meta Fields](/docs/release-notes/5.39.0/date-time-and-identity-meta-fields) article. @@ -60,7 +60,7 @@ As mentioned in the [changelog](/docs/release-notes/5.39.0/changelog#deployments And despite the fact that, at the moment, the state machine is only utilized internally, this still means that, in order to deploy Webiny successfully, proper [AWS Identity and Access Management (IAM)](https://aws.amazon.com/iam/) permissions need to be in place. -For new users, this is not an issue because we've updated our [Deploy Webiny Project AWS CloudFormation template](/docs/infrastructure/aws/configure-aws-credentials#and-quot-deploy-webiny-project-and-quot-aws-cloud-formation-template) to include the required permissions. However, for existing users, this means that, in order to deploy Webiny successfully, they'll need to update the permissions attached to the IAM user or role they're using to deploy Webiny. +For new users, this is not an issue because we've updated our [Deploy Webiny Project AWS CloudFormation template](/docs/{version}/infrastructure/aws/configure-aws-credentials#and-quot-deploy-webiny-project-and-quot-aws-cloud-formation-template) to include the required permissions. However, for existing users, this means that, in order to deploy Webiny successfully, they'll need to update the permissions attached to the IAM user or role they're using to deploy Webiny. Ultimately, no matter if you're using the mentioned AWS CloudFormation template or not, the following additional permissions need to be attached to the IAM user or role you're using to deploy Webiny: @@ -87,7 +87,7 @@ custom Pulumi resource name prefix (set via `webiny.application.ts` files), you' For example, if using `my-123-prefix-` as the custom Pulumi resource name prefix, then the resource should be set to `arn:aws:states:*:*:stateMachine:my-123-prefix-*`. So, instead of ending with `wby-*`, the resource now ends with `my-123-prefix-*`. -For more information on custom Pulumi resource name prefixes, see [Pulumi Resource Name Prefixes](/docs/infrastructure/basics/modify-cloud-infrastructure#pulumi-resource-name-prefixes). +For more information on custom Pulumi resource name prefixes, see [Pulumi Resource Name Prefixes](/docs/{version}/infrastructure/basics/modify-cloud-infrastructure#pulumi-resource-name-prefixes). </Alert> diff --git a/docs/release-notes/5.39.13/changelog.mdx b/docs/release-notes/5.39.13/changelog.mdx index dad103f27..0a88e462b 100644 --- a/docs/release-notes/5.39.13/changelog.mdx +++ b/docs/release-notes/5.39.13/changelog.mdx @@ -12,6 +12,6 @@ import { GithubRelease } from "@/components/GithubRelease"; ### Ensure Published Entries Are Fully Deleted ([#4265](https://github.com/webiny/webiny-js/pull/4265)) -With this release, we've resolved an issue where deleting a published revision of a content entry would not make the entry disappear when listing content entries via [Headless CMS's READ GraphQL API](/docs/headless-cms/basics/graphql-api#read). In other words, the entry would still remain visible in the list of entries, even though it was deleted. +With this release, we've resolved an issue where deleting a published revision of a content entry would not make the entry disappear when listing content entries via [Headless CMS's READ GraphQL API](/docs/{version}/headless-cms/basics/graphql-api#read). In other words, the entry would still remain visible in the list of entries, even though it was deleted. Now, when a published entry is deleted, it will no longer be visible in the list of entries returned by the READ API. diff --git a/docs/release-notes/5.39.2/changelog.mdx b/docs/release-notes/5.39.2/changelog.mdx index c023bf8d4..ee26bea28 100644 --- a/docs/release-notes/5.39.2/changelog.mdx +++ b/docs/release-notes/5.39.2/changelog.mdx @@ -62,7 +62,7 @@ With this release, upon defining content models programmatically, developers now <Image src={securityPermissions} alt="Security Permissions Defined via the Security Application" /> -The existing [Define Content Models via Code](/docs/headless-cms/extending/content-models-via-code#disable-authorization-for-content-models-and-entries) article has been updated to include this new feature. +The existing [Define Content Models via Code](/docs/{version}/headless-cms/extending/content-models-via-code#disable-authorization-for-content-models-and-entries) article has been updated to include this new feature. ### Addressing Invalid `TYPE` Field Value ([#3893](https://github.com/webiny/webiny-js/pull/3893)) diff --git a/docs/release-notes/5.39.9/changelog.mdx b/docs/release-notes/5.39.9/changelog.mdx index c85766792..08cf2330e 100644 --- a/docs/release-notes/5.39.9/changelog.mdx +++ b/docs/release-notes/5.39.9/changelog.mdx @@ -26,7 +26,7 @@ This issue has been fixed, and now the published record is updated correctly whe <Alert type={"info"}> - This improvement only applies to projects that use [Amazon DynamoDB + Amazon OpenSearch database setup](/docs/architecture/introduction#different-database-setups). + This improvement only applies to projects that use [Amazon DynamoDB + Amazon OpenSearch database setup](/docs/{version}/architecture/introduction#different-database-setups). </Alert> @@ -40,7 +40,7 @@ Note that the errors we're referring to here are errors that are, in most cases, <Alert type={"info"}> - These improvements only apply to projects that use [Amazon DynamoDB + Amazon OpenSearch database setup](/docs/architecture/introduction#different-database-setups). + These improvements only apply to projects that use [Amazon DynamoDB + Amazon OpenSearch database setup](/docs/{version}/architecture/introduction#different-database-setups). </Alert> diff --git a/docs/release-notes/5.4.0/changelog.mdx b/docs/release-notes/5.4.0/changelog.mdx index 21f330a56..f196b4807 100644 --- a/docs/release-notes/5.4.0/changelog.mdx +++ b/docs/release-notes/5.4.0/changelog.mdx @@ -32,7 +32,7 @@ In a couple of different scenarios, performing data filtering on boolean and num <Alert type="info" title="Headless CMS GraphQL API"> -Learn more about the Headless CMS GraphQL API in the [Headless CMS GraphQL API](/docs/headless-cms/basics/graphql-api) key topic. +Learn more about the Headless CMS GraphQL API in the [Headless CMS GraphQL API](/docs/{version}/headless-cms/basics/graphql-api) key topic. </Alert> @@ -50,7 +50,7 @@ With this release, all of the static assets that you upload as part of the **Web <Alert type="info"> -Learn more about the **Website** project application on the cloud infrastructure level in the [Cloud Infrastructure](/docs/architecture/website/overview) key topics section. +Learn more about the **Website** project application on the cloud infrastructure level in the [Cloud Infrastructure](/docs/{version}/architecture/website/overview) key topics section. </Alert> diff --git a/docs/release-notes/5.4.0/upgrade-guide.mdx b/docs/release-notes/5.4.0/upgrade-guide.mdx index dbf823a2c..7fcef1d42 100644 --- a/docs/release-notes/5.4.0/upgrade-guide.mdx +++ b/docs/release-notes/5.4.0/upgrade-guide.mdx @@ -101,7 +101,7 @@ As it was always the case, upon deploying **Website** and **Admin Area** project Due to website prerendering improvements that the 5.4.0 release brings, in the Amazon S3 bucket that's deployed as part of the **Website** project application, expect to have multiple `static-{RANDOM_ID}` folders - one for each deploy. If you're deploying frequently and you end up having a lot of folders, you might want to schedule a cleanup task, that will delete folders that are no longer in use. -Check out the [Cloud Infrastructure](/docs/architecture/website/prerendering-pages) key topics section to learn more about all of the resources included in the process. +Check out the [Cloud Infrastructure](/docs/{version}/architecture/website/prerendering-pages) key topics section to learn more about all of the resources included in the process. </Alert> diff --git a/docs/release-notes/5.40.0/changelog.mdx b/docs/release-notes/5.40.0/changelog.mdx index 7ab26847f..f6ebcaa8b 100644 --- a/docs/release-notes/5.40.0/changelog.mdx +++ b/docs/release-notes/5.40.0/changelog.mdx @@ -120,7 +120,7 @@ Content entry traverser allows you to traverse any given content entry using the This tool is very useful in situations when you need to, for example, extract specific values from an entry, send them to an external API for processing, and then inject the processed values back to their original position in the source entry, asynchronously (via webhooks, for example). -To learn how to use it, visit the [Content Entry Traverser](/docs/headless-cms/extending/content-entry-traverser) article. +To learn how to use it, visit the [Content Entry Traverser](/docs/{version}/headless-cms/extending/content-entry-traverser) article. ### Field Renderer Settings @@ -218,7 +218,7 @@ Furthermore, in order to make it easier for developers to create new extensions, Ultimately, the goal is to make the extension creation process as seamless as possible, enabling developers to quickly and efficiently extend Webiny to meet their specific requirements. With the new `extensions` folder and the **New Extension** scaffold, we believe we've taken a significant step in that direction. -For more information, please refer to the new [Extensions](/docs/core-development-concepts/basics/extensions) article. +For more information, please refer to the new [Extensions](/docs/{version}/core-development-concepts/basics/extensions) article. #### Note on Backward Compatibility @@ -265,7 +265,7 @@ In terms of existing documentation, we've already updated some of the articles t ### Webiny CLI and `create-webiny-project` ([#4045](https://github.com/webiny/webiny-js/pull/4045)) -With this release, we took some time to improve the [Webiny CLI](/docs/core-development-concepts/basics/webiny-cli) and the `create-webiny-project` CLI, which is used to create new Webiny projects. The focus was on improving the overall user experience and making the CLI tools more user-friendly. +With this release, we took some time to improve the [Webiny CLI](/docs/{version}/core-development-concepts/basics/webiny-cli) and the `create-webiny-project` CLI, which is used to create new Webiny projects. The focus was on improving the overall user experience and making the CLI tools more user-friendly. In the following sections, we cover some of the user-facing improvements that were made. For a full list of changes, check out the [linked pull request](https://github.com/webiny/webiny-js/pull/4045). @@ -304,7 +304,7 @@ Prior to this release, the project details would need to be fetched manually by #### Improved `webiny about` Command -The [`webiny about`](/docs/core-development-concepts/basics/webiny-cli#yarn-webiny-about) command has been improved to provide more information about the Webiny project you're working on. The command now also includes the following information: +The [`webiny about`](/docs/{version}/core-development-concepts/basics/webiny-cli#yarn-webiny-about) command has been improved to provide more information about the Webiny project you're working on. The command now also includes the following information: 1. the database setup the project is using 2. user's current version of NPM. @@ -314,7 +314,7 @@ The [`webiny about`](/docs/core-development-concepts/basics/webiny-cli#yarn-webi #### Refreshed `webiny info` Command -The [`webiny info`](/docs/core-development-concepts/basics/webiny-cli#yarn-webiny-info-env-env) command has been visually refreshed a bit. +The [`webiny info`](/docs/{version}/core-development-concepts/basics/webiny-cli#yarn-webiny-info-env-env) command has been visually refreshed a bit. <Image src={refreshedWebinyInfoCommand} title={'Refreshed "webiny info" Command'} /> @@ -328,7 +328,7 @@ Although no breaking changes are expected, we've still compiled a list of all of ### Preventing Production Deployments with Locally Stored State Files ([#4119](https://github.com/webiny/webiny-js/pull/4119)) -We've seen a couple of cases where uses would still use locally stored [Pulumi](/docs/infrastructure/pulumi-iac/iac-with-pulumi) state files with their production environments. This is not recommended, so we've made it a bit harder to do so. +We've seen a couple of cases where uses would still use locally stored [Pulumi](/docs/{version}/infrastructure/pulumi-iac/iac-with-pulumi) state files with their production environments. This is not recommended, so we've made it a bit harder to do so. In case a production deployment with locally stored state files is detected, the deployment will fail with an error message. Still, if the user wishes to bypass this check, they can append the new `--allow-local-state-files` flag to the deployment command. @@ -341,7 +341,7 @@ The `env` object contains two properties: - `name` - the name of the environment - `isProduction` - a boolean value indicating whether the environment is considered a production environment -Note that the `isProduction` value is calculated based on the list of production environment names that are defined via the existing [`productionEnvironments`](/docs/infrastructure/basics/modify-cloud-infrastructure#defining-multiple-production-environments) property in the `webiny.project.ts` file. +Note that the `isProduction` value is calculated based on the list of production environment names that are defined via the existing [`productionEnvironments`](/docs/{version}/infrastructure/basics/modify-cloud-infrastructure#defining-multiple-production-environments) property in the `webiny.project.ts` file. An example of how the `env` object can be used is shown below: diff --git a/docs/release-notes/5.40.0/pulumi-v6.mdx b/docs/release-notes/5.40.0/pulumi-v6.mdx index 5d36e3217..3ca3159f1 100644 --- a/docs/release-notes/5.40.0/pulumi-v6.mdx +++ b/docs/release-notes/5.40.0/pulumi-v6.mdx @@ -24,7 +24,7 @@ Note that, on top of the changes listed in this article, you should pay extra at <Alert type="info"> To deploy necessary cloud infrastructure resources, by default, Webiny relies on Pulumi, a modern infrastructure as -code framework. Find out more in the following [IaC with Pulumi](/docs/infrastructure/pulumi-iac/iac-with-pulumi) +code framework. Find out more in the following [IaC with Pulumi](/docs/{version}/infrastructure/pulumi-iac/iac-with-pulumi) article. </Alert> @@ -32,7 +32,7 @@ article. <Alert type="warning"> With the 5.40.0 release, by default, the deployment (Pulumi) logs [are hidden](/docs/release-notes/5.40.0/changelog#pulumi-output-hidden-by-default) when deploying from local machines. To see -the logs, you can append the `--deployment-logs` flag upon running the [`webiny deploy`](/docs/core-development-concepts/basics/project-deployment) command. +the logs, you can append the `--deployment-logs` flag upon running the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command. </Alert> diff --git a/docs/release-notes/5.40.5/changelog.mdx b/docs/release-notes/5.40.5/changelog.mdx index a7fb4ccf0..51983d037 100644 --- a/docs/release-notes/5.40.5/changelog.mdx +++ b/docs/release-notes/5.40.5/changelog.mdx @@ -45,7 +45,7 @@ Note that we will slowly be updating our documentation to include this feature i ### `webiny about` Command Now Showing Correct `@pulumi/pulumi` Package Version ([#4216](https://github.com/webiny/webiny-js/pull/4216)) -By [updating Pulumi package versions](#updated-pulumi-package-versions-4216), we've also fixed an issue with the [`webiny about`](/docs/core-development-concepts/basics/webiny-cli#yarn-webiny-about) command, which would incorrectly report the `@pulumi/pulumi` package version. +By [updating Pulumi package versions](#updated-pulumi-package-versions-4216), we've also fixed an issue with the [`webiny about`](/docs/{version}/core-development-concepts/basics/webiny-cli#yarn-webiny-about) command, which would incorrectly report the `@pulumi/pulumi` package version. <Image src={webinyAboutFixed} style={{maxWidth: 600}} title={<><code>webiny about</code> Command Now Showing Correct <code>@pulumi/pulumi</code> Package Version</>}/> @@ -59,7 +59,7 @@ With this release, we've ported the following changes from the [5.39.9 release]( <Alert type={"info"}> - This improvement only applies to projects that use [Amazon DynamoDB + Amazon OpenSearch database setup](/docs/architecture/introduction#different-database-setups). + This improvement only applies to projects that use [Amazon DynamoDB + Amazon OpenSearch database setup](/docs/{version}/architecture/introduction#different-database-setups). </Alert> @@ -73,7 +73,7 @@ Note that the errors we're referring to here are errors that are, in most cases, <Alert type={"info"}> - These improvements only apply to projects that use [Amazon DynamoDB + Amazon OpenSearch database setup](/docs/architecture/introduction#different-database-setups). + These improvements only apply to projects that use [Amazon DynamoDB + Amazon OpenSearch database setup](/docs/{version}/architecture/introduction#different-database-setups). </Alert> diff --git a/docs/release-notes/5.40.7/changelog.mdx b/docs/release-notes/5.40.7/changelog.mdx index f9d419b34..4b5269a50 100644 --- a/docs/release-notes/5.40.7/changelog.mdx +++ b/docs/release-notes/5.40.7/changelog.mdx @@ -14,7 +14,7 @@ Upon deploying API, Admin, and Website applications, Webiny deploys Amazon Cloud <Alert> - Learn more about Webiny's cloud architecture in the [Cloud Architecture](/docs/architecture/introduction) documentation. + Learn more about Webiny's cloud architecture in the [Cloud Architecture](/docs/{version}/architecture/introduction) documentation. </Alert> diff --git a/docs/release-notes/5.41.0/changelog.mdx b/docs/release-notes/5.41.0/changelog.mdx index 9f4e8ecd1..0d47f8352 100644 --- a/docs/release-notes/5.41.0/changelog.mdx +++ b/docs/release-notes/5.41.0/changelog.mdx @@ -101,7 +101,7 @@ At this stage, real-time status updates on background tasks are not supported. U When upgrading to version 5.41.X, it is crucial to review and update any custom bulk actions you have implemented. The new background task processing introduces changes that may impact how your bulk actions function, potentially causing unexpected behaviour if not updated. To ensure compatibility, you need to either: -- **Add a Bulk Action Task**: Implement background task support. Detailed guidance is available in [the documentation](/docs/headless-cms/extending/customize-entry-list-bulk-actions#bulk-action-via-background-task). +- **Add a Bulk Action Task**: Implement background task support. Detailed guidance is available in [the documentation](/docs/{version}/headless-cms/extending/customize-entry-list-bulk-actions#bulk-action-via-background-task). - **Handle "Select All" Scenarios**: If users select all entries in the current view, prevent the immediate execution of the bulk action by disabling the trigger. Use the `worker.isSelectedAll` flag to check whether all entries are selected before proceeding. ## Page Builder @@ -123,7 +123,7 @@ We'll be monitoring the situation closely, and if we see that the issue persists <Alert> To learn more about the prerendering process Webiny's Page Builder app users to prerender published pages, check out -the [Prerendering Pages](https://www.webiny.com/docs/architecture/website/prerendering-pages) article. +the [Prerendering Pages](https://www.webiny.com/docs/{version}/architecture/website/prerendering-pages) article. </Alert> @@ -169,7 +169,7 @@ know](https://www.webiny.com/slack). </Alert> -From the early days, in order to perform both backend and frontend development, Webiny users would use the [`webiny watch`](/docs/core-development-concepts/basics/watch-command) command. And while this command works fine when it comes to frontend development (Admin, public website), we've come to a conclusion that it's not the best solution for backend development. +From the early days, in order to perform both backend and frontend development, Webiny users would use the [`webiny watch`](/docs/{version}/core-development-concepts/basics/watch-command) command. And while this command works fine when it comes to frontend development (Admin, public website), we've come to a conclusion that it's not the best solution for backend development. One of the reasons is the fact that, whenever a backend code change is made, the code needs to redeployed to AWS Lambda, which can take anywhere from 5 seconds, up to a minute, and even more. This can be a real productivity killer, especially when you're working on a feature that requires a lot of backend changes. Another reason is the inability to properly debug the backend code, as the `webiny watch` command doesn't provide a way to debug the code running in AWS Lambda. @@ -221,7 +221,7 @@ getaddrinfo ENOTFOUND xyz123abc-ats.iot.eu-central-1.amazonaws.com... You can fix it by just waiting a bit for the underlying infrastructure to be fully set up. This is a one-time issue, and you shouldn't see it again after the first deployment. </Alert> -With all of these steps completed, you should be able to see the new watch command in action. To learn more, we've also created a new section in our existing [`watch command`](/docs/core-development-concepts/basics/watch-command) article, which explains how to use this new feature. +With all of these steps completed, you should be able to see the new watch command in action. To learn more, we've also created a new section in our existing [`watch command`](/docs/{version}/core-development-concepts/basics/watch-command) article, which explains how to use this new feature. We hope you'll find this new feature useful, and we're looking forward to hearing your feedback! @@ -264,7 +264,7 @@ With this release, we've addressed a couple of issues related to missing or inco <Alert type={"info"}> Learn more about the **Deploy Webiny Project** AWS CloudFormation template in our [Configure AWS -Credentials](/docs/infrastructure/aws/configure-aws-credentials#deploy-webiny-project-aws-cloud-formation-template) +Credentials](/docs/{version}/infrastructure/aws/configure-aws-credentials#deploy-webiny-project-aws-cloud-formation-template) article. </Alert> @@ -281,7 +281,7 @@ As we can see, we've only bumped the patch versions of these packages, which mea <Alert type="info"> Webiny projects are deployed with Pulumi - a modern infrastructure as code (IaC) solution. Check out the [Iac with -Pulumi](/docs/infrastructure/pulumi-iac/iac-with-pulumi) topic to learn more. +Pulumi](/docs/{version}/infrastructure/pulumi-iac/iac-with-pulumi) topic to learn more. </Alert> @@ -289,7 +289,7 @@ Pulumi](/docs/infrastructure/pulumi-iac/iac-with-pulumi) topic to learn more. In this release we have added the ability to make Webiny share indexes via Pulumi configuration. -To find out more about shared indexes, please read [this](/docs/core-development-concepts/extending-and-customizing/how-to-customize-elasticsearch-index) article. +To find out more about shared indexes, please read [this](/docs/{version}/core-development-concepts/extending-and-customizing/how-to-customize-elasticsearch-index) article. To make Elasticsearch share indexes, you need to add the following configuration to your `apps/core/webiny.aplication.ts` file: diff --git a/docs/release-notes/5.41.1/changelog.mdx b/docs/release-notes/5.41.1/changelog.mdx index aebf1bab7..f7d8ba53c 100644 --- a/docs/release-notes/5.41.1/changelog.mdx +++ b/docs/release-notes/5.41.1/changelog.mdx @@ -123,11 +123,11 @@ As already mentioned above, in the same fashion, the extension can be accessed v ### Improved Error Messages ([#4341](https://github.com/webiny/webiny-js/pull/4341)) -Prior to this release, in case a user immediately tried to [watch](/docs/core-development-concepts/basics/watch-command) the **Admin** or **Website** frontend applications, but the **Core** and **API** applications weren't deployed, they would receive an error message that wasn't very helpful. We've improved this error message to provide more context and help users understand what's going on. +Prior to this release, in case a user immediately tried to [watch](/docs/{version}/core-development-concepts/basics/watch-command) the **Admin** or **Website** frontend applications, but the **Core** and **API** applications weren't deployed, they would receive an error message that wasn't very helpful. We've improved this error message to provide more context and help users understand what's going on. ### The `webiny extension` Command -Up until now, in order to scaffold a new extension, users had to run the `yarn webiny scaffold` command, and then select **New Extension** from the list of all available scaffolds. And although this isn't a big deal, still, since extensions are becoming more and more important in the last couple of releases, we've decided to introduce a new command called [`webiny extension`](/docs/core-development-concepts/basics/webiny-cli#yarn-webiny-extension). +Up until now, in order to scaffold a new extension, users had to run the `yarn webiny scaffold` command, and then select **New Extension** from the list of all available scaffolds. And although this isn't a big deal, still, since extensions are becoming more and more important in the last couple of releases, we've decided to introduce a new command called [`webiny extension`](/docs/{version}/core-development-concepts/basics/webiny-cli#yarn-webiny-extension). Essentially, everything stays the same, but now, instead of running `yarn webiny scaffold`, users can run `yarn webiny extension` to scaffold a new extension. diff --git a/docs/release-notes/5.41.2/changelog.mdx b/docs/release-notes/5.41.2/changelog.mdx index 51d45253d..a9485f422 100644 --- a/docs/release-notes/5.41.2/changelog.mdx +++ b/docs/release-notes/5.41.2/changelog.mdx @@ -71,7 +71,7 @@ Upon deploying Admin and Website applications, Webiny deploys a couple of Cloudf <Alert> - Learn more about Webiny's cloud architecture in the [Cloud Architecture](/docs/architecture/introduction) documentation. + Learn more about Webiny's cloud architecture in the [Cloud Architecture](/docs/{version}/architecture/introduction) documentation. </Alert> @@ -89,7 +89,7 @@ To fix this, we had to internally instruct Pulumi to ignore changes in the `stag ### Skip "First Deployment" Check When In CI Environment ([#4408](https://github.com/webiny/webiny-js/pull/4408)) -When users deploy their project for the first time via the [`webiny deploy`](/docs/core-development-concepts/basics/project-deployment) command, Webiny shows the following short message: +When users deploy their project for the first time via the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command, Webiny shows the following short message: <Image src={firstDeployment} alt="First Deployment Message" /> @@ -105,7 +105,7 @@ We've added basic error logging during the execution of lifecycle event handlers This will help users debug issues because. Not only will they be able to see the newly added logs in their [Amazon CloudWatch logs](https://webiny.link/cloudwatch), but also, in their browser. -The following example shows a log that happened because of an error that occurred during the [`onEntryBeforePublish`](/docs/headless-cms/references/lifecycle-events#on-entry-before-publish) lifecycle event: +The following example shows a log that happened because of an error that occurred during the [`onEntryBeforePublish`](/docs/{version}/headless-cms/references/lifecycle-events#on-entry-before-publish) lifecycle event: <Image src={errorLoggingEventHandlers} alt="Error Logging Event Handlers" shadow={false}/> @@ -113,7 +113,7 @@ The following example shows a log that happened because of an error that occurre In case you missed it, with the `DEBUG` env variable set to `true`, all the logs that occur during a single GraphQL HTTP request are actually forwarded to user's browser console. - To learn more about the `DEBUG` environment variable, check out the [Environment Variables](/docs/core-development-concepts/basics/environment-variables#debug) documentation. + To learn more about the `DEBUG` environment variable, check out the [Environment Variables](/docs/{version}/core-development-concepts/basics/environment-variables#debug) documentation. </Alert> diff --git a/docs/release-notes/5.41.4/changelog.mdx b/docs/release-notes/5.41.4/changelog.mdx index 0a42e76dc..c0ac8ef58 100644 --- a/docs/release-notes/5.41.4/changelog.mdx +++ b/docs/release-notes/5.41.4/changelog.mdx @@ -39,7 +39,7 @@ We've introduced a new type of an extension called **Page Builder element** exte Once run, the extension will make sure a users ends up with all of the required files and configurations for a new Page Builder element plugin. This will make it easier for users to start developing new Page Builder elements. -The extension can be accessed like any other extension, via the [`webiny extension`](/docs/core-development-concepts/basics/webiny-cli#yarn-webiny-extension) command, by then selecting **Page Builder Element** from the list of all available extensions. +The extension can be accessed like any other extension, via the [`webiny extension`](/docs/{version}/core-development-concepts/basics/webiny-cli#yarn-webiny-extension) command, by then selecting **Page Builder Element** from the list of all available extensions. ### New Page Element Plugins ([#4340](https://github.com/webiny/webiny-js/pull/4340)) diff --git a/docs/release-notes/5.42.0/changelog.mdx b/docs/release-notes/5.42.0/changelog.mdx index 1bd0bdc40..061dc1186 100644 --- a/docs/release-notes/5.42.0/changelog.mdx +++ b/docs/release-notes/5.42.0/changelog.mdx @@ -61,7 +61,7 @@ We have added a new `Logger` into to the system. This logger is primarily for ou </Alert> -If you want to use logger in your project, you can read about it in [this article](/docs/core-development-concepts/basics/logger). +If you want to use logger in your project, you can read about it in [this article](/docs/{version}/core-development-concepts/basics/logger). ### Updated Dependencies ([#4353](https://github.com/webiny/webiny-js/pull/4353) [#4338](https://github.com/webiny/webiny-js/pull/4338) [#4426](https://github.com/webiny/webiny-js/pull/4426) [#4430](https://github.com/webiny/webiny-js/pull/4430)) @@ -69,7 +69,7 @@ We have updated a number of Webiny dependencies in this release. We will not lis If there are any out of date (out of sync) packages in our users project, they will be informed about that during the upgrade process, and will be given an option to update them to the same version Webiny uses. -To find out more about that part of the upgrade process, please read [this article](/docs/core-development-concepts/basics/user-project-upgrade). +To find out more about that part of the upgrade process, please read [this article](/docs/{version}/core-development-concepts/basics/user-project-upgrade). ### Removed `apps/api/graphql/src/types.ts` File (New Projects Only) @@ -121,7 +121,7 @@ Of course, if needed, you can further modify these limits in your `webiny.applic <Alert> - Check out the [Modify Cloud Infrastructure](/docs/infrastructure/basics/modify-cloud-infrastructure) to learn more about modifying the cloud infrastructure that Webiny deploys. + Check out the [Modify Cloud Infrastructure](/docs/{version}/infrastructure/basics/modify-cloud-infrastructure) to learn more about modifying the cloud infrastructure that Webiny deploys. </Alert> diff --git a/docs/release-notes/5.42.1/changelog.mdx b/docs/release-notes/5.42.1/changelog.mdx index dd00c3bc7..bcbecde12 100644 --- a/docs/release-notes/5.42.1/changelog.mdx +++ b/docs/release-notes/5.42.1/changelog.mdx @@ -14,13 +14,13 @@ import { Alert } from "@/components/Alert"; ### Consolidation of Headless CMS Backend Plugin Naming ([#4502](https://github.com/webiny/webiny-js/pull/4502)) -We noticed there were some naming-related inconsistencies in Headless CMS backend plugins. For example, when defining a new [content model](/docs/headless-cms/extending/content-models-via-code), users would use the `createCmsModelPlugin` factory function. On the other hand, when defining a [single entry model](/docs/release-notes/5.40.6/changelog#introducing-single-entry-models-beta-4228-4298-4296), they would use the `createSingleEntryModel` factory function. +We noticed there were some naming-related inconsistencies in Headless CMS backend plugins. For example, when defining a new [content model](/docs/{version}/headless-cms/extending/content-models-via-code), users would use the `createCmsModelPlugin` factory function. On the other hand, when defining a [single entry model](/docs/release-notes/5.40.6/changelog#introducing-single-entry-models-beta-4228-4298-4296), they would use the `createSingleEntryModel` factory function. This PR not only consolidates the naming of these plugins but also exports them all via the `@webiny/api-serverless-cms` package. This way, users can import all CMS-related plugins from a single package. <Alert> - The existing [Define Content Models via Code](/docs/headless-cms/extending/content-models-via-code) article has been updated to reflect these changes. + The existing [Define Content Models via Code](/docs/{version}/headless-cms/extending/content-models-via-code) article has been updated to reflect these changes. </Alert> @@ -61,7 +61,7 @@ With this release, we've fixed an issue where these Admin User entries were not ### Fixed VPC Configuration for Production Deployment ([#4521](https://github.com/webiny/webiny-js/pull/4521)) -In case you missed it, Webiny can be deployed into two [deployment modes](/docs/architecture/deployment-modes/introduction): development and production. As the names suggest, the development mode is used for development and testing purposes, while the production mode is used for live applications. +In case you missed it, Webiny can be deployed into two [deployment modes](/docs/{version}/architecture/deployment-modes/introduction): development and production. As the names suggest, the development mode is used for development and testing purposes, while the production mode is used for live applications. When comparing the two, the main difference is the usage of Amazon VPC (Virtual Private Cloud). In production mode, eligible cloud resources are deployed within a VPC, which provides an additional layer of security and isolation. @@ -84,7 +84,7 @@ When not using the `/enterprise` version, the VPC configuration would be applied ### Refreshing the CI/CD Scaffold ([#4526](https://github.com/webiny/webiny-js/pull/4526)) -We've refreshed the [GitHub Actions CI/CD](/docs/core-development-concepts/ci-cd/setup#git-hub-actions) scaffold to ensure it's up-to-date with the latest changes. One of the main changes is the update of Node.js version that was used to run the CI/CD pipeline. The version has been updated from 14 all the way to 20. +We've refreshed the [GitHub Actions CI/CD](/docs/{version}/core-development-concepts/ci-cd/setup#git-hub-actions) scaffold to ensure it's up-to-date with the latest changes. One of the main changes is the update of Node.js version that was used to run the CI/CD pipeline. The version has been updated from 14 all the way to 20. ## Other diff --git a/docs/release-notes/5.42.3/changelog.mdx b/docs/release-notes/5.42.3/changelog.mdx index ffeb3afdc..64378d39b 100644 --- a/docs/release-notes/5.42.3/changelog.mdx +++ b/docs/release-notes/5.42.3/changelog.mdx @@ -27,7 +27,7 @@ These plugins allow fine-grained control, such as targeting specific models. For more details, check out the related documentation: -- [Adding custom fields to CMS folders](/docs/headless-cms/extending/customize-folder-fields) +- [Adding custom fields to CMS folders](/docs/{version}/headless-cms/extending/customize-folder-fields) - [Adding custom fields to Page Builder folders](/docs/page-builder/extending/customize-folder-fields) - [Adding custom fields to File Manager folders](/docs/file-manager/extending/customize-folder-fields) diff --git a/docs/release-notes/5.43.0/upgrade-guide.mdx b/docs/release-notes/5.43.0/upgrade-guide.mdx index 5e87d40b9..fc885c355 100644 --- a/docs/release-notes/5.43.0/upgrade-guide.mdx +++ b/docs/release-notes/5.43.0/upgrade-guide.mdx @@ -110,7 +110,7 @@ Once you have updated your Webiny project configuration, you will need to redepl Note that, during deployment, the VPC configuration will now be correctly attached to the Amazon OpenSearch cluster. As a result, the previously deployed cluster will be **DESTROYED** and a new one created. This will result in the **loss of all data from the previous cluster**❗ -Luckily, the data can be recreated. Once the new cluster is deployed, the recreation can be done via the [Amazon OpenSearch - Reindexing Background Task](/docs/core-development-concepts/background-tasks/built-in-background-tasks#amazon-open-search-reindexing-background-task), which can be triggered via the GraphQL API or via a custom plugin. This can also be done manually, or alternatively, via a [post-deployment hook](https://www.webiny.com/docs/infrastructure/basics/build-and-deploy-hooks) script that you can add to your Webiny project. +Luckily, the data can be recreated. Once the new cluster is deployed, the recreation can be done via the [Amazon OpenSearch - Reindexing Background Task](/docs/{version}/core-development-concepts/background-tasks/built-in-background-tasks#amazon-open-search-reindexing-background-task), which can be triggered via the GraphQL API or via a custom plugin. This can also be done manually, or alternatively, via a [post-deployment hook](https://www.webiny.com/docs/{version}/infrastructure/basics/build-and-deploy-hooks) script that you can add to your Webiny project. In case you need more help with this, especially when it comes to planning and executing the data migration, please reach out to us via our [community Slack](https://webiny.com/slack). diff --git a/docs/release-notes/5.43.2/changelog.mdx b/docs/release-notes/5.43.2/changelog.mdx index e63638a0f..65cb7ec68 100644 --- a/docs/release-notes/5.43.2/changelog.mdx +++ b/docs/release-notes/5.43.2/changelog.mdx @@ -16,7 +16,7 @@ A new **confirmation dialog** has been introduced when users move folders via dr By enabling the new `DropConfirmation` configuration under the `Browser.Folder` namespace, users will now be prompted to confirm the action, helping prevent accidental folder moves. -This feature is available in the [CMS](/docs/headless-cms/extending/confirmation-dialog-for-folder-drag-and-drop), [File Manager](/docs/file-manager/extending/confirmation-dialog-for-folder-drag-and-drop) and [Page Builder](/docs/page-builder/extending/confirmation-dialog-for-folder-drag-and-drop) apps. +This feature is available in the [CMS](/docs/{version}/headless-cms/extending/confirmation-dialog-for-folder-drag-and-drop), [File Manager](/docs/file-manager/extending/confirmation-dialog-for-folder-drag-and-drop) and [Page Builder](/docs/page-builder/extending/confirmation-dialog-for-folder-drag-and-drop) apps. By default, the confirmation is disabled (`false`) and can be turned on by setting `DropConfirmation` to `true` in the relevant app config. diff --git a/docs/release-notes/5.5.0/changelog.mdx b/docs/release-notes/5.5.0/changelog.mdx index c16f3645b..f6d461ae8 100644 --- a/docs/release-notes/5.5.0/changelog.mdx +++ b/docs/release-notes/5.5.0/changelog.mdx @@ -30,7 +30,7 @@ The brand new `webiny watch` command brings local development experience to a wh #### How We Currently Do It -Let’s say you wanted to expand the default GraphQL API, that’s deployed as part of the [API](/docs/architecture/api/overview) project application. At the moment, in order to do that, you’d have to do the following: +Let’s say you wanted to expand the default GraphQL API, that’s deployed as part of the [API](/docs/{version}/architecture/api/overview) project application. At the moment, in order to do that, you’d have to do the following: - start a watch session on relevant packages using the `webiny workspaces run` command - make your code changes @@ -59,7 +59,7 @@ This basically means **no more digging** through [Amazon CloudWatch](https://aws <Alert type="info" title="Learn More"> -To learn more about the new `webiny watch` command, check out the newly added [Use the Watch Command](/docs/core-development-concepts/basics/watch-command) guide. +To learn more about the new `webiny watch` command, check out the newly added [Use the Watch Command](/docs/{version}/core-development-concepts/basics/watch-command) guide. </Alert> @@ -95,7 +95,7 @@ Now you have to define access to specific content model groups first, and based ### Rich Text Content Renderer ([#1566](https://github.com/webiny/webiny-js/pull/1566)) -Up until now, you had to manually render rich text content that comes from the Headless CMS. To make it a lot easier for you, we've finally introduced a dedicated component to do the heavy lifting. For details, see the [how-to guide on rendering the rich text content](/docs/headless-cms/extending/render-rich-text-content). +Up until now, you had to manually render rich text content that comes from the Headless CMS. To make it a lot easier for you, we've finally introduced a dedicated component to do the heavy lifting. For details, see the [how-to guide on rendering the rich text content](/docs/{version}/headless-cms/extending/render-rich-text-content). ### Filtering by Reference Field Id ([#1567](https://github.com/webiny/webiny-js/pull/1567)) @@ -162,7 +162,7 @@ All the changes can be automatically applied in your existing Webiny project via #### 1. `.pulumi` Folders Moved To Project Root -By default, the Pulumi cloud infrastructure [state files](/docs/infrastructure/pulumi-iac/iac-with-pulumi#state-files) are stored locally - in `.pulumi` folders located in your project applications folders: +By default, the Pulumi cloud infrastructure [state files](/docs/{version}/infrastructure/pulumi-iac/iac-with-pulumi#state-files) are stored locally - in `.pulumi` folders located in your project applications folders: ```bash api/.pulumi @@ -206,7 +206,7 @@ Every project application now has its own `webiny.application.js` file. Think of <Alert type="info"> -Learn more about project applications in the [Project Applications](/docs/core-development-concepts/project-organization/project-applications) guide. +Learn more about project applications in the [Project Applications](/docs/{version}/core-development-concepts/project-organization/project-applications) guide. </Alert> diff --git a/docs/release-notes/5.5.0/upgrade-guide.mdx b/docs/release-notes/5.5.0/upgrade-guide.mdx index 69af544ae..ee94a1197 100644 --- a/docs/release-notes/5.5.0/upgrade-guide.mdx +++ b/docs/release-notes/5.5.0/upgrade-guide.mdx @@ -49,7 +49,7 @@ Running this command will apply a minor fix to the `webiny upgrade` command that </Alert> -This release includes a couple of smaller changes on the project organization level. To make it easier, we provide a simple [Webiny CLI](/docs/core-development-concepts/basics/webiny-cli) command that will automatically make all the necessary adjustments for you. +This release includes a couple of smaller changes on the project organization level. To make it easier, we provide a simple [Webiny CLI](/docs/{version}/core-development-concepts/basics/webiny-cli) command that will automatically make all the necessary adjustments for you. Once you've run the above upgrade command, run the following: @@ -68,7 +68,7 @@ Before running the `webiny upgrade` command, we recommend that you commit any ac Once the `webiny upgrade` command has finished, a couple of manual steps remain to be completed, after which, your project should be completely updated. -You can then proceed by committing the changes to your working branch and trying to [deploy](/docs/core-development-concepts/basics/project-deployment) the project to one of the development or pre-production environment. +You can then proceed by committing the changes to your working branch and trying to [deploy](/docs/{version}/core-development-concepts/basics/project-deployment) the project to one of the development or pre-production environment. #### 1. Add `apolloLinks.ts` file (located in your Website project application) diff --git a/docs/release-notes/5.6.0/changelog.mdx b/docs/release-notes/5.6.0/changelog.mdx index 27af9ad40..7a80e7a81 100644 --- a/docs/release-notes/5.6.0/changelog.mdx +++ b/docs/release-notes/5.6.0/changelog.mdx @@ -105,7 +105,7 @@ So, from now on, you can expect all of the project applications (meaning all clo As you may have already known, every Webiny project, by default, comes with three project application: **API** (`api`), **Admin Area** (`apps/admin`), and **Website** (`apps/website`). These consist of application code, and, more importantly, of necessary cloud infrastructure that needs to be deployed in order for them to work as intended. -Read more about project organization in the [Project Organization](/docs/core-development-concepts/project-organization/project-applications-and-packages) key topics section. +Read more about project organization in the [Project Organization](/docs/{version}/core-development-concepts/project-organization/project-applications-and-packages) key topics section. </Alert> diff --git a/docs/release-notes/5.7.0/changelog.mdx b/docs/release-notes/5.7.0/changelog.mdx index e31261ac9..ed0c0ad7a 100644 --- a/docs/release-notes/5.7.0/changelog.mdx +++ b/docs/release-notes/5.7.0/changelog.mdx @@ -26,17 +26,17 @@ With this release, we're introducing a brand new CI/CD scaffold, which will set Currently, you can set up your CI/CD via [GitHub Actions](https://github.com/features/actions) only. But note that in the future, we would certainly like to bring support for more providers, depending on the interest from the community. -For more information on how to use the new scaffold, make sure to check out the also new [Set up CI/CD](/docs/core-development-concepts/ci-cd/setup) how-to guide. +For more information on how to use the new scaffold, make sure to check out the also new [Set up CI/CD](/docs/{version}/core-development-concepts/ci-cd/setup) how-to guide. <Alert type="success"> -If you plan to use a different CI/CD provider, you can still create your workflows manually, by following all of the recommendations outlined in the new [CI/CD](/docs/core-development-concepts/ci-cd/introduction) key topics section. Also, if you think your provider should be supported out of the box, please [open an issue](https://github.com/webiny/webiny-js/issues/new) or [contact us](https://www.webiny.com/slack). +If you plan to use a different CI/CD provider, you can still create your workflows manually, by following all of the recommendations outlined in the new [CI/CD](/docs/{version}/core-development-concepts/ci-cd/introduction) key topics section. Also, if you think your provider should be supported out of the box, please [open an issue](https://github.com/webiny/webiny-js/issues/new) or [contact us](https://www.webiny.com/slack). </Alert> ### Improved `--debug` Argument (`webiny deploy` and `webiny destroy` Commands) ([#1624](https://github.com/webiny/webiny-js/pull/1624), [@ankurvr](https://github.com/ankurvr)) -From this release, passing the `--debug` flag upon running the [`webiny deploy`](/docs/core-development-concepts/basics/project-deployment) and [`webiny destroy`](/docs/infrastructure/basics/destroy-cloud-infrastructure) commands will also include additional deployment-related information and logs. +From this release, passing the `--debug` flag upon running the [`webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) and [`webiny destroy`](/docs/{version}/infrastructure/basics/destroy-cloud-infrastructure) commands will also include additional deployment-related information and logs. The following example shows how you can use it with the `webiny deploy` command: @@ -80,11 +80,11 @@ Starting with this `5.7.0` release, we'll be experimenting more and more in this ### New CI/CD Key Topics -We've just published the brand new [CI/CD](/docs/core-development-concepts/ci-cd/introduction) key topics section, which, as you might've already guessed, covers everything that there is to know about setting up a CI/CD workflow for your Webiny projects. +We've just published the brand new [CI/CD](/docs/{version}/core-development-concepts/ci-cd/introduction) key topics section, which, as you might've already guessed, covers everything that there is to know about setting up a CI/CD workflow for your Webiny projects. ### Security Framework Key Topics -We've finally put together several articles explaining what [Webiny Security Framework](/docs/core-development-concepts/security-framework/introduction) is and how everything is tied together on both API and React side. +We've finally put together several articles explaining what [Webiny Security Framework](/docs/{version}/core-development-concepts/security-framework/introduction) is and how everything is tied together on both API and React side. ### Multi-Tenancy Key Topic diff --git a/docs/release-notes/5.7.0/upgrade-guide.mdx b/docs/release-notes/5.7.0/upgrade-guide.mdx index ec08e8dfe..43d2b00dd 100644 --- a/docs/release-notes/5.7.0/upgrade-guide.mdx +++ b/docs/release-notes/5.7.0/upgrade-guide.mdx @@ -307,4 +307,4 @@ export default () => [ ## Redeploy! -Now you're ready to redeploy your API and apps. By now, you're most likely familiar with the deployment process, but if you need a refresher, visit our [Deploy Your Project](/docs/core-development-concepts/basics/project-deployment) guide for everything related to deployments. +Now you're ready to redeploy your API and apps. By now, you're most likely familiar with the deployment process, but if you need a refresher, visit our [Deploy Your Project](/docs/{version}/core-development-concepts/basics/project-deployment) guide for everything related to deployments. diff --git a/docs/release-notes/5.8.0/changelog.mdx b/docs/release-notes/5.8.0/changelog.mdx index 23c6dbb89..4bd7aa190 100644 --- a/docs/release-notes/5.8.0/changelog.mdx +++ b/docs/release-notes/5.8.0/changelog.mdx @@ -20,11 +20,11 @@ Please check the [Webiny 5.8.0 migration guide](/docs/release-notes/5.8.0/upgrad ### Filtering of Content Entries by `createdBy` and `ownedBy` Fields ([#1641](https://github.com/webiny/webiny-js/issues/1641)) -Via the [Headless CMS GraphQL API](/docs/headless-cms/basics/graphql-api), existing content entries can now be filtered by `createdBy` and `ownedBy` fields. This can be useful when in need to retrieve content entries created or owned by a specific user. For example: +Via the [Headless CMS GraphQL API](/docs/{version}/headless-cms/basics/graphql-api), existing content entries can now be filtered by `createdBy` and `ownedBy` fields. This can be useful when in need to retrieve content entries created or owned by a specific user. For example: ![Filtering of Content Entries by createdBy Field](./createdBy.png) -The filtering can be utilized in any of the [three Headless CMS GraphQL API types](/docs/headless-cms/basics/graphql-api#graphql-api-types) - manage, preview, and read. +The filtering can be utilized in any of the [three Headless CMS GraphQL API types](/docs/{version}/headless-cms/basics/graphql-api#graphql-api-types) - manage, preview, and read. ### Filtering of Content Entries by `entryId` ([#1660](https://github.com/webiny/webiny-js/pull/1660)) @@ -36,13 +36,13 @@ With Webiny Headless CMS, users first define content models, for example **Blog </Alert> -Via the [Headless CMS GraphQL API](/docs/headless-cms/basics/graphql-api), this structure of content entry IDs allows users to retrieve a specific revision of a content entry. For example, here we are retrieving the revision number three (note the `#0003` in the value passed to the `id` input field): +Via the [Headless CMS GraphQL API](/docs/{version}/headless-cms/basics/graphql-api), this structure of content entry IDs allows users to retrieve a specific revision of a content entry. For example, here we are retrieving the revision number three (note the `#0003` in the value passed to the `id` input field): ![Filtering of Content Entries by id Field](./retrieveById.png) But still, we've seen cases in which users just want to retrieve the currently published revision of a particular content entry, making the actual revision number irrelevant. -So, starting from this release, you can also query content entries by `entryId`. It is a new GraphQL input field which, depending on the Headless CMS GraphQL API [type](/docs/headless-cms/basics/graphql-api#graphql-api-types), applies the following filtering: +So, starting from this release, you can also query content entries by `entryId`. It is a new GraphQL input field which, depending on the Headless CMS GraphQL API [type](/docs/{version}/headless-cms/basics/graphql-api#graphql-api-types), applies the following filtering: - **manage** and **preview** - will look for the **latest** content entry revision - **read** - will look for the **published** content entry revision diff --git a/docs/release-notes/5.9.0/changelog.mdx b/docs/release-notes/5.9.0/changelog.mdx index bb2a63e13..2b92a4feb 100644 --- a/docs/release-notes/5.9.0/changelog.mdx +++ b/docs/release-notes/5.9.0/changelog.mdx @@ -32,7 +32,7 @@ To learn more about the changes we made and the reasoning behind them, check out <Alert type="info"> -To learn more about scaffolding and all of the available scaffolds, check out the [Scaffolding](/docs/core-development-concepts/scaffolding/introduction) how-to guides section. +To learn more about scaffolding and all of the available scaffolds, check out the [Scaffolding](/docs/{version}/core-development-concepts/scaffolding/introduction) how-to guides section. </Alert> diff --git a/docs/release-notes/5.9.0/upgrade-guide.mdx b/docs/release-notes/5.9.0/upgrade-guide.mdx index 143fb2d98..2af5a81c4 100644 --- a/docs/release-notes/5.9.0/upgrade-guide.mdx +++ b/docs/release-notes/5.9.0/upgrade-guide.mdx @@ -87,7 +87,7 @@ As stated in the [Upgrade Webiny](/docs/release-notes/upgrade-webiny#pre-product <Alert type="success"> -Learn more about different deployment environments in the [CI/CD / Environments](/docs/core-development-concepts/ci-cd/environments) key topic. +Learn more about different deployment environments in the [CI/CD / Environments](/docs/{version}/core-development-concepts/ci-cd/environments) key topic. </Alert> diff --git a/docs/release-notes/upgrade-webiny.mdx b/docs/release-notes/upgrade-webiny.mdx index 093b66826..f88684e33 100644 --- a/docs/release-notes/upgrade-webiny.mdx +++ b/docs/release-notes/upgrade-webiny.mdx @@ -21,7 +21,7 @@ Whenever you're doing an upgrade, we recommended that you first deploy your chan <Alert type="info"> -Learn how to deploy your project into multiple environments with the [`deploy`](/docs/core-development-concepts/basics/project-deployment) command. +Learn how to deploy your project into multiple environments with the [`deploy`](/docs/{version}/core-development-concepts/basics/project-deployment) command. </Alert> @@ -61,7 +61,7 @@ Please note that it's possible to skip only **patch versions**. For example, if ### Once upgraded, do we need to re-deploy the Webiny project in order to see the changes? -Yes, once you've completed the upgrade steps, in order to actually see the new features and fixes online, you need to re-deploy you project. Which project applications you need to re-deploy? It depends on the released fixes and features, but the easiest approach would be just to deploy the entire project, using the [`yarn webiny deploy`](/docs/core-development-concepts/basics/project-deployment#the-deploy-command) command. +Yes, once you've completed the upgrade steps, in order to actually see the new features and fixes online, you need to re-deploy you project. Which project applications you need to re-deploy? It depends on the released fixes and features, but the easiest approach would be just to deploy the entire project, using the [`yarn webiny deploy`](/docs/{version}/core-development-concepts/basics/project-deployment#the-deploy-command) command. Additionally, before you re-deploy the changes into the production environment, it's recommended that you re-deploy the changes into one of your test or preview environments first. @@ -92,4 +92,4 @@ npx create-webiny-project@beta my-project --tag=5.40.0-beta.5 Additionally, set the environment variable `WEBINY_VERSION=5.40.0`. Feel free to update the tag version to your intended beta version. -Please note, we do not recommend using beta versions for production projects. However, if you want to try out features available early in a beta release, you can set up a beta version. \ No newline at end of file +Please note, we do not recommend using beta versions for production projects. However, if you want to try out features available early in a beta release, you can set up a beta version. diff --git a/docs/user-guides/5.39.x/security/essentials/assign-team.mdx b/docs/user-guides/5.39.x/security/essentials/assign-team.mdx index 6d2ff7629..59ac3e0a7 100644 --- a/docs/user-guides/5.39.x/security/essentials/assign-team.mdx +++ b/docs/user-guides/5.39.x/security/essentials/assign-team.mdx @@ -17,7 +17,7 @@ In this tutorial, we will learn how to assign a team to a user. <Alert type="info"> - Note that the Teams feature is part of our enterprise offering. To learn more, please check out the [Teams](/docs/enterprise/aacl/teams) article. + Note that the Teams feature is part of our enterprise offering. To learn more, please check out the [Teams](/docs/{version}/enterprise/aacl/teams) article. </Alert> diff --git a/docs/user-guides/5.39.x/security/essentials/team-creation.mdx b/docs/user-guides/5.39.x/security/essentials/team-creation.mdx index 1d0219dd5..12b5245fb 100644 --- a/docs/user-guides/5.39.x/security/essentials/team-creation.mdx +++ b/docs/user-guides/5.39.x/security/essentials/team-creation.mdx @@ -17,7 +17,7 @@ Webiny enables you to define a team for a group of users in your application. Yo <Alert type="info"> - Note that the Teams feature is part of our enterprise offering. To learn more, please check out the [Teams](/docs/enterprise/aacl/teams) article. + Note that the Teams feature is part of our enterprise offering. To learn more, please check out the [Teams](/docs/{version}/enterprise/aacl/teams) article. </Alert> diff --git a/docs/user-guides/6.0.x/assets/webiny-overview.mp4 b/docs/user-guides/6.0.x/assets/webiny-overview.mp4 new file mode 100644 index 000000000..43d1f2a0b Binary files /dev/null and b/docs/user-guides/6.0.x/assets/webiny-overview.mp4 differ diff --git a/docs/user-guides/6.0.x/file-manager/essentials/assets/organizing-files/organizing-files.mp4 b/docs/user-guides/6.0.x/file-manager/essentials/assets/organizing-files/organizing-files.mp4 new file mode 100644 index 000000000..33308f9d6 Binary files /dev/null and b/docs/user-guides/6.0.x/file-manager/essentials/assets/organizing-files/organizing-files.mp4 differ diff --git a/docs/user-guides/6.0.x/file-manager/essentials/assets/organizing-files/snowboard.jpg b/docs/user-guides/6.0.x/file-manager/essentials/assets/organizing-files/snowboard.jpg new file mode 100644 index 000000000..4b14abb3a Binary files /dev/null and b/docs/user-guides/6.0.x/file-manager/essentials/assets/organizing-files/snowboard.jpg differ diff --git a/docs/user-guides/6.0.x/file-manager/essentials/assets/tagging-files/filter-files-by-tag.mp4 b/docs/user-guides/6.0.x/file-manager/essentials/assets/tagging-files/filter-files-by-tag.mp4 new file mode 100644 index 000000000..50dc32be5 Binary files /dev/null and b/docs/user-guides/6.0.x/file-manager/essentials/assets/tagging-files/filter-files-by-tag.mp4 differ diff --git a/docs/user-guides/6.0.x/file-manager/essentials/assets/tagging-files/snowboard.jpg b/docs/user-guides/6.0.x/file-manager/essentials/assets/tagging-files/snowboard.jpg new file mode 100644 index 000000000..4b14abb3a Binary files /dev/null and b/docs/user-guides/6.0.x/file-manager/essentials/assets/tagging-files/snowboard.jpg differ diff --git a/docs/user-guides/6.0.x/file-manager/essentials/assets/tagging-files/tagging-a-file.mp4 b/docs/user-guides/6.0.x/file-manager/essentials/assets/tagging-files/tagging-a-file.mp4 new file mode 100644 index 000000000..ce9ec30c6 Binary files /dev/null and b/docs/user-guides/6.0.x/file-manager/essentials/assets/tagging-files/tagging-a-file.mp4 differ diff --git a/docs/user-guides/6.0.x/file-manager/essentials/assets/tagging-files/tagging-multiple-files.mp4 b/docs/user-guides/6.0.x/file-manager/essentials/assets/tagging-files/tagging-multiple-files.mp4 new file mode 100644 index 000000000..41a3cc6c8 Binary files /dev/null and b/docs/user-guides/6.0.x/file-manager/essentials/assets/tagging-files/tagging-multiple-files.mp4 differ diff --git a/docs/user-guides/6.0.x/file-manager/essentials/assets/upload-file/upload-file-drag-and-drop.mp4 b/docs/user-guides/6.0.x/file-manager/essentials/assets/upload-file/upload-file-drag-and-drop.mp4 new file mode 100644 index 000000000..a2937bd1c Binary files /dev/null and b/docs/user-guides/6.0.x/file-manager/essentials/assets/upload-file/upload-file-drag-and-drop.mp4 differ diff --git a/docs/user-guides/6.0.x/file-manager/essentials/assets/upload-file/upload-file-file-explorer.mp4 b/docs/user-guides/6.0.x/file-manager/essentials/assets/upload-file/upload-file-file-explorer.mp4 new file mode 100644 index 000000000..22661921f Binary files /dev/null and b/docs/user-guides/6.0.x/file-manager/essentials/assets/upload-file/upload-file-file-explorer.mp4 differ diff --git a/docs/user-guides/6.0.x/file-manager/essentials/assets/upload-file/upload-image-example.png b/docs/user-guides/6.0.x/file-manager/essentials/assets/upload-file/upload-image-example.png new file mode 100644 index 000000000..de580a3d9 Binary files /dev/null and b/docs/user-guides/6.0.x/file-manager/essentials/assets/upload-file/upload-image-example.png differ diff --git a/docs/user-guides/6.0.x/file-manager/essentials/assets/upload-file/upload-multiple-files.mp4 b/docs/user-guides/6.0.x/file-manager/essentials/assets/upload-file/upload-multiple-files.mp4 new file mode 100644 index 000000000..be7d73a53 Binary files /dev/null and b/docs/user-guides/6.0.x/file-manager/essentials/assets/upload-file/upload-multiple-files.mp4 differ diff --git a/docs/user-guides/6.0.x/file-manager/essentials/organizing-files.mdx b/docs/user-guides/6.0.x/file-manager/essentials/organizing-files.mdx new file mode 100644 index 000000000..907a0a961 --- /dev/null +++ b/docs/user-guides/6.0.x/file-manager/essentials/organizing-files.mdx @@ -0,0 +1,99 @@ +--- +id: 2f7200c3 +title: Organizing Files +description: Learn how to organize files in folders and sub-folders in File Manager. +--- + +import { Alert } from "@/components/Alert"; +import organizingFilesVideo from "./assets/organizing-files/organizing-files.mp4"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- how to create folders and sub-folders +- how to move files and folders + +</Alert> + + +Webiny simplifies content organization by allowing users to create folders and sub-folders, making it easier to manage. In this tutorial, we will learn how to organize your files in folders and sub-folders in the File Manager. We will do this in a few steps: + +- Step 1: Create a folder +- Step 2: Create a sub-folder +- Step 3: Move a folder into a parent folder +- Step 4: Upload an image + +<Video src={organizingFilesVideo} controls={true}/> + +## Step 1: Create a folder + +1. From the **Side Menu**, click **File Manager**. + + ✔️ The **File Manager Home** screen opens. + +2. In the navigation panel on the left, click **➕CREATE NEW FOLDER** + (Or, in the header section, click **➕NEW FOLDER**). + + ✔️ The **Create a new folder** screen opens. + +3. In the **Title** textbox, type **Sport**. + +4. In the **Slug** textbox, type **sport**. + +5. Click **CREATE FOLDER**. + + ✔️ The message "Folder created successfully!" displays. + + +## Step 2: Create a sub-folder + +1. In the navigation panel on the left, click **➕Create new folder**. + + ✔️ The **Create a new folder** screen opens. + +2. In the **Title** textbox, type **Snow**. + +3. In the **Slug** textbox, type **snow**. + +4. In the **Parent folder** menu, click **Sport**. + +5. Click **CREATE FOLDER**. + + ✔️ The message "Folder created successfully!" displays. + + +## Step 3: Move a folder into a parent folder + +1. In the navigation panel on the left, click **➕Create new folder**. + + ✔️ The **Create a new folder** screen opens. + +2. In the **Title** textbox, type **Water**. + +3. In the **Slug** textbox, type **water**. + +4. Click **CREATE FOLDER**. + ✔️ The message "Folder created successfully!" displays. + +5. Use the drag handle to drag and dropthe newly created folder into the folder **Sport** + + ✔️ The child folder shows up in the parent one. + +## Step 4: Upload an image + +We will upload the following image in this step. Please save it on your computer to upload. + +![Snowboard image for upload](./assets/organizing-files/snowboard.jpg) + +1. In the navigation panel on the left, click on **Sport** and then on **Snow**. + + ✔️ The **Snow** folder opens. + + **Note**: You can go to any folder by clicking its title in the navigation panel on the left. + +2. Click **UPLOAD**. + + ✔️ The file explorer screen opens. + +3. From the file explorer, upload the image. + + ✔️ The message "File upload complete." displays at the bottom. diff --git a/docs/user-guides/6.0.x/file-manager/essentials/tagging-files.mdx b/docs/user-guides/6.0.x/file-manager/essentials/tagging-files.mdx new file mode 100644 index 000000000..43ce0e4c9 --- /dev/null +++ b/docs/user-guides/6.0.x/file-manager/essentials/tagging-files.mdx @@ -0,0 +1,103 @@ +--- +id: 2f7200c4 +title: Tagging Files +description: Learn how to tag a file and filter it through the tag in File Manager. +--- + +import { Alert } from "@/components/Alert"; +import step1TaggingVideo from "./assets/tagging-files/tagging-a-file.mp4"; +import step3TaggingFilesVideo from "./assets/tagging-files/tagging-multiple-files.mp4"; +import step4FilterVideo from "./assets/tagging-files/filter-files-by-tag.mp4"; + + + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- how to tag a file +- how to filter files via assigned tag(s) + +</Alert> + +Webiny allows users to tag files, facilitating convenient access. Users can efficiently search and filter files based on assigned tags. In this tutorial, we will learn how to tag a file, and filter it via its assigned tag in the **File Manager**. We will do this in a few steps: + +- Step 1: Upload images +- Step 2: Tag a file +- Step 3: Tag multiple files +- Step 4: Filter files by tags + + +<Video src={step1TaggingVideo} controls={true}/> + +## Step 1: Upload images + +1. From the **Side Menu**, click **File Manager**. + + ✔️ The **File Manager Home** screen opens. + +2. Click **UPLOAD**. + + ✔️ The file explorer screen opens. + +3. From the file explorer, select and upload multiple random images. + +## Step 2: Tag a file + +1. From the **Side Menu**, click **File Manager**. + + ✔️ The **File Manager Home** screen opens. + +2. Hover over one of the images you uploaded and click the EDIT button. + + ✔️ The **File details** screen opens. + +3. In the **Tags** textbox, type "**snowboard**". Press Enter. Type "**sunset**". Press Enter. Type "**friendship**". Press Enter. + +4. Click **SAVE FILE**. + +## Step 3: Tag multiple files + +<Video src={step3TaggingFilesVideo} controls={true}/> + + +1. From the **Top Menu**, click **Switch to Table** icon. + + ✔️ The **File Manager Home** screen will switch to a table view to make it easier to select/ deselect a larger number of images. + +2. Select all images in this folder by clicking on the top checkbox. Note you can also select only individual images. + + ✔️ The images are highlighted + +2. Click the EDIT icon at the top, part of bulk actions menu. + + ✔️ The Edit items screen will open up. + +3. In the **Field** for Operation 1, select "**Tags**". In **Operation**, select "**Append to existing values**". In **Tags**, type "**snow**">. Press Enter. Type "**snowboard**". Press Enter. Type "**sport**". Press Enter. + +4. Click **SUBMIT**. + +## Step 4: Filter files by tags + +<Video src={step4FilterVideo} controls={true}/> + +1. From the **Top Menu**, click **Switch to Grid** icon. + + ✔️ The **File Manager Home** screen will switch to a grid view to find the desired image(s) quicker. + +2. On the **File Manager Home** screen, in the navigation panel on the left, under **Filter by tag**, click the **friendship** tag and then after you see the results select **snow**. + + ✔️ All the files with the tag **friendship** AND **snow** appear on the screen. + + **Note**: You can deactivate an active tag filter by clicking on it again. + +3. In the **Conditional filter** drop down switch from "**match all**" to "**match any**". + + ✔️ All the files having either **friendship** or **snow** tag appear on the screen. + + **Note**: When applying multiple tag filters, the **Conditional filter** drop-down becomes active. The default selection is **Match any**, meaning all files with at least one of the active tags will appear on the screen. If the **Match all** option is selected, only files with all the active tags will be displayed on the screen. + + +## Additional information + +1. You can also apply a tag filter by searching the tag name in the search bar. + +2. You can apply filters by utilizing the search bar, clicking on tags, and using the conditional filtering drop-down in combination. diff --git a/docs/user-guides/6.0.x/file-manager/essentials/upload-file.mdx b/docs/user-guides/6.0.x/file-manager/essentials/upload-file.mdx new file mode 100644 index 000000000..1cefc1c15 --- /dev/null +++ b/docs/user-guides/6.0.x/file-manager/essentials/upload-file.mdx @@ -0,0 +1,74 @@ +--- +id: 2f7200c2 +title: File Upload +description: Learn how to upload a file in File Manager. +--- + +import { Alert } from "@/components/Alert"; +import uploadFileExplorerVideo from "./assets/upload-file/upload-file-file-explorer.mp4"; +import uploadFileDragDropVideo from "./assets/upload-file/upload-file-drag-and-drop.mp4"; +import uploadMultipleFilesVideo from "./assets/upload-file/upload-multiple-files.mp4"; + + + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- how to upload a file or multiple files + +</Alert> + +Webiny allows you to effortlessly upload files into the **File Manager** that you can use across your application. In this tutorial, we will learn how to upload a file or multiple files into the **File Manager**. As an example, we will upload the image shown below. Please save it on your computer to upload later. + +![Industrial Analytics](./assets/upload-file/upload-image-example.png) + +There are two ways to upload a file in **File Manager**; let's look at each approach one by one. + +## Approach 1: Through file explorer + +<Video src={uploadFileExplorerVideo} controls={true}/> + +1. From the **Side Menu**, click **File Manager**. + + ✔️ The **File Manager Home** screen opens. + +2. Click **UPLOAD**. + + ✔️ The file explorer screen opens. + +3. From the file explorer, upload the image. + + ✔️ The file is uploaded. A pop-up confirmation message "File upload complete" at the bottom of the page. + +4. Click on the **EDIT** button to adjust the **Name** and the other metadata of the record, e.g. you can add Tags to optimize organization and searching for assets. + + ✔️ The data about the file is updated. + + +## Approach 2: Drag and drop + +<Video src={uploadFileDragDropVideo} controls={true}/> + +1. From the **Side Menu**, click **File Manager**. + + ✔️ The **File Manager Home** screen opens. + +2. Drag and drop the image from your computer's file explorer to the **Home** screen. + + ✔️ A pop-up confirmation message "File upload complete" at the bottom of the page. + + +## Upload multiple files + +<Video src={uploadMultipleFilesVideo} controls={true}/> + +1. From the **Side Menu**, click **File Manager**. + + ✔️ The **File Manager Home** screen opens. + +2. Click **UPLOAD**. + + ✔️ The file explorer screen opens. + +3. From the file explorer, select and upload the files. + + ✔️ The assets may take some time to be uploaded. The progress bar will inform the user of the percentage completion. Even if the user navigates away from the page the upload completes in the background and the pop-up confirmation message "File upload complete" shows up at the bottom of the page. \ No newline at end of file diff --git a/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/export-content-models-step-1.png b/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/export-content-models-step-1.png new file mode 100644 index 000000000..89404fe12 Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/export-content-models-step-1.png differ diff --git a/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/export-content-models-step-2.png b/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/export-content-models-step-2.png new file mode 100644 index 000000000..aa12c4dc0 Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/export-content-models-step-2.png differ diff --git a/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/import-content-models-step-1.png b/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/import-content-models-step-1.png new file mode 100644 index 000000000..b83a9ec6d Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/import-content-models-step-1.png differ diff --git a/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/import-content-models-step-2.png b/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/import-content-models-step-2.png new file mode 100644 index 000000000..f77d53676 Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/import-content-models-step-2.png differ diff --git a/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/import-content-models-step-3.png b/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/import-content-models-step-3.png new file mode 100644 index 000000000..f77d53676 Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/import-content-models-step-3.png differ diff --git a/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/import-content-models-step-4.png b/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/import-content-models-step-4.png new file mode 100644 index 000000000..99ad9a1bb Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/import-content-models-step-4.png differ diff --git a/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/import-content-models.png b/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/import-content-models.png new file mode 100644 index 000000000..7e4acad9c Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/import-content-models.png differ diff --git a/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/import-export-content-models.mp4 b/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/import-export-content-models.mp4 new file mode 100644 index 000000000..3b1d662fd Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/advanced/assets/import-export-content-models/import-export-content-models.mp4 differ diff --git a/docs/user-guides/6.0.x/headless-cms/advanced/import-export-content-models.mdx b/docs/user-guides/6.0.x/headless-cms/advanced/import-export-content-models.mdx new file mode 100644 index 000000000..4708e4cae --- /dev/null +++ b/docs/user-guides/6.0.x/headless-cms/advanced/import-export-content-models.mdx @@ -0,0 +1,74 @@ +--- +id: +title: Import/Export Content Models +description: Learn how to import and export content models in Webiny Headless CMS. +--- + +import { Alert } from "@/components/Alert"; + +import importExportContentModel from "./assets/import-export-content-models/import-export-content-models.mp4"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- how to export content models +- how to import content models + +</Alert> + +Webiny Headless CMS allows you to export all your content models as a JSON file. This is useful if you want to migrate your content models to another project or if you want to share them with other developers. + +Similarly, you can use the generated JSON file to import those same content models into your project. +This tutorial will guide you through the process of exporting and importing content models. + +<Video src={importExportContentModel} controls={true} /> + +## Exporting Content Models + +To export one or more content models navigate to your Content Models view inside the Headless CMS application. + +1. From the **Side Menu**, Click **Content Modeling** >**Models**. + ✔️ The Content Models screen opens. + +2. Click the **Export all models** icon. + ✔️ The export action will generate a JSON file containing all your content models. + ![Headless CMS - Export Content Models](./assets/import-export-content-models/export-content-models-step-1.png) + +## Importing Content Models + +To import content models, navigate to your Content Models view inside the Headless CMS application. + +1. From the **Side Menu**, Click **Content Modeling** > **Models**. + ✔️ The Content Models screen opens. + +2. Click the **Import models** icon. + ✔️ The system will ask you to provide an export file. + ![Headless CMS - Export Content Models](./assets/import-export-content-models/import-content-models.png) + +3. Select the file you want to import and click **Validate file**. + ![Headless CMS - Import Content Models](./assets/import-export-content-models/import-content-models-step-1.png) + ✔️ The validation action will check the file and display a list of content models that can be imported. + +4. Click the **Model will be skipped** label in front of the title of the Content Models you want to import. From the list you can choose which content model you want to import and which ones you want to skip. + ![Headless CMS - Import Content Models](./assets/import-export-content-models/import-content-models-step-2.png) + +<Alert type="success" title="Auto select referenced models"> + +Note that if you select to import a specific content model that references one or more content models that are also part of the export file, the system will automatically select those referenced content models as well. If you wish to skip them, you can just go back and exclude them from the import. + +</Alert> + +![Headless CMS - Import Content Models](./assets/import-export-content-models/import-content-models-step-3.png) + +All the content models are grouped in their respective content model groups. Those groups will be automatically created for you upon importing the file if such a group already doesn't exist. + +Inside the group section, you will have a list of individual content models that belong to that group. You can select which content models you want to import and which ones you want to skip by clicking the button on the right-hand side. + +Also, underneath the content model name you will have a status for the content model. This status tells you if this content model will be `updated` (meaning the content model already exists) or `created` (meaning the content model currently doesn't exist). + +5. Finally, once you have selected which content models you want to import. Click Import to start the import process. + +![Headless CMS - Import Content Models](./assets/import-export-content-models/import-content-models-step-4.png) + +✔️ The import process can take a few seconds to finish as it needs to validate all the information. Once the process is done you will see the status screen with the results of the import process. + +From the same status screen, you can proceed to import additional content models just by selecting them and clicking the **Import** button again. In case you want to finish the import process, just click outside the content model dialog. diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/add-validator-to-fields.mdx b/docs/user-guides/6.0.x/headless-cms/essentials/add-validator-to-fields.mdx new file mode 100644 index 000000000..649cb33a2 --- /dev/null +++ b/docs/user-guides/6.0.x/headless-cms/essentials/add-validator-to-fields.mdx @@ -0,0 +1,85 @@ +--- +id: +title: Add Validator to Fields +description: Learn how to add a validator to a content model's field in Headless CMS. +--- + +import { Alert } from "@/components/Alert"; +import addValidatorsToFields from "./assets/add-validator-to-fields/add-validator-to-fields.mp4"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- what is a field validator +- how to add a validator to a content model's field +- how to test the applied validator + +</Alert> + +A field validator helps you ensure the user input meets specific requirements and matches the expected format for a field. + +In this tutorial, we will learn how to add validators to a content model's fields. +As an example, we will add validators to the **LONG TEXT** and **NUMBER** fields used in the **Product** content model that we created in the [Create Content Model](/docs/{version}/user-guides/headless-cms/essentials/create-content-model) tutorial. + +<Video src={addValidatorsToFields} controls={true} /> + +## Step 1: Add `Required` and `Min length` validators to a LONG TEXT field + +In this step we will: + +- make the **Description** field required. +- set the minimum length for the input the **Description** field to **20 characters**. + +1. From the **Side Menu**, Click **Content Modeling** > **Models**. + + ✔️ The **Content Models** screen opens. + +2. Hover over the **Product** content model. + +3. Click ✏️ **Edit**. + + ✔️ Screen to configure the **Product** content model’s fields opens. + +4. Click the **Edit Field** icon (✏️) on the **Description** field. + + ✔️ **Field Settings - Long Text** screen opens. + + +5. Click the **Validations** tab. + +6. Enable the **Required** validation by toggling the **Enabled** button. This will make the **Description** field mandatory. + + ✔️ **Message** textbox will appear to set the error message. + +7. In the **Message** textbox, type **Please enter the product description**. + +8. Enable the **Min length** validation by toggling the **Enabled** button. + + ✔️ **Message** and **Value** textboxes will appear to set the error message and minimum value. + +9. In the **Message** textbox, type **Description cannot be less than 20 characters**. + +10. In the **Value** textbox, type **20**. + +11. Click **Save Field**. + + ✔️ Screen to configure the **Product** content model’s fields opens. + +12. Click **Save**. + + ✔️ The message “Your content model was saved successfully!” displays. + +## Step 2: Test the validators + +1. On the screen to configure the **Product** content model’s fields, click the **Preview** tab. + +2. Click the **Description** textbox. + +3. Click anywhere outside the **Description** textbox. + + ✔️ The message “Please enter the product description” appears. + +4. In the **Description** textbox, type **Top sweatshirt**. + +5. Click anywhere outside the **Description** textbox. + + ✔️ The message “Description cannot be less than 20 characters” appears. diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/assets/add-validator-to-fields/add-validator-to-fields.mp4 b/docs/user-guides/6.0.x/headless-cms/essentials/assets/add-validator-to-fields/add-validator-to-fields.mp4 new file mode 100644 index 000000000..41efdd8ad Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/essentials/assets/add-validator-to-fields/add-validator-to-fields.mp4 differ diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/assets/clone-content-model/clone-content-model.mp4 b/docs/user-guides/6.0.x/headless-cms/essentials/assets/clone-content-model/clone-content-model.mp4 new file mode 100644 index 000000000..f177c72b2 Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/essentials/assets/clone-content-model/clone-content-model.mp4 differ diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/assets/content-entry-revisions/content-entry-revisions.mp4 b/docs/user-guides/6.0.x/headless-cms/essentials/assets/content-entry-revisions/content-entry-revisions.mp4 new file mode 100644 index 000000000..c9ae9263d Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/essentials/assets/content-entry-revisions/content-entry-revisions.mp4 differ diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/assets/create-content-entry/content-entry-revision.png b/docs/user-guides/6.0.x/headless-cms/essentials/assets/create-content-entry/content-entry-revision.png new file mode 100644 index 000000000..d1e5dbe06 Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/essentials/assets/create-content-entry/content-entry-revision.png differ diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/assets/create-content-entry/create-content-entry.mp4 b/docs/user-guides/6.0.x/headless-cms/essentials/assets/create-content-entry/create-content-entry.mp4 new file mode 100644 index 000000000..7c2e793c5 Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/essentials/assets/create-content-entry/create-content-entry.mp4 differ diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/assets/create-content-model-group/create-content-model-group.mp4 b/docs/user-guides/6.0.x/headless-cms/essentials/assets/create-content-model-group/create-content-model-group.mp4 new file mode 100644 index 000000000..db79d2b0a Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/essentials/assets/create-content-model-group/create-content-model-group.mp4 differ diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/assets/create-content-model/create-content-model.mp4 b/docs/user-guides/6.0.x/headless-cms/essentials/assets/create-content-model/create-content-model.mp4 new file mode 100644 index 000000000..62260cf2f Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/essentials/assets/create-content-model/create-content-model.mp4 differ diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/assets/create-content-model/field-validators.png b/docs/user-guides/6.0.x/headless-cms/essentials/assets/create-content-model/field-validators.png new file mode 100644 index 000000000..0a4c9199b Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/essentials/assets/create-content-model/field-validators.png differ diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/assets/glossary/content-model.svg b/docs/user-guides/6.0.x/headless-cms/essentials/assets/glossary/content-model.svg new file mode 100644 index 000000000..7395aa1d8 --- /dev/null +++ b/docs/user-guides/6.0.x/headless-cms/essentials/assets/glossary/content-model.svg @@ -0,0 +1,97 @@ +<svg width="1920" height="1080" viewBox="0 0 1920 1080" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_1302_2038)"> +<rect width="1920" height="1080" fill="white"/> +<g opacity="0.8"> +<path opacity="0.7" fill-rule="evenodd" clip-rule="evenodd" d="M2004.71 667.225L1843.29 759.634C1828.02 768.377 1809.2 768.377 1793.92 759.634L1632.5 667.225C1617.23 658.479 1607.82 642.319 1607.82 624.829V440.012C1607.82 422.522 1617.23 406.36 1632.5 397.616L1793.92 305.207C1809.2 296.461 1828.02 296.461 1843.29 305.207L2004.71 397.616C2019.99 406.36 2029.4 422.522 2029.4 440.012V624.829C2029.4 642.319 2019.99 658.479 2004.71 667.225Z" fill="#FA5A28" fill-opacity="0.06"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M1980.74 922.428L1664.36 918.992C1634.42 918.663 1606.57 901.713 1591.32 874.524L1430.1 587.203C1414.85 560.01 1414.5 526.715 1429.18 499.85L1584.36 215.967C1599.04 189.102 1626.53 172.752 1656.47 173.081L1972.86 176.519C2002.8 176.843 2030.64 193.793 2045.9 220.986L2207.11 508.305C2222.37 535.494 2222.72 568.793 2208.03 595.658L2052.86 879.541C2038.17 906.406 2010.68 922.752 1980.74 922.428Z" fill="#FA5A28" fill-opacity="0.05"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M2338.31 730.383L2014.11 1058.16C1983.42 1089.17 1939.11 1101.68 1897.86 1090.97L1461.91 977.723C1420.65 967.004 1388.73 934.697 1378.15 892.961L1266.41 451.942C1255.84 410.207 1268.22 365.388 1298.91 334.372L1623.11 6.59626C1653.79 -24.4263 1698.11 -36.9325 1739.37 -26.2131L2175.31 87.0323C2216.56 97.7448 2248.49 130.058 2259.06 171.793L2370.8 612.813C2381.38 654.548 2368.99 699.361 2338.31 730.383Z" fill="#FA5A28" fill-opacity="0.05"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M2171.43 1137.16L1623.64 1199.13C1571.8 1204.99 1520.12 1181.87 1488.06 1138.48L1149.32 679.933C1117.26 636.534 1109.7 579.464 1129.48 530.206L1338.53 9.68767C1358.32 -39.5708 1402.44 -73.5293 1454.28 -79.3888L2002.08 -141.358C2053.92 -147.225 2105.6 -124.106 2137.66 -80.7076L2476.39 377.838C2508.45 421.229 2516.01 478.306 2496.23 527.564L2287.18 1048.08C2267.39 1097.34 2223.28 1131.29 2171.43 1137.16Z" fill="#FA5A28" fill-opacity="0.04"/> +<g opacity="0.2" filter="url(#filter0_f_1302_2038)"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M1996.55 530.019L1949.09 630.138C1944.59 639.612 1935.39 646.005 1924.95 646.909L1814.56 656.452C1804.11 657.355 1794.01 652.632 1788.05 644.06L1725.13 553.484C1719.17 544.912 1718.27 533.795 1722.77 524.321L1770.23 424.202C1774.72 414.726 1783.93 408.333 1794.37 407.431L1904.76 397.888C1915.21 396.984 1925.31 401.709 1931.27 410.28L1994.19 500.856C2000.15 509.428 2001.05 520.544 1996.55 530.019Z" fill="white"/> +</g> +</g> +<path fill-rule="evenodd" clip-rule="evenodd" d="M1856.49 1005.49L1833.51 1018.65C1831.34 1019.89 1828.66 1019.89 1826.49 1018.65L1803.51 1005.49C1801.34 1004.24 1800 1001.94 1800 999.449V973.131C1800 970.64 1801.34 968.339 1803.51 967.093L1826.49 953.934C1828.66 952.689 1831.34 952.689 1833.51 953.934L1856.49 967.093C1858.66 968.339 1860 970.64 1860 973.131V999.449C1860 1001.94 1858.66 1004.24 1856.49 1005.49ZM1843.89 975.189C1842.16 980.012 1840.43 984.847 1838.69 989.688H1838.14C1836.41 984.836 1834.68 979.989 1832.95 975.148H1827.55C1825.8 980.042 1824.07 984.888 1822.33 989.741H1821.83C1820.07 984.841 1818.31 979.942 1816.61 975.213H1810.17C1813.3 984.113 1816.36 992.79 1819.41 1001.47H1824.73L1829.99 986.786H1830.53C1832.29 991.709 1834.04 996.638 1835.76 1001.45H1841.09C1844.16 992.742 1847.21 984.06 1850.33 975.189H1843.89Z" fill="#FA5A28"/> +<g filter="url(#filter1_d_1302_2038)"> +<path d="M1372 906.25H727C721.891 906.25 717.75 902.109 717.75 897V211C717.75 205.891 721.891 201.75 727 201.75H915.049H940.659H1111.82H1176.27H1372C1377.11 201.75 1381.25 205.891 1381.25 211V897C1381.25 902.109 1377.11 906.25 1372 906.25Z" fill="white" stroke="#FA5A28" stroke-width="1.5"/> +<path d="M1000.03 276.92V253.448H1008.1C1009.82 253.448 1011.38 253.688 1012.78 254.168C1014.19 254.624 1015.32 255.404 1016.16 256.508C1017 257.612 1017.42 259.112 1017.42 261.008C1017.42 262.832 1017 264.332 1016.16 265.508C1015.32 266.684 1014.2 267.56 1012.81 268.136C1011.42 268.688 1009.9 268.964 1008.24 268.964H1005.32V276.92H1000.03ZM1005.32 264.752H1007.92C1010.8 264.752 1012.24 263.504 1012.24 261.008C1012.24 259.784 1011.85 258.92 1011.08 258.416C1010.32 257.912 1009.21 257.66 1007.77 257.66H1005.32V264.752ZM1021.05 276.92V259.064H1025.37L1025.73 262.196H1025.87C1026.52 260.996 1027.3 260.108 1028.21 259.532C1029.12 258.932 1030.03 258.632 1030.95 258.632C1031.45 258.632 1031.87 258.668 1032.21 258.74C1032.54 258.788 1032.83 258.872 1033.07 258.992L1032.21 263.564C1031.89 263.468 1031.58 263.396 1031.27 263.348C1030.98 263.3 1030.65 263.276 1030.26 263.276C1029.59 263.276 1028.88 263.528 1028.14 264.032C1027.42 264.512 1026.82 265.352 1026.34 266.552V276.92H1021.05ZM1042.71 277.352C1041.19 277.352 1039.77 276.992 1038.42 276.272C1037.1 275.528 1036.03 274.46 1035.22 273.068C1034.4 271.652 1033.99 269.96 1033.99 267.992C1033.99 266 1034.4 264.308 1035.22 262.916C1036.03 261.524 1037.1 260.468 1038.42 259.748C1039.77 259.004 1041.19 258.632 1042.71 258.632C1044.22 258.632 1045.63 259.004 1046.95 259.748C1048.27 260.468 1049.34 261.524 1050.16 262.916C1050.97 264.308 1051.38 266 1051.38 267.992C1051.38 269.96 1050.97 271.652 1050.16 273.068C1049.34 274.46 1048.27 275.528 1046.95 276.272C1045.63 276.992 1044.22 277.352 1042.71 277.352ZM1042.71 273.068C1043.79 273.068 1044.6 272.612 1045.15 271.7C1045.71 270.764 1045.98 269.528 1045.98 267.992C1045.98 266.432 1045.71 265.196 1045.15 264.284C1044.6 263.372 1043.79 262.916 1042.71 262.916C1041.6 262.916 1040.77 263.372 1040.22 264.284C1039.69 265.196 1039.43 266.432 1039.43 267.992C1039.43 269.528 1039.69 270.764 1040.22 271.7C1040.77 272.612 1041.6 273.068 1042.71 273.068ZM1061.38 277.352C1059.17 277.352 1057.39 276.524 1056.05 274.868C1054.73 273.188 1054.07 270.896 1054.07 267.992C1054.07 266.048 1054.42 264.38 1055.11 262.988C1055.83 261.572 1056.76 260.492 1057.89 259.748C1059.04 259.004 1060.24 258.632 1061.49 258.632C1062.47 258.632 1063.3 258.8 1063.97 259.136C1064.64 259.472 1065.28 259.928 1065.88 260.504L1065.66 257.768V251.684H1070.95V276.92H1066.63L1066.27 275.156H1066.13C1065.51 275.78 1064.77 276.308 1063.93 276.74C1063.09 277.148 1062.24 277.352 1061.38 277.352ZM1062.75 273.032C1063.32 273.032 1063.84 272.912 1064.29 272.672C1064.77 272.432 1065.23 272.012 1065.66 271.412V264.104C1065.21 263.672 1064.71 263.372 1064.19 263.204C1063.68 263.036 1063.19 262.952 1062.71 262.952C1061.87 262.952 1061.13 263.36 1060.48 264.176C1059.83 264.968 1059.51 266.216 1059.51 267.92C1059.51 269.672 1059.78 270.968 1060.33 271.808C1060.91 272.624 1061.71 273.032 1062.75 273.032ZM1081.01 277.352C1079.06 277.352 1077.65 276.716 1076.76 275.444C1075.9 274.148 1075.46 272.384 1075.46 270.152V259.064H1080.76V269.468C1080.76 270.74 1080.94 271.628 1081.3 272.132C1081.66 272.612 1082.22 272.852 1082.99 272.852C1083.66 272.852 1084.22 272.696 1084.68 272.384C1085.14 272.072 1085.63 271.568 1086.16 270.872V259.064H1091.45V276.92H1087.13L1086.73 274.436H1086.62C1085.88 275.324 1085.06 276.032 1084.18 276.56C1083.29 277.088 1082.23 277.352 1081.01 277.352ZM1103.88 277.352C1102.22 277.352 1100.72 276.992 1099.38 276.272C1098.06 275.528 1097 274.46 1096.21 273.068C1095.44 271.652 1095.06 269.96 1095.06 267.992C1095.06 266 1095.49 264.308 1096.36 262.916C1097.22 261.524 1098.36 260.468 1099.78 259.748C1101.19 259.004 1102.72 258.632 1104.35 258.632C1105.45 258.632 1106.42 258.812 1107.26 259.172C1108.13 259.532 1108.9 259.988 1109.57 260.54L1107.08 263.96C1106.24 263.264 1105.44 262.916 1104.67 262.916C1103.4 262.916 1102.38 263.372 1101.61 264.284C1100.87 265.196 1100.5 266.432 1100.5 267.992C1100.5 269.528 1100.87 270.764 1101.61 271.7C1102.38 272.612 1103.34 273.068 1104.49 273.068C1105.07 273.068 1105.63 272.948 1106.18 272.708C1106.74 272.444 1107.24 272.132 1107.7 271.772L1109.78 275.228C1108.9 275.996 1107.94 276.548 1106.9 276.884C1105.87 277.196 1104.86 277.352 1103.88 277.352ZM1119.43 277.352C1117.23 277.352 1115.64 276.716 1114.68 275.444C1113.75 274.172 1113.28 272.504 1113.28 270.44V263.204H1110.83V259.28L1113.57 259.064L1114.18 254.312H1118.57V259.064H1122.85V263.204H1118.57V270.368C1118.57 271.376 1118.77 272.108 1119.18 272.564C1119.61 272.996 1120.18 273.212 1120.87 273.212C1121.16 273.212 1121.45 273.176 1121.74 273.104C1122.05 273.032 1122.33 272.948 1122.57 272.852L1123.39 276.704C1122.94 276.848 1122.37 276.992 1121.7 277.136C1121.05 277.28 1120.3 277.352 1119.43 277.352Z" fill="#FA5A28"/> +</g> +<g filter="url(#filter2_d_1302_2038)"> +<rect x="856.16" y="518.303" width="385.384" height="105.917" rx="10" fill="white" stroke="#7B39D9" stroke-width="1.5"/> +<path d="M886.189 581V559.484H892.261C894.461 559.484 896.364 559.858 897.97 560.606C899.576 561.354 900.819 562.52 901.699 564.104C902.601 565.666 903.052 567.679 903.052 570.143C903.052 572.607 902.612 574.642 901.732 576.248C900.852 577.854 899.62 579.053 898.036 579.845C896.474 580.615 894.637 581 892.525 581H886.189ZM891.04 577.073H891.964C893.196 577.073 894.263 576.853 895.165 576.413C896.089 575.973 896.804 575.247 897.31 574.235C897.816 573.223 898.069 571.859 898.069 570.143C898.069 568.427 897.816 567.085 897.31 566.117C896.804 565.127 896.089 564.434 895.165 564.038C894.263 563.62 893.196 563.411 891.964 563.411H891.04V577.073ZM914.066 581.396C912.504 581.396 911.096 581.055 909.842 580.373C908.588 579.691 907.598 578.712 906.872 577.436C906.146 576.16 905.783 574.62 905.783 572.816C905.783 571.034 906.146 569.505 906.872 568.229C907.62 566.953 908.588 565.974 909.776 565.292C910.964 564.588 912.207 564.236 913.505 564.236C915.067 564.236 916.354 564.588 917.366 565.292C918.4 565.974 919.17 566.909 919.676 568.097C920.204 569.263 920.468 570.594 920.468 572.09C920.468 572.508 920.446 572.926 920.402 573.344C920.358 573.74 920.314 574.037 920.27 574.235H910.469C910.689 575.423 911.184 576.303 911.954 576.875C912.724 577.425 913.648 577.7 914.726 577.7C915.892 577.7 917.069 577.337 918.257 576.611L919.874 579.548C919.038 580.12 918.103 580.571 917.069 580.901C916.035 581.231 915.034 581.396 914.066 581.396ZM910.436 571.034H916.343C916.343 570.132 916.123 569.395 915.683 568.823C915.265 568.229 914.572 567.932 913.604 567.932C912.856 567.932 912.185 568.196 911.591 568.724C910.997 569.23 910.612 570 910.436 571.034ZM928.638 581.396C927.56 581.396 926.449 581.187 925.305 580.769C924.183 580.351 923.204 579.801 922.368 579.119L924.546 576.083C925.294 576.633 926.009 577.062 926.691 577.37C927.395 577.656 928.088 577.799 928.77 577.799C929.496 577.799 930.024 577.678 930.354 577.436C930.684 577.172 930.849 576.831 930.849 576.413C930.849 576.039 930.684 575.731 930.354 575.489C930.046 575.247 929.639 575.027 929.133 574.829C928.627 574.609 928.088 574.389 927.516 574.169C926.856 573.905 926.196 573.575 925.536 573.179C924.898 572.783 924.359 572.277 923.919 571.661C923.479 571.023 923.259 570.253 923.259 569.351C923.259 567.833 923.831 566.601 924.975 565.655C926.141 564.709 927.659 564.236 929.529 564.236C930.783 564.236 931.883 564.456 932.829 564.896C933.797 565.314 934.622 565.787 935.304 566.315L933.126 569.219C932.554 568.779 931.982 568.438 931.41 568.196C930.838 567.954 930.266 567.833 929.694 567.833C928.44 567.833 927.813 568.262 927.813 569.12C927.813 569.648 928.121 570.055 928.737 570.341C929.375 570.605 930.112 570.891 930.948 571.199C931.652 571.441 932.334 571.76 932.994 572.156C933.676 572.53 934.237 573.036 934.677 573.674C935.139 574.29 935.37 575.104 935.37 576.116C935.37 577.59 934.798 578.844 933.654 579.878C932.51 580.89 930.838 581.396 928.638 581.396ZM945.579 581.396C944.061 581.396 942.686 581.066 941.454 580.406C940.244 579.724 939.276 578.745 938.55 577.469C937.846 576.171 937.494 574.62 937.494 572.816C937.494 570.99 937.89 569.439 938.682 568.163C939.474 566.887 940.519 565.919 941.817 565.259C943.115 564.577 944.512 564.236 946.008 564.236C947.02 564.236 947.911 564.401 948.681 564.731C949.473 565.061 950.177 565.479 950.793 565.985L948.516 569.12C947.746 568.482 947.009 568.163 946.305 568.163C945.139 568.163 944.204 568.581 943.5 569.417C942.818 570.253 942.477 571.386 942.477 572.816C942.477 574.224 942.818 575.357 943.5 576.215C944.204 577.051 945.084 577.469 946.14 577.469C946.668 577.469 947.185 577.359 947.691 577.139C948.197 576.897 948.659 576.611 949.077 576.281L950.991 579.449C950.177 580.153 949.297 580.659 948.351 580.967C947.405 581.253 946.481 581.396 945.579 581.396ZM953.855 581V564.632H957.815L958.145 567.503H958.277C958.871 566.403 959.586 565.589 960.422 565.061C961.258 564.511 962.094 564.236 962.93 564.236C963.392 564.236 963.777 564.269 964.085 564.335C964.393 564.379 964.657 564.456 964.877 564.566L964.085 568.757C963.799 568.669 963.513 568.603 963.227 568.559C962.963 568.515 962.655 568.493 962.303 568.493C961.687 568.493 961.038 568.724 960.356 569.186C959.696 569.626 959.146 570.396 958.706 571.496V581H953.855ZM967.004 581V564.632H971.855V581H967.004ZM969.413 562.223C968.599 562.223 967.939 561.992 967.433 561.53C966.927 561.068 966.674 560.452 966.674 559.682C966.674 558.912 966.927 558.296 967.433 557.834C967.939 557.372 968.599 557.141 969.413 557.141C970.227 557.141 970.887 557.372 971.393 557.834C971.899 558.296 972.152 558.912 972.152 559.682C972.152 560.452 971.899 561.068 971.393 561.53C970.887 561.992 970.227 562.223 969.413 562.223ZM976.124 587.072V564.632H980.084L980.414 566.249H980.546C981.184 565.677 981.899 565.204 982.691 564.83C983.505 564.434 984.341 564.236 985.199 564.236C987.179 564.236 988.741 564.995 989.885 566.513C991.029 568.009 991.601 570.022 991.601 572.552C991.601 574.422 991.271 576.017 990.611 577.337C989.951 578.657 989.093 579.669 988.037 580.373C987.003 581.055 985.892 581.396 984.704 581.396C984 581.396 983.318 581.253 982.658 580.967C981.998 580.659 981.382 580.23 980.81 579.68L980.975 582.287V587.072H976.124ZM983.582 577.436C984.418 577.436 985.133 577.051 985.727 576.281C986.321 575.511 986.618 574.29 986.618 572.618C986.618 569.67 985.672 568.196 983.78 568.196C982.834 568.196 981.899 568.691 980.975 569.681V576.38C981.415 576.776 981.855 577.051 982.295 577.205C982.735 577.359 983.164 577.436 983.582 577.436ZM1000.47 581.396C998.45 581.396 996.998 580.813 996.118 579.647C995.26 578.481 994.831 576.952 994.831 575.06V568.427H992.587V564.83L995.095 564.632L995.656 560.276H999.682V564.632H1003.61V568.427H999.682V574.994C999.682 575.918 999.869 576.589 1000.24 577.007C1000.64 577.403 1001.16 577.601 1001.79 577.601C1002.06 577.601 1002.32 577.568 1002.59 577.502C1002.87 577.436 1003.12 577.359 1003.34 577.271L1004.1 580.802C1003.69 580.934 1003.17 581.066 1002.55 581.198C1001.96 581.33 1001.27 581.396 1000.47 581.396ZM1006.8 581V564.632H1011.65V581H1006.8ZM1009.21 562.223C1008.4 562.223 1007.74 561.992 1007.23 561.53C1006.73 561.068 1006.47 560.452 1006.47 559.682C1006.47 558.912 1006.73 558.296 1007.23 557.834C1007.74 557.372 1008.4 557.141 1009.21 557.141C1010.03 557.141 1010.69 557.372 1011.19 557.834C1011.7 558.296 1011.95 558.912 1011.95 559.682C1011.95 560.452 1011.7 561.068 1011.19 561.53C1010.69 561.992 1010.03 562.223 1009.21 562.223ZM1022.95 581.396C1021.57 581.396 1020.26 581.066 1019.03 580.406C1017.82 579.724 1016.84 578.745 1016.09 577.469C1015.34 576.171 1014.97 574.62 1014.97 572.816C1014.97 570.99 1015.34 569.439 1016.09 568.163C1016.84 566.887 1017.82 565.919 1019.03 565.259C1020.26 564.577 1021.57 564.236 1022.95 564.236C1024.34 564.236 1025.64 564.577 1026.85 565.259C1028.06 565.919 1029.04 566.887 1029.78 568.163C1030.53 569.439 1030.91 570.99 1030.91 572.816C1030.91 574.62 1030.53 576.171 1029.78 577.469C1029.04 578.745 1028.06 579.724 1026.85 580.406C1025.64 581.066 1024.34 581.396 1022.95 581.396ZM1022.95 577.469C1023.94 577.469 1024.69 577.051 1025.2 576.215C1025.7 575.357 1025.96 574.224 1025.96 572.816C1025.96 571.386 1025.7 570.253 1025.2 569.417C1024.69 568.581 1023.94 568.163 1022.95 568.163C1021.94 568.163 1021.18 568.581 1020.68 569.417C1020.19 570.253 1019.95 571.386 1019.95 572.816C1019.95 574.224 1020.19 575.357 1020.68 576.215C1021.18 577.051 1021.94 577.469 1022.95 577.469ZM1034.23 581V564.632H1038.19L1038.52 566.711H1038.65C1039.35 566.051 1040.12 565.479 1040.96 564.995C1041.82 564.489 1042.8 564.236 1043.9 564.236C1045.68 564.236 1046.97 564.83 1047.76 566.018C1048.57 567.184 1048.98 568.79 1048.98 570.836V581H1044.13V571.463C1044.13 570.275 1043.96 569.461 1043.63 569.021C1043.33 568.581 1042.82 568.361 1042.12 568.361C1041.5 568.361 1040.97 568.504 1040.53 568.79C1040.09 569.054 1039.61 569.439 1039.08 569.945V581H1034.23Z" fill="#7B39D9"/> +<path d="M1064.31 586.907C1062.92 584.641 1061.84 582.287 1061.07 579.845C1060.32 577.403 1059.95 574.73 1059.95 571.826C1059.95 568.922 1060.32 566.249 1061.07 563.807C1061.84 561.365 1062.92 559.011 1064.31 556.745L1067.34 557.999C1066.13 560.133 1065.25 562.388 1064.7 564.764C1064.15 567.118 1063.88 569.472 1063.88 571.826C1063.88 574.158 1064.15 576.512 1064.7 578.888C1065.25 581.242 1066.13 583.497 1067.34 585.653L1064.31 586.907ZM1071.46 581V559.484H1076.31V576.908H1084.82V581H1071.46ZM1094.72 581.396C1093.34 581.396 1092.03 581.066 1090.79 580.406C1089.58 579.724 1088.61 578.745 1087.86 577.469C1087.11 576.171 1086.74 574.62 1086.74 572.816C1086.74 570.99 1087.11 569.439 1087.86 568.163C1088.61 566.887 1089.58 565.919 1090.79 565.259C1092.03 564.577 1093.34 564.236 1094.72 564.236C1096.11 564.236 1097.41 564.577 1098.62 565.259C1099.83 565.919 1100.8 566.887 1101.55 568.163C1102.3 569.439 1102.67 570.99 1102.67 572.816C1102.67 574.62 1102.3 576.171 1101.55 577.469C1100.8 578.745 1099.83 579.724 1098.62 580.406C1097.41 581.066 1096.11 581.396 1094.72 581.396ZM1094.72 577.469C1095.71 577.469 1096.46 577.051 1096.97 576.215C1097.47 575.357 1097.72 574.224 1097.72 572.816C1097.72 571.386 1097.47 570.253 1096.97 569.417C1096.46 568.581 1095.71 568.163 1094.72 568.163C1093.71 568.163 1092.95 568.581 1092.44 569.417C1091.96 570.253 1091.72 571.386 1091.72 572.816C1091.72 574.224 1091.96 575.357 1092.44 576.215C1092.95 577.051 1093.71 577.469 1094.72 577.469ZM1106 581V564.632H1109.96L1110.29 566.711H1110.42C1111.12 566.051 1111.89 565.479 1112.73 564.995C1113.59 564.489 1114.57 564.236 1115.67 564.236C1117.45 564.236 1118.74 564.83 1119.53 566.018C1120.34 567.184 1120.75 568.79 1120.75 570.836V581H1115.9V571.463C1115.9 570.275 1115.73 569.461 1115.4 569.021C1115.09 568.581 1114.59 568.361 1113.88 568.361C1113.27 568.361 1112.74 568.504 1112.3 568.79C1111.86 569.054 1111.38 569.439 1110.85 569.945V581H1106ZM1130.72 587.963C1129.45 587.963 1128.29 587.82 1127.26 587.534C1126.22 587.248 1125.4 586.797 1124.78 586.181C1124.17 585.565 1123.86 584.773 1123.86 583.805C1123.86 582.485 1124.64 581.385 1126.2 580.505V580.373C1125.78 580.087 1125.42 579.724 1125.11 579.284C1124.83 578.844 1124.68 578.283 1124.68 577.601C1124.68 577.007 1124.86 576.435 1125.21 575.885C1125.56 575.335 1126 574.884 1126.53 574.532V574.4C1125.96 574.004 1125.44 573.432 1124.98 572.684C1124.54 571.936 1124.32 571.089 1124.32 570.143C1124.32 568.823 1124.64 567.734 1125.28 566.876C1125.92 565.996 1126.75 565.336 1127.79 564.896C1128.82 564.456 1129.92 564.236 1131.09 564.236C1132.05 564.236 1132.9 564.368 1133.63 564.632H1139.6V568.163H1136.99C1137.15 568.405 1137.27 568.713 1137.36 569.087C1137.47 569.461 1137.52 569.868 1137.52 570.308C1137.52 571.562 1137.23 572.596 1136.66 573.41C1136.09 574.224 1135.32 574.829 1134.35 575.225C1133.38 575.621 1132.3 575.819 1131.09 575.819C1130.45 575.819 1129.79 575.709 1129.11 575.489C1128.71 575.819 1128.51 576.226 1128.51 576.71C1128.51 577.128 1128.7 577.436 1129.07 577.634C1129.45 577.832 1130.08 577.931 1130.99 577.931H1133.63C1135.65 577.931 1137.19 578.261 1138.25 578.921C1139.32 579.559 1139.86 580.615 1139.86 582.089C1139.86 583.211 1139.49 584.212 1138.74 585.092C1137.99 585.994 1136.94 586.698 1135.57 587.204C1134.21 587.71 1132.59 587.963 1130.72 587.963ZM1131.09 572.882C1131.72 572.882 1132.25 572.651 1132.67 572.189C1133.11 571.727 1133.33 571.045 1133.33 570.143C1133.33 569.285 1133.11 568.636 1132.67 568.196C1132.25 567.734 1131.72 567.503 1131.09 567.503C1130.45 567.503 1129.91 567.723 1129.47 568.163C1129.05 568.603 1128.84 569.263 1128.84 570.143C1128.84 571.045 1129.05 571.727 1129.47 572.189C1129.91 572.651 1130.45 572.882 1131.09 572.882ZM1131.48 584.927C1132.58 584.927 1133.48 584.729 1134.19 584.333C1134.89 583.937 1135.24 583.464 1135.24 582.914C1135.24 582.408 1135.02 582.067 1134.58 581.891C1134.17 581.715 1133.55 581.627 1132.74 581.627H1131.05C1130.5 581.627 1130.04 581.605 1129.67 581.561C1129.31 581.539 1129.01 581.495 1128.74 581.429C1128.15 581.957 1127.85 582.496 1127.85 583.046C1127.85 583.662 1128.18 584.124 1128.84 584.432C1129.52 584.762 1130.4 584.927 1131.48 584.927ZM1153.7 581V563.576H1147.8V559.484H1164.49V563.576H1158.59V581H1153.7ZM1172.27 581.396C1170.7 581.396 1169.3 581.055 1168.04 580.373C1166.79 579.691 1165.8 578.712 1165.07 577.436C1164.35 576.16 1163.98 574.62 1163.98 572.816C1163.98 571.034 1164.35 569.505 1165.07 568.229C1165.82 566.953 1166.79 565.974 1167.98 565.292C1169.16 564.588 1170.41 564.236 1171.7 564.236C1173.27 564.236 1174.55 564.588 1175.57 565.292C1176.6 565.974 1177.37 566.909 1177.88 568.097C1178.4 569.263 1178.67 570.594 1178.67 572.09C1178.67 572.508 1178.65 572.926 1178.6 573.344C1178.56 573.74 1178.51 574.037 1178.47 574.235H1168.67C1168.89 575.423 1169.38 576.303 1170.15 576.875C1170.92 577.425 1171.85 577.7 1172.93 577.7C1174.09 577.7 1175.27 577.337 1176.46 576.611L1178.07 579.548C1177.24 580.12 1176.3 580.571 1175.27 580.901C1174.23 581.231 1173.23 581.396 1172.27 581.396ZM1168.64 571.034H1174.54C1174.54 570.132 1174.32 569.395 1173.88 568.823C1173.46 568.229 1172.77 567.932 1171.8 567.932C1171.06 567.932 1170.38 568.196 1169.79 568.724C1169.2 569.23 1168.81 570 1168.64 571.034ZM1179.82 581L1184.84 572.486L1180.12 564.632H1185.33L1186.78 567.272C1187 567.734 1187.23 568.207 1187.48 568.691C1187.72 569.153 1187.95 569.615 1188.17 570.077H1188.3C1188.48 569.615 1188.66 569.153 1188.86 568.691C1189.06 568.207 1189.25 567.734 1189.42 567.272L1190.55 564.632H1195.56L1190.81 573.047L1195.86 581H1190.64L1189.06 578.294C1188.8 577.832 1188.53 577.359 1188.27 576.875C1188.03 576.391 1187.77 575.918 1187.51 575.456H1187.38C1187.18 575.918 1186.97 576.391 1186.75 576.875C1186.53 577.337 1186.32 577.81 1186.12 578.294L1184.84 581H1179.82ZM1203.82 581.396C1201.8 581.396 1200.35 580.813 1199.47 579.647C1198.61 578.481 1198.18 576.952 1198.18 575.06V568.427H1195.94V564.83L1198.44 564.632L1199.01 560.276H1203.03V564.632H1206.96V568.427H1203.03V574.994C1203.03 575.918 1203.22 576.589 1203.59 577.007C1203.99 577.403 1204.51 577.601 1205.14 577.601C1205.41 577.601 1205.67 577.568 1205.94 577.502C1206.22 577.436 1206.47 577.359 1206.69 577.271L1207.45 580.802C1207.04 580.934 1206.52 581.066 1205.9 581.198C1205.31 581.33 1204.62 581.396 1203.82 581.396ZM1212.63 586.907L1209.59 585.653C1210.82 583.497 1211.72 581.242 1212.27 578.888C1212.82 576.512 1213.09 574.158 1213.09 571.826C1213.09 569.472 1212.82 567.118 1212.27 564.764C1211.72 562.388 1210.82 560.133 1209.59 557.999L1212.63 556.745C1214.01 559.011 1215.08 561.365 1215.83 563.807C1216.6 566.249 1216.98 568.922 1216.98 571.826C1216.98 574.73 1216.6 577.403 1215.83 579.845C1215.08 582.287 1214.01 584.641 1212.63 586.907Z" fill="#00CCB0"/> +</g> +<g filter="url(#filter3_d_1302_2038)"> +<rect x="862.541" y="340.924" width="385.384" height="105.917" rx="10" fill="white" stroke="#7B39D9" stroke-width="1.5"/> +<path d="M971.514 406V384.484H976.497L982.107 395.176L984.219 399.928H984.351C984.263 398.784 984.142 397.508 983.988 396.1C983.834 394.692 983.757 393.35 983.757 392.074V384.484H988.377V406H983.394L977.784 395.275L975.672 390.589H975.54C975.65 391.777 975.771 393.053 975.903 394.417C976.057 395.781 976.134 397.101 976.134 398.377V406H971.514ZM997.189 406.396C995.693 406.396 994.505 405.923 993.625 404.977C992.745 404.009 992.305 402.832 992.305 401.446C992.305 399.73 993.031 398.388 994.483 397.42C995.935 396.452 998.278 395.803 1001.51 395.473C1001.47 394.747 1001.25 394.175 1000.85 393.757C1000.48 393.317 999.84 393.097 998.938 393.097C998.256 393.097 997.563 393.229 996.859 393.493C996.155 393.757 995.407 394.12 994.615 394.582L992.866 391.381C993.9 390.743 995 390.226 996.166 389.83C997.354 389.434 998.586 389.236 999.862 389.236C1001.95 389.236 1003.56 389.841 1004.68 391.051C1005.8 392.261 1006.36 394.12 1006.36 396.628V406H1002.4L1002.07 404.317H1001.94C1001.26 404.933 1000.52 405.439 999.73 405.835C998.96 406.209 998.113 406.396 997.189 406.396ZM998.839 402.634C999.389 402.634 999.862 402.513 1000.26 402.271C1000.68 402.007 1001.09 401.666 1001.51 401.248V398.377C999.796 398.597 998.608 398.949 997.948 399.433C997.288 399.895 996.958 400.445 996.958 401.083C996.958 401.611 997.123 402.007 997.453 402.271C997.805 402.513 998.267 402.634 998.839 402.634ZM1010.47 406V389.632H1014.43L1014.76 391.744H1014.89C1015.57 391.062 1016.3 390.479 1017.07 389.995C1017.84 389.489 1018.76 389.236 1019.84 389.236C1021 389.236 1021.94 389.478 1022.64 389.962C1023.37 390.424 1023.94 391.095 1024.36 391.975C1025.09 391.227 1025.86 390.589 1026.67 390.061C1027.48 389.511 1028.43 389.236 1029.51 389.236C1031.27 389.236 1032.55 389.83 1033.37 391.018C1034.2 392.184 1034.62 393.79 1034.62 395.836V406H1029.77V396.463C1029.77 395.275 1029.61 394.461 1029.28 394.021C1028.97 393.581 1028.46 393.361 1027.76 393.361C1026.94 393.361 1026.01 393.889 1024.95 394.945V406H1020.1V396.463C1020.1 395.275 1019.94 394.461 1019.61 394.021C1019.3 393.581 1018.79 393.361 1018.09 393.361C1017.28 393.361 1016.35 393.889 1015.32 394.945V406H1010.47ZM1046.09 406.396C1044.53 406.396 1043.12 406.055 1041.86 405.373C1040.61 404.691 1039.62 403.712 1038.89 402.436C1038.17 401.16 1037.8 399.62 1037.8 397.816C1037.8 396.034 1038.17 394.505 1038.89 393.229C1039.64 391.953 1040.61 390.974 1041.8 390.292C1042.99 389.588 1044.23 389.236 1045.53 389.236C1047.09 389.236 1048.38 389.588 1049.39 390.292C1050.42 390.974 1051.19 391.909 1051.7 393.097C1052.23 394.263 1052.49 395.594 1052.49 397.09C1052.49 397.508 1052.47 397.926 1052.42 398.344C1052.38 398.74 1052.34 399.037 1052.29 399.235H1042.49C1042.71 400.423 1043.21 401.303 1043.98 401.875C1044.75 402.425 1045.67 402.7 1046.75 402.7C1047.91 402.7 1049.09 402.337 1050.28 401.611L1051.9 404.548C1051.06 405.12 1050.12 405.571 1049.09 405.901C1048.06 406.231 1047.06 406.396 1046.09 406.396ZM1042.46 396.034H1048.36C1048.36 395.132 1048.14 394.395 1047.7 393.823C1047.29 393.229 1046.59 392.932 1045.63 392.932C1044.88 392.932 1044.21 393.196 1043.61 393.724C1043.02 394.23 1042.63 395 1042.46 396.034Z" fill="#7B39D9"/> +<path d="M1067.03 411.907C1065.65 409.641 1064.57 407.287 1063.8 404.845C1063.05 402.403 1062.68 399.73 1062.68 396.826C1062.68 393.922 1063.05 391.249 1063.8 388.807C1064.57 386.365 1065.65 384.011 1067.03 381.745L1070.07 382.999C1068.86 385.133 1067.98 387.388 1067.43 389.764C1066.88 392.118 1066.61 394.472 1066.61 396.826C1066.61 399.158 1066.88 401.512 1067.43 403.888C1067.98 406.242 1068.86 408.497 1070.07 410.653L1067.03 411.907ZM1078.38 406V388.576H1072.47V384.484H1089.17V388.576H1083.26V406H1078.38ZM1096.94 406.396C1095.38 406.396 1093.97 406.055 1092.72 405.373C1091.46 404.691 1090.47 403.712 1089.75 402.436C1089.02 401.16 1088.66 399.62 1088.66 397.816C1088.66 396.034 1089.02 394.505 1089.75 393.229C1090.49 391.953 1091.46 390.974 1092.65 390.292C1093.84 389.588 1095.08 389.236 1096.38 389.236C1097.94 389.236 1099.23 389.588 1100.24 390.292C1101.27 390.974 1102.04 391.909 1102.55 393.097C1103.08 394.263 1103.34 395.594 1103.34 397.09C1103.34 397.508 1103.32 397.926 1103.28 398.344C1103.23 398.74 1103.19 399.037 1103.14 399.235H1093.34C1093.56 400.423 1094.06 401.303 1094.83 401.875C1095.6 402.425 1096.52 402.7 1097.6 402.7C1098.77 402.7 1099.94 402.337 1101.13 401.611L1102.75 404.548C1101.91 405.12 1100.98 405.571 1099.94 405.901C1098.91 406.231 1097.91 406.396 1096.94 406.396ZM1093.31 396.034H1099.22C1099.22 395.132 1099 394.395 1098.56 393.823C1098.14 393.229 1097.45 392.932 1096.48 392.932C1095.73 392.932 1095.06 393.196 1094.47 393.724C1093.87 394.23 1093.49 395 1093.31 396.034ZM1104.5 406L1109.51 397.486L1104.79 389.632H1110.01L1111.46 392.272C1111.68 392.734 1111.91 393.207 1112.15 393.691C1112.39 394.153 1112.63 394.615 1112.85 395.077H1112.98C1113.15 394.615 1113.34 394.153 1113.54 393.691C1113.74 393.207 1113.92 392.734 1114.1 392.272L1115.22 389.632H1120.24L1115.49 398.047L1120.53 406H1115.32L1113.74 403.294C1113.47 402.832 1113.21 402.359 1112.94 401.875C1112.7 401.391 1112.45 400.918 1112.19 400.456H1112.05C1111.86 400.918 1111.65 401.391 1111.43 401.875C1111.21 402.337 1111 402.81 1110.8 403.294L1109.51 406H1104.5ZM1128.5 406.396C1126.47 406.396 1125.02 405.813 1124.14 404.647C1123.28 403.481 1122.86 401.952 1122.86 400.06V393.427H1120.61V389.83L1123.12 389.632L1123.68 385.276H1127.71V389.632H1131.63V393.427H1127.71V399.994C1127.71 400.918 1127.89 401.589 1128.27 402.007C1128.66 402.403 1129.18 402.601 1129.82 402.601C1130.08 402.601 1130.35 402.568 1130.61 402.502C1130.9 402.436 1131.15 402.359 1131.37 402.271L1132.13 405.802C1131.71 405.934 1131.19 406.066 1130.58 406.198C1129.98 406.33 1129.29 406.396 1128.5 406.396ZM1137.3 411.907L1134.27 410.653C1135.5 408.497 1136.39 406.242 1136.94 403.888C1137.49 401.512 1137.77 399.158 1137.77 396.826C1137.77 394.472 1137.49 392.118 1136.94 389.764C1136.39 387.388 1135.5 385.133 1134.27 382.999L1137.3 381.745C1138.69 384.011 1139.76 386.365 1140.5 388.807C1141.27 391.249 1141.66 393.922 1141.66 396.826C1141.66 399.73 1141.27 402.403 1140.5 404.845C1139.76 407.287 1138.69 409.641 1137.3 411.907Z" fill="#00CCB0"/> +</g> +<g filter="url(#filter4_d_1302_2038)"> +<rect x="857.436" y="703.756" width="385.384" height="105.917" rx="10" fill="white" stroke="#7B39D9" stroke-width="1.5"/> +<path d="M931.084 766V744.484H938.476C940.06 744.484 941.49 744.704 942.766 745.144C944.064 745.562 945.098 746.277 945.868 747.289C946.638 748.301 947.023 749.676 947.023 751.414C947.023 753.086 946.638 754.461 945.868 755.539C945.098 756.617 944.075 757.42 942.799 757.948C941.523 758.454 940.126 758.707 938.608 758.707H935.935V766H931.084ZM935.935 754.846H938.311C940.951 754.846 942.271 753.702 942.271 751.414C942.271 750.292 941.919 749.5 941.215 749.038C940.511 748.576 939.499 748.345 938.179 748.345H935.935V754.846ZM950.347 766V749.632H954.307L954.637 752.503H954.769C955.363 751.403 956.078 750.589 956.914 750.061C957.75 749.511 958.586 749.236 959.422 749.236C959.884 749.236 960.269 749.269 960.577 749.335C960.885 749.379 961.149 749.456 961.369 749.566L960.577 753.757C960.291 753.669 960.005 753.603 959.719 753.559C959.455 753.515 959.147 753.493 958.795 753.493C958.179 753.493 957.53 753.724 956.848 754.186C956.188 754.626 955.638 755.396 955.198 756.496V766H950.347ZM963.495 766V749.632H968.346V766H963.495ZM965.904 747.223C965.09 747.223 964.43 746.992 963.924 746.53C963.418 746.068 963.165 745.452 963.165 744.682C963.165 743.912 963.418 743.296 963.924 742.834C964.43 742.372 965.09 742.141 965.904 742.141C966.718 742.141 967.378 742.372 967.884 742.834C968.39 743.296 968.643 743.912 968.643 744.682C968.643 745.452 968.39 746.068 967.884 746.53C967.378 746.992 966.718 747.223 965.904 747.223ZM979.743 766.396C978.225 766.396 976.85 766.066 975.618 765.406C974.408 764.724 973.44 763.745 972.714 762.469C972.01 761.171 971.658 759.62 971.658 757.816C971.658 755.99 972.054 754.439 972.846 753.163C973.638 751.887 974.683 750.919 975.981 750.259C977.279 749.577 978.676 749.236 980.172 749.236C981.184 749.236 982.075 749.401 982.845 749.731C983.637 750.061 984.341 750.479 984.957 750.985L982.68 754.12C981.91 753.482 981.173 753.163 980.469 753.163C979.303 753.163 978.368 753.581 977.664 754.417C976.982 755.253 976.641 756.386 976.641 757.816C976.641 759.224 976.982 760.357 977.664 761.215C978.368 762.051 979.248 762.469 980.304 762.469C980.832 762.469 981.349 762.359 981.855 762.139C982.361 761.897 982.823 761.611 983.241 761.281L985.155 764.449C984.341 765.153 983.461 765.659 982.515 765.967C981.569 766.253 980.645 766.396 979.743 766.396ZM994.411 766.396C992.849 766.396 991.441 766.055 990.187 765.373C988.933 764.691 987.943 763.712 987.217 762.436C986.491 761.16 986.128 759.62 986.128 757.816C986.128 756.034 986.491 754.505 987.217 753.229C987.965 751.953 988.933 750.974 990.121 750.292C991.309 749.588 992.552 749.236 993.85 749.236C995.412 749.236 996.699 749.588 997.711 750.292C998.745 750.974 999.515 751.909 1000.02 753.097C1000.55 754.263 1000.81 755.594 1000.81 757.09C1000.81 757.508 1000.79 757.926 1000.75 758.344C1000.7 758.74 1000.66 759.037 1000.61 759.235H990.814C991.034 760.423 991.529 761.303 992.299 761.875C993.069 762.425 993.993 762.7 995.071 762.7C996.237 762.7 997.414 762.337 998.602 761.611L1000.22 764.548C999.383 765.12 998.448 765.571 997.414 765.901C996.38 766.231 995.379 766.396 994.411 766.396ZM990.781 756.034H996.688C996.688 755.132 996.468 754.395 996.028 753.823C995.61 753.229 994.917 752.932 993.949 752.932C993.201 752.932 992.53 753.196 991.936 753.724C991.342 754.23 990.957 755 990.781 756.034Z" fill="#7B39D9"/> +<path d="M1015.36 771.907C1013.97 769.641 1012.89 767.287 1012.12 764.845C1011.38 762.403 1011 759.73 1011 756.826C1011 753.922 1011.38 751.249 1012.12 748.807C1012.89 746.365 1013.97 744.011 1015.36 741.745L1018.39 742.999C1017.18 745.133 1016.3 747.388 1015.75 749.764C1015.2 752.118 1014.93 754.472 1014.93 756.826C1014.93 759.158 1015.2 761.512 1015.75 763.888C1016.3 766.242 1017.18 768.497 1018.39 770.653L1015.36 771.907ZM1022.51 766V744.484H1027.49L1033.1 755.176L1035.22 759.928H1035.35C1035.26 758.784 1035.14 757.508 1034.99 756.1C1034.83 754.692 1034.75 753.35 1034.75 752.074V744.484H1039.37V766H1034.39L1028.78 755.275L1026.67 750.589H1026.54C1026.65 751.777 1026.77 753.053 1026.9 754.417C1027.05 755.781 1027.13 757.101 1027.13 758.377V766H1022.51ZM1048.98 766.396C1047.2 766.396 1045.9 765.813 1045.08 764.647C1044.29 763.459 1043.9 761.842 1043.9 759.796V749.632H1048.75V759.169C1048.75 760.335 1048.91 761.149 1049.24 761.611C1049.57 762.051 1050.09 762.271 1050.79 762.271C1051.41 762.271 1051.93 762.128 1052.34 761.842C1052.76 761.556 1053.21 761.094 1053.7 760.456V749.632H1058.55V766H1054.59L1054.23 763.723H1054.13C1053.44 764.537 1052.7 765.186 1051.88 765.67C1051.07 766.154 1050.1 766.396 1048.98 766.396ZM1062.82 766V749.632H1066.78L1067.11 751.744H1067.24C1067.92 751.062 1068.65 750.479 1069.42 749.995C1070.19 749.489 1071.11 749.236 1072.19 749.236C1073.36 749.236 1074.29 749.478 1074.99 749.962C1075.72 750.424 1076.29 751.095 1076.71 751.975C1077.44 751.227 1078.21 750.589 1079.02 750.061C1079.83 749.511 1080.78 749.236 1081.86 749.236C1083.62 749.236 1084.91 749.83 1085.72 751.018C1086.56 752.184 1086.97 753.79 1086.97 755.836V766H1082.12V756.463C1082.12 755.275 1081.96 754.461 1081.63 754.021C1081.32 753.581 1080.81 753.361 1080.11 753.361C1079.3 753.361 1078.36 753.889 1077.3 754.945V766H1072.45V756.463C1072.45 755.275 1072.29 754.461 1071.96 754.021C1071.65 753.581 1071.14 753.361 1070.44 753.361C1069.63 753.361 1068.7 753.889 1067.67 754.945V766H1062.82ZM1099.69 766.396C1098.97 766.396 1098.23 766.22 1097.48 765.868C1096.76 765.494 1096.07 764.955 1095.44 764.251H1095.3L1094.91 766H1091.11V742.867H1095.96V748.543L1095.83 751.051C1096.47 750.479 1097.16 750.039 1097.91 749.731C1098.66 749.401 1099.41 749.236 1100.15 749.236C1101.47 749.236 1102.62 749.577 1103.59 750.259C1104.55 750.941 1105.29 751.909 1105.8 753.163C1106.33 754.395 1106.59 755.847 1106.59 757.519C1106.59 759.389 1106.26 760.995 1105.6 762.337C1104.94 763.657 1104.08 764.669 1103.03 765.373C1101.99 766.055 1100.88 766.396 1099.69 766.396ZM1098.57 762.436C1099.41 762.436 1100.12 762.051 1100.72 761.281C1101.31 760.511 1101.61 759.29 1101.61 757.618C1101.61 754.67 1100.66 753.196 1098.77 753.196C1097.8 753.196 1096.87 753.691 1095.96 754.681V761.38C1096.4 761.776 1096.84 762.051 1097.28 762.205C1097.72 762.359 1098.15 762.436 1098.57 762.436ZM1117.36 766.396C1115.79 766.396 1114.39 766.055 1113.13 765.373C1111.88 764.691 1110.89 763.712 1110.16 762.436C1109.44 761.16 1109.07 759.62 1109.07 757.816C1109.07 756.034 1109.44 754.505 1110.16 753.229C1110.91 751.953 1111.88 750.974 1113.07 750.292C1114.25 749.588 1115.5 749.236 1116.79 749.236C1118.36 749.236 1119.64 749.588 1120.66 750.292C1121.69 750.974 1122.46 751.909 1122.97 753.097C1123.49 754.263 1123.76 755.594 1123.76 757.09C1123.76 757.508 1123.74 757.926 1123.69 758.344C1123.65 758.74 1123.6 759.037 1123.56 759.235H1113.76C1113.98 760.423 1114.47 761.303 1115.24 761.875C1116.01 762.425 1116.94 762.7 1118.02 762.7C1119.18 762.7 1120.36 762.337 1121.55 761.611L1123.16 764.548C1122.33 765.12 1121.39 765.571 1120.36 765.901C1119.32 766.231 1118.32 766.396 1117.36 766.396ZM1113.73 756.034H1119.63C1119.63 755.132 1119.41 754.395 1118.97 753.823C1118.55 753.229 1117.86 752.932 1116.89 752.932C1116.15 752.932 1115.47 753.196 1114.88 753.724C1114.29 754.23 1113.9 755 1113.73 756.034ZM1127.11 766V749.632H1131.07L1131.4 752.503H1131.53C1132.13 751.403 1132.84 750.589 1133.68 750.061C1134.51 749.511 1135.35 749.236 1136.18 749.236C1136.65 749.236 1137.03 749.269 1137.34 749.335C1137.65 749.379 1137.91 749.456 1138.13 749.566L1137.34 753.757C1137.05 753.669 1136.77 753.603 1136.48 753.559C1136.22 753.515 1135.91 753.493 1135.56 753.493C1134.94 753.493 1134.29 753.724 1133.61 754.186C1132.95 754.626 1132.4 755.396 1131.96 756.496V766H1127.11ZM1142.73 771.907L1139.7 770.653C1140.93 768.497 1141.82 766.242 1142.37 763.888C1142.92 761.512 1143.19 759.158 1143.19 756.826C1143.19 754.472 1142.92 752.118 1142.37 749.764C1141.82 747.388 1140.93 745.133 1139.7 742.999L1142.73 741.745C1144.12 744.011 1145.19 746.365 1145.93 748.807C1146.7 751.249 1147.09 753.922 1147.09 756.826C1147.09 759.73 1146.7 762.403 1145.93 764.845C1145.19 767.287 1144.12 769.641 1142.73 771.907Z" fill="#00CCB0"/> +</g> +<path d="M409.523 531.064L863.817 385.588" stroke="#7B39D9" stroke-width="2" stroke-dasharray="5 5"/> +<path d="M409.523 630.6L853.5 758" stroke="#7B39D9" stroke-width="2" stroke-dasharray="5 5"/> +<path d="M459.929 580.832H856.16" stroke="#7B39D9" stroke-width="2" stroke-dasharray="5 5"/> +<path d="M1565.5 539.5L1112.66 412.386" stroke="#00CCB0" stroke-width="2" stroke-dasharray="5 5"/> +<path d="M1574 660L1084 740.5" stroke="#00CCB0" stroke-width="2" stroke-dasharray="5 5"/> +<path d="M1540.73 595H1126" stroke="#00CCB0" stroke-width="2" stroke-dasharray="5 5"/> +<path d="M272.979 302.641C446.405 303.139 717.064 303.917 717.064 303.917" stroke="#FA5A28" stroke-width="2" stroke-dasharray="5 5"/> +<path d="M138.96 274.48C136.773 274.48 134.76 273.973 132.92 272.96C131.08 271.947 129.6 270.453 128.48 268.48C127.387 266.48 126.84 264.027 126.84 261.12C126.84 258.24 127.4 255.787 128.52 253.76C129.667 251.707 131.173 250.147 133.04 249.08C134.933 247.987 136.973 247.44 139.16 247.44C140.84 247.44 142.347 247.787 143.68 248.48C145.013 249.147 146.12 249.933 147 250.84L143.88 254.6C143.213 253.987 142.507 253.493 141.76 253.12C141.04 252.72 140.213 252.52 139.28 252.52C138.107 252.52 137.027 252.853 136.04 253.52C135.08 254.187 134.307 255.147 133.72 256.4C133.16 257.653 132.88 259.16 132.88 260.92C132.88 263.587 133.453 265.667 134.6 267.16C135.747 268.653 137.28 269.4 139.2 269.4C140.267 269.4 141.213 269.16 142.04 268.68C142.893 268.2 143.64 267.627 144.28 266.96L147.4 270.64C145.213 273.2 142.4 274.48 138.96 274.48ZM159.401 274.48C157.721 274.48 156.135 274.08 154.641 273.28C153.175 272.453 151.988 271.267 151.081 269.72C150.175 268.147 149.721 266.267 149.721 264.08C149.721 261.867 150.175 259.987 151.081 258.44C151.988 256.893 153.175 255.72 154.641 254.92C156.135 254.093 157.721 253.68 159.401 253.68C161.081 253.68 162.655 254.093 164.121 254.92C165.588 255.72 166.775 256.893 167.681 258.44C168.588 259.987 169.041 261.867 169.041 264.08C169.041 266.267 168.588 268.147 167.681 269.72C166.775 271.267 165.588 272.453 164.121 273.28C162.655 274.08 161.081 274.48 159.401 274.48ZM159.401 269.72C160.601 269.72 161.508 269.213 162.121 268.2C162.735 267.16 163.041 265.787 163.041 264.08C163.041 262.347 162.735 260.973 162.121 259.96C161.508 258.947 160.601 258.44 159.401 258.44C158.175 258.44 157.255 258.947 156.641 259.96C156.055 260.973 155.761 262.347 155.761 264.08C155.761 265.787 156.055 267.16 156.641 268.2C157.255 269.213 158.175 269.72 159.401 269.72ZM173.069 274V254.16H177.869L178.269 256.68H178.429C179.282 255.88 180.215 255.187 181.229 254.6C182.269 253.987 183.455 253.68 184.789 253.68C186.949 253.68 188.509 254.4 189.469 255.84C190.455 257.253 190.949 259.2 190.949 261.68V274H185.069V262.44C185.069 261 184.869 260.013 184.469 259.48C184.095 258.947 183.482 258.68 182.629 258.68C181.882 258.68 181.242 258.853 180.709 259.2C180.175 259.52 179.589 259.987 178.949 260.6V274H173.069ZM203.599 274.48C201.146 274.48 199.386 273.773 198.319 272.36C197.279 270.947 196.759 269.093 196.759 266.8V258.76H194.039V254.4L197.079 254.16L197.759 248.88H202.639V254.16H207.399V258.76H202.639V266.72C202.639 267.84 202.866 268.653 203.319 269.16C203.799 269.64 204.426 269.88 205.199 269.88C205.519 269.88 205.839 269.84 206.159 269.76C206.506 269.68 206.813 269.587 207.079 269.48L207.999 273.76C207.493 273.92 206.866 274.08 206.119 274.24C205.399 274.4 204.559 274.48 203.599 274.48ZM219.449 274.48C217.555 274.48 215.849 274.067 214.329 273.24C212.809 272.413 211.609 271.227 210.729 269.68C209.849 268.133 209.409 266.267 209.409 264.08C209.409 261.92 209.849 260.067 210.729 258.52C211.635 256.973 212.809 255.787 214.249 254.96C215.689 254.107 217.195 253.68 218.769 253.68C220.662 253.68 222.222 254.107 223.449 254.96C224.702 255.787 225.635 256.92 226.249 258.36C226.889 259.773 227.209 261.387 227.209 263.2C227.209 263.707 227.182 264.213 227.129 264.72C227.075 265.2 227.022 265.56 226.969 265.8H215.089C215.355 267.24 215.955 268.307 216.889 269C217.822 269.667 218.942 270 220.249 270C221.662 270 223.089 269.56 224.529 268.68L226.489 272.24C225.475 272.933 224.342 273.48 223.089 273.88C221.835 274.28 220.622 274.48 219.449 274.48ZM215.049 261.92H222.209C222.209 260.827 221.942 259.933 221.409 259.24C220.902 258.52 220.062 258.16 218.889 258.16C217.982 258.16 217.169 258.48 216.449 259.12C215.729 259.733 215.262 260.667 215.049 261.92ZM231.272 274V254.16H236.072L236.472 256.68H236.632C237.485 255.88 238.419 255.187 239.432 254.6C240.472 253.987 241.659 253.68 242.992 253.68C245.152 253.68 246.712 254.4 247.672 255.84C248.659 257.253 249.152 259.2 249.152 261.68V274H243.272V262.44C243.272 261 243.072 260.013 242.672 259.48C242.299 258.947 241.685 258.68 240.832 258.68C240.085 258.68 239.445 258.853 238.912 259.2C238.379 259.52 237.792 259.987 237.152 260.6V274H231.272ZM261.803 274.48C259.349 274.48 257.589 273.773 256.523 272.36C255.483 270.947 254.963 269.093 254.963 266.8V258.76H252.243V254.4L255.283 254.16L255.963 248.88H260.843V254.16H265.603V258.76H260.843V266.72C260.843 267.84 261.069 268.653 261.523 269.16C262.003 269.64 262.629 269.88 263.403 269.88C263.723 269.88 264.043 269.84 264.363 269.76C264.709 269.68 265.016 269.587 265.283 269.48L266.203 273.76C265.696 273.92 265.069 274.08 264.323 274.24C263.603 274.4 262.763 274.48 261.803 274.48ZM277.963 274V247.92H284.403L288.603 259.52C288.869 260.267 289.123 261.053 289.363 261.88C289.603 262.707 289.856 263.52 290.123 264.32H290.283C290.549 263.52 290.789 262.707 291.003 261.88C291.243 261.053 291.496 260.267 291.763 259.52L295.883 247.92H302.283V274H296.923V264.44C296.923 263.587 296.963 262.64 297.043 261.6C297.149 260.533 297.256 259.467 297.363 258.4C297.496 257.333 297.603 256.387 297.683 255.56H297.523L295.403 261.76L291.683 271.72H288.443L284.723 261.76L282.643 255.56H282.483C282.589 256.387 282.696 257.333 282.803 258.4C282.909 259.467 283.003 260.533 283.083 261.6C283.189 262.64 283.243 263.587 283.243 264.44V274H277.963ZM316.472 274.48C314.792 274.48 313.205 274.08 311.712 273.28C310.245 272.453 309.058 271.267 308.152 269.72C307.245 268.147 306.792 266.267 306.792 264.08C306.792 261.867 307.245 259.987 308.152 258.44C309.058 256.893 310.245 255.72 311.712 254.92C313.205 254.093 314.792 253.68 316.472 253.68C318.152 253.68 319.725 254.093 321.192 254.92C322.658 255.72 323.845 256.893 324.752 258.44C325.658 259.987 326.112 261.867 326.112 264.08C326.112 266.267 325.658 268.147 324.752 269.72C323.845 271.267 322.658 272.453 321.192 273.28C319.725 274.08 318.152 274.48 316.472 274.48ZM316.472 269.72C317.672 269.72 318.578 269.213 319.192 268.2C319.805 267.16 320.112 265.787 320.112 264.08C320.112 262.347 319.805 260.973 319.192 259.96C318.578 258.947 317.672 258.44 316.472 258.44C315.245 258.44 314.325 258.947 313.712 259.96C313.125 260.973 312.832 262.347 312.832 264.08C312.832 265.787 313.125 267.16 313.712 268.2C314.325 269.213 315.245 269.72 316.472 269.72ZM337.219 274.48C334.766 274.48 332.792 273.56 331.299 271.72C329.832 269.853 329.099 267.307 329.099 264.08C329.099 261.92 329.486 260.067 330.259 258.52C331.059 256.947 332.086 255.747 333.339 254.92C334.619 254.093 335.952 253.68 337.339 253.68C338.432 253.68 339.352 253.867 340.099 254.24C340.846 254.613 341.552 255.12 342.219 255.76L341.979 252.72V245.96H347.859V274H343.059L342.659 272.04H342.499C341.806 272.733 340.992 273.32 340.059 273.8C339.126 274.253 338.179 274.48 337.219 274.48ZM338.739 269.68C339.379 269.68 339.952 269.547 340.459 269.28C340.992 269.013 341.499 268.547 341.979 267.88V259.76C341.472 259.28 340.926 258.947 340.339 258.76C339.779 258.573 339.232 258.48 338.699 258.48C337.766 258.48 336.939 258.933 336.219 259.84C335.499 260.72 335.139 262.107 335.139 264C335.139 265.947 335.446 267.387 336.059 268.32C336.699 269.227 337.592 269.68 338.739 269.68ZM361.949 274.48C360.055 274.48 358.349 274.067 356.829 273.24C355.309 272.413 354.109 271.227 353.229 269.68C352.349 268.133 351.909 266.267 351.909 264.08C351.909 261.92 352.349 260.067 353.229 258.52C354.135 256.973 355.309 255.787 356.749 254.96C358.189 254.107 359.695 253.68 361.269 253.68C363.162 253.68 364.722 254.107 365.949 254.96C367.202 255.787 368.135 256.92 368.749 258.36C369.389 259.773 369.709 261.387 369.709 263.2C369.709 263.707 369.682 264.213 369.629 264.72C369.575 265.2 369.522 265.56 369.469 265.8H357.589C357.855 267.24 358.455 268.307 359.389 269C360.322 269.667 361.442 270 362.749 270C364.162 270 365.589 269.56 367.029 268.68L368.989 272.24C367.975 272.933 366.842 273.48 365.589 273.88C364.335 274.28 363.122 274.48 361.949 274.48ZM357.549 261.92H364.709C364.709 260.827 364.442 259.933 363.909 259.24C363.402 258.52 362.562 258.16 361.389 258.16C360.482 258.16 359.669 258.48 358.949 259.12C358.229 259.733 357.762 260.667 357.549 261.92ZM379.172 274.48C377.145 274.48 375.732 273.88 374.932 272.68C374.159 271.453 373.772 269.84 373.772 267.84V245.96H379.652V268.08C379.652 268.693 379.759 269.12 379.972 269.36C380.212 269.6 380.452 269.72 380.692 269.72C380.825 269.72 380.932 269.72 381.012 269.72C381.119 269.693 381.252 269.667 381.412 269.64L382.132 274C381.812 274.133 381.399 274.24 380.892 274.32C380.412 274.427 379.839 274.48 379.172 274.48Z" fill="#FA5A28"/> +<path d="M146.96 584.48C144.773 584.48 142.76 583.973 140.92 582.96C139.08 581.947 137.6 580.453 136.48 578.48C135.387 576.48 134.84 574.027 134.84 571.12C134.84 568.24 135.4 565.787 136.52 563.76C137.667 561.707 139.173 560.147 141.04 559.08C142.933 557.987 144.973 557.44 147.16 557.44C148.84 557.44 150.347 557.787 151.68 558.48C153.013 559.147 154.12 559.933 155 560.84L151.88 564.6C151.213 563.987 150.507 563.493 149.76 563.12C149.04 562.72 148.213 562.52 147.28 562.52C146.107 562.52 145.027 562.853 144.04 563.52C143.08 564.187 142.307 565.147 141.72 566.4C141.16 567.653 140.88 569.16 140.88 570.92C140.88 573.587 141.453 575.667 142.6 577.16C143.747 578.653 145.28 579.4 147.2 579.4C148.267 579.4 149.213 579.16 150.04 578.68C150.893 578.2 151.64 577.627 152.28 576.96L155.4 580.64C153.213 583.2 150.4 584.48 146.96 584.48ZM167.401 584.48C165.721 584.48 164.135 584.08 162.641 583.28C161.175 582.453 159.988 581.267 159.081 579.72C158.175 578.147 157.721 576.267 157.721 574.08C157.721 571.867 158.175 569.987 159.081 568.44C159.988 566.893 161.175 565.72 162.641 564.92C164.135 564.093 165.721 563.68 167.401 563.68C169.081 563.68 170.655 564.093 172.121 564.92C173.588 565.72 174.775 566.893 175.681 568.44C176.588 569.987 177.041 571.867 177.041 574.08C177.041 576.267 176.588 578.147 175.681 579.72C174.775 581.267 173.588 582.453 172.121 583.28C170.655 584.08 169.081 584.48 167.401 584.48ZM167.401 579.72C168.601 579.72 169.508 579.213 170.121 578.2C170.735 577.16 171.041 575.787 171.041 574.08C171.041 572.347 170.735 570.973 170.121 569.96C169.508 568.947 168.601 568.44 167.401 568.44C166.175 568.44 165.255 568.947 164.641 569.96C164.055 570.973 163.761 572.347 163.761 574.08C163.761 575.787 164.055 577.16 164.641 578.2C165.255 579.213 166.175 579.72 167.401 579.72ZM181.069 584V564.16H185.869L186.269 566.68H186.429C187.282 565.88 188.215 565.187 189.229 564.6C190.269 563.987 191.455 563.68 192.789 563.68C194.949 563.68 196.509 564.4 197.469 565.84C198.455 567.253 198.949 569.2 198.949 571.68V584H193.069V572.44C193.069 571 192.869 570.013 192.469 569.48C192.095 568.947 191.482 568.68 190.629 568.68C189.882 568.68 189.242 568.853 188.709 569.2C188.175 569.52 187.589 569.987 186.949 570.6V584H181.069ZM211.599 584.48C209.146 584.48 207.386 583.773 206.319 582.36C205.279 580.947 204.759 579.093 204.759 576.8V568.76H202.039V564.4L205.079 564.16L205.759 558.88H210.639V564.16H215.399V568.76H210.639V576.72C210.639 577.84 210.866 578.653 211.319 579.16C211.799 579.64 212.426 579.88 213.199 579.88C213.519 579.88 213.839 579.84 214.159 579.76C214.506 579.68 214.813 579.587 215.079 579.48L215.999 583.76C215.493 583.92 214.866 584.08 214.119 584.24C213.399 584.4 212.559 584.48 211.599 584.48ZM227.449 584.48C225.555 584.48 223.849 584.067 222.329 583.24C220.809 582.413 219.609 581.227 218.729 579.68C217.849 578.133 217.409 576.267 217.409 574.08C217.409 571.92 217.849 570.067 218.729 568.52C219.635 566.973 220.809 565.787 222.249 564.96C223.689 564.107 225.195 563.68 226.769 563.68C228.662 563.68 230.222 564.107 231.449 564.96C232.702 565.787 233.635 566.92 234.249 568.36C234.889 569.773 235.209 571.387 235.209 573.2C235.209 573.707 235.182 574.213 235.129 574.72C235.075 575.2 235.022 575.56 234.969 575.8H223.089C223.355 577.24 223.955 578.307 224.889 579C225.822 579.667 226.942 580 228.249 580C229.662 580 231.089 579.56 232.529 578.68L234.489 582.24C233.475 582.933 232.342 583.48 231.089 583.88C229.835 584.28 228.622 584.48 227.449 584.48ZM223.049 571.92H230.209C230.209 570.827 229.942 569.933 229.409 569.24C228.902 568.52 228.062 568.16 226.889 568.16C225.982 568.16 225.169 568.48 224.449 569.12C223.729 569.733 223.262 570.667 223.049 571.92ZM239.272 584V564.16H244.072L244.472 566.68H244.632C245.485 565.88 246.419 565.187 247.432 564.6C248.472 563.987 249.659 563.68 250.992 563.68C253.152 563.68 254.712 564.4 255.672 565.84C256.659 567.253 257.152 569.2 257.152 571.68V584H251.272V572.44C251.272 571 251.072 570.013 250.672 569.48C250.299 568.947 249.685 568.68 248.832 568.68C248.085 568.68 247.445 568.853 246.912 569.2C246.379 569.52 245.792 569.987 245.152 570.6V584H239.272ZM269.803 584.48C267.349 584.48 265.589 583.773 264.523 582.36C263.483 580.947 262.963 579.093 262.963 576.8V568.76H260.243V564.4L263.283 564.16L263.963 558.88H268.843V564.16H273.603V568.76H268.843V576.72C268.843 577.84 269.069 578.653 269.523 579.16C270.003 579.64 270.629 579.88 271.403 579.88C271.723 579.88 272.043 579.84 272.363 579.76C272.709 579.68 273.016 579.587 273.283 579.48L274.203 583.76C273.696 583.92 273.069 584.08 272.323 584.24C271.603 584.4 270.763 584.48 269.803 584.48ZM285.963 584V557.92H302.403V562.88H291.843V568.92H300.883V573.88H291.843V584H285.963ZM306.459 584V564.16H312.339V584H306.459ZM309.379 561.24C308.393 561.24 307.593 560.96 306.979 560.4C306.366 559.84 306.059 559.093 306.059 558.16C306.059 557.227 306.366 556.48 306.979 555.92C307.593 555.36 308.393 555.08 309.379 555.08C310.366 555.08 311.166 555.36 311.779 555.92C312.393 556.48 312.699 557.227 312.699 558.16C312.699 559.093 312.393 559.84 311.779 560.4C311.166 560.96 310.366 561.24 309.379 561.24ZM326.394 584.48C324.501 584.48 322.794 584.067 321.274 583.24C319.754 582.413 318.554 581.227 317.674 579.68C316.794 578.133 316.354 576.267 316.354 574.08C316.354 571.92 316.794 570.067 317.674 568.52C318.581 566.973 319.754 565.787 321.194 564.96C322.634 564.107 324.141 563.68 325.714 563.68C327.607 563.68 329.167 564.107 330.394 564.96C331.647 565.787 332.581 566.92 333.194 568.36C333.834 569.773 334.154 571.387 334.154 573.2C334.154 573.707 334.127 574.213 334.074 574.72C334.021 575.2 333.967 575.56 333.914 575.8H322.034C322.301 577.24 322.901 578.307 323.834 579C324.767 579.667 325.887 580 327.194 580C328.607 580 330.034 579.56 331.474 578.68L333.434 582.24C332.421 582.933 331.287 583.48 330.034 583.88C328.781 584.28 327.567 584.48 326.394 584.48ZM321.994 571.92H329.154C329.154 570.827 328.887 569.933 328.354 569.24C327.847 568.52 327.007 568.16 325.834 568.16C324.927 568.16 324.114 568.48 323.394 569.12C322.674 569.733 322.207 570.667 321.994 571.92ZM343.617 584.48C341.591 584.48 340.177 583.88 339.377 582.68C338.604 581.453 338.217 579.84 338.217 577.84V555.96H344.097V578.08C344.097 578.693 344.204 579.12 344.417 579.36C344.657 579.6 344.897 579.72 345.137 579.72C345.271 579.72 345.377 579.72 345.457 579.72C345.564 579.693 345.697 579.667 345.857 579.64L346.577 584C346.257 584.133 345.844 584.24 345.337 584.32C344.857 584.427 344.284 584.48 343.617 584.48ZM356.743 584.48C354.289 584.48 352.316 583.56 350.823 581.72C349.356 579.853 348.623 577.307 348.623 574.08C348.623 571.92 349.009 570.067 349.783 568.52C350.583 566.947 351.609 565.747 352.863 564.92C354.143 564.093 355.476 563.68 356.863 563.68C357.956 563.68 358.876 563.867 359.623 564.24C360.369 564.613 361.076 565.12 361.743 565.76L361.503 562.72V555.96H367.383V584H362.583L362.183 582.04H362.023C361.329 582.733 360.516 583.32 359.583 583.8C358.649 584.253 357.703 584.48 356.743 584.48ZM358.263 579.68C358.903 579.68 359.476 579.547 359.983 579.28C360.516 579.013 361.023 578.547 361.503 577.88V569.76C360.996 569.28 360.449 568.947 359.863 568.76C359.303 568.573 358.756 568.48 358.223 568.48C357.289 568.48 356.463 568.933 355.743 569.84C355.023 570.72 354.663 572.107 354.663 574C354.663 575.947 354.969 577.387 355.583 578.32C356.223 579.227 357.116 579.68 358.263 579.68ZM378.432 584.48C377.126 584.48 375.779 584.227 374.392 583.72C373.032 583.213 371.846 582.547 370.832 581.72L373.472 578.04C374.379 578.707 375.246 579.227 376.072 579.6C376.926 579.947 377.766 580.12 378.592 580.12C379.472 580.12 380.112 579.973 380.512 579.68C380.912 579.36 381.112 578.947 381.112 578.44C381.112 577.987 380.912 577.613 380.512 577.32C380.139 577.027 379.646 576.76 379.032 576.52C378.419 576.253 377.766 575.987 377.072 575.72C376.272 575.4 375.472 575 374.672 574.52C373.899 574.04 373.246 573.427 372.712 572.68C372.179 571.907 371.912 570.973 371.912 569.88C371.912 568.04 372.606 566.547 373.992 565.4C375.406 564.253 377.246 563.68 379.512 563.68C381.032 563.68 382.366 563.947 383.512 564.48C384.686 564.987 385.686 565.56 386.512 566.2L383.872 569.72C383.179 569.187 382.486 568.773 381.792 568.48C381.099 568.187 380.406 568.04 379.712 568.04C378.192 568.04 377.432 568.56 377.432 569.6C377.432 570.24 377.806 570.733 378.552 571.08C379.326 571.4 380.219 571.747 381.232 572.12C382.086 572.413 382.912 572.8 383.712 573.28C384.539 573.733 385.219 574.347 385.752 575.12C386.312 575.867 386.592 576.853 386.592 578.08C386.592 579.867 385.899 581.387 384.512 582.64C383.126 583.867 381.099 584.48 378.432 584.48Z" fill="#7B39D9"/> +<path d="M1565.08 609V582.92H1581.52V587.88H1570.96V593.92H1580V598.88H1570.96V609H1565.08ZM1585.58 609V589.16H1591.46V609H1585.58ZM1588.5 586.24C1587.51 586.24 1586.71 585.96 1586.1 585.4C1585.48 584.84 1585.18 584.093 1585.18 583.16C1585.18 582.227 1585.48 581.48 1586.1 580.92C1586.71 580.36 1587.51 580.08 1588.5 580.08C1589.48 580.08 1590.28 580.36 1590.9 580.92C1591.51 581.48 1591.82 582.227 1591.82 583.16C1591.82 584.093 1591.51 584.84 1590.9 585.4C1590.28 585.96 1589.48 586.24 1588.5 586.24ZM1605.51 609.48C1603.62 609.48 1601.91 609.067 1600.39 608.24C1598.87 607.413 1597.67 606.227 1596.79 604.68C1595.91 603.133 1595.47 601.267 1595.47 599.08C1595.47 596.92 1595.91 595.067 1596.79 593.52C1597.7 591.973 1598.87 590.787 1600.31 589.96C1601.75 589.107 1603.26 588.68 1604.83 588.68C1606.72 588.68 1608.28 589.107 1609.51 589.96C1610.76 590.787 1611.7 591.92 1612.31 593.36C1612.95 594.773 1613.27 596.387 1613.27 598.2C1613.27 598.707 1613.24 599.213 1613.19 599.72C1613.14 600.2 1613.08 600.56 1613.03 600.8H1601.15C1601.42 602.24 1602.02 603.307 1602.95 604C1603.88 604.667 1605 605 1606.31 605C1607.72 605 1609.15 604.56 1610.59 603.68L1612.55 607.24C1611.54 607.933 1610.4 608.48 1609.15 608.88C1607.9 609.28 1606.68 609.48 1605.51 609.48ZM1601.11 596.92H1608.27C1608.27 595.827 1608 594.933 1607.47 594.24C1606.96 593.52 1606.12 593.16 1604.95 593.16C1604.04 593.16 1603.23 593.48 1602.51 594.12C1601.79 594.733 1601.32 595.667 1601.11 596.92ZM1622.73 609.48C1620.71 609.48 1619.29 608.88 1618.49 607.68C1617.72 606.453 1617.33 604.84 1617.33 602.84V580.96H1623.21V603.08C1623.21 603.693 1623.32 604.12 1623.53 604.36C1623.77 604.6 1624.01 604.72 1624.25 604.72C1624.39 604.72 1624.49 604.72 1624.57 604.72C1624.68 604.693 1624.81 604.667 1624.97 604.64L1625.69 609C1625.37 609.133 1624.96 609.24 1624.45 609.32C1623.97 609.427 1623.4 609.48 1622.73 609.48ZM1635.86 609.48C1633.41 609.48 1631.43 608.56 1629.94 606.72C1628.47 604.853 1627.74 602.307 1627.74 599.08C1627.74 596.92 1628.13 595.067 1628.9 593.52C1629.7 591.947 1630.73 590.747 1631.98 589.92C1633.26 589.093 1634.59 588.68 1635.98 588.68C1637.07 588.68 1637.99 588.867 1638.74 589.24C1639.49 589.613 1640.19 590.12 1640.86 590.76L1640.62 587.72V580.96H1646.5V609H1641.7L1641.3 607.04H1641.14C1640.45 607.733 1639.63 608.32 1638.7 608.8C1637.77 609.253 1636.82 609.48 1635.86 609.48ZM1637.38 604.68C1638.02 604.68 1638.59 604.547 1639.1 604.28C1639.63 604.013 1640.14 603.547 1640.62 602.88V594.76C1640.11 594.28 1639.57 593.947 1638.98 593.76C1638.42 593.573 1637.87 593.48 1637.34 593.48C1636.41 593.48 1635.58 593.933 1634.86 594.84C1634.14 595.72 1633.78 597.107 1633.78 599C1633.78 600.947 1634.09 602.387 1634.7 603.32C1635.34 604.227 1636.23 604.68 1637.38 604.68ZM1665.28 609V587.88H1658.12V582.92H1678.36V587.88H1671.2V609H1665.28ZM1683.17 616.76C1682.58 616.76 1682.06 616.72 1681.61 616.64C1681.18 616.56 1680.77 616.467 1680.37 616.36L1681.41 611.88C1681.59 611.907 1681.81 611.947 1682.05 612C1682.29 612.08 1682.51 612.12 1682.73 612.12C1683.71 612.12 1684.47 611.88 1685.01 611.4C1685.54 610.92 1685.94 610.293 1686.21 609.52L1686.49 608.48L1678.85 589.16H1684.77L1687.61 597.68C1687.9 598.587 1688.17 599.507 1688.41 600.44C1688.65 601.373 1688.9 602.333 1689.17 603.32H1689.33C1689.54 602.387 1689.75 601.453 1689.97 600.52C1690.21 599.56 1690.45 598.613 1690.69 597.68L1693.09 589.16H1698.73L1691.85 609.2C1691.23 610.853 1690.55 612.24 1689.81 613.36C1689.06 614.507 1688.15 615.36 1687.09 615.92C1686.05 616.48 1684.74 616.76 1683.17 616.76ZM1701.83 616.36V589.16H1706.63L1707.03 591.12H1707.19C1707.96 590.427 1708.83 589.853 1709.79 589.4C1710.77 588.92 1711.79 588.68 1712.83 588.68C1715.23 588.68 1717.12 589.6 1718.51 591.44C1719.89 593.253 1720.59 595.693 1720.59 598.76C1720.59 601.027 1720.19 602.96 1719.39 604.56C1718.59 606.16 1717.55 607.387 1716.27 608.24C1715.01 609.067 1713.67 609.48 1712.23 609.48C1711.37 609.48 1710.55 609.307 1709.75 608.96C1708.95 608.587 1708.2 608.067 1707.51 607.4L1707.71 610.56V616.36H1701.83ZM1710.87 604.68C1711.88 604.68 1712.75 604.213 1713.47 603.28C1714.19 602.347 1714.55 600.867 1714.55 598.84C1714.55 595.267 1713.4 593.48 1711.11 593.48C1709.96 593.48 1708.83 594.08 1707.71 595.28V603.4C1708.24 603.88 1708.77 604.213 1709.31 604.4C1709.84 604.587 1710.36 604.68 1710.87 604.68ZM1733.64 609.48C1731.74 609.48 1730.04 609.067 1728.52 608.24C1727 607.413 1725.8 606.227 1724.92 604.68C1724.04 603.133 1723.6 601.267 1723.6 599.08C1723.6 596.92 1724.04 595.067 1724.92 593.52C1725.82 591.973 1727 590.787 1728.44 589.96C1729.88 589.107 1731.38 588.68 1732.96 588.68C1734.85 588.68 1736.41 589.107 1737.64 589.96C1738.89 590.787 1739.82 591.92 1740.44 593.36C1741.08 594.773 1741.4 596.387 1741.4 598.2C1741.4 598.707 1741.37 599.213 1741.32 599.72C1741.26 600.2 1741.21 600.56 1741.16 600.8H1729.28C1729.54 602.24 1730.14 603.307 1731.08 604C1732.01 604.667 1733.13 605 1734.44 605C1735.85 605 1737.28 604.56 1738.72 603.68L1740.68 607.24C1739.66 607.933 1738.53 608.48 1737.28 608.88C1736.02 609.28 1734.81 609.48 1733.64 609.48ZM1729.24 596.92H1736.4C1736.4 595.827 1736.13 594.933 1735.6 594.24C1735.09 593.52 1734.25 593.16 1733.08 593.16C1732.17 593.16 1731.36 593.48 1730.64 594.12C1729.92 594.733 1729.45 595.667 1729.24 596.92Z" fill="#00CCB0"/> +<path d="M118 262H392V281H118V262Z" fill="#FA6400" fill-opacity="0.2"/> +<path d="M124 572H398V591H124V572Z" fill="#FA6400" fill-opacity="0.2"/> +<path opacity="0.8" d="M1557 598H1751V615H1557V598Z" fill="#FA6400" fill-opacity="0.15"/> +</g> +<defs> +<filter id="filter0_f_1302_2038" x="1699.93" y="377.779" width="319.452" height="298.783" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<feFlood flood-opacity="0" result="BackgroundImageFix"/> +<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/> +<feGaussianBlur stdDeviation="10" result="effect1_foregroundBlur_1302_2038"/> +</filter> +<filter id="filter1_d_1302_2038" x="691" y="175" width="717" height="758" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<feFlood flood-opacity="0" result="BackgroundImageFix"/> +<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/> +<feOffset/> +<feGaussianBlur stdDeviation="13"/> +<feComposite in2="hardAlpha" operator="out"/> +<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0"/> +<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1302_2038"/> +<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1302_2038" result="shape"/> +</filter> +<filter id="filter2_d_1302_2038" x="853.41" y="515.553" width="394.884" height="115.417" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<feFlood flood-opacity="0" result="BackgroundImageFix"/> +<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/> +<feOffset dx="2" dy="2"/> +<feGaussianBlur stdDeviation="2"/> +<feComposite in2="hardAlpha" operator="out"/> +<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/> +<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1302_2038"/> +<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1302_2038" result="shape"/> +</filter> +<filter id="filter3_d_1302_2038" x="859.791" y="338.174" width="394.884" height="115.417" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<feFlood flood-opacity="0" result="BackgroundImageFix"/> +<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/> +<feOffset dx="2" dy="2"/> +<feGaussianBlur stdDeviation="2"/> +<feComposite in2="hardAlpha" operator="out"/> +<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/> +<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1302_2038"/> +<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1302_2038" result="shape"/> +</filter> +<filter id="filter4_d_1302_2038" x="854.686" y="701.006" width="394.884" height="115.417" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> +<feFlood flood-opacity="0" result="BackgroundImageFix"/> +<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/> +<feOffset dx="2" dy="2"/> +<feGaussianBlur stdDeviation="2"/> +<feComposite in2="hardAlpha" operator="out"/> +<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/> +<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1302_2038"/> +<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1302_2038" result="shape"/> +</filter> +<clipPath id="clip0_1302_2038"> +<rect width="1920" height="1080" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/assets/glossary/product-content-entries.png b/docs/user-guides/6.0.x/headless-cms/essentials/assets/glossary/product-content-entries.png new file mode 100644 index 000000000..76f06927f Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/essentials/assets/glossary/product-content-entries.png differ diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/assets/glossary/product-content-model.png b/docs/user-guides/6.0.x/headless-cms/essentials/assets/glossary/product-content-model.png new file mode 100644 index 000000000..f650be8ad Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/essentials/assets/glossary/product-content-model.png differ diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/assets/manage-content-model-settings/manage-content-model-settings.mp4 b/docs/user-guides/6.0.x/headless-cms/essentials/assets/manage-content-model-settings/manage-content-model-settings.mp4 new file mode 100644 index 000000000..c5ea82fdb Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/essentials/assets/manage-content-model-settings/manage-content-model-settings.mp4 differ diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/assets/reference-field/reference-field.mp4 b/docs/user-guides/6.0.x/headless-cms/essentials/assets/reference-field/reference-field.mp4 new file mode 100644 index 000000000..cec2bbb55 Binary files /dev/null and b/docs/user-guides/6.0.x/headless-cms/essentials/assets/reference-field/reference-field.mp4 differ diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/clone-content-model.mdx b/docs/user-guides/6.0.x/headless-cms/essentials/clone-content-model.mdx new file mode 100644 index 000000000..6277ab5ea --- /dev/null +++ b/docs/user-guides/6.0.x/headless-cms/essentials/clone-content-model.mdx @@ -0,0 +1,61 @@ +--- +id: +title: Clone Content Model +description: Learn how to clone a content model in Headless CMS. +--- + +import { Alert } from "@/components/Alert"; +import cloneContentModel from "./assets/clone-content-model/clone-content-model.mp4"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- how to clone a content model + +</Alert> + +Webiny allows you to create a new content model by cloning an existing content model. All the fields, validations, and other settings are copied over from the original content model to the clone content model. + +In this tutorial, we will learn how to clone a content model. As an example, we will create a content model with the following attributes by cloning an existing content model: + +| Attribute | Value | +| :---------- | :------------------------------------------------------------ | +| Name | **Virtual Product** | +| Group | **E-Commerce** | +| Description | **Demo Virtual Product Content Model for E-Commerce project** | + +<Video src={cloneContentModel} controls={true} /> + +## Prerequisites + +To follow this tutorial, you need the **Product** content model to clone it. +If you don't have the **Product** content model, please follow the [Create Content Model](/docs/{version}/user-guides/headless-cms/essentials/create-content-model) tutorial to create it. + +## Clone Content Model + +1. From the **Side Menu**, Click **Content Modeling** > **Models**. + + ✔️ The **Content Models** screen opens. + +2. Click the **Kebab Menu Icon** ( ⁝ ) on the **Product** content model. + + ✔️ Menu opens with **Clone**, **Export**, and **Delete** options. + +3. Click **Clone**. + + ✔️ The **Clone Content Model** screen opens. + +4. In the **Name** textbox, type **Virtual Product**. + +5. In the **Singular API Name** textbox, type **VirtualProduct**. + +6. In the **Plural API Name** textbox, type **VirtualProducts**. + +7. In the **Content model group** drop-down, if you have the **E-Commerce** group, click it, else click **Ungrouped**. + +8. In the **Icon** dropdown, click **globe** icon (🌐). + +9. In the **Description** textbox, type **Demo Virtual Product Content Model for E-Commerce project**. + +10. Click **+ Clone**. + + ✔️ **Virtual Product** content model is created. diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/content-entry-revisions.mdx b/docs/user-guides/6.0.x/headless-cms/essentials/content-entry-revisions.mdx new file mode 100644 index 000000000..eaaefced3 --- /dev/null +++ b/docs/user-guides/6.0.x/headless-cms/essentials/content-entry-revisions.mdx @@ -0,0 +1,114 @@ +--- +id: +title: Content Entry Revisions +description: Learn how to publish a specific version of a content entry, and create a new version of a content entry by deriving from a previous revision. +--- + +import { Alert } from "@/components/Alert"; +import contentEntryRevision from "./assets/content-entry-revisions/content-entry-revisions.mp4"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- how to create multiple revisions of a content entry and publish a specific one +- how to create a new content entry version from a previous revision + +</Alert> + +In Webiny, each modification in a content entry that is saved or published is stored as a separate revision. +In this tutorial, we will learn how to create multiple revisions of a content entry and publish a specific revision. +We will also learn how to create a new content entry version from a previous revision. +As an example, we will use the **Product** content model that we created in the [Create Content Model](/docs/{version}/user-guides/headless-cms/essentials/create-content-model) tutorial. + +<Video src={contentEntryRevision} controls={true} /> + +We will do this in 3 steps: + +- Step 1: Create a content entry in the **Product** content model and make multiple revisions. +- Step 2: Publish a previous revision of the content entry. +- Step 3: Create a new content entry version from a previous revision. + +## Step 1: Create a Content Entry and Its Revisions + +If you are not familiar with how to create a content entry, please follow the [Create Content Entry](/docs/{version}/user-guides/headless-cms/essentials/create-content-entry) tutorial. + +1. Create a content entry in the **Product** content model with the following attributes: + + | Field | Value | + | :---------- | :---------------------------------------------------------------- | + | Name | **Men's Blue T-Shirt** | + | Description | **Half Sleeved, Regular fit, Cotton blend, Blue T-shirt for Men** | + | Price | **15** | + | Category | **Clothes** | + + **Note**: If you haven't added the **Category** field to the **Product** content model, skip it (or add it by following the [Reference Field](/docs/{version}/user-guides/headless-cms/essentials/reference-field) tutorial). + +2. Now, update the **Name** and **Description** textboxes with the following values: + + | Field | Value | + | :---------- | :----------------------------------------------------------------------- | + | Name | **Men's Solid Blue T-Shirt** | + | Description | **Half Sleeved, Regular fit, Cotton blend, Solid, Blue T-shirt for Men** | + +3. Click **SAVE & PUBLISH**. + + **Note**: Clicking **SAVE** will create a new version of the content entry with updated field values and save it as a draft. + Whereas clicking **SAVE & PUBLISH** will create a new version and publish it. + +4. Create another revision by updating the **Name** and **Description** textboxes with the following values: + + | Field | Value | + | :---------- | :----------------------------------------------------------------------------------- | + | Name | **Men's Solid Round Neck Blue T-Shirt** | + | Description | **Round Neck, Half Sleeved, Regular fit, Cotton blend, Solid, Blue T-shirt for Men** | + +5. Click **SAVE & PUBLISH**. + +## Step 2: Publish a Previous Revision + +1. In the **Men’s Round Neck Solid Blue T-Shirt** content entry, click the **Kebab Menu Icon** ( ⁝ ). + + ✔️ Menu opens with **Trash Entry**, **Schedule unpublish**, and **Show entry revisions** options. + +2. Click **Show entry revisions**. + + ✔️ The **Entry revisions** section opens. + +3. To publish the previous **Men’s Solid Blue T-Shirt** revision, click the **Kebab Menu Icon** on it ( ⁝ ). + + ✔️ Menu opens with **New revision from current** and **Publish revision** options. + +4. Click **Publish revision**. + + ✔️ The **Publish Product** confirmation screen appears. + +5. Click **Yes, publish!** + + ✔️ The **Men’s Solid Blue T-Shirt** revision gets published. + +## Step 3: Create a new content entry version from a previous revision + +1. In the **Men’s Solid Blue T-Shirt** content entry, click the **Kebab Menu Icon** ( ⁝ ) + + ✔️ Menu opens with **Trash Entry**, **Schedule unpublish**, and **Show entry revisions** options. + +2. Click **Show entry revisions**. + + ✔️ The **Entry revisions** section opens. + +3. To create a new entry version from the previous **Men’s Blue T-Shirt** revision, click the **Kebab Menu Icon** on it ( ⁝ ). + + ✔️ Menu opens with **New revision from current** and **Publish revision** options. + +4. Click **New revision from current**. + + ✔️ A new draft of the previous **Men’s Blue T-Shirt** revision gets created. + + **Optional**: Make the desired change(s) in the respective field(s). + +5. Click **Save & Publish**. + + ✔️ The **Publish Product** confirmation screen appears. + +6. Click **Yes, publish!** + + ✔️ A new content entry revision of the **Men’s Solid Blue T-Shirt** entry gets published. diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/create-content-entry.mdx b/docs/user-guides/6.0.x/headless-cms/essentials/create-content-entry.mdx new file mode 100644 index 000000000..65194358f --- /dev/null +++ b/docs/user-guides/6.0.x/headless-cms/essentials/create-content-entry.mdx @@ -0,0 +1,68 @@ +--- +id: +title: Create Content Entry +description: Learn how to create a content entry in Headless CMS. +--- + +import { Alert } from "@/components/Alert"; +import createContentEntry from "./assets/create-content-entry/create-content-entry.mp4"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- how to create a content Entry + +</Alert> + +In the previous tutorial, we learned how to create a [content model](/docs/{version}/user-guides/headless-cms/essentials/create-content-model), and +in this tutorial, we will explore how to create a [content entry](/docs/{version}/user-guides/headless-cms/essentials/glossary#content-entry). +As an example, we will create a **Product** content entry with the following attributes: + +| Field | Value | +| :---------- | :--------------------------------------------- | +| Name | Relaxed Sweatshirt | +| Description | Top sweatshirt fabric made from a cotton blend | +| Price | 10 | + +## Prerequisites + +To create a content entry, the prerequisite is to have a content model. +If you don't have any content model yet, please follow this [tutorial](/docs/{version}/user-guides/headless-cms/essentials/create-content-model) to create a content model. + +<Video src={createContentEntry} controls={true} /> + +## Create Content Entry + +1. From the **Side Menu**, Click **Content** > **Ungrouped** > **Product**. + + ✔️ The **Product** content ****entry screen opens. + OR + From the **Side Menu**, Click **Content Modeling** > **Models**. + + ✔️ The **Content Models** screen opens. + + 1. Hover over the **Product** content model. + 2. Click **View entries**. +2. Click **+ New Product**. + + ✔️ The **New Product** entry screen opens. + +3. In the **Name** textbox, type **Relaxed Sweatshirt**. +4. In the **Description** textbox, type **Top sweatshirt fabric made from a cotton blend**. +5. In the **Price** textbox, type **10**. +6. Click **Save & Publish**. + + ✔️ The **Publish Product** confirmation screen appears. + +7. Click **Yes, publish!** + + ✔️ The message “Relaxed Sweatshirt was published successfully!” displays. + + +Congratulations! You have created your first content entry. + +## Additional Information + +### Content Revision + +Every time you save any content entry, a new revision is created. You can see all the content revisions in the **REVISONS** tab. +![Content Entry Revision](./assets/create-content-entry/content-entry-revision.png) diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/create-content-model-group.mdx b/docs/user-guides/6.0.x/headless-cms/essentials/create-content-model-group.mdx new file mode 100644 index 000000000..55dbeb938 --- /dev/null +++ b/docs/user-guides/6.0.x/headless-cms/essentials/create-content-model-group.mdx @@ -0,0 +1,52 @@ +--- +id: +title: Create Content Model Group +description: Learn how to create a content model group in Headless CMS. +--- + +import { Alert } from "@/components/Alert"; +import createContentModelGroup from "./assets/create-content-model-group/create-content-model-group.mp4"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- what is content model group and it's uses +- how to create a content model group + +</Alert> + +Content model groups help in organizing content models. With groups, you can organize your models efficiently. +For example, all the content models related to E-Commerce can be grouped together, +and they will be shown in the side navigation bar under the E-Commerce heading. There are two main uses of +the content model group. + +- Organization of content models +- Restrict the content models access scope based on the content model group + +In this tutorial, we will learn how to create a content model group. +As an example, we will create a E-Commerce content group with the following values: + +| Attribute | Value | +| :---------- | :--------------------- | +| Name | E-Commerce | +| Group icon | 🛒 | +| Description | E-Commerce Model Group | + +<Video src={createContentModelGroup} controls={true} /> + +1. From the **Side Menu**, Click **Content Modeling** > **Groups**. + + ✔️ The **Content model groups** screen opens. + +2. Click **+ New**. + + ✔️ The **New content model group** section opens. + +3. In the **Name** textbox, type **E-Commerce**. +4. In the **Slug** textbox, type **e-commerce**. +5. In the **Group icon** dropdown, click the **shopping-cart** icon (🛒). +6. In the **Description** textbox, type **E-Commerce Model Group**. +7. Click **Save**. + + ✔️ The message “Content model group saved successfully!” displays. + +8. Congratulations! You have created your first content model group. diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/create-content-model.mdx b/docs/user-guides/6.0.x/headless-cms/essentials/create-content-model.mdx new file mode 100644 index 000000000..538f5d4ab --- /dev/null +++ b/docs/user-guides/6.0.x/headless-cms/essentials/create-content-model.mdx @@ -0,0 +1,82 @@ +--- +id: +title: Create Content Model +description: Learn how to create a content model in Headless CMS. +--- + +import { Alert } from "@/components/Alert"; +import createContent from "./assets/create-content-model/create-content-model.mp4"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- how to create a content model +- how to define content model's fields + +</Alert> + +In this tutorial, we will learn how to create a [content model](/docs/{version}/user-guides/headless-cms/essentials/glossary#content-model). +As an example, we will create a Product content model with the following fields: + +| Field | Field Type | +| :---------- | :--------- | +| Name | Text | +| Description | Long text | +| Price | Number | + +Content model creation is a two-step process: in step 1, we will create the model, and in step 2, +we will define model [fields](/docs/{version}/user-guides/headless-cms/essentials/glossary#field-field-type). + +<Video src={createContent} controls={true} /> + +## Step 1: Create Content Model + +1. From the **Side Menu**, Click **Content Modeling** > **Models**. + + ✔️ The **Content Models** screen opens. + +2. Click **+ New**. + + ✔️ The **New Content Model** screen opens. + +3. In the **Name** textbox, type **Product**. +4. In the **Singular API Name** textbox, type **Product**. +5. In the **Plural API Name** textbox, type **Products**. +6. In the **Content model group** drop-down, if you have already created a group, click that group, else click **Ungrouped**. +7. In the **Icon** dropdown, click the **box** icon (📦). +8. In the **Description** textbox, type **Demo Product Content Model**. +9. Unselect the **Create model with default fields** checkbox. +10. Click **+ Create Model**. + + ✔️ Screen to configure the **Product** content model’s fields opens. + +## Step 2: Define fields + +1. Drag and drop the **Text** field in the **Edit** tab. + + ✔️ **Field Settings - Text** screen opens. + +2. In the **Label** textbox, type **Name** and click **Save Field**. +3. Drag and drop the **Long Text** field in the **Edit** tab. + + ✔️ **Field Settings - Long Text** screen opens. + +4. In the **Label** textbox, type **Description** and click **Save Field**. +5. Drag and drop the **Number** field in the **Edit** tab. + + ✔️ **Field Settings - Number** screen opens. + +6. In the **Label** textbox, type **Price** and click **Save Field**. +7. Click **Save**. + + ✔️ The message “Your content model was saved successfully!” displays. + +8. Congratulations! You have created your first content model. + +## Additional Information + +### Field Validation + +You can add various validations to a field from the **VALIDATORS** tab on the **Field Settings** screen. +Depending on the field type, you can add different types of validations to your field. + +![Field Validators](./assets/create-content-model/field-validators.png) diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/glossary.mdx b/docs/user-guides/6.0.x/headless-cms/essentials/glossary.mdx new file mode 100644 index 000000000..84d9414bc --- /dev/null +++ b/docs/user-guides/6.0.x/headless-cms/essentials/glossary.mdx @@ -0,0 +1,67 @@ +--- +id: +title: Headless CMS Glossary +description: Learn about the Headless CMS terminologies. +--- + +import { Alert } from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- Headless CMS terminologies, and their meanings. + +</Alert> + +## Content Model + +The first step to storing information in a Headless CMS is to create your content model. +If you're new to the Headless CMS world, this term may be unfamiliar to you, but it's simple to understand. + +![Content Model](./assets/glossary/content-model.svg) + +Let’s understand the content model with an example. +Let’s say you want to store all the products in your shop in a CMS. As a first step, you will need to define all the +product attributes and their types. For example, a product may have the following attributes ([fields](#field-field-type)): + +- Name (Text Type) +- Description (Long Text) +- Price (Number) + +The collection of these attributes (fields) will be referred to as the "content model." +As per the example above, the Product content model will have three fields: name, description, +and price, with field types of text, long text, and number, respectively. +Below is the actual screenshot of the Webiny user interface for a content model. + +![Product Content Model (Webiny User Interface)](./assets/glossary/product-content-model.png) + +## Field / Field Type + +As mentioned in the content model section, every content model is a collection of fields, and each field has a type. +The field type defines the kind of content you want to store. Webiny supports the following field types: + +| Field Type | Description | +| :---------- | :----------------------------------------------------------------------------------------- | +| `Text` | Titles, names, single line values. | +| `Long text` | Long comments, notes, multi line values. | +| `Rich text` | Text formatting with references and media. | +| `Number` | Store numbers. | +| `Boolean` | Store boolean ("yes" or "no" ) values. | +| `Date/Time` | Store date and time. | +| `Files` | Images, videos and other files. | +| `Reference` | Reference existing content entries. For example, a book can reference one or more authors. | +| `Object` | Store nested data structures. | + +## Content Entry + +Each record that you store in the content model is a content entry. For example, a new product record +created with the following information is a content entry. + +| Field | Value | +| :---------- | :--------------------------------------------- | +| Name | Relaxed Sweatshirt | +| Description | Top sweatshirt fabric made from a cotton blend | +| Price | 10 | + +This one record is a content entry, and each content model will contain multiple content entries. + +![Content Entry](./assets/glossary/product-content-entries.png) diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/manage-content-model-settings.mdx b/docs/user-guides/6.0.x/headless-cms/essentials/manage-content-model-settings.mdx new file mode 100644 index 000000000..e5db94d1c --- /dev/null +++ b/docs/user-guides/6.0.x/headless-cms/essentials/manage-content-model-settings.mdx @@ -0,0 +1,49 @@ +--- +id: +title: Manage Content Model Settings +description: Learn how to manage content model settings in Headless CMS. +--- + +import { Alert } from "@/components/Alert"; +import modelSettings from "./assets/manage-content-model-settings/manage-content-model-settings.mp4"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- how to manage content model settings + +</Alert> + +In this tutorial, we will learn how to manage a content model general settings. +As an example, we will update the description of **Product** content model that we created in the [Create Content Model](/docs/{version}/user-guides/headless-cms/essentials/create-content-model) tutorial. + +<Video src={modelSettings} controls={true} /> + +1. From the **Side Menu**, Click **Content Modeling** > **Models**. + + ✔️ The **Content Models** screen opens. + +2. Hover over the **Product** content model. + +3. Click ✏️ **Edit**. + + ✔️ Screen to configure the **Product** content model’s fields opens. + +4. Click the **Settings** icon (⚙️). + + ✔️ The **Content model settings** screen opens. + +5. In the **General settings** section, in the **Content model description** textbox, update the text: +from **Demo Product Content Model** +to **Demo Product Content Model for E-Commerce project**. + +6. In the **Content model group** drop-down, click **E-Commerce**. + + **Note**: Similarly, you can update the **Content model name**, **Content model group**, **Icon**, and **Tags**. + +7. Click **Save**. + + ✔️ Screen to configure the **Product** content model’s fields opens with a notification “Content model settings updated successfully.” + +8. Click **Save**. + + ✔️ The message “Your content model was saved successfully!” displays. diff --git a/docs/user-guides/6.0.x/headless-cms/essentials/reference-field.mdx b/docs/user-guides/6.0.x/headless-cms/essentials/reference-field.mdx new file mode 100644 index 000000000..49a0b24a9 --- /dev/null +++ b/docs/user-guides/6.0.x/headless-cms/essentials/reference-field.mdx @@ -0,0 +1,147 @@ +--- +id: +title: Reference Field +description: Learn how to use reference field in Headless CMS. +--- + +import { Alert } from "@/components/Alert"; +import referenceField from "./assets/reference-field/reference-field.mp4"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- what is a reference field +- how to use reference field + +</Alert> + +The reference field enables users to link one content model to another. For instance, consider two content models, **Product** and **Category**. +A product may belong to multiple categories. In such a scenario, we create a reference field in the **Product** content model that refers to the **Category** model. + +In this tutorial, we will learn how to use reference field. +As an example, we will use the **Product** content model that we created in the [Create Content Model](/docs/{version}/user-guides/headless-cms/essentials/create-content-model) tutorial. +We will create another content model **Category**, and give the reference of **Category** in **Product**. +We will do this in four steps: + +- Step 1: Create a **Category** content model. +- Step 2: Add content entries to the **Category** content model. +- Step 3: Update the **Product** content model and add a category reference field to it. +- Step 4: Create a content entry in the **Product** content model with reference to the **Category** content model. + +<Video src={referenceField} controls={true} /> + +## Step 1: Create 'Category' content model + +We will create a category content model with the following attributes and fields. + +If you are not familiar with how to create a content model, please follow the [Create Content Model](/docs/{version}/user-guides/headless-cms/essentials/create-content-model) tutorial. + +1. Create a content model with the following attributes: + + | Field | Value | + | :---------- | :------------------------------------------------------------------------ | + | Name | **Category** | + | Singular API Name | **Category** | + | Plural API Name | **Categories** | + | Content model group | If you have created **E-commerce** group, select it, else select **Ungrouped** | + | Icon | **(boxes)** | + | Description | **Demo Category content model** | + +2. Add the following field to the **Category** content model: + + | Field | Field Type | + | :---- | :--------- | + | Name | Text | + +## Step 2: Create 'Category' content entries + +1. From the **Side Menu**, Click **Content Modeling** > **Models**. + + ✔️ The **Content Models** screen opens. + + 1. Hover over the **Category** content model. + 2. Click **View entries**. + +2. Click **+ New Category**. + + ✔️ The **New Category** entry screen opens. + +3. In the **Name** textbox, type **Clothes**. + +4. Click **Save & Publish**. + + ✔️ The **Publish Product** confirmation screen appears. + +5. Click **Yes, publish!** + + ✔️ The message “Clothes was published successfully!” displays. + + +**Optional**: Similarly, you can create another **Category** content entry with name **Accessories**. + +## Step 3: Update 'Product' Content Model + +1. From the **Side Menu**, Click **Content Modeling** > **Models**. + + ✔️ The **Content Models** screen opens. + +2. Hover over the **Product** content model. + +3. Click ✏️ **Edit**. + + ✔️ Screen to configure the **Product** content model’s fields opens. + +4. Drag and drop the **Reference** field in the **Edit** tab. + + ✔️ **Field Settings - Reference** screen opens. + +5. In the **Label** textbox, type **Category**. + +6. In the **Content Models** dropdown, click **Category**. + +7. Click the **Use as a list of references** button. + + **Note**: Since a product can belong to multiple categories, enabling **Use as a list of references** will allow you to associate multiple categories to a product. + +8. Click **Save Field**. + + ✔️ Screen to configure the **Product** content model’s fields opens. + +9. Click **Save**. + + ✔️ The message “Your content model was saved successfully!” displays. + +## Step 4: Create 'Product' content entry with a reference to 'Category' + +1. From the **Side Menu**, Click **Content Modeling** > **Models**. + + ✔️ The **Content Models** screen opens. + + 1. Hover over the **Product** content model. + 2. Click **View entries**. + +2. Click **+ New Product**. + + ✔️ The **New Product** entry screen opens. + +3. In the **Name** textbox, type **Men’s Tiro ‘21 Pants**. + +4. In the **Description** textbox, type **Men’s tapered track pants for versatile wear**. + +5. In the **Price** textbox, type **28**. + +6. In the **Category** field: + 1. Click **Select an existing record.** + + ✔️ The **Select an existing record** screen opens. + + 2. In the search bar, type **Clothes**. + 3. Click the **Clothes** list item. + 4. Click **Save**. + +7. Click **Save & Publish**. + + ✔️ The **Publish Product** confirmation screen appears. + +8. Click **Yes, publish!** + + ✔️ The message “Men’s Trio ‘21 Pants was published successfully!” displays. diff --git a/docs/user-guides/6.0.x/navigation.tsx b/docs/user-guides/6.0.x/navigation.tsx new file mode 100644 index 000000000..ad3e82e5f --- /dev/null +++ b/docs/user-guides/6.0.x/navigation.tsx @@ -0,0 +1,72 @@ +import React from "react"; +import { Group, Page, NavigationRoot, Separator } from "@webiny/docs-generator"; + +export const Navigation = ({ children }: { children: React.ReactNode }) => { + return ( + <NavigationRoot directory={__dirname} linkPrefix={"user-guides"}> + <Group title={"Get Started"} icon={"/docs-menu-icons/get-started.svg"} link={"overview"}> + <Page link={"overview"} /> + </Group> + <Separator /> + <Group + title={"Headless CMS"} + icon={"/docs-menu-icons/headless-cms.svg"} + link={"headless-cms/essentials/glossary"} + > + <Group title={"Essentials"}> + <Page title={"Glossary"} link={"headless-cms/essentials/glossary"} /> + <Page link={"headless-cms/essentials/create-content-model"} /> + <Page link={"headless-cms/essentials/create-content-entry"} /> + <Page link={"headless-cms/essentials/create-content-model-group"} /> + <Page link={"headless-cms/essentials/content-entry-revisions"} /> + <Page link={"headless-cms/essentials/clone-content-model"} /> + <Page link={"headless-cms/essentials/manage-content-model-settings"} /> + <Page link={"headless-cms/essentials/add-validator-to-fields"} /> + <Page link={"headless-cms/essentials/reference-field"} /> + </Group> + <Group title={"Advanced"}> + <Page link={"headless-cms/advanced/import-export-content-models"} /> + </Group> + </Group> + <Separator /> + <Group + title={"Website Builder"} + icon={"/docs-menu-icons/page-builder.svg"} + link={"website-builder/essentials/glossary"} + > + <Group title={"Essentials"}> + <Page title={"Glossary"} link={"website-builder/essentials/glossary"} /> + <Page link={"website-builder/essentials/create-page"} /> + <Page link={"website-builder/essentials/nextjs-starter-kit"} /> + <Page link={"website-builder/essentials/custom-components"} /> + </Group> + </Group> + <Separator /> + <Group + title={"File Manager"} + icon={"/docs-menu-icons/file-manager.svg"} + link={"file-manager/essentials/upload-file"} + > + <Group title={"Essentials"}> + <Page link={"file-manager/essentials/upload-file"} /> + <Page link={"file-manager/essentials/organizing-files"} /> + <Page link={"file-manager/essentials/tagging-files"} /> + </Group> + </Group> + <Separator /> + <Group title={"Security"} + icon={"/docs-menu-icons/wcp.svg"} + link={"security/essentials/create-user"} + > + <Group title={"Essentials"}> + <Page link={"security/essentials/create-user"} /> + <Page link={"security/essentials/create-user-role"} /> + <Page link={"security/essentials/assign-role"} /> + <Page link={"security/essentials/create-team"} /> + <Page link={"security/essentials/assign-team"} /> + </Group> + </Group> + {children} + </NavigationRoot> + ); +}; diff --git a/docs/user-guides/6.0.x/overview.mdx b/docs/user-guides/6.0.x/overview.mdx new file mode 100644 index 000000000..d96b79de0 --- /dev/null +++ b/docs/user-guides/6.0.x/overview.mdx @@ -0,0 +1,17 @@ +--- +id: 78be9e2d +title: Overview +description: Overview of Webiny CMS the enterprise open-source serverless CMS. +--- + +import webinyOverview from "./assets/webiny-overview.mp4"; + +<Video src={webinyOverview} controls={true} /> + +Webiny Serverless CMS includes: + +1️⃣ **Website Builder** - Build stunning landing pages with an easy to use Drag&drop editor. + +2️⃣ **Headless CMS** - Headless CMS with a GraphQL API. Build APIs and content models through a UI. It includes content revisions, localization, and fine-grain permission control. + +3️⃣ **File Manager** - Upload files images. Search and organize your assets. It includes a built-in image editor for basic image manipulations. diff --git a/docs/user-guides/6.0.x/security/essentials/assets/assign-role/assign-role-to-user.mp4 b/docs/user-guides/6.0.x/security/essentials/assets/assign-role/assign-role-to-user.mp4 new file mode 100644 index 000000000..578ffdbe3 Binary files /dev/null and b/docs/user-guides/6.0.x/security/essentials/assets/assign-role/assign-role-to-user.mp4 differ diff --git a/docs/user-guides/6.0.x/security/essentials/assets/assign-team/assign-team-to-user.mp4 b/docs/user-guides/6.0.x/security/essentials/assets/assign-team/assign-team-to-user.mp4 new file mode 100644 index 000000000..6c5ae0b92 Binary files /dev/null and b/docs/user-guides/6.0.x/security/essentials/assets/assign-team/assign-team-to-user.mp4 differ diff --git a/docs/user-guides/6.0.x/security/essentials/assets/create-team/create-team.mp4 b/docs/user-guides/6.0.x/security/essentials/assets/create-team/create-team.mp4 new file mode 100644 index 000000000..0f919099a Binary files /dev/null and b/docs/user-guides/6.0.x/security/essentials/assets/create-team/create-team.mp4 differ diff --git a/docs/user-guides/6.0.x/security/essentials/assets/create-user-role/create-user-role.mp4 b/docs/user-guides/6.0.x/security/essentials/assets/create-user-role/create-user-role.mp4 new file mode 100644 index 000000000..3cca4b937 Binary files /dev/null and b/docs/user-guides/6.0.x/security/essentials/assets/create-user-role/create-user-role.mp4 differ diff --git a/docs/user-guides/6.0.x/security/essentials/assets/create-user/create-user.mp4 b/docs/user-guides/6.0.x/security/essentials/assets/create-user/create-user.mp4 new file mode 100644 index 000000000..e9f671f40 Binary files /dev/null and b/docs/user-guides/6.0.x/security/essentials/assets/create-user/create-user.mp4 differ diff --git a/docs/user-guides/6.0.x/security/essentials/assign-role.mdx b/docs/user-guides/6.0.x/security/essentials/assign-role.mdx new file mode 100644 index 000000000..2bd4f11a1 --- /dev/null +++ b/docs/user-guides/6.0.x/security/essentials/assign-role.mdx @@ -0,0 +1,39 @@ +--- +id: +title: Assign Role to a User +description: Learn how to assign a role to a user. +--- + +import { Alert } from "@/components/Alert"; +import assignRoleVideo from "./assets/assign-role/assign-role-to-user.mp4"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- how to assign a role to a user + +</Alert> + +In this tutorial, we will learn how to assign a role to a user. + +## Prerequisites + +To follow this tutorial, you need to have the **E-commerce** role and the **John Doe** user in your Webiny instance. If you don't have them, please follow the [Create Role](/docs/{version}/user-guides/security/essentials/create-user-role) and [Create User](/docs/{version}/user-guides/security/essentials/create-user) tutorials to create it. + +<Video src={assignRoleVideo} controls={true}/> + +1. From the **Side Menu**, click **Settings** > **ACCESS MANAGEMENT** > **Users.** + + ✔️ The **Admin Users** screen opens. + +2. Click **John Doe** in the list of Users. + +3. Click **Roles**. + + ✔️ The **Roles** accordion opens. + +4. In the **Roles** dropdown, click **E-commerce**. + +5. Click **Update user**. + + ✔️ The message “User saved successfully.” displays. + diff --git a/docs/user-guides/6.0.x/security/essentials/assign-team.mdx b/docs/user-guides/6.0.x/security/essentials/assign-team.mdx new file mode 100644 index 000000000..7fc29cad1 --- /dev/null +++ b/docs/user-guides/6.0.x/security/essentials/assign-team.mdx @@ -0,0 +1,40 @@ +--- +id: +title: Assign Team to a User +description: Learn how to assign a team to a user. +--- + +import { Alert } from "@/components/Alert"; +import assignTeamVideo from "./assets/assign-team/assign-team-to-user.mp4"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- how to assign a team to a user + +</Alert> + +In this tutorial, we will learn how to assign a team to a user. + +<Alert type="info"> + + Note that the Teams feature is part of our enterprise offering. To learn more, please check out the [Teams](/docs/{version}/enterprise/aacl/teams) article. + +</Alert> + +## Prerequisites + +To follow this tutorial, you need to have the **E-commerce L2 Managers** team and the **John Doe** user in your Webiny instance. If you don't have them, please follow the [Create Team](/docs/{version}/user-guides/security/essentials/create-team) and [Create User](/docs/{version}/user-guides/security/essentials/create-user) tutorials to create it. + +<Video src={assignTeamVideo} controls={true}/> + +1. From the **Side Menu**, click **Settings** > **ACCESS MANAGEMENT** > **Users.** + + ✔️ The **Admin Users** screen opens. + +2. Click **John Doe** in the list of Users. + +3. In the **Teams** dropdown, click **E-Commerce L2 Managers**. + +4. Click **Update user**. + + ✔️ The message “User saved successfully.” displays. diff --git a/docs/user-guides/6.0.x/security/essentials/create-team.mdx b/docs/user-guides/6.0.x/security/essentials/create-team.mdx new file mode 100644 index 000000000..bdcef7621 --- /dev/null +++ b/docs/user-guides/6.0.x/security/essentials/create-team.mdx @@ -0,0 +1,50 @@ +--- +id: 440cef17 +title: Create a Team +description: Learn how to create a Team. +--- + +import { Alert } from "@/components/Alert"; +import teamCreationVideo from "./assets/create-team/create-team.mp4"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- how to create a team + +</Alert> + +Webiny enables you to define a team for a group of users in your application. You can provide the access of multiple user roles to the group by creating a Team. In this tutorial, we will learn how to create a Team. + +<Alert type="info"> + + Note that the Teams feature is part of our enterprise offering. To learn more, please check out the [Teams](/docs/{version}/enterprise/aacl/teams) article. + +</Alert> + +## Prerequisites + +To follow this tutorial, you need to have the **E-commerce** user role in your Webiny instance. If you don't have it, please follow the [Create Role](/docs/{version}/user-guides/security/essentials/create-user-role) tutorial to create it. + +<Video src={teamCreationVideo} controls={true}/> + +1. From the **Side Menu**, click **Settings** > **ACCESS MANAGEMENT** > **Teams**. + + ✔️ The **Teams** screen opens. + +2. Click **+ New**. + + ✔️ The form to create a new team opens. + +3. In the **Name** textbox, type **E-Commerce L2 Managers**. + +4. In the **Slug** textbox, type **e-commerce-l2-managers**. + +5. In the **Description** textbox, type **Team of level-2 E-Commerce Managers**. + +6. In the **Roles** dropdown, click **E-Commerce**. + + **Note**: You can select multiple roles in the **Roles** dropdown. + +7. Click **Save.** + + ✔️ The message “Team saved successfully!” displays. diff --git a/docs/user-guides/6.0.x/security/essentials/create-user-role.mdx b/docs/user-guides/6.0.x/security/essentials/create-user-role.mdx new file mode 100644 index 000000000..70a4f5f78 --- /dev/null +++ b/docs/user-guides/6.0.x/security/essentials/create-user-role.mdx @@ -0,0 +1,96 @@ +--- +id: +title: Create a Role +description: Learn how to create a Role. +--- + +import { Alert } from "@/components/Alert"; +import roleCreationVideo from "./assets/create-user-role/create-user-role.mp4"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- how to create a Role +- how to define access permissions for a Role + +</Alert> + + +<Alert type="info" title="Can I use this?"> + + +In the Open Source version, you'll have basic roles and permissions, where users either have full access or no access to a particular application. +To access the advanced roles and permissions feature, you need a Webiny Enterprise or Webiny Business license. + +</Alert> + +You can manage access permissions for users with Roles. In a Role, you define various access permissions, and then assign this Role to users. +In this tutorial, we will learn how to create a Role with custom access permission to the Headless CMS. We will do this in 2 steps: + +- Step 1: Create a Role. +- Step 2: Define access permissions. + +As an example, we will create a Role with the following access permissions: + +- Permission to view and update a specific content model group. +- Permission to view, create, and update all content models inside the content model group. +- Permission to view, create, and update the content entries inside the content models. + +## Prerequisites + +To follow this tutorial, you need to have a content model group named **E-commerce** in your Webiny instance. If you don't have it, please follow the [Create Content Model Group](/docs/{version}/user-guides/headless-cms/essentials/create-content-model-group) tutorial to create it. + +<Video src={roleCreationVideo} controls={true}/> + +## Step 1: Create a Role + +1. From the **Side Menu**, click **Settings** > **ACCESS MANAGEMENT** > **Roles**. + + ✔️ The **Roles** screen opens. + +2. Click **+ New**. + + ✔️ The form to create a new Role opens. + +3. In the **Name** textbox, type **E-Commerce**. + +4. In the **Slug** textbox, type **e-commerce**. + +5. In the **Description** textbox, type **User Role for E-Commerce Managers**. + +## Step 2: Define Access Permissions + +1. Under the **Permissions** section, click **Headless CMS**. + + ✔️ The **Headless CMS** accordion opens. + +2. In the **Access Level** dropdown, click **Custom access**. + +3. Under **GraphQL API types**, select all the three checkboxes - **Read**, **Manage**, and **Preview**. + +4. Under the **Content Model Groups** section: + + a. In the **Access Scope** dropdown, click **Only specific groups**. + + ✔️ A list of content model groups in the current locale appears. + + b. Select the **E-Commerce** checkbox. + + c. In the **Primary Actions** dropdown, click **Read, write**. + +5. Under the **Content Models** section: + + a. In the **Access Scope** dropdown, click **All models**. + + b. In the **Primary Actions** dropdown, click **Read, write**. + +6. Under the **Content Entries** section: + + a. In the **Access Scope** dropdown, click **All entries**. + + b. In the **Primary Actions** dropdown, click **Read, write**. + + c. Under **Publishing actions**, select **Publish** and **Unpublish** checkboxes. + +7. Click **Save**. + + ✔️ The message “Role saved successfully!” displays. diff --git a/docs/user-guides/6.0.x/security/essentials/create-user.mdx b/docs/user-guides/6.0.x/security/essentials/create-user.mdx new file mode 100644 index 000000000..a93c26b3b --- /dev/null +++ b/docs/user-guides/6.0.x/security/essentials/create-user.mdx @@ -0,0 +1,38 @@ +--- +id: +title: Create a User +description: Learn how to create a user. +--- +import { Alert } from "@/components/Alert"; +import userCreationVideo from "./assets/create-user/create-user.mp4"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- how to create a user + +</Alert> + +Webiny users can access the admin application. You can assign users to specific roles or teams to grant them different levels of permissions and access within the application. +In this guide, we will learn how to create a user, and here are additional guides that explain more about [Roles](/docs/{version}/user-guides/security/essentials/create-user-role) and [Teams](/docs/{version}/user-guides/security/essentials/create-team). + +<Video src={userCreationVideo} controls={true}/> + +1. From the **Side Menu**, click **Settings** > **ACCESS MANAGEMENT** > **Users.** + + ✔️ The **Admin Users** screen opens. + +2. Click **+ New**. + + ✔️ The **New User** section opens. + +3. In the **First Name** textbox, type *new user’s first name* (e.g. **John**). + +4. In the **Last Name** textbox, type *new user’s last name* (e.g. **Doe**). + +5. In the **Email** textbox, type *new user’s email* (e.g. **johndoe@example.com**). + +6. In the **Password** textbox, type *new user’s password*. + +7. Click **Create user**. + + ✔️ The message “User saved successfully.” displays. diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/create-page-preview.png b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/create-page-preview.png new file mode 100644 index 000000000..9ac540628 Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/create-page-preview.png differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/example-image.jpg b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/example-image.jpg new file mode 100644 index 000000000..7babd286f Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/example-image.jpg differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/folders-static.png b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/folders-static.png new file mode 100644 index 000000000..e3aa0295b Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/folders-static.png differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/status.png b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/status.png new file mode 100644 index 000000000..402a9fe63 Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/status.png differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step1-add-new-page.mp4 b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step1-add-new-page.mp4 new file mode 100644 index 000000000..8b2a5cdf9 Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step1-add-new-page.mp4 differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step10-preview.mp4 b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step10-preview.mp4 new file mode 100644 index 000000000..934a9f565 Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step10-preview.mp4 differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step11-publish.mp4 b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step11-publish.mp4 new file mode 100644 index 000000000..6030e0cc8 Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step11-publish.mp4 differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step12-folders.mp4 b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step12-folders.mp4 new file mode 100644 index 000000000..864bc42d2 Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step12-folders.mp4 differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step2-add-edit-box.mp4 b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step2-add-edit-box.mp4 new file mode 100644 index 000000000..c1d74ebe2 Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step2-add-edit-box.mp4 differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step3-add-edit-rich-text.mp4 b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step3-add-edit-rich-text.mp4 new file mode 100644 index 000000000..cf28c7d26 Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step3-add-edit-rich-text.mp4 differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step4-add-edit-grid.mp4 b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step4-add-edit-grid.mp4 new file mode 100644 index 000000000..f061415aa Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step4-add-edit-grid.mp4 differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step5-add-adjust-image.mp4 b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step5-add-adjust-image.mp4 new file mode 100644 index 000000000..7ab9ba76d Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step5-add-adjust-image.mp4 differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step6-custom-element.mp4 b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step6-custom-element.mp4 new file mode 100644 index 000000000..0b4a4271b Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step6-custom-element.mp4 differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step7-quick-select.mp4 b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step7-quick-select.mp4 new file mode 100644 index 000000000..6b4374ccc Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step7-quick-select.mp4 differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step7-use-navigator.mp4 b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step7-use-navigator.mp4 new file mode 100644 index 000000000..cc5d68186 Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step7-use-navigator.mp4 differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step8-review-settings.mp4 b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step8-review-settings.mp4 new file mode 100644 index 000000000..bd6e17562 Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step8-review-settings.mp4 differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step9-preview-breakpoints.mp4 b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step9-preview-breakpoints.mp4 new file mode 100644 index 000000000..cd1ec4a92 Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/create-page/step9-preview-breakpoints.mp4 differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/custom-components/calloutbox-custom-component.png b/docs/user-guides/6.0.x/website-builder/essentials/assets/custom-components/calloutbox-custom-component.png new file mode 100644 index 000000000..f8ea3718f Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/custom-components/calloutbox-custom-component.png differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/glossary/status.png b/docs/user-guides/6.0.x/website-builder/essentials/assets/glossary/status.png new file mode 100644 index 000000000..402a9fe63 Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/glossary/status.png differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/nextjs-starter-kit/env-file.png b/docs/user-guides/6.0.x/website-builder/essentials/assets/nextjs-starter-kit/env-file.png new file mode 100644 index 000000000..8d757e0f5 Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/nextjs-starter-kit/env-file.png differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/nextjs-starter-kit/multiple_resources_picker.png b/docs/user-guides/6.0.x/website-builder/essentials/assets/nextjs-starter-kit/multiple_resources_picker.png new file mode 100644 index 000000000..1e93ab1f8 Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/nextjs-starter-kit/multiple_resources_picker.png differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/nextjs-starter-kit/single_resource_picker.png b/docs/user-guides/6.0.x/website-builder/essentials/assets/nextjs-starter-kit/single_resource_picker.png new file mode 100644 index 000000000..f5c589808 Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/nextjs-starter-kit/single_resource_picker.png differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/nextjs-starter-kit/test-page.png b/docs/user-guides/6.0.x/website-builder/essentials/assets/nextjs-starter-kit/test-page.png new file mode 100644 index 000000000..6f1cc1841 Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/nextjs-starter-kit/test-page.png differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/assets/nextjs-starter-kit/wb-settings.png b/docs/user-guides/6.0.x/website-builder/essentials/assets/nextjs-starter-kit/wb-settings.png new file mode 100644 index 000000000..f1497ba61 Binary files /dev/null and b/docs/user-guides/6.0.x/website-builder/essentials/assets/nextjs-starter-kit/wb-settings.png differ diff --git a/docs/user-guides/6.0.x/website-builder/essentials/create-page.mdx b/docs/user-guides/6.0.x/website-builder/essentials/create-page.mdx new file mode 100644 index 000000000..4528f92b3 --- /dev/null +++ b/docs/user-guides/6.0.x/website-builder/essentials/create-page.mdx @@ -0,0 +1,235 @@ +--- +id: aafeab8a +title: Create Page +description: Learn how to create a page in Website Builder. +--- + +import { Alert } from "@/components/Alert"; +import step1Video from "./assets/create-page/step1-add-new-page.mp4"; +import step2Video from "./assets/create-page/step2-add-edit-box.mp4"; +import step3Video from "./assets/create-page/step3-add-edit-rich-text.mp4"; +import step4Video from "./assets/create-page/step4-add-edit-grid.mp4"; +import step5Video from "./assets/create-page/step5-add-adjust-image.mp4"; +import step6Video from "./assets/create-page/step6-custom-element.mp4"; +import step7Video1 from "./assets/create-page/step7-use-navigator.mp4"; +import step7Video2 from "./assets/create-page/step7-quick-select.mp4"; +import step8Video from "./assets/create-page/step8-review-settings.mp4"; +import step9Video from "./assets/create-page/step9-preview-breakpoints.mp4"; +import step10Video from "./assets/create-page/step10-preview.mp4"; +import step11Video from "./assets/create-page/step11-publish.mp4"; +import step12Video from "./assets/create-page/step12-folders.mp4"; + + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- how to create a page using Website Builder + +</Alert> + +Webiny's Website Builder incorporates a drag-and-drop visual editor that allows you to easily create and edit web pages without requiring any coding skills. + +In this tutorial, we will learn how to create a Page using the Website Builder. As an example, we will create a page with the section shown in the image below: +![Create Page](./assets/create-page/create-page-preview.png) + + +We will do this in 12 steps: + +- Step 1: Add a new Page +- Step 2: Add and edit a Box +- Step 3: Add and edit Rich Text +- Step 4: Add and edit a Grid +- Step 5: Add and adjust an Image +- Step 6: Add a complex custom Element +- Step 7: Use the Navigator +- Step 8: Review Settings +- Step 9: Preview the Breakpoints and adjust +- Step 10: Preview +- Step 11: Publish +- Step 12: Organize content in Folders + +## Step 1: Add a New Page + +<Video src={step1Video} controls={true} /> + +1. From the **Side Menu**, click **Website Builder** > **Pages**. + + ✔️ The **Pages** screen opens. + +2. Click **+ NEW PAGE**. + + ✔️ The pop-up to select a Page type opens, e.g., Static Page. + +3. Add the **Title** of the Page. + + ✔️ The **Path** is automatically generated. + +4. Click **CREATE**. + + ✔️ The new Page edit screen appears. + +## Step 2: Add and Edit a Box + +<Video src={step2Video} controls={true} /> + +1. Drag and drop a **Box** Element into the ➕ container and click on it to select it. + + ✔️ The right-side **Element** and **Style** menus now control the selected Box element. + +2. Explore the **Style** tab; you can change Layout, Margin & Padding, Background, and control the Visibility of the component. + +3. Change the **Background** of the Box. + + ✔️ The Box changes color in the Page area in the center of the screen. + + **Note**: Boxes could be used as building blocks of a Page. A Page may be built with multiple Boxes to group Elements together easily share Style, move around together, or delete in one go. A Box can contain Elements like Grids, Images, Rich Text, etc. + +## Step 3: Add and Edit Rich Text + +<Video src={step3Video} controls={true} /> + +1. Drag and drop a **Rich Text** Element to the Box. + + ✔️ Placeholder text appears on the Page. + +2. Select the text and, using the **Element** tab on the right, add and edit the text as needed. You can also open it in a larger pop-up for precise editing. + + ✔️ Formatting reflects in the Page preview area. + +## Step 4: Add and Edit a Grid + +<Video src={step4Video} controls={true} /> + +1. Add a **Grid** to the Box element and select it. Note: avoid addingthe Grid to the **Main Content** area area to keep the same Background and Style, it should be in the Box. + + ✔️ The Grid shows with sample content in the main Page area. + +2. In the **Element** tab layout options, click the **four-column-layout, single-row**. + + ✔️ The Grid updates content in the main Page area. + +3. Drag and drop **Rich Text** Elements into Column 3 and 4. + + ✔️ Sample text populates in these Cells. + +4. Populate and edit the text to explore the Rich Text editor. + + **Note**: Grids are also powerful Page building blocks made of one or more Cells. Elements like Images and Rich Text can be placed inside their Cells. + +## Step 5: Add and Adjust an Image + +<Video src={step5Video} controls={true} /> + +1. Drag and drop an **Image** Element. + + ✔️ Placeholder Image element appears on the Page. + +2. Select the Image from the **Element** tab by clicking **SELECT FROM LIBRARY**. + + ✔️ File Manager screen pops up. + + a. Find and click the desired Image. + + ✔️ Selected asset adds to the Page. + + b. OR click **UPLOAD**. + + ✔️ File explorer opens to select the Image you want to use. Here is the image used in this example: + + ![Example Image](./assets/create-page/example-image.jpg) + +3. In the **Style** tab of the Image element, click **Layout** and adjust Width to 80%, for example. Then adjust Alignment to centered. Use Margin & Padding as needed. + +## Step 6: Add a Complex Custom Element + +<Video src={step6Video} controls={true} /> + +1. Drag and drop a **Hero #1** element onto the Page. + + ✔️ Complex element with child components appears. + +2. Child elements are not editable in this example, but custom components can specify inputs like button labels, etc so this is completely customizable. + +3. Adjust the **Style** for this element and the changes apply to the element as a whole and not to its individual parts. + +## Step 7: Use the Navigator + +<Video src={step7Video1} controls={true} /> + +1. From the **Navigator** tab on the left of the Page, click to access structure and components. + + ✔️ Navigator opens. + +2. Click parent Elements to explore children, e.g., Box > Grid > Column (first) > Rich Text. + + ✔️ Element highlights on the Page for editing so that users acan find it quickly and start editing it. + + **Note**: Navigator excels for complex Pages with lots of components. Use it for precise selection of composites like Grids. Another way to make a precise selection is to use the bread crumb at the bottom of the screen. It allows you to go up the hierarchy in a single click. + + <Video src={step7Video2} controls={true} /> + + +## Step 8: Review Settings + +<Video src={step8Video} controls={true} /> + +1. Click the **SETTINGS** icon (⚙️). + + ✔️ **General Settings** tab in **Page Settings** opens. + +2. In **SEO** and **Social** tabs, add info from the content on the Page itself or any test content. + +3. Click **SAVE SETTINGS** before closing.Unlike the changes on the Page, which are automatically saved, here the user needs to actually save them to ensure no accidental changes are made. + + ✔️ Page Settings are updated. + +## Step 9: Preview Breakpoints and Adjust + +<Video src={step9Video} controls={true} /> + +1. At the top of the Page , you have some quick actions, click on the tablet or mobile icon icons to see how the content will look. + + ✔️ Center preview updates to different sizes. + +2. When you click on the Mobile, you will notice the content in the Grid is not showing properly. The Grid has a built-in functionality that you can use to quickly fix this. Select Grid, **Element** tab, set **Stack at breakpoint** to **Mobile**. + + **Note**: Selecting **Tablet** stacks fpr tablets and all smaller size screens like Mobile automatically. + +## Step 10: Preview + +<Video src={step10Video} controls={true} /> + +1. Click **PREVIEW** in a new tab. + + ✔️ Page opens in new tab as on Next.js site so that you can check how it will look once published. + + ![Preview Page](./assets/create-page/create-page-preview.png) + + +## Step 11: Publish + +<Video src={step11Video} controls={true} /> + +1. Click **PUBLISH**. + + ✔️ The pop-up will ask you to confirm that you really want to publish this Page. + +2. Click **YES, PUBLISH THE PAGE!**. + + ✔️ Page goes live on website. + +## Step 12: Organize Content in Folders + +<Video src={step12Video} controls={true} /> + +1. On Pages list, click **+ NEW FOLDER**. + + ✔️ The pop-up will ask you to confirm the Title of the Page and the Slug will automatically be populated. + +2. Use top Search to find the relevant records and multi-select the Pages, then use the top menu **Bulk Actions** > **Move** to target Folder, e.g., **Features**. + + ✔️ A confirmation report in the end of the successful action. If there are any issues with the Move this report will inform you. + + **Note**: If you want to build a hierarchy of Folders (nested in other Folders) then you could change the default **Home** location (the root folder) to whatever folder that already exists in your Website Builder. Organizing your content in Folders can help end users find content quickly and efficiently, but keep in mind the **Search** functionality at the top can also help when looking for the right content. + +![Folders](./assets/create-page/folders-static.png) + diff --git a/docs/user-guides/6.0.x/website-builder/essentials/custom-components.mdx b/docs/user-guides/6.0.x/website-builder/essentials/custom-components.mdx new file mode 100644 index 000000000..cfa124126 --- /dev/null +++ b/docs/user-guides/6.0.x/website-builder/essentials/custom-components.mdx @@ -0,0 +1,181 @@ +--- +id: c6fabe44 +title: Custom Components +description: Learn how to add custom components in the Next.js starter kit with Website Builder. +--- + +import { Alert } from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- how to add custom components to your Website Builder + +</Alert> + +In this tutorial, we explain how to create, register and use custom components in this Website Builder project. + +- Step 1: Add a React component file +- Step 2: Register the component +- Step 3: Ensure the group matches the one registered +- Step 4: Open the editor to verify the component appears in the chosen group + +## Overview + +- Custom components live in the `src/editorComponents` folder and are provided to the renderer via `editorComponents` exported from `src/editorComponents/index.tsx`. +- The page renderer (`src/components/DocumentRenderer.tsx`) passes `editorComponents` to `DocumentRenderer` from `@webiny/website-builder-nextjs`. +- Component groups (used in the editor UI) are registered in `src/contentSdk/initializeContentSdk.ts` using `registerComponentGroup`. + +## Files to inspect + +- `src/editorComponents/index.tsx` — the central list of editor components and input definitions +- `src/components/DocumentRenderer.tsx` — how components are provided to the renderer +- `src/contentSdk/initializeContentSdk.ts` — where component groups are registered + +## Step-by-step: Create a new custom component + +### Step 1: Add a React component file + +Add a React component file under `src/editorComponents` (or a subfolder). In this tutorial we will create `CalloutBox` component. + +- Prefer exporting a named component (e.g. `export const CalloutBox = () => { ... }`). +- Keep the component as a standard React functional component. + +Example minimal component: + +```diff-tsx src/editorComponents/CalloutBox.tsx +"use client" +import type { ComponentProps } from "@webiny/website-builder-nextjs"; + +interface LineProps { + text: string + highlighted: boolean + breakAfter?: boolean +} + +type CalloutBoxProps = ComponentProps<{ + "line-1": string + "line-2": string + style: 'default' | "primary" +}> + +export function CalloutBox({ inputs }: CalloutBoxProps) { + + const lines = [ + { text: inputs['line-1'], highlighted: true }, + { text: inputs['line-2'], highlighted: false }, + ]; + + return ( + <div className={` + inline-block + p-4 md:p-8 lg:p-12 + border + -mb-px + w-full + border-border bg-background + `}> + <h3 className={'max-w-5xl m-0 font-bold text-lg md:text-4xl lg:text-6xl/16 tracking-tighter text-balance'}> + {lines.map((line, index) => { + return ( + <div + key={index} + className={` + + ${line.highlighted ? 'text-foreground' : 'text-muted-foreground/60'} + `} + > + {line.text} + </div> + ) + })} + </h3> + </div> + ) +} +``` + +### Step 2: Register the component + +Define editor inputs and register the component in `src/editorComponents/index.tsx`. + +- Use `createComponent` from `@webiny/website-builder-nextjs` to register the component with `name`, `label`, `group` and `inputs`. +- Use input helpers such as `createTextInput`, `createLongTextInput`, `createLexicalInput`, `createFileInput`, `createSelectInput`, `createSlotInput`. + +Example registration snippet (add to `src/editorComponents/index.tsx`): + +```tsx +import { + createComponent, + createTextInput, + createLongTextInput +} from "@webiny/website-builder-nextjs"; +import {CalloutBox} from "./CalloutBox"; + + + createComponent(CalloutBox, { + name: "Webiny/CalloutBox", + label: "Callout Box", + group: "basic", + inputs: [ + createLongTextInput({ + name: "line-1", + label: "Line 1 Text", + defaultValue: "Your Ultimate", + required: true + }), + createLongTextInput({ + name: "line-2", + label: "Line 2 Text", + defaultValue: "Headless CMS", + required: true + }) + ] + }), +``` + +Notes: + +- The `name` property defines the unique editor identifier (used by the editor to save/load the block). +- The `group` should match a component group registered in `src/contentSdk/initializeContentSdk` (e.g., `custom`, `basic`). + +**How inputs map to component props** + +- When the editor renders the page, the `DocumentRenderer` will render your component and pass the block data as props. +- Typical convention: input names map to prop names. For example, `title` becomes `props.title` inside your component. +- For slot inputs (`createSlotInput`) the renderer will pass an array of nested blocks which you should render using `children` or a dedicated renderer. + +### Step 3: Ensure the group matches the one registered + +- Component groups (editor categories) are registered in `src/contentSdk/initializeContentSdk.ts` with `registerComponentGroup`. +- Pick an existing group (`basic`, `sample`) or add a new one in `initializeContentSdk.ts`. + +In this tutorial, we used an existing group, but if you ned to create a new one, for example, a new `Demo Group` add the following to `initializeContentSdk.ts`: + +```tsx +registerComponentGroup({ + name: "demo", + label: "Demo Group", + description: "Demo components" +}); +``` +Note: the order in which the Component groups show in the Website builder depends on the order in which they were added to the file above. +<Alert type="success" title="Tips and best practices"> + + - Keep components presentation-focused; prefer receiving plain data from inputs rather than coupling to editor APIs inside the component. + + - For rich text, prefer `createLexicalInput` where content is saved as Lexical nodes and will be rendered by `DocumentRenderer`. + + - Use `createSlotInput` to allow nesting arbitrary content inside your block. + + - Keep components SSR-friendly. Use client-only code (like browser-only libs) inside a child component or guarded by + dynamic import to avoid SSR issues. + +</Alert> + +### Step 4: Open the editor to verify the component appears in the chosen group and that it is functional. + +- Run the site and open a new Page in the editor to verify the component appears in the chosen group. +- Drag and drop the new component in the Page to validate it is functional. + +![Callout Box Custom Component](./assets/custom-components/calloutbox-custom-component.png) + diff --git a/docs/user-guides/6.0.x/website-builder/essentials/glossary.mdx b/docs/user-guides/6.0.x/website-builder/essentials/glossary.mdx new file mode 100644 index 000000000..90e24a4dc --- /dev/null +++ b/docs/user-guides/6.0.x/website-builder/essentials/glossary.mdx @@ -0,0 +1,32 @@ +--- +id: aafeab87 +title: Website Builder Glossary +description: Learn about the Website Builder terminologies. +--- + +import { Alert } from "@/components/Alert"; + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- Website Builder terminologies, and their meanings. + +</Alert> + +## Grid Element + +The Grid element is the fundamental building block of a Page. When you create a page, the first thing to add is a grid block. It serves as the parent container for all the Page elements. + +## Page Element + +Website Builder application comes with a few ready-made page elements like Image, Rich Text, Fragment, etc. These are the building blocks of a Page. + +## Page Revision + +Page Revisions are a snapshot in time of the page. A new Revision is created every time we have a Publish event, meaning if you are editing Draft of Revision 1, it will stay Revision 1 until you Publish the Page. Once the entry was published and you try editing it again, the system will automatically create Revision 2 for you so that Revision 1 will remain intact and published and Revision 2 will be the record you edit. + +## Page Status + +In Website Builder by default, we have three statuses: Draft, Published, and Unpublished. The statuses are self-explanatory, but keep in mind that in the Pages view, the Status that you see is the status of the latest revision. + +![Page statuses](./assets/glossary/status.png) + diff --git a/docs/user-guides/6.0.x/website-builder/essentials/nextjs-starter-kit.mdx b/docs/user-guides/6.0.x/website-builder/essentials/nextjs-starter-kit.mdx new file mode 100644 index 000000000..3032d32f6 --- /dev/null +++ b/docs/user-guides/6.0.x/website-builder/essentials/nextjs-starter-kit.mdx @@ -0,0 +1,179 @@ +--- +id: 02ae18dd +title: Next.js Stater Kit +description: Learn how to integrate our Next.js starter kit with Website Builder. +--- + +import { Alert } from "@/components/Alert"; + + +<Alert type="success" title="WHAT YOU'LL LEARN"> + +- how to link your Website Builder with our Next.js starter kit + +</Alert> + +Webiny's Website Builder incorporates a drag-and-drop visual editor allows you to use custom front end of your choice. We recommend Next.js. To get our users up and running as quickly as possible we put together a sample Next.js project. + +In this tutorial, we will learn how to link your Webiny project to the [Next.js starter kit](https://github.com/webiny/website-builder-nextjs) + +We will do this in a few simple steps: + +- Step 1: Fork the Next.js starter kit repository +- Step 2: Switch to the appropriate branch +- Step 3: Create and populate your .env file +- Step 4: Establish connection +- Step 5: Validate connection +- Optional information and actions + +## What's Included in the Starter Kit + +- TypeScript +- Tailwind CSS +- Sample ecommerce API +- Sample components +- Sample component groups +This project uses [Next.js App Router](https://nextjs.org/docs/app)! + + +## Step 1: Clone the repository + +Use your tools of choice and clone the [Next.js Startet kit repository](https://github.com/webiny/website-builder-nextjs.git) + + ✔️ The project structure should be already visible in your editor. + +## Step 2: Switch to the appropriate branch + +<Alert type="warning" title="Version Match"> +Pick the right branch for your Webiny project! If your Webiny project runs on the latest version, check out the latest branch from this Next.js repo, for example for "Webiny v6.0.0" use the "v6.0.0" branch. If this is not available use the closest matching version and update `@webiny/website-builder-nextjs` in `package.json` in the Next.js project. +</Alert> + + +## Step 3: Create and populate your .env file + +1. Create a new file in your project root called `.env` + +![Example .env file with dummy data](./assets/nextjs-starter-kit/env-file.png) + +2. Add the correct variables from your Webiny project. + +A user can find them in the Webiny Admin app, click on the **Support** link in the bottom left corner, and then select **Configure Next.js**. This is a configuration specifically generated for Webiny Next.js starter kit. Simply copy the values in your `.env` file in the Next.js starter kit and SAVE. + + ✔️ The following environment variables are saved in the `.env` file: +```diff-tsx .env +NEXT_PUBLIC_WEBSITE_BUILDER_API_KEY: {YOUR_API_KEY} +NEXT_PUBLIC_WEBSITE_BUILDER_API_HOST: {YOUR_API_HOST} +NEXT_PUBLIC_WEBSITE_BUILDER_API_TENANT: {YOUR_API_TENANT} +# Optional, check "Cross-Origin Configuration" section below. +NEXT_PUBLIC_WEBSITE_BUILDER_ADMIN_HOST: {YOUR_ADMIN_HOST} +``` + +3. Ensure that in the `package.json` the `"@webiny/website-builder-nextjs":` has the right Webiny version against it, e.g. "6.0.0" + + +## Step 4: Establish the connection + +In the Next.js project root, run: + +```tsx +yarn && yarn dev +``` + ✔️ This will build your dependencies. + + ✔️ It establishes the connection between your Next.js app and the Webiny project thanks to your env variables. + + ✔️ It starts the Next.js in development mode on `localhost:3000`. It enables hot reloading, detailed error overlays, and source maps for fast iteration on your project. + +## Step 5: Validate connection + +In the Website builder, try creating a new page. If the default components and header load properly, then the connection is established properly. + +![New Website Builder Page](./assets/nextjs-starter-kit/test-page.png) + +Note: If there are any issues, ensure that there are no warnings in the Next.js project after the start of the dev mode. For example, if you are running something else on `http://localhost:3000` the app will automatically use a different port. If this is the case you need to align your Website Builder settings to the same port. + +![Website Builder Settings](./assets/nextjs-starter-kit/wb-settings.png) + + +## Optional information and actions for developers and advanced users + +### Webiny Admin app host URL +If you're using your Next.js project in an editor that is hosted on a domain different from your Next.js domain, you'll have to whitelist the editor's domain. You can do that via the `NEXT_PUBLIC_WEBSITE_BUILDER_ADMIN_HOST` env var (see "Cross-Origin Configuration" section below). + +A simple way to retrieve your Admin app host URL is to log in to your Webiny Admin app, and copy the URL from your browser's address bar (for example: https://dxhy1vkapexg1.cloudfront.net) or using the **Support** link described above. + +### Content SDK + +Webiny Content SDK is located in `src/contentSdk` folder. The `initializeContentSdk.ts` file contains the SDK initialization, and editor component group registration. Customize your component groups here. + +### Custom components + +Custom components are passed directly to the `DocumentRenderer` (see the example in `./src/app/[[...slug]]/page.tsx`). +To create custom components, see examples in `./src/editorComponents/index.tsx`. We also have amore detailed article here covering Custom Components. + +### Cross-Origin Configuration + +If you're using your Next.js project in an editor that is hosted on a domain different from your Next.js domain, you'll have to whitelist the editor's domain. + +Open `next.config.ts`, and add your domain to the `Content-Security-Policy` header. For example: + +``` +{ + key: "Content-Security-Policy", + value: "frame-ancestors http://localhost:3001 https://d3fak6u4cx01ke.cloudfront.net" +} +``` + +### Sample Routes + +- `src/app/[[...slug]]` - this directory contains an example of simple static page generation, using pages from the Webiny Website Builder + +- `src/app/product/[slug]` - this directory contains an example of Product Details Page (PDP) generation, using a combination of a remote ecommerce API, and optional editorial content. + +## Website Builder SDK + +When you initially clone this repo, `@webiny/website-builder-nextjs` package in the `package.json` will be set to `*`. We recommend you set the version to whatever is the latest version at the time of cloning. Also, keep in mind that it's preferable to keep this version in sync with your actual Webiny Admin app version, so the Editor SDK and the Contend SDK are on the same version. + + +<Alert type="info" title="Tip for developers"> +Inspect the sample code for more inline comments! +</Alert> + +## Ecommerce Integrations and Component Inputs + +<Alert type="info" title="Ecommerce Only"> +This section is closely connected to, and depends on, ecommerce integrations in your Webiny Admin app. If you don't have any ecommerce integrations, you can skip this part. +</Alert> + +Webiny Website Builder provides a way to integrate with your ecommerce platform of choice. Once an integration is enabled in Webiny Admin app, you get access to specialized component input renderers, which allow you to browse and select your ecommerce resources (products, categories, etc.) to assign them to your components in the editor. + +To use a specific renderer in your component inputs definition, you need to follow a naming convention. +Here's an example, which creates a "text" input, which contains a list of string values, and uses a renderer called `SampleEcommerce/Product/List`. + +### Single Resource Picker + +``` +createTextInput({ + name: "productId", + renderer: "SampleEcommerce/Product", + label: "Product" +}) +``` +![Single Resource Picker](./assets/nextjs-starter-kit/single_resource_picker.png) + +### Multiple Resources Picker + +``` +createTextInput({ + name: "productIds", + list: true, + renderer: "SampleEcommerce/Product/List", + label: "Products" +}) +``` + +![Multiple Resources Picker](./assets/nextjs-starter-kit/multiple_resources_picker.png) + + + + diff --git a/generateDocs.js b/generateDocs.js index c40a99a90..c439145d0 100644 --- a/generateDocs.js +++ b/generateDocs.js @@ -51,7 +51,7 @@ const { default: docsConfig } = require("./docs.config"); if (docsConfig.cleanOutputDir) { const rimraf = require("rimraf"); console.log("Cleaning output directory..."); - rimraf.sync(docsConfig.cleanOutputDir); + docsConfig.cleanOutputDir.forEach(dir => rimraf.sync(dir)); } await app.generate(); } catch (err) { diff --git a/generator/package.json b/generator/package.json index 2825fbe7d..4270a4d3f 100644 --- a/generator/package.json +++ b/generator/package.json @@ -21,8 +21,8 @@ "jsdom": "^20.0.0", "load-json-file": "^6.2.0", "md5": "^2.3.0", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "react": "18.2.0", + "react-dom": "18.2.0", "unist-util-visit": "^2.0.3", "write-json-file": "^4.3.0", "yargs": "^17.3.1" diff --git a/generator/src/app/App.ts b/generator/src/app/App.ts index 0df3ba7db..e09b2c0b6 100644 --- a/generator/src/app/App.ts +++ b/generator/src/app/App.ts @@ -34,8 +34,9 @@ export class App { await generator.execute(); await this.checkBrokenLinks(); } catch (err) { - this.logger.error(err.message); - throw err; + this.logger.error(err); + // Don't break the process. + // throw err; } } diff --git a/generator/src/app/DocumentRootVersions.ts b/generator/src/app/DocumentRootVersions.ts index 0c23f508a..61b4b2567 100644 --- a/generator/src/app/DocumentRootVersions.ts +++ b/generator/src/app/DocumentRootVersions.ts @@ -98,6 +98,9 @@ export class DocumentRootVersions { */ return semver .rsort(versions.map(p => p.replace(".x", ".0")).filter(version => semver.valid(version))) - .map(v => v.replace(".0", ".x")); + .map(v => { + // Restore the `.x` character in the patch position. + return v.split(".").slice(0, 2).join(".") + ".x"; + }); } } diff --git a/generator/src/app/LinkValidator.ts b/generator/src/app/LinkValidator.ts index a8585ec9d..ba817454e 100644 --- a/generator/src/app/LinkValidator.ts +++ b/generator/src/app/LinkValidator.ts @@ -6,6 +6,10 @@ export interface ValidationCallback { (link: string): Promise<boolean> | boolean; } +export interface FilePathFilter { + (filePath: string): boolean; +} + class LinkValidationResult { private readonly invalidLinks: Map<string, string[]>; @@ -29,12 +33,14 @@ class LinkValidationResult { export class LinkValidator { private readonly validator: ValidationCallback; private readonly whitelist: string[]; + private readonly filePathFilter?: FilePathFilter; private readonly linkCollection = new Map<string, Set<string>>(); private readonly skipPrefixes = ["#", "http://", "https://", "mailto:"]; - constructor(whitelist: string[], validator: ValidationCallback) { + constructor(whitelist: string[], validator: ValidationCallback, filePathFilter?: FilePathFilter) { this.whitelist = whitelist; this.validator = validator; + this.filePathFilter = filePathFilter; } async validate(match?: string) { @@ -82,6 +88,11 @@ export class LinkValidator { return; } + // Apply file path filter if provided + if (this.filePathFilter && !this.filePathFilter(filePath)) { + return; + } + if (!this.linkCollection.has(filePath)) { this.linkCollection.set(filePath, new Set<string>()); } diff --git a/generator/src/app/PublicMdxFileWriter.ts b/generator/src/app/PublicMdxFileWriter.ts new file mode 100644 index 000000000..fe18ba1d5 --- /dev/null +++ b/generator/src/app/PublicMdxFileWriter.ts @@ -0,0 +1,31 @@ +import { IFile } from "../abstractions/IFile"; +import { IMdxFileWriter } from "../abstractions/IMdxFileWriter"; +import { MdxFile } from "./MdxFile"; +import { File } from "./File"; + +const marker = "<!-- ================== AUTO-GENERATED ================== -->"; + +export class PublicMdxFileWriter implements IMdxFileWriter { + private readonly relativeOutputPath: string; + + constructor(relativeOutputPath: string) { + this.relativeOutputPath = relativeOutputPath; + } + + async output(mdxFile: MdxFile): Promise<IFile[]> { + const mdxPath = `${this.relativeOutputPath}/${mdxFile.getOutputPath().withExtension("mdx")}`; + + const content = mdxFile.getContents(); + const markerIndex = content.indexOf(marker); + const cleanContent = content.substring(0, markerIndex); + + return [ + // Output an MDX file. + new File({ + path: mdxPath, + contents: cleanContent, + sourcePath: mdxFile.getAbsolutePath() + }) + ]; + } +} diff --git a/generator/src/app/ReactRenderer.tsx b/generator/src/app/ReactRenderer.tsx index 9cdb6f65d..903e6a99e 100644 --- a/generator/src/app/ReactRenderer.tsx +++ b/generator/src/app/ReactRenderer.tsx @@ -1,7 +1,5 @@ -// @ts-ignore -import { JSDOM } from "jsdom"; import React from "react"; -import ReactDOM from "react-dom"; +import Renderer from "react-test-renderer"; import debounce from "debounce"; import { Properties, toObject, Property } from "@webiny/react-properties"; import { IReactRenderer } from "../abstractions/IReactRenderer"; @@ -13,17 +11,7 @@ export class ReactRenderer<T> implements IReactRenderer<T> { resolve(toObject(value)); }); - this.mount(<Properties onChange={onChange}>{element}</Properties>); + Renderer.create(<Properties onChange={onChange}>{element}</Properties>); }); } - - private mount(element: React.ReactElement) { - const dom = new JSDOM(`<div id="root"/>`); - // @ts-ignore - global["window"] = dom.window; - // @ts-ignore - global["document"] = dom.window.document; - const root = dom.window.document.getElementById("root"); - ReactDOM.render(element, root); - } } diff --git a/generator/src/app/processors/CodeSeparatorProcessor.ts b/generator/src/app/processors/CodeSeparatorProcessor.ts index b75f724ca..b5a0f892a 100644 --- a/generator/src/app/processors/CodeSeparatorProcessor.ts +++ b/generator/src/app/processors/CodeSeparatorProcessor.ts @@ -8,7 +8,7 @@ export class CodeSeparatorProcessor extends AbstractMdxProcessor { contents, "\n", this.mdxComment( - `================== THE FOLLOWING CODE IS GENERATED VIA CODE PROCESSORS ==================` + `================== AUTO-GENERATED ==================` ) ].join("\n"); }); diff --git a/generator/src/app/processors/ServerSideRenderProcessor.ts b/generator/src/app/processors/ServerSideRenderProcessor.ts new file mode 100644 index 000000000..7b5f75181 --- /dev/null +++ b/generator/src/app/processors/ServerSideRenderProcessor.ts @@ -0,0 +1,21 @@ +import { AbstractMdxProcessor } from "./AbstractMdxProcessor"; +import { MdxFile } from "../MdxFile"; + +/** + * Adds getServerSideProps to force Next.js to use SSR instead of SSG. + * This prevents older versioned pages from being statically generated at build time. + */ +export class ServerSideRenderProcessor extends AbstractMdxProcessor { + processMdx(mdxFile: MdxFile): MdxFile { + return mdxFile.withContents(contents => { + return [ + contents, + "", + this.mdxComment("Force SSR for this page to avoid static generation at build time"), + "export function getServerSideProps() {", + " return { props: {} };", + "}" + ].join("\n"); + }); + } +} diff --git a/generator/src/documentRoots/versioned/VersionedDocumentRootFactory.ts b/generator/src/documentRoots/versioned/VersionedDocumentRootFactory.ts index d903359ad..7ab5b5649 100644 --- a/generator/src/documentRoots/versioned/VersionedDocumentRootFactory.ts +++ b/generator/src/documentRoots/versioned/VersionedDocumentRootFactory.ts @@ -46,6 +46,7 @@ import { NextLinksRemarkPlugin } from "../../app/mdxCompiler/remark/NextLinksRem import { FilteredMdxFileWriter } from "../../app/FilteredMdxFileWriter"; import { VersionRoot } from "./VersionRoot"; import { ProcessedFileWriter } from "../../app/ProcessedFileWriter"; +import { PublicMdxFileWriter } from "../../app/PublicMdxFileWriter"; interface Config { rootDir: string; @@ -131,6 +132,10 @@ export class VersionedDocumentRootFactory implements IDocumentRootFactory { ...config.mdxFileProcessors ]; + // if (!version.isLatest()) { + // mdxFileProcessors.push(new ServerSideRenderProcessor()); + // } + if (this.appConfig.isDevMode()) { // Inject absolute file path for development purposes. mdxFileProcessors.push(new AbsolutePathProcessor(this.appConfig.getProjectRootDir())); @@ -166,6 +171,10 @@ export class VersionedDocumentRootFactory implements IDocumentRootFactory { new CompositeMdxFileWriter([ // In dev mode, we write the processed MDX file for debugging purposes. this.appConfig.isDevMode() ? new MdxFileWriter(outputDir) : new PassthroughFileWriter(), + // Output `latest` files to `public/raw` for access via `.mdx` extension + version.isLatest() + ? new PublicMdxFileWriter(`${this.appConfig.getProjectRootDir()}/public/docs-static/raw`) + : new PassthroughFileWriter(), // Write sitemap XML file for each MDX file. new SitemapFileWriter(outputDir), // Write a JS file compiled from the MDX file. diff --git a/next.config.js b/next.config.js index 3825c227b..660c78a99 100644 --- a/next.config.js +++ b/next.config.js @@ -4,7 +4,6 @@ const withBundleAnalyzer = require("@next/bundle-analyzer")({ }); module.exports = withBundleAnalyzer({ - swcMinify: true, pageExtensions: ["js", "jsx"], images: { disableStaticImages: true diff --git a/package.json b/package.json index cb200cc8b..d3a0d6dce 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,9 @@ "eslint": "eslint \"**/*.{js,jsx,ts,tsx}\" --max-warnings=0 --fix", "prepare-release-notes": "node scripts/prepareReleaseNotes.js", "lint:fix": "yarn format && yarn eslint", - "get-id": "node -e 'console.log(require(\"@webiny/utils\").mdbid().slice(-8))'" + "get-id": "node -e 'console.log(require(\"@webiny/utils\").mdbid().slice(-8))'", + "validate:mdx": "tsx scripts/validate-mdx-pairing.ts", + "generate:reference": "tsx scripts/generate-reference.ts" }, "browserslist": { "development": [ @@ -48,9 +50,9 @@ "@sindresorhus/slugify": "^1.1.0", "@svgr/webpack": "^5.5.0", "@tailwindcss/typography": "0.5.2", - "@webiny/react-composition": "^5.39.6", - "@webiny/react-properties": "^5.39.6", - "@webiny/utils": "latest", + "@webiny/react-composition": "^5.44.0", + "@webiny/react-properties": "^5.44.0", + "@webiny/utils": "^5.44.0", "autoprefixer": "^10.4.0", "babel-plugin-module-resolver": "^4.1.0", "brotli-size": "^4.0.0", @@ -66,11 +68,10 @@ "front-matter": "^4.0.2", "fs-extra": "^9.1.0", "globby": "^11.1.0", - "jsdom": "^20.0.0", "load-json-file": "^6.2.0", "lodash.memoize": "^4.1.2", "minimatch": "^3.0.4", - "next": "12.3.4", + "next": "^15.5.12", "node-gyp": "^9.0.0", "p-map": "4.0.0", "p-retry": "^4.6.2", @@ -80,10 +81,11 @@ "prettier": "^2.5.0", "prismjs": "^1.25.0", "prompt-sync": "^4.2.0", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "react": "18.2.0", + "react-dom": "18.2.0", "react-image-lightbox": "^5.1.4", - "react-tabs": "^3.2.3", + "react-tabs": "^6.1.0", + "react-test-renderer": "18.2.0", "redent": "^3.0.0", "replace-in-path": "^1.1.0", "rimraf": "^3.0.2", @@ -98,8 +100,9 @@ }, "devDependencies": { "@types/jest": "^29.5.4", - "@types/react": "^17.0.83", - "@types/react-dom": "^17.0.26", + "@types/react": "^18.3.28", + "@types/react-dom": "^18.3.7", + "@types/react-test-renderer": "18.3.1", "@types/semver": "^7.5.5", "@typescript-eslint/eslint-plugin": "2.x", "@typescript-eslint/parser": "2.x", @@ -113,17 +116,15 @@ "eslint-plugin-react": "7.x", "eslint-plugin-react-hooks": "2.x", "execa": "^5.0.0", - "glyphhanger": "^4.0.1", "inquirer": "^8.2.4", "jest": "^29.6.4", "ncp": "^2.0.0", - "ts-jest": "^29.1.1" + "ts-jest": "^29.1.1", + "ts-morph": "^27.0.2", + "tsx": "^4.21.0" }, "packageManager": "yarn@3.2.0", "resolutions": { - "react": "^17.0.2", - "react-dom": "^17.0.2", - "@types/react": "^17.0.83", - "@types/react-dom": "^17.0.26" + "@types/react": "18.3.28" } } diff --git a/plans/2026-02-14-mdx-ai-txt-validation-design.md b/plans/2026-02-14-mdx-ai-txt-validation-design.md new file mode 100644 index 000000000..db1f6d81e --- /dev/null +++ b/plans/2026-02-14-mdx-ai-txt-validation-design.md @@ -0,0 +1,264 @@ +# MDX/.ai.txt Pairing Validation Design + +**Date:** 2026-02-14 +**Status:** Approved + +## Overview + +A TypeScript validation script that ensures every `.mdx` file in `docs/developer-docs/6.0.x/` has a corresponding `.ai.txt` companion file, and vice versa. The script supports configurable exceptions via glob patterns. + +## Requirements + +### Functional +- Validate bidirectional pairing between `.mdx` and `.ai.txt` files +- Scope limited to `docs/developer-docs/6.0.x/` directory only +- Support glob-based exception patterns +- Simple list output of missing files +- Exit code 1 on validation failure, 0 on success +- Standalone script callable from CI or build process + +### Non-Functional +- TypeScript for type safety and code clarity +- JSON configuration for easy maintenance +- Use existing project dependencies where possible + +## Architecture + +### File Structure + +``` +.mdx-validation.json ← Configuration file (root) +scripts/validate-mdx-pairing.ts ← TypeScript validation script +``` + +### High-Level Flow + +``` +1. Load config from .mdx-validation.json +2. Scan docs/developer-docs/6.0.x/ for all .mdx files +3. Scan same directory for all .ai.txt files +4. Apply glob-based exceptions from config +5. Check bidirectional pairing: + - .mdx files without .ai.txt + - .ai.txt files without .mdx +6. Output simple list of missing files +7. Exit 1 if any issues, exit 0 if clean +``` + +### Integration + +**Package.json script:** +```json +"scripts": { + "validate:mdx": "tsx scripts/validate-mdx-pairing.ts" +} +``` + +**Run with:** `yarn validate:mdx` + +**Future integration points:** +- CI/GitHub Actions +- Pre-build validation +- Pre-commit hooks (optional) + +## Configuration + +### File: `.mdx-validation.json` + +Located in project root. Simple JSON format with two fields. + +```json +{ + "targetDir": "docs/developer-docs/6.0.x", + "exceptions": [ + "get-started/welcome.mdx", + "get-started/install-webiny.mdx", + "overview/pricing.mdx", + "overview/features/security.mdx" + ] +} +``` + +### Fields + +- **`targetDir`** (string, required): Relative path from project root to scan +- **`exceptions`** (array, required): Patterns to exclude from validation + - Can be empty array `[]` for strict mode + - Supports exact filenames: `"get-started/welcome.mdx"` + - Supports glob patterns: `"overview/**"`, `"*/welcome.mdx"` + - Paths relative to `targetDir` + +### Glob Matching + +- Uses `minimatch` library (via globby) +- Patterns match against relative paths within targetDir +- Example: `"overview/**"` excludes all files under overview/ + +## Implementation + +### TypeScript Types + +```typescript +interface Config { + targetDir: string; + exceptions: string[]; +} + +interface ValidationResult { + mdxWithoutAiTxt: string[]; + aiTxtWithoutMdx: string[]; +} +``` + +### Key Functions + +```typescript +loadConfig(): Config +scanFiles(dir: string, pattern: string): string[] +applyExceptions(files: string[], patterns: string[]): string[] +validatePairing(mdxFiles: string[], aiTxtFiles: string[]): ValidationResult +printResults(result: ValidationResult): void +``` + +### Algorithm + +1. **Load & validate config** + - Read `.mdx-validation.json` + - Parse and type-check against `Config` interface + - Throw exception if config is invalid + +2. **Scan for files** + - Use `globby` to find all `*.mdx` files in `targetDir` + - Use `globby` to find all `*.ai.txt` files in `targetDir` + - Store as relative paths from `targetDir` + +3. **Apply exceptions** + - Filter out .mdx files matching exception patterns using `minimatch` + - Build expected pairs: for each .mdx, expect matching .ai.txt + +4. **Bidirectional validation** + - Check A: Find .mdx files without corresponding .ai.txt + - Check B: Find .ai.txt files without corresponding .mdx + - Store both lists in `ValidationResult` + +5. **Output & exit** + - If both lists empty: success message, exit 0 + - If issues found: print relevant list(s), exit 1 + +## Output Format + +### Success (exit 0) + +``` +✓ All .mdx/.ai.txt files are properly paired +``` + +### Failure (exit 1) + +Only show the direction(s) with issues: + +**Missing .ai.txt files:** +``` +✗ Validation failed + +Missing .ai.txt files: + - basic/events.mdx + - tasks/creating.mdx +``` + +**Orphaned .ai.txt files:** +``` +✗ Validation failed + +Orphaned .ai.txt files (no matching .mdx): + - old-feature/deprecated.ai.txt +``` + +**Note:** In practice, only one direction will have issues at a time. Both having issues would indicate a fundamental problem with the directory structure. + +## Error Handling + +### Configuration Errors (throw exception) + +```typescript +// Missing config file +throw new Error("Config file not found: .mdx-validation.json"); + +// Invalid JSON +throw new Error("Invalid JSON in .mdx-validation.json"); + +// Missing required fields +throw new Error("Config missing required field: targetDir"); + +// Invalid field types +throw new Error("Config field 'exceptions' must be an array"); +``` + +### Directory Errors (throw exception) + +```typescript +// Target directory doesn't exist +throw new Error(`Target directory not found: ${config.targetDir}`); + +// No read permissions +throw new Error(`Cannot read directory: ${config.targetDir}`); +``` + +### Graceful Handling (no exception) + +- Empty exception array `[]` → proceed with strict validation +- No .mdx files found → exit 0 (nothing to validate) +- No .ai.txt files found → report all .mdx as missing pairs, exit 1 +- Glob pattern matches nothing → pattern is ignored (valid scenario) + +### Exit Codes + +- `0` - Validation passed +- `1` - Validation failed (missing pairs found) +- `>1` - Fatal error (config/directory issues) via uncaught exception + +## Dependencies + +### New Dependencies +- `tsx` (devDependency) - TypeScript execution runtime + +### Existing Dependencies +- `globby` - File pattern matching +- `fs-extra` - File system operations +- `minimatch` - Glob pattern matching (via globby) + +## Initial Configuration + +The initial `.mdx-validation.json` includes the 4 currently missing files as exceptions: + +```json +{ + "targetDir": "docs/developer-docs/6.0.x", + "exceptions": [ + "get-started/welcome.mdx", + "get-started/install-webiny.mdx", + "overview/pricing.mdx", + "overview/features/security.mdx" + ] +} +``` + +## Future Enhancements + +Potential additions (not in initial scope): +- `--quiet` flag for CI (suppress success messages) +- `--fix` flag to generate missing .ai.txt stub files +- Multiple target directories +- Custom output formats (JSON, JUnit XML) +- Watch mode for development + +## Decisions + +1. **TypeScript over JavaScript**: Type safety improves maintainability +2. **tsx over tsc compilation**: Faster iteration, simpler setup +3. **JSON config over TypeScript config**: Simpler for non-code configuration +4. **External config over inline**: Easier to modify without touching script +5. **Bidirectional validation**: Catches both missing files and orphaned files +6. **Glob support**: More flexible than exact file matching +7. **Simple list output**: Easy to parse, clear for humans +8. **Exit 1 on failure**: Standard practice for validation scripts diff --git a/plans/2026-02-14-mdx-ai-txt-validation.md b/plans/2026-02-14-mdx-ai-txt-validation.md new file mode 100644 index 000000000..ea80e3389 --- /dev/null +++ b/plans/2026-02-14-mdx-ai-txt-validation.md @@ -0,0 +1,786 @@ +# MDX/.ai.txt Pairing Validation Implementation Plan + +> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. + +**Goal:** Create a TypeScript validation script that ensures every `.mdx` file in `docs/developer-docs/6.0.x/` has a corresponding `.ai.txt` companion file (and vice versa), with configurable exceptions via glob patterns. + +**Architecture:** Standalone TypeScript script executed via tsx, reading configuration from JSON file. Uses globby for file scanning and minimatch for glob pattern matching. Bidirectional validation with clear error reporting. + +**Tech Stack:** TypeScript, tsx (runtime), globby (file scanning), minimatch (via globby), fs-extra (file operations) + +--- + +## Task 1: Add Dependencies + +**Files:** +- Modify: `package.json` (devDependencies section) + +**Step 1: Add tsx to devDependencies** + +Add to the `devDependencies` section: +```json +"tsx": "^4.21.0" +``` + +**Step 2: Install dependencies** + +Run: `yarn install` +Expected: tsx installed successfully + +**Step 3: Verify tsx works** + +Run: `yarn tsx --version` +Expected: Version number printed (e.g., "4.21.0") + +**Step 4: Commit** + +```bash +git add package.json yarn.lock +git commit -m "build: add tsx for TypeScript script execution" +``` + +--- + +## Task 2: Create Configuration File + +**Files:** +- Create: `.mdx-validation.json` (project root) + +**Step 1: Create config file with current exceptions** + +Create `.mdx-validation.json` in project root: +```json +{ + "targetDir": "docs/developer-docs/6.0.x", + "exceptions": [ + "get-started/welcome.mdx", + "get-started/install-webiny.mdx", + "overview/pricing.mdx", + "overview/features/security.mdx" + ] +} +``` + +**Step 2: Verify JSON is valid** + +Run: `cat .mdx-validation.json | node -e "JSON.parse(require('fs').readFileSync(0, 'utf-8'))"` +Expected: No errors (silent success) + +**Step 3: Commit** + +```bash +git add .mdx-validation.json +git commit -m "feat: add MDX validation configuration file" +``` + +--- + +## Task 3: Create Script Skeleton with Types + +**Files:** +- Create: `scripts/validate-mdx-pairing.ts` + +**Step 1: Create script file with types and imports** + +Create `scripts/validate-mdx-pairing.ts`: +```typescript +import { readFileSync, existsSync } from "fs"; +import { join } from "path"; +import { globby } from "globby"; +import minimatch from "minimatch"; + +interface Config { + targetDir: string; + exceptions: string[]; +} + +interface ValidationResult { + mdxWithoutAiTxt: string[]; + aiTxtWithoutMdx: string[]; +} + +function main(): void { + console.log("MDX/.ai.txt Validation Script"); + process.exit(0); +} + +main(); +``` + +**Step 2: Test script runs** + +Run: `yarn tsx scripts/validate-mdx-pairing.ts` +Expected: Prints "MDX/.ai.txt Validation Script" and exits cleanly + +**Step 3: Commit** + +```bash +git add scripts/validate-mdx-pairing.ts +git commit -m "feat: add validation script skeleton with TypeScript types" +``` + +--- + +## Task 4: Implement Config Loading + +**Files:** +- Modify: `scripts/validate-mdx-pairing.ts` + +**Step 1: Add loadConfig function** + +Add after interface definitions: +```typescript +function loadConfig(): Config { + const configPath = ".mdx-validation.json"; + + if (!existsSync(configPath)) { + throw new Error(`Config file not found: ${configPath}`); + } + + let configContent: string; + try { + configContent = readFileSync(configPath, "utf-8"); + } catch (error) { + throw new Error(`Cannot read config file: ${configPath}`); + } + + let config: any; + try { + config = JSON.parse(configContent); + } catch (error) { + throw new Error(`Invalid JSON in ${configPath}`); + } + + // Validate required fields + if (!config.targetDir || typeof config.targetDir !== "string") { + throw new Error("Config missing required field: targetDir"); + } + + if (!Array.isArray(config.exceptions)) { + throw new Error("Config field 'exceptions' must be an array"); + } + + return { + targetDir: config.targetDir, + exceptions: config.exceptions, + }; +} +``` + +**Step 2: Update main to use loadConfig** + +Replace main function: +```typescript +function main(): void { + try { + const config = loadConfig(); + console.log(`✓ Config loaded: ${config.targetDir}`); + console.log(`✓ Exceptions: ${config.exceptions.length}`); + process.exit(0); + } catch (error) { + if (error instanceof Error) { + console.error(`Error: ${error.message}`); + } + process.exit(2); + } +} +``` + +**Step 3: Test config loading** + +Run: `yarn tsx scripts/validate-mdx-pairing.ts` +Expected: +``` +✓ Config loaded: docs/developer-docs/6.0.x +✓ Exceptions: 4 +``` + +**Step 4: Test error handling - rename config temporarily** + +Run: `mv .mdx-validation.json .mdx-validation.json.bak && yarn tsx scripts/validate-mdx-pairing.ts` +Expected: `Error: Config file not found: .mdx-validation.json` + +Run: `mv .mdx-validation.json.bak .mdx-validation.json` +Expected: Config restored + +**Step 5: Commit** + +```bash +git add scripts/validate-mdx-pairing.ts +git commit -m "feat: implement config loading with validation" +``` + +--- + +## Task 5: Implement File Scanning + +**Files:** +- Modify: `scripts/validate-mdx-pairing.ts` + +**Step 1: Add scanFiles function** + +Add after loadConfig function: +```typescript +async function scanFiles(baseDir: string, pattern: string): Promise<string[]> { + const targetPath = join(process.cwd(), baseDir); + + if (!existsSync(targetPath)) { + throw new Error(`Target directory not found: ${baseDir}`); + } + + const files = await globby(pattern, { + cwd: targetPath, + onlyFiles: true, + }); + + return files.sort(); +} +``` + +**Step 2: Update main to scan files** + +Replace main function: +```typescript +async function main(): Promise<void> { + try { + const config = loadConfig(); + + // Scan for .mdx and .ai.txt files + const mdxFiles = await scanFiles(config.targetDir, "**/*.mdx"); + const aiTxtFiles = await scanFiles(config.targetDir, "**/*.ai.txt"); + + console.log(`✓ Found ${mdxFiles.length} .mdx files`); + console.log(`✓ Found ${aiTxtFiles.length} .ai.txt files`); + + process.exit(0); + } catch (error) { + if (error instanceof Error) { + console.error(`Error: ${error.message}`); + } + process.exit(2); + } +} + +main(); +``` + +**Step 3: Test file scanning** + +Run: `yarn tsx scripts/validate-mdx-pairing.ts` +Expected: +``` +✓ Found 30 .mdx files +✓ Found 26 .ai.txt files +``` + +**Step 4: Commit** + +```bash +git add scripts/validate-mdx-pairing.ts +git commit -m "feat: implement file scanning with globby" +``` + +--- + +## Task 6: Implement Exception Filtering + +**Files:** +- Modify: `scripts/validate-mdx-pairing.ts` + +**Step 1: Add applyExceptions function** + +Add after scanFiles function: +```typescript +function applyExceptions(files: string[], patterns: string[]): string[] { + if (patterns.length === 0) { + return files; + } + + return files.filter((file) => { + // Check if file matches any exception pattern + for (const pattern of patterns) { + if (minimatch(file, pattern)) { + return false; // Exclude this file + } + } + return true; // Keep this file + }); +} +``` + +**Step 2: Update main to apply exceptions** + +Replace the scanning section in main: +```typescript + // Scan for .mdx and .ai.txt files + const allMdxFiles = await scanFiles(config.targetDir, "**/*.mdx"); + const aiTxtFiles = await scanFiles(config.targetDir, "**/*.ai.txt"); + + // Apply exceptions to .mdx files + const mdxFiles = applyExceptions(allMdxFiles, config.exceptions); + + console.log(`✓ Found ${allMdxFiles.length} .mdx files`); + console.log(`✓ After exceptions: ${mdxFiles.length} .mdx files to validate`); + console.log(`✓ Found ${aiTxtFiles.length} .ai.txt files`); +``` + +**Step 3: Test exception filtering** + +Run: `yarn tsx scripts/validate-mdx-pairing.ts` +Expected: +``` +✓ Found 30 .mdx files +✓ After exceptions: 26 .mdx files to validate +✓ Found 26 .ai.txt files +``` + +**Step 4: Commit** + +```bash +git add scripts/validate-mdx-pairing.ts +git commit -m "feat: implement exception filtering with glob patterns" +``` + +--- + +## Task 7: Implement Bidirectional Validation + +**Files:** +- Modify: `scripts/validate-mdx-pairing.ts` + +**Step 1: Add validatePairing function** + +Add after applyExceptions function: +```typescript +function validatePairing( + mdxFiles: string[], + aiTxtFiles: string[] +): ValidationResult { + const result: ValidationResult = { + mdxWithoutAiTxt: [], + aiTxtWithoutMdx: [], + }; + + // Create sets for efficient lookup + const mdxSet = new Set(mdxFiles.map((f) => f.replace(/\.mdx$/, ""))); + const aiTxtSet = new Set(aiTxtFiles.map((f) => f.replace(/\.ai\.txt$/, ""))); + + // Check for .mdx files without .ai.txt + for (const mdxFile of mdxFiles) { + const baseName = mdxFile.replace(/\.mdx$/, ""); + if (!aiTxtSet.has(baseName)) { + result.mdxWithoutAiTxt.push(mdxFile); + } + } + + // Check for .ai.txt files without .mdx + for (const aiTxtFile of aiTxtFiles) { + const baseName = aiTxtFile.replace(/\.ai\.txt$/, ""); + if (!mdxSet.has(baseName)) { + result.aiTxtWithoutMdx.push(aiTxtFile); + } + } + + return result; +} +``` + +**Step 2: Update main to perform validation** + +Replace the console.log section in main with: +```typescript + console.log(`✓ Found ${allMdxFiles.length} .mdx files`); + console.log(`✓ After exceptions: ${mdxFiles.length} .mdx files to validate`); + console.log(`✓ Found ${aiTxtFiles.length} .ai.txt files`); + + // Validate pairing + const result = validatePairing(mdxFiles, aiTxtFiles); + + // Temporary debug output + console.log(`\nValidation result:`); + console.log(` Missing .ai.txt: ${result.mdxWithoutAiTxt.length}`); + console.log(` Orphaned .ai.txt: ${result.aiTxtWithoutMdx.length}`); +``` + +**Step 3: Test validation logic** + +Run: `yarn tsx scripts/validate-mdx-pairing.ts` +Expected: +``` +✓ Found 30 .mdx files +✓ After exceptions: 26 .mdx files to validate +✓ Found 26 .ai.txt files + +Validation result: + Missing .ai.txt: 0 + Orphaned .ai.txt: 0 +``` + +**Step 4: Commit** + +```bash +git add scripts/validate-mdx-pairing.ts +git commit -m "feat: implement bidirectional validation logic" +``` + +--- + +## Task 8: Implement Output Formatting and Exit Codes + +**Files:** +- Modify: `scripts/validate-mdx-pairing.ts` + +**Step 1: Add printResults function** + +Add after validatePairing function: +```typescript +function printResults(result: ValidationResult): number { + const hasIssues = + result.mdxWithoutAiTxt.length > 0 || result.aiTxtWithoutMdx.length > 0; + + if (!hasIssues) { + console.log("✓ All .mdx/.ai.txt files are properly paired"); + return 0; + } + + console.log("✗ Validation failed\n"); + + if (result.mdxWithoutAiTxt.length > 0) { + console.log("Missing .ai.txt files:"); + for (const file of result.mdxWithoutAiTxt) { + console.log(` - ${file}`); + } + console.log(""); + } + + if (result.aiTxtWithoutMdx.length > 0) { + console.log("Orphaned .ai.txt files (no matching .mdx):"); + for (const file of result.aiTxtWithoutMdx) { + console.log(` - ${file}`); + } + console.log(""); + } + + return 1; +} +``` + +**Step 2: Update main to use printResults** + +Replace the validation result section: +```typescript + // Validate pairing + const result = validatePairing(mdxFiles, aiTxtFiles); + + // Print results and exit + const exitCode = printResults(result); + process.exit(exitCode); +``` + +**Step 3: Test success case** + +Run: `yarn tsx scripts/validate-mdx-pairing.ts` +Expected: `✓ All .mdx/.ai.txt files are properly paired` + +Check exit code: +Run: `yarn tsx scripts/validate-mdx-pairing.ts; echo "Exit code: $?"` +Expected: `Exit code: 0` + +**Step 4: Test failure case - temporarily remove an exception** + +Edit `.mdx-validation.json`, remove one exception (e.g., `"get-started/welcome.mdx"`): +```json +{ + "targetDir": "docs/developer-docs/6.0.x", + "exceptions": [ + "get-started/install-webiny.mdx", + "overview/pricing.mdx", + "overview/features/security.mdx" + ] +} +``` + +Run: `yarn tsx scripts/validate-mdx-pairing.ts; echo "Exit code: $?"` +Expected: +``` +✗ Validation failed + +Missing .ai.txt files: + - get-started/welcome.mdx + +Exit code: 1 +``` + +Restore the exception in `.mdx-validation.json`. + +**Step 5: Commit** + +```bash +git add scripts/validate-mdx-pairing.ts +git commit -m "feat: implement output formatting with exit codes" +``` + +--- + +## Task 9: Add Package.json Script + +**Files:** +- Modify: `package.json` + +**Step 1: Add validate:mdx script** + +Add to the `scripts` section in package.json: +```json +"validate:mdx": "tsx scripts/validate-mdx-pairing.ts" +``` + +**Step 2: Test the new script** + +Run: `yarn validate:mdx` +Expected: `✓ All .mdx/.ai.txt files are properly paired` + +**Step 3: Verify exit code** + +Run: `yarn validate:mdx; echo "Exit code: $?"` +Expected: `Exit code: 0` + +**Step 4: Commit** + +```bash +git add package.json +git commit -m "feat: add validate:mdx script to package.json" +``` + +--- + +## Task 10: Add Script Header Comments + +**Files:** +- Modify: `scripts/validate-mdx-pairing.ts` + +**Step 1: Add file header with documentation** + +Add at the top of the file: +```typescript +/** + * MDX/.ai.txt Pairing Validation Script + * + * Validates that every .mdx file in docs/developer-docs/6.0.x/ has a corresponding + * .ai.txt companion file, and vice versa. + * + * Configuration: .mdx-validation.json (project root) + * Usage: yarn validate:mdx + * + * Exit codes: + * 0 - All files properly paired + * 1 - Validation failed (missing pairs found) + * 2 - Fatal error (config/directory issues) + */ + +import { readFileSync, existsSync } from "fs"; +// ... rest of imports +``` + +**Step 2: Verify script still works** + +Run: `yarn validate:mdx` +Expected: `✓ All .mdx/.ai.txt files are properly paired` + +**Step 3: Commit** + +```bash +git add scripts/validate-mdx-pairing.ts +git commit -m "docs: add header comments to validation script" +``` + +--- + +## Task 11: Manual Testing + +**Files:** +- None (testing only) + +**Step 1: Test success case** + +Run: `yarn validate:mdx` +Expected: Success message, exit 0 + +**Step 2: Test missing .ai.txt case** + +1. Temporarily rename an .ai.txt file: + ```bash + mv docs/developer-docs/6.0.x/basic/di.ai.txt docs/developer-docs/6.0.x/basic/di.ai.txt.bak + ``` + +2. Run validation: + ```bash + yarn validate:mdx + ``` + Expected: + ``` + ✗ Validation failed + + Missing .ai.txt files: + - basic/di.mdx + ``` + +3. Restore file: + ```bash + mv docs/developer-docs/6.0.x/basic/di.ai.txt.bak docs/developer-docs/6.0.x/basic/di.ai.txt + ``` + +**Step 3: Test orphaned .ai.txt case** + +1. Temporarily rename an .mdx file: + ```bash + mv docs/developer-docs/6.0.x/basic/result.mdx docs/developer-docs/6.0.x/basic/result.mdx.bak + ``` + +2. Run validation: + ```bash + yarn validate:mdx + ``` + Expected: + ``` + ✗ Validation failed + + Orphaned .ai.txt files (no matching .mdx): + - basic/result.ai.txt + ``` + +3. Restore file: + ```bash + mv docs/developer-docs/6.0.x/basic/result.mdx.bak docs/developer-docs/6.0.x/basic/result.mdx + ``` + +**Step 4: Test exception patterns** + +1. Add a glob exception to `.mdx-validation.json`: + ```json + "exceptions": [ + "get-started/**", + "overview/**" + ] + ``` + +2. Run validation: + ```bash + yarn validate:mdx + ``` + Expected: Success (4 files excluded by glob patterns) + +3. Restore original exceptions in `.mdx-validation.json` + +**Step 5: Test config error handling** + +1. Break the JSON: + ```bash + echo '{invalid json}' > .mdx-validation.json.broken + mv .mdx-validation.json .mdx-validation.json.good + mv .mdx-validation.json.broken .mdx-validation.json + ``` + +2. Run validation: + ```bash + yarn validate:mdx + ``` + Expected: `Error: Invalid JSON in .mdx-validation.json` + +3. Restore config: + ```bash + mv .mdx-validation.json.good .mdx-validation.json + ``` + +**Step 6: Final verification** + +Run: `yarn validate:mdx` +Expected: `✓ All .mdx/.ai.txt files are properly paired` + +--- + +## Task 12: Update Documentation + +**Files:** +- Create: `docs/developer-docs/6.0.x/validation.md` (optional, if needed) +- Modify: `README.md` (if validation should be documented there) + +**Step 1: Add validation section to README (if applicable)** + +If the project README has a "Development" or "Scripts" section, add: +```markdown +### Validating Documentation + +Ensure all `.mdx` files have corresponding `.ai.txt` companion files: + +\`\`\`bash +yarn validate:mdx +\`\`\` + +Configuration: `.mdx-validation.json` +``` + +**Step 2: Commit (if changes made)** + +```bash +git add README.md +git commit -m "docs: document MDX validation script" +``` + +--- + +## Task 13: Final Commit and Summary + +**Files:** +- None (summary only) + +**Step 1: Review git log** + +Run: `git log --oneline -15` +Expected: See all commits from this implementation + +**Step 2: Verify clean working directory** + +Run: `git status` +Expected: `nothing to commit, working tree clean` + +**Step 3: Final test** + +Run: `yarn validate:mdx` +Expected: `✓ All .mdx/.ai.txt files are properly paired` + +**Step 4: Summary** + +Implementation complete: +- ✓ TypeScript validation script with type safety +- ✓ JSON configuration with glob pattern support +- ✓ Bidirectional validation (both directions) +- ✓ Clear output formatting +- ✓ Proper exit codes (0=success, 1=failure, 2=error) +- ✓ Package.json integration (yarn validate:mdx) +- ✓ Comprehensive error handling +- ✓ Manual testing completed + +Ready for CI/build integration. + +--- + +## Future Integration + +**CI/GitHub Actions:** +Add to `.github/workflows/ci.yml`: +```yaml +- name: Validate MDX pairing + run: yarn validate:mdx +``` + +**Pre-build validation:** +Update `build` script in package.json: +```json +"build": "yarn validate:mdx && yarn generate && next build" +``` + +**Pre-commit hook (optional):** +Add to `.husky/pre-commit` or similar: +```bash +yarn validate:mdx +``` diff --git a/remote b/remote new file mode 120000 index 000000000..92a62243d --- /dev/null +++ b/remote @@ -0,0 +1 @@ +/Users/brunozoric/work/webiny/webiny-beta-test/testing-v6.0.0/extensions \ No newline at end of file diff --git a/scripts/dev.sh b/scripts/dev.sh index 3628d0960..f7efe6ce3 100755 --- a/scripts/dev.sh +++ b/scripts/dev.sh @@ -1,3 +1,3 @@ #!/usr/bin/env bash ARGS=$@ -NODE_ENV=development yarn generate $ARGS && concurrently --prefix=none "NODE_ENV=development yarn generate $ARGS --watchOnly" "next dev" +NODE_ENV=development yarn generate $ARGS && concurrently --prefix=none "NODE_ENV=development yarn generate $ARGS --watchOnly" "next dev & sleep 2 && open http://localhost:3000/docs/get-started/install-webiny" diff --git a/scripts/generate-reference.ts b/scripts/generate-reference.ts new file mode 100644 index 000000000..26d925894 --- /dev/null +++ b/scripts/generate-reference.ts @@ -0,0 +1,2143 @@ +/** + * Reference Documentation Generator + * + * Reads every export path from packages/webiny/src/, resolves each exported + * symbol back to its originating @webiny/* source file, extracts TypeScript + * interface signatures + JSDoc comments + namespace types, and writes: + * - One .mdx page per webiny/* entry point + * - One .ai.txt companion per page + * + * Then rewrites the Reference <Group> in navigation.tsx with all generated pages. + * + * Usage: yarn generate:reference + */ + +import { readFileSync, writeFileSync, mkdirSync, existsSync } from "fs"; +import { join, dirname } from "path"; +import { Project, SourceFile, SyntaxKind, Node } from "ts-morph"; +import slugify from "@sindresorhus/slugify"; + +// --------------------------------------------------------------------------- +// Config +// --------------------------------------------------------------------------- + +const WEBINY_PKG = "/Users/adrian/dev/wby-next/packages/webiny"; +const WEBINY_MONOREPO = "/Users/adrian/dev/wby-next/packages"; +const DOCS_ROOT = join(process.cwd(), "docs/developer-docs/6.0.x"); +const REF_DIR = join(DOCS_ROOT, "reference"); +const NAV_FILE = join(DOCS_ROOT, "navigation.tsx"); + +// Module-level package path map, populated in main() before any extraction +let PKG_MAP: Map<string, string> = new Map(); + +// --------------------------------------------------------------------------- +// Types +// --------------------------------------------------------------------------- + +interface ExportEntry { + /** The local alias used in the barrel (what consumers import) */ + exportedName: string; + /** Original name in the source file (before `as` rename) */ + originalName: string; + /** Absolute path to the originating source .ts file */ + sourceFile: string; + /** Whether it's a type-only export */ + isTypeOnly: boolean; +} + +interface InterfaceMember { + /** e.g. "execute(model: CmsModel, input: Input): Promise<Result<...>>" */ + signature: string; + /** JSDoc on this specific member */ + jsDoc: string; +} + +interface NamespaceMember { + /** e.g. "Interface" */ + name: string; + /** e.g. "ICreateEntryUseCase" or "Promise<Result<CmsEntry, Error>>" */ + value: string; +} + +interface EventPayloadField { + name: string; + typeText: string; + optional: boolean; +} + +type AbstractionKind = "useCase" | "eventHandler" | "service"; + +interface ExtractedSymbol { + name: string; + kind: + | "abstraction" + | "interface" + | "class" + | "namespace" + | "function" + | "variable" + | "type" + | "enum" + | "other"; + isTypeOnly: boolean; + /** Full text of the declaration (interface body, class signature, etc.) */ + declarationText: string; + /** JSDoc comment attached to the declaration */ + jsDoc: string; + /** Namespace members if kind === 'namespace' */ + namespaceMembers: string[]; + sourceFile: string; + + // --- Abstraction-specific enrichment --- + /** Set when kind === 'abstraction' */ + abstractionKind?: AbstractionKind; + /** The resolved Interface members (from IFoo that createAbstraction<IFoo> wraps) */ + interfaceMembers?: InterfaceMember[]; + /** Resolved namespace type members: Interface, Input, Return, Error, Event, etc. */ + namespaceTypes?: NamespaceMember[]; + /** For eventHandler: the payload fields of the event */ + eventPayloadFields?: EventPayloadField[]; + /** For eventHandler: the event type name e.g. "EntryBeforeCreateEvent" */ + eventTypeName?: string; + /** For eventHandler: the payload interface name */ + eventPayloadName?: string; +} + +interface EntryPointDoc { + /** e.g. "webiny/api/cms/entry" */ + importPath: string; + /** e.g. "api/cms/entry" */ + relPath: string; + /** Human-readable title */ + title: string; + /** Short description */ + description: string; + /** All symbols exported from this entry point */ + symbols: ExtractedSymbol[]; +} + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +function randomId(): string { + return Math.random().toString(36).slice(2, 10).padEnd(8, "0").slice(0, 8); +} + +/** Convert a barrel-relative path to a human title: "api/cms/entry" -> "CMS Entry" */ +function toTitle(relPath: string): string { + const parts = relPath.split("/"); + const last = parts[parts.length - 1]; + + const specialCases: Record<string, string> = { + api: "API", + cms: "CMS", + graphql: "GraphQL", + ui: "UI", + aco: "ACO", + cli: "CLI", + infra: "Infrastructure", + extensions: "Extensions", + admin: "Admin", + index: "Overview", + buildParams: "Build Params", + eventPublisher: "Event Publisher", + keyValueStore: "Key-Value Store", + tenancy: "Tenancy", + security: "Security", + system: "System", + tasks: "Tasks", + logger: "Logger", + entry: "Entry", + group: "Group", + model: "Model", + field: "Field", + page: "Page", + redirect: "Redirect", + nextjs: "Next.js", + apiKey: "API Key", + authentication: "Authentication", + role: "Role", + user: "User", + lexical: "Lexical Editor", + form: "Form", + router: "Router", + localStorage: "Local Storage", + envConfig: "Env Config", + graphqlClient: "GraphQL Client", + configs: "Configs", + "website-builder": "Website Builder", + "tenant-manager": "Tenant Manager", + command: "Command", + core: "Core" + }; + + const section = + specialCases[last] ?? last.replace(/-/g, " ").replace(/\b\w/g, c => c.toUpperCase()); + const parentSection = + parts.length > 1 ? (specialCases[parts[parts.length - 2]] ?? parts[parts.length - 2]) : ""; + + // Compose a meaningful title from last two segments + if (parts.length === 1) return section; + if (last === "index") return parentSection; + return section; +} + +/** Derive a description string from the entry point path */ +function toDescription(relPath: string): string { + const map: Record<string, string> = { + api: "Core API primitives: createFeature, createAbstraction, Result, BaseError", + "api/logger": "Logger abstraction for server-side logging", + "api/graphql": "GraphQL schema factory and response helpers", + "api/eventPublisher": "Domain event publishing primitives", + "api/keyValueStore": "Key-value store abstraction", + "api/buildParams": "API build parameter types", + "api/tasks": "Background task abstractions: TaskService, TaskDefinition", + "api/system": "System installation abstractions", + "api/tenancy": "Tenancy context and tenant management", + "api/tenant-manager": "Tenant manager abstractions", + "api/security": "Security primitives: Identity, Authenticator, Authorizer", + "api/security/apiKey": "API key use cases and event handlers", + "api/security/authentication": "Authentication event handlers", + "api/security/role": "Role use cases and event handlers", + "api/security/user": "User use cases and event handlers", + "api/cms/entry": "CMS entry use cases and event handlers", + "api/cms/group": "CMS group use cases and event handlers", + "api/cms/model": "CMS model builders, factories, use cases and event handlers", + "api/website-builder/page": "Website Builder page use cases and event handlers", + "api/website-builder/redirect": "Website Builder redirect use cases and event handlers", + "api/website-builder/nextjs": "Next.js configuration abstraction", + admin: "Admin app core: createFeature, createAbstraction, Provider, Plugin", + "admin/ui": "Admin UI component library", + "admin/form": "Form primitives: Bind, Form, useForm, validation", + "admin/aco": "ACO (Advanced Content Organisation) hooks and utilities", + "admin/buildParams": "Admin build parameter types", + "admin/cms": "CMS admin hooks, types and utilities", + "admin/cms/entry/editor": "Content entry editor components and hooks", + "admin/cms/entry/list": "Content entry list configuration", + "admin/cms/fieldRenderers/dynamicZone": "Dynamic zone field renderer components", + "admin/cms/fieldRenderers/object": "Object field renderer components", + "admin/cms/lexical": "CMS Lexical rich-text editor config", + "admin/configs": "Admin configuration types", + "admin/envConfig": "Environment configuration for admin", + "admin/graphqlClient": "GraphQL client hooks and utilities", + "admin/localStorage": "Local storage abstraction and hooks", + "admin/lexical": "Lexical editor components and hooks", + "admin/router": "Router components and hooks", + "admin/security": "Admin security: authentication, identity, permissions", + "admin/tenancy": "Admin tenancy hooks and context", + "admin/website-builder": "Website Builder admin utilities", + "admin/website-builder/lexical": "Website Builder Lexical editor config", + "admin/website-builder/page/editor": "Page editor components", + "admin/website-builder/page/list": "Page list configuration", + "admin/website-builder/redirect/list": "Redirect list configuration", + extensions: "Project extension wiring: Api, Admin, Cli, Infra, Project, EnvVar, FeatureFlags", + "infra/index": "Infrastructure primitives: Logger, Ui, lifecycle hooks", + "infra/api": "API infrastructure lifecycle hooks and Pulumi abstraction", + "infra/admin": "Admin infrastructure lifecycle hooks and Pulumi abstraction", + "infra/core": "Core infrastructure lifecycle hooks and Pulumi abstraction", + "cli/index": "CLI-scoped Logger and Ui abstractions", + "cli/command": "CLI command factory abstraction" + }; + return map[relPath] ?? `Reference for webiny/${relPath}`; +} + +// --------------------------------------------------------------------------- +// Path resolution: @webiny/pkg/path.js -> absolute filesystem path +// --------------------------------------------------------------------------- + +/** Build a map of @webiny/* package names to their src/ directories */ +function buildPackagePathMap(): Map<string, string> { + const map = new Map<string, string>(); + const entries = readFileSync(join(WEBINY_PKG, "tsconfig.json"), "utf-8"); + // strip comments from tsconfig (it's not valid JSON) + const cleaned = entries.replace(/\/\/[^\n]*/g, "").replace(/\/\*[\s\S]*?\*\//g, ""); + const tsconfig = JSON.parse(cleaned); + const paths: Record<string, string[]> = tsconfig?.compilerOptions?.paths ?? {}; + + for (const [alias, targets] of Object.entries(paths)) { + if (!alias.startsWith("@webiny/")) continue; + const rawTarget = targets[0]; + if (!rawTarget) continue; + // e.g. "../api-core/src/*" -> /abs/path/to/api-core/src + const resolved = join(WEBINY_PKG, rawTarget.replace(/\/\*$/, "").replace(/\*$/, "")); + // strip trailing /src to get the package root, store both with and without + const pkgAlias = alias.replace(/\/\*$/, ""); + map.set(pkgAlias, resolved); + } + return map; +} + +/** Resolve "@webiny/api-core/features/task/TaskDefinition/index.js" to absolute path */ +function resolveWebinyImport(importPath: string, pkgMap: Map<string, string>): string | null { + for (const [alias, srcDir] of Array.from(pkgMap.entries())) { + if (importPath.startsWith(alias + "/")) { + const rest = importPath.slice(alias.length + 1).replace(/\.js$/, ".ts"); + return join(srcDir, rest); + } + if (importPath === alias) { + return join(srcDir, "index.ts"); + } + } + return null; +} + +// --------------------------------------------------------------------------- +// Barrel parsing: collect all re-exported names from a barrel .ts file +// --------------------------------------------------------------------------- + +function parseBarrel(sf: SourceFile, pkgMap: Map<string, string>): ExportEntry[] { + const entries: ExportEntry[] = []; + + for (const decl of sf.getExportDeclarations()) { + const moduleSpecifier = decl.getModuleSpecifierValue(); + if (!moduleSpecifier) continue; + + const resolvedPath = resolveWebinyImport(moduleSpecifier, pkgMap); + if (!resolvedPath) continue; + + const isTypeOnly = decl.isTypeOnly(); + const namedExports = decl.getNamedExports(); + + if (namedExports.length === 0) { + // export * from "..." + entries.push({ + exportedName: "*", + originalName: "*", + sourceFile: resolvedPath, + isTypeOnly + }); + } else { + for (const ne of namedExports) { + entries.push({ + exportedName: ne.getAliasNode()?.getText() ?? ne.getNameNode().getText(), + originalName: ne.getNameNode().getText(), + sourceFile: resolvedPath, + isTypeOnly: isTypeOnly || ne.isTypeOnly() + }); + } + } + } + + return entries; +} + +// --------------------------------------------------------------------------- +// Symbol extraction from a source file +// --------------------------------------------------------------------------- + +function extractJsDoc(node: Node): string { + const jsDocNodes = node.getChildrenOfKind(SyntaxKind.JSDoc); + if (jsDocNodes.length === 0) return ""; + return jsDocNodes + .map(jd => jd.getInnerText().trim()) + .filter(Boolean) + .join("\n"); +} + +function cleanDeclarationText(text: string): string { + return text + .replace(/\{[\s\S]*\}/g, match => { + if (match.length < 200 && !match.includes("return ") && !match.includes("const ")) { + return match; + } + return "{ ... }"; + }) + .trim(); +} + +// Isolated project for interface extraction (avoids cross-file resolution issues) +let _isolatedProject: Project | null = null; +function getIsolatedProject(): Project { + if (!_isolatedProject) { + _isolatedProject = new Project({ + useInMemoryFileSystem: false, + skipAddingFilesFromTsConfig: true + }); + } + return _isolatedProject; +} + +/** + * Search a source file (and any files it re-exports from) for an interface by name. + * Returns the interface members, or [] if not found. + */ +function extractInterfaceMembers( + sf: SourceFile, + interfaceName: string, + pkgMap?: Map<string, string>, + visited = new Set<string>() +): InterfaceMember[] { + const filePath = sf.getFilePath(); + if (visited.has(filePath)) return []; + visited.add(filePath); + + // Search all interfaces in this file + const allIfaces = [ + ...sf.getInterfaces(), + ...sf.getStatements().filter(Node.isInterfaceDeclaration) + ].filter(Node.isInterfaceDeclaration); + + const iface = allIfaces.find(i => i.getName() === interfaceName); + if (iface) { + return iface.getMembers().map(m => ({ + signature: m.getText().trim().replace(/;$/, ""), + jsDoc: extractJsDoc(m) + })); + } + + // Raw text fallback for this file + const src = sf.getFullText(); + const rawMatch = src.match( + new RegExp(`interface\\s+${interfaceName}\\s*(?:<[^{]*>)?\\s*\\{([^}]+)\\}`) + ); + if (rawMatch) { + return rawMatch[1] + .split("\n") + .map(l => l.trim()) + .filter(l => l && !l.startsWith("//") && l !== "{" && l !== "}") + .map(l => ({ signature: l.replace(/;$/, ""), jsDoc: "" })); + } + + // Follow re-exports into sibling files (handles index.ts -> abstractions.ts pattern) + if (pkgMap) { + for (const decl of sf.getExportDeclarations()) { + const modSpec = decl.getModuleSpecifierValue(); + if (!modSpec) continue; + + let resolvedPath: string | null = null; + if (modSpec.startsWith(".")) { + // Relative import — resolve relative to this file's directory + const dir = sf.getDirectoryPath(); + resolvedPath = join(dir, modSpec.replace(/\.js$/, ".ts")); + } else { + resolvedPath = resolveWebinyImport(modSpec, pkgMap); + } + + if (!resolvedPath || !existsSync(resolvedPath)) continue; + + try { + const siblingSf = sf.getProject().addSourceFileAtPath(resolvedPath); + const result = extractInterfaceMembers(siblingSf, interfaceName, pkgMap, visited); + if (result.length > 0) return result; + } catch { + continue; + } + } + } + + return []; +} + +/** Extract fields from an interface declaration as EventPayloadField[] */ +function extractPayloadFields(sf: SourceFile, interfaceName: string): EventPayloadField[] { + // Try AST first + const iface = [ + ...sf.getInterfaces(), + ...sf.getStatements().filter(Node.isInterfaceDeclaration) + ].find(i => Node.isInterfaceDeclaration(i) && i.getName() === interfaceName); + + if (iface && Node.isInterfaceDeclaration(iface)) { + return iface.getProperties().map(p => ({ + name: p.getName(), + typeText: p.getTypeNode()?.getText() ?? "unknown", + optional: p.hasQuestionToken() + })); + } + + // Raw text fallback + const src = sf.getFullText(); + const regex = new RegExp(`interface\\s+${interfaceName}\\s*\\{([^}]+)\\}`); + const match = src.match(regex); + if (!match) return []; + + return match[1] + .split("\n") + .map(l => l.trim()) + .filter(l => l && !l.startsWith("//")) + .map(l => { + const propMatch = l.match(/^(\w+)(\?)?:\s*(.+?);?$/); + if (!propMatch) return null; + return { name: propMatch[1], typeText: propMatch[3], optional: !!propMatch[2] }; + }) + .filter((f): f is EventPayloadField => f !== null); +} + +/** Extract namespace type members as NamespaceMember[] */ +function extractNamespaceTypes(sf: SourceFile, namespaceName: string): NamespaceMember[] { + const allModules = sf.getModules(); + const ns = allModules.find(m => m.getName() === namespaceName); + if (!ns) return []; + + const body = ns.getBody(); + if (!body || !Node.isModuleBlock(body)) return []; + + const members: NamespaceMember[] = []; + for (const stmt of body.getStatements()) { + if (Node.isTypeAliasDeclaration(stmt)) { + const typeNode = stmt.getTypeNode(); + members.push({ + name: stmt.getName(), + value: typeNode?.getText() ?? stmt.getText() + }); + } else if (Node.isInterfaceDeclaration(stmt)) { + members.push({ name: stmt.getName() ?? "", value: "interface" }); + } else if (Node.isExportDeclaration(stmt)) { + members.push({ name: "", value: stmt.getText() }); + } + } + return members.filter(m => m.name); +} + +/** + * If a variable declaration is `createAbstraction<IFoo>(...)` or + * `createAbstraction<IEventHandler<SomeEvent>>(...)`, return the generic arg text. + * Handles nested generics by counting angle brackets. + */ +function getCreateAbstractionGeneric(node: Node): string | null { + if (!Node.isVariableDeclaration(node)) return null; + const initializer = node.getInitializer(); + if (!initializer) return null; + + const txt = initializer.getText().replace(/\s+/g, " "); + const startKeyword = "createAbstraction<"; + const idx = txt.indexOf(startKeyword); + if (idx === -1) return null; + + // Walk from after the '<', counting depth to find the matching '>' + let depth = 1; + let i = idx + startKeyword.length; + let start = i; + while (i < txt.length && depth > 0) { + if (txt[i] === "<") depth++; + else if (txt[i] === ">") depth--; + i++; + } + if (depth !== 0) return null; + return txt.slice(start, i - 1).trim(); +} + +/** + * Classify an abstraction based on its name and generic type arg. + */ +function classifyAbstraction(name: string, genericArg: string): AbstractionKind { + if (name.endsWith("EventHandler") || name.endsWith("Handler")) return "eventHandler"; + if (name.endsWith("UseCase") || name.endsWith("Repository")) return "useCase"; + return "service"; +} + +/** + * For an IEventHandler<SomeEvent> generic arg, extract the event class name. + * e.g. "IEventHandler<EntryBeforeCreateEvent>" -> "EntryBeforeCreateEvent" + * Also handles "IEventHandler<DomainEvent<SomePayload>>" -> "DomainEvent<SomePayload>" + */ +function extractEventTypeName(genericArg: string): string | null { + // Simple case: IEventHandler<SomeNamedClass> + const simple = genericArg.match(/IEventHandler\s*<\s*(\w+)\s*>/); + if (simple) return simple[1]; + // Nested case: IEventHandler<DomainEvent<SomePayload>> + const nested = genericArg.match(/IEventHandler\s*<\s*(DomainEvent\s*<\s*\w+\s*>)\s*>/); + if (nested) return nested[1]; + return null; +} + +/** + * For an IEventHandler<DomainEvent<SomePayload>> generic arg, extract the payload name directly. + * e.g. "IEventHandler<DomainEvent<PageBeforeCreatePayload>>" -> "PageBeforeCreatePayload" + */ +function extractPayloadNameFromGenericArg(genericArg: string): string | null { + const m = genericArg.match(/IEventHandler\s*<\s*DomainEvent\s*<\s*(\w+)\s*>/); + return m ? m[1] : null; +} + +/** + * Find the payload interface name from an event class in the source file. + * Looks for: class SomeEvent extends DomainEvent<SomePayload> + */ +function extractEventPayloadInterfaceName(sf: SourceFile, eventClassName: string): string | null { + // Try AST first + const cls = sf.getClasses().find(c => c.getName() === eventClassName); + if (cls) { + const extendsClause = cls.getExtends(); + if (extendsClause) { + const m = extendsClause.getText().match(/DomainEvent\s*<\s*(\w+)\s*>/); + if (m) return m[1]; + } + } + // Raw text fallback: class SomeEvent extends DomainEvent<SomePayload> + const src = sf.getFullText(); + const regex = new RegExp( + `class\\s+${eventClassName}\\s+extends\\s+DomainEvent\\s*<\\s*(\\w+)\\s*>` + ); + const m = src.match(regex); + return m ? m[1] : null; +} + +function extractSymbol(sf: SourceFile, name: string): ExtractedSymbol | null { + const allExported = sf.getExportedDeclarations(); + + for (const [exportName, decls] of Array.from(allExported.entries())) { + if (exportName !== name) continue; + if (decls.length === 0) continue; + + // When a name has both a VariableDeclaration and a ModuleDeclaration (namespace), + // prefer the variable and merge namespace types in below. + const varDecl = decls.find(d => Node.isVariableDeclaration(d)); + const nsDecl = decls.find(d => Node.isModuleDeclaration(d)); + const node = varDecl ?? decls[0]; + const jsDoc = extractJsDoc(node); + + // ----------------------------------------------------------------------- + // Interface + // ----------------------------------------------------------------------- + if (Node.isInterfaceDeclaration(node)) { + return { + name, + kind: "interface", + isTypeOnly: true, + declarationText: cleanDeclarationText(node.getText()), + jsDoc, + namespaceMembers: [], + sourceFile: sf.getFilePath() + }; + } + + // ----------------------------------------------------------------------- + // Class + // ----------------------------------------------------------------------- + if (Node.isClassDeclaration(node)) { + const members = node + .getMembers() + .map(m => { + const txt = m.getText().trim(); + return txt.replace(/\{[\s\S]*$/, "").trim() + (txt.includes("{") ? ";" : ""); + }) + .filter(Boolean); + + const classHead = node.getText().split("{")[0].trim(); + const body = members.length ? "\n " + members.join("\n ") + "\n" : ""; + return { + name, + kind: "class", + isTypeOnly: false, + declarationText: `${classHead} {${body}}`, + jsDoc, + namespaceMembers: [], + sourceFile: sf.getFilePath() + }; + } + + // ----------------------------------------------------------------------- + // Namespace — skip here, handled separately in enrichment pass + // ----------------------------------------------------------------------- + if (Node.isModuleDeclaration(node)) { + const members: string[] = []; + const body = node.getBody(); + if (body && Node.isModuleBlock(body)) { + for (const stmt of body.getStatements()) { + members.push(stmt.getText().trim()); + } + } + return { + name, + kind: "namespace", + isTypeOnly: true, + declarationText: node.getText().split("{")[0].trim(), + jsDoc, + namespaceMembers: members, + sourceFile: sf.getFilePath() + }; + } + + // ----------------------------------------------------------------------- + // Function + // ----------------------------------------------------------------------- + if ( + Node.isFunctionDeclaration(node) || + Node.isArrowFunction(node) || + Node.isFunctionExpression(node) + ) { + const txt = node.getText().trim(); + return { + name, + kind: "function", + isTypeOnly: false, + declarationText: txt.replace(/\{[\s\S]*$/, "").trim(), + jsDoc, + namespaceMembers: [], + sourceFile: sf.getFilePath() + }; + } + + // ----------------------------------------------------------------------- + // Variable — detect createAbstraction() and enrich + // ----------------------------------------------------------------------- + if (Node.isVariableDeclaration(node)) { + const genericArg = getCreateAbstractionGeneric(node); + + if (genericArg) { + // It's an abstraction token — resolve the wrapped interface + const abstractionKind = classifyAbstraction(name, genericArg); + const interfaceMembers: InterfaceMember[] = []; + const eventPayloadFields: EventPayloadField[] = []; + let eventTypeName: string | undefined; + let eventPayloadName: string | undefined; + + if (abstractionKind === "eventHandler") { + // IEventHandler<SomeEvent> or IEventHandler<DomainEvent<SomePayload>> + eventTypeName = extractEventTypeName(genericArg) ?? undefined; + if (eventTypeName) { + // If eventTypeName is a simple class name (e.g. EntryBeforeCreateEvent), + // find the payload via its extends clause. Otherwise (DomainEvent<X>), + // extract payload name directly from the generic arg. + const isDomainEventWrapper = eventTypeName.startsWith("DomainEvent"); + if (isDomainEventWrapper) { + eventPayloadName = extractPayloadNameFromGenericArg(genericArg) ?? undefined; + } else { + eventPayloadName = extractEventPayloadInterfaceName(sf, eventTypeName) ?? undefined; + } + if (eventPayloadName) { + const fields = extractPayloadFields(sf, eventPayloadName); + eventPayloadFields.push(...fields); + } + } + // The handle() method signature — use the specific event type + interfaceMembers.push({ + signature: `handle(event: ${eventTypeName ?? "DomainEvent<unknown>"}): Promise<void>`, + jsDoc: "" + }); + } else { + // useCase or service — resolve the IFoo interface, following re-exports + const resolved = extractInterfaceMembers(sf, genericArg, PKG_MAP); + interfaceMembers.push(...resolved); + } + + // Extract namespace types — first try the co-located nsDecl, then search by name + let namespaceTypes = nsDecl + ? (() => { + const body = (nsDecl as any).getBody?.(); + if (!body || !Node.isModuleBlock(body)) return []; + const members: NamespaceMember[] = []; + for (const stmt of body.getStatements()) { + if (Node.isTypeAliasDeclaration(stmt)) { + const typeNode = stmt.getTypeNode(); + members.push({ + name: stmt.getName(), + value: typeNode?.getText() ?? stmt.getText() + }); + } + } + return members; + })() + : extractNamespaceTypes(sf, name); + + return { + name, + kind: "abstraction", + isTypeOnly: false, + declarationText: "", + jsDoc, + namespaceMembers: [], + sourceFile: sf.getFilePath(), + abstractionKind, + interfaceMembers, + namespaceTypes, + eventPayloadFields, + eventTypeName, + eventPayloadName + }; + } + + // Regular variable + const parent = node.getParent(); + const gp = parent?.getParent(); + const txt = gp ? gp.getText().trim() : node.getText().trim(); + return { + name, + kind: "variable", + isTypeOnly: false, + declarationText: txt.slice(0, 400), + jsDoc, + namespaceMembers: [], + sourceFile: sf.getFilePath() + }; + } + + // ----------------------------------------------------------------------- + // Type alias + // ----------------------------------------------------------------------- + if (Node.isTypeAliasDeclaration(node)) { + return { + name, + kind: "type", + isTypeOnly: true, + declarationText: cleanDeclarationText(node.getText()), + jsDoc, + namespaceMembers: [], + sourceFile: sf.getFilePath() + }; + } + + // ----------------------------------------------------------------------- + // Enum + // ----------------------------------------------------------------------- + if (Node.isEnumDeclaration(node)) { + return { + name, + kind: "enum", + isTypeOnly: false, + declarationText: node.getText().trim(), + jsDoc, + namespaceMembers: [], + sourceFile: sf.getFilePath() + }; + } + + // Fallback + return { + name, + kind: "other", + isTypeOnly: false, + declarationText: node.getText().slice(0, 300).trim(), + jsDoc, + namespaceMembers: [], + sourceFile: sf.getFilePath() + }; + } + + return null; +} + +/** + * After all symbols for an entry point are collected, pair each abstraction + * with its corresponding namespace symbol (same name) to merge namespace types. + * Namespaces are exported separately from their abstraction constant — + * e.g. both `Logger` (variable) and `Logger` (namespace) are exported. + * ts-morph returns each separately; we collapse them here. + */ +function mergeNamespaceSymbols(symbols: ExtractedSymbol[]): ExtractedSymbol[] { + const merged: ExtractedSymbol[] = []; + const nsMap = new Map<string, ExtractedSymbol>(); + + // First pass: collect namespaces + for (const sym of symbols) { + if (sym.kind === "namespace") { + nsMap.set(sym.name, sym); + } + } + + for (const sym of symbols) { + if (sym.kind === "namespace") continue; // will be merged into abstraction + + if (sym.kind === "abstraction") { + const ns = nsMap.get(sym.name); + if ( + ns && + ns.namespaceMembers.length > 0 && + (!sym.namespaceTypes || sym.namespaceTypes.length === 0) + ) { + // Parse namespace members into NamespaceMember[] + const parsed: NamespaceMember[] = []; + for (const m of ns.namespaceMembers) { + const typeMatch = m.match(/export\s+type\s+(\w+)\s*(?:<[^>]*>)?\s*=\s*([\s\S]+?);/); + if (typeMatch) { + parsed.push({ name: typeMatch[1], value: typeMatch[2].trim() }); + } + } + merged.push({ ...sym, namespaceTypes: parsed.length ? parsed : sym.namespaceTypes }); + } else { + merged.push(sym); + } + } else { + merged.push(sym); + } + } + + return merged; +} + +// --------------------------------------------------------------------------- +// MDX rendering +// --------------------------------------------------------------------------- + +interface SymbolGroup { + title: string; + symbols: ExtractedSymbol[]; +} + +/** + * Group symbols into logical sections depending on the entry point layer (api vs admin). + * Returns groups in display order, skipping empty groups. + */ +function groupSymbols(relPath: string, symbols: ExtractedSymbol[]): SymbolGroup[] { + const layer = relPath.split("/")[0]; // "api" | "admin" | "infra" | "cli" | "extensions" + + if (layer === "api") { + const useCases = symbols.filter( + s => s.kind === "abstraction" && s.abstractionKind === "useCase" + ); + const handlers = symbols.filter( + s => s.kind === "abstraction" && s.abstractionKind === "eventHandler" + ); + const services = symbols.filter( + s => s.kind === "abstraction" && s.abstractionKind === "service" + ); + const rest = symbols.filter(s => s.kind !== "abstraction"); + + return [ + { title: "Use Cases", symbols: useCases }, + { title: "Event Handlers", symbols: handlers }, + { title: "Services", symbols: services }, + { title: "Types & Classes", symbols: rest } + ].filter(g => g.symbols.length > 0); + } + + if (layer === "admin") { + const hooks = symbols.filter( + s => + (s.kind === "function" || s.kind === "variable") && + s.name.startsWith("use") && + s.name.length > 3 && + s.name[3] === s.name[3].toUpperCase() + ); + const hookNames = new Set(hooks.map(s => s.name)); + const components = symbols.filter( + s => + !hookNames.has(s.name) && + (s.kind === "variable" || s.kind === "function" || s.kind === "class") && + s.name[0] === s.name[0].toUpperCase() && + s.name[0] !== s.name[0].toLowerCase() + ); + const componentNames = new Set(components.map(s => s.name)); + const types = symbols.filter( + s => + !hookNames.has(s.name) && + !componentNames.has(s.name) && + (s.kind === "type" || s.kind === "interface") + ); + const typeNames = new Set(types.map(s => s.name)); + const rest = symbols.filter( + s => !hookNames.has(s.name) && !componentNames.has(s.name) && !typeNames.has(s.name) + ); + + return [ + { title: "Components", symbols: components }, + { title: "Hooks", symbols: hooks }, + { title: "Types", symbols: types }, + { title: "Other", symbols: rest } + ].filter(g => g.symbols.length > 0); + } + + // For infra, cli, extensions — no grouping, single flat group + return [{ title: "", symbols }]; +} + +function renderLearnBlock(relPath: string, symbols: ExtractedSymbol[]): string { + const useCases = symbols.filter(s => s.name.endsWith("UseCase")); + const handlers = symbols.filter(s => s.name.endsWith("EventHandler")); + const builders = symbols.filter(s => s.name.endsWith("Builder") || s.name.endsWith("Factory")); + const components = symbols.filter( + s => + s.kind === "class" || + (s.name[0] === s.name[0].toUpperCase() && + !s.name.endsWith("UseCase") && + !s.name.endsWith("EventHandler")) + ); + + const bullets: string[] = []; + + if (useCases.length > 0) bullets.push(`- What use cases are available in \`webiny/${relPath}\`?`); + if (handlers.length > 0) bullets.push(`- Which event handlers can you implement?`); + if (builders.length > 0) bullets.push(`- How to use the builder and factory APIs?`); + if (bullets.length === 0) bullets.push(`- What is exported from \`webiny/${relPath}\`?`); + bullets.push(`- How to import and use each exported item?`); + + return bullets.join("\n"); +} + +function kindLabel(sym: ExtractedSymbol): string { + if (sym.kind === "abstraction") { + if (sym.abstractionKind === "eventHandler") return "Event Handler Abstraction"; + if (sym.abstractionKind === "useCase") return "Use Case Abstraction"; + return "Abstraction"; + } + if (sym.isTypeOnly && sym.kind !== "namespace") return "Type"; + const map: Record<string, string> = { + interface: "Interface", + class: "Class", + namespace: "Namespace", + function: "Function", + variable: "Constant", + type: "Type", + enum: "Enum", + other: "Export" + }; + return map[sym.kind] ?? "Export"; +} + +function renderUsageSnippet( + sym: ExtractedSymbol, + importPath: string +): { file: string; body: string } | null { + if (sym.kind !== "abstraction") return null; + + const lines: string[] = []; + + if (sym.abstractionKind === "eventHandler") { + lines.push(`import { ${sym.name} } from "${importPath}";`); + lines.push(``); + lines.push(`class MyHandler implements ${sym.name}.Interface {`); + lines.push(` public constructor(/* inject dependencies here */) {}`); + lines.push(``); + lines.push(` public async handle(event: ${sym.name}.Event): Promise<void> {`); + if (sym.eventPayloadFields && sym.eventPayloadFields.length > 0) { + const fields = sym.eventPayloadFields.map(f => f.name).join(", "); + lines.push(` const { ${fields} } = event.payload;`); + } else { + lines.push(` // implementation`); + } + lines.push(` }`); + lines.push(`}`); + lines.push(``); + lines.push(`export default ${sym.name}.createImplementation({`); + lines.push(` implementation: MyHandler,`); + lines.push(` dependencies: []`); + lines.push(`});`); + } else { + // use case or service abstraction — show it being injected and called + const paramName = sym.name.charAt(0).toLowerCase() + sym.name.slice(1); + + // Pick a representative method to call: prefer common primary names, fall back to first + const PREFERRED = [ + "execute", + "handle", + "get", + "list", + "create", + "info", + "log", + "map", + "resolve", + "build" + ]; + const pick = + sym.interfaceMembers && sym.interfaceMembers.length > 0 + ? (PREFERRED.map(p => + sym.interfaceMembers!.find( + m => m.signature.startsWith(p + "(") || m.signature.startsWith(p + "<") + ) + ).find(Boolean) ?? sym.interfaceMembers[0]) + : null; + // Strip generic type params from call site (e.g. "map<T extends X>" -> "map") + const methodName = pick ? pick.signature.split("(")[0].split("<")[0].trim() : null; + const isAsync = pick ? pick.signature.includes("Promise<") : false; + + lines.push(`import { ${sym.name} } from "${importPath}";`); + lines.push(``); + lines.push(`class MyImpl implements MyUseCase.Interface {`); + lines.push(` public constructor(private ${paramName}: ${sym.name}.Interface) {}`); + lines.push(``); + lines.push(` public async execute(/* ... */): Promise<void> {`); + if (methodName) { + lines.push(` ${isAsync ? "await " : ""}this.${paramName}.${methodName}(/* ... */);`); + } + lines.push(` }`); + lines.push(`}`); + lines.push(``); + lines.push(`export default MyUseCase.createImplementation({`); + lines.push(` implementation: MyImpl,`); + lines.push(` dependencies: [${sym.name}]`); + lines.push(`});`); + } + + // file is declared in each branch above + const file = + sym.abstractionKind === "eventHandler" ? "extensions/MyHandler.ts" : "extensions/MyImpl.ts"; + return { file, body: lines.join("\n") }; +} + +function renderSymbolSection( + sym: ExtractedSymbol, + importPath: string, + headingLevel: 2 | 3 | 4 = 2 +): string { + const label = kindLabel(sym); + const lines: string[] = []; + const hashes = "#".repeat(headingLevel); + + lines.push(`${hashes} \`${sym.name}\``); + lines.push(""); + lines.push(`**${label}** — imported from \`${importPath}\``); + lines.push(""); + + if (sym.jsDoc) { + lines.push(sym.jsDoc); + lines.push(""); + } + + // Import snippet + const importKeyword = sym.isTypeOnly && sym.kind !== "namespace" ? "import type" : "import"; + lines.push("```typescript"); + lines.push(`${importKeyword} { ${sym.name} } from "${importPath}";`); + lines.push("```"); + lines.push(""); + + // ------------------------------------------------------------------------- + // Abstraction: rich rendering + // ------------------------------------------------------------------------- + if (sym.kind === "abstraction") { + // Interface section + if (sym.interfaceMembers && sym.interfaceMembers.length > 0) { + lines.push(`**Interface \`${sym.name}.Interface\`:**`); + lines.push(""); + lines.push("```typescript"); + lines.push(`interface ${sym.name}.Interface {`); + for (const m of sym.interfaceMembers) { + if (m.jsDoc) { + for (const docLine of m.jsDoc.split("\n")) { + lines.push(` // ${docLine}`); + } + } + lines.push(` ${m.signature};`); + } + lines.push("}"); + lines.push("```"); + lines.push(""); + } + + // Event payload section + if ( + sym.abstractionKind === "eventHandler" && + sym.eventPayloadFields && + sym.eventPayloadFields.length > 0 + ) { + lines.push(`**Event payload \`${sym.eventPayloadName ?? "payload"}\`:**`); + lines.push(""); + lines.push("```typescript"); + lines.push(`interface ${sym.eventPayloadName ?? "Payload"} {`); + for (const f of sym.eventPayloadFields) { + lines.push(` ${f.name}${f.optional ? "?" : ""}: ${f.typeText};`); + } + lines.push("}"); + lines.push("```"); + lines.push(""); + } + + // Namespace types section + if (sym.namespaceTypes && sym.namespaceTypes.length > 0) { + lines.push(`**Types:**`); + lines.push(""); + lines.push("```typescript"); + lines.push(`namespace ${sym.name} {`); + for (const t of sym.namespaceTypes) { + lines.push(` type ${t.name} = ${t.value};`); + } + lines.push("}"); + lines.push("```"); + lines.push(""); + } + + // Usage snippet + const usage = renderUsageSnippet(sym, importPath); + if (usage) { + lines.push(`**Usage:**`); + lines.push(""); + lines.push(`\`\`\`typescript ${usage.file}`); + lines.push(usage.body); + lines.push("```"); + lines.push(""); + } + + return lines.join("\n"); + } + + // ------------------------------------------------------------------------- + // Plain declaration + // ------------------------------------------------------------------------- + if (sym.declarationText && sym.declarationText.length > 0) { + lines.push("```typescript"); + lines.push(sym.declarationText); + lines.push("```"); + lines.push(""); + } + + // Namespace members (raw, for non-abstraction namespaces) + if (sym.kind === "namespace" && sym.namespaceMembers.length > 0) { + lines.push("```typescript"); + lines.push(`namespace ${sym.name} {`); + for (const m of sym.namespaceMembers) { + lines.push(` ${m}`); + } + lines.push("}"); + lines.push("```"); + lines.push(""); + } + + return lines.join("\n"); +} + +// --------------------------------------------------------------------------- +// Extensions page — defineExtension-aware extraction + rendering +// --------------------------------------------------------------------------- + +interface ExtParamEntry { + name: string; + type: string; + required: boolean; + description: string; + /** Raw live Zod schema node — used to expand complex types in footnotes */ + schema?: any; +} + +interface ExtensionEntry { + /** Dot-notation namespace path, e.g. "Infra.Admin.BeforeBuild" */ + path: string; + /** Value of the `type` field, e.g. "Admin/BeforeBuild" */ + extensionType: string; + description: string; + multiple: boolean; + params: ExtParamEntry[]; +} + +// Minimal mock context for paramsSchema functions that receive ({ project }) => z.object(...) +const EXT_MOCK_CTX = { + project: { + paths: { + projectFolder: { toString: () => "/project", join: (...a: string[]) => a.join("/") }, + workspaceFolder: { toString: () => "/project", join: (...a: string[]) => a.join("/") } + }, + config: {} + } +}; + +/** Resolve a live Zod schema from a paramsSchema value (direct schema or function) */ +function resolveParamsSchema(paramsSchema: unknown): unknown { + if (!paramsSchema) return null; + if (typeof paramsSchema === "function") { + try { + return (paramsSchema as Function)(EXT_MOCK_CTX); + } catch { + return null; + } + } + return paramsSchema; +} + +/** Map a live Zod type instance to a readable type string */ +function liveZodTypeName(schema: any): string { + const t: string = schema?._def?.typeName ?? ""; + // Unwrap modifiers + if (t === "ZodOptional" || t === "ZodDefault") return liveZodTypeName(schema._def.innerType); + const map: Record<string, string> = { + ZodString: "string", + ZodBoolean: "boolean", + ZodNumber: "number", + ZodArray: "array", + ZodObject: "object", + ZodUnion: "union", + ZodEnum: "enum", + ZodRecord: "record", + ZodAny: "any", + // zodSrcPath returns a ZodEffects (transform/refine wrapper around ZodString) + ZodEffects: "string" + }; + return map[t] ?? t.replace(/^Zod/, "").toLowerCase(); +} + +/** Unwrap ZodOptional/ZodDefault to get the inner schema */ +function unwrapZod(schema: any): any { + const t = schema?._def?.typeName; + if (t === "ZodOptional" || t === "ZodDefault") return unwrapZod(schema._def.innerType); + return schema; +} + +/** Recursively extract params from a live ZodObject schema, dot-notating nested objects */ +function liveZodObjectParams(schema: any, prefix: string): ExtParamEntry[] { + if (unwrapZod(schema)?._def?.typeName !== "ZodObject") return []; + const obj = unwrapZod(schema); + const results: ExtParamEntry[] = []; + for (const [key, val] of Object.entries(obj.shape as Record<string, any>)) { + const name = prefix ? `${prefix}.${key}` : key; + const type = liveZodTypeName(val); + const optional = val.isOptional?.() ?? false; + const innerDef = unwrapZod(val)?._def; + const description = innerDef?.description ?? ""; + results.push({ name, type, required: !optional, description, schema: val }); + // Recurse into nested ZodObject (so nested fields also appear in the table) + if (type === "object") { + results.push(...liveZodObjectParams(unwrapZod(val), name)); + } + } + return results; +} + +/** Walk a live runtime namespace object, calling getDefinition() on each leaf */ +function walkRuntimeNamespace(obj: any, path: string, results: ExtensionEntry[]) { + if (!obj || (typeof obj !== "object" && typeof obj !== "function")) return; + if (typeof obj.getDefinition === "function") { + const def = obj.getDefinition(); + const schema = resolveParamsSchema(def.paramsSchema); + const params = schema ? liveZodObjectParams(schema, "") : []; + results.push({ + path, + extensionType: def.type ?? path, + description: def.description ?? "", + multiple: def.multiple ?? false, + params + }); + return; + } + // Plain object namespace — recurse + for (const [k, v] of Object.entries(obj)) { + if (v && (typeof v === "function" || typeof v === "object")) { + walkRuntimeNamespace(v, path ? `${path}.${k}` : k, results); + } + } +} + +/** + * Extract all defineExtension entries by dynamically importing the compiled dist files. + * Uses real Zod schema instances — no AST text parsing. + */ +async function extractExtensions(): Promise<ExtensionEntry[]> { + const PROJECT_DIST = `${WEBINY_MONOREPO}/project/dist`; + const PROJECT_AWS_DIST = `${WEBINY_MONOREPO}/project-aws/dist`; + + // Import compiled dist barrels — these use fully-resolved relative imports, no alias issues + const [projectAws, project] = await Promise.all([ + import(PROJECT_AWS_DIST + "/index.js"), + import(PROJECT_DIST + "/extensions/index.js") + ]); + + const namespaces: Record<string, any> = { + Api: projectAws.Api, + Admin: projectAws.Admin, + Cli: projectAws.Cli, + Infra: projectAws.Infra, + Project: projectAws.Project + }; + + const results: ExtensionEntry[] = []; + for (const [name, val] of Object.entries(namespaces)) { + walkRuntimeNamespace(val, name, results); + } + return results; +} + +/** Render the param type as a readable string */ +function renderParamType(p: ExtParamEntry): string { + if (p.type === "unknown") return "string"; // zodSrcPath and similar are always strings + return p.type; +} + +/** + * Returns true if a Zod schema node is "complex" — i.e. needs its own sub-section + * rather than just a type name in the table. + */ +function isComplexZodType(schema: any): boolean { + const t: string = unwrapZod(schema)?._def?.typeName ?? ""; + if (t === "ZodObject") return Object.keys(unwrapZod(schema).shape as object).length > 0; + if (t === "ZodUnion") { + return unwrapZod(schema)._def.options.some((o: any) => isComplexZodType(o)); + } + if (t === "ZodArray") return isComplexZodType(unwrapZod(schema)._def.type); + if (t === "ZodTuple") return true; + return false; +} + +/** + * Render a short display type for the table cell — primitive types as-is, + * complex types as a link to their sub-section anchor. + */ +function renderParamTypeCell(p: ExtParamEntry, sectionAnchor: string): string { + if (!p.schema || !isComplexZodType(p.schema)) { + return `\`${renderParamType(p)}\``; + } + // Escape pipes in type labels so they don't break markdown table rendering + const label = renderParamType(p).replace(/\|/g, "\\|"); + return `[${label}](#${sectionAnchor})`; +} + +interface TypeSubSection { + /** Anchor id for the sub-section heading */ + anchor: string; + /** Display heading text */ + heading: string; + /** The live Zod schema to render */ + schema: any; + /** Sub-sections collected recursively from this one */ + children: TypeSubSection[]; +} + +/** + * Collect all TypeSubSections needed for a list of top-level params. + * Walks recursively — objects inside unions get their own sub-sections too. + */ +function collectSubSections(params: ExtParamEntry[], anchorPrefix: string): TypeSubSection[] { + const sections: TypeSubSection[] = []; + + for (const p of params) { + if (!p.schema || !isComplexZodType(p.schema)) continue; + const inner = unwrapZod(p.schema); + const t: string = inner?._def?.typeName ?? ""; + const anchor = slugify(`${anchorPrefix}-${p.name}`); + + if (t === "ZodObject") { + const childParams: ExtParamEntry[] = Object.entries(inner.shape as Record<string, any>).map( + ([k, v]: [string, any]) => ({ + name: k, + type: liveZodTypeName(v), + required: !(v.isOptional?.() ?? false), + description: unwrapZod(v)?._def?.description ?? "", + schema: v + }) + ); + const children = collectSubSections(childParams, anchor); + sections.push({ anchor, heading: p.name, schema: inner, children }); + } else if (t === "ZodUnion") { + // Each complex union member gets its own sub-section + const children: TypeSubSection[] = []; + inner._def.options.forEach((opt: any, i: number) => { + const optInner = unwrapZod(opt); + const ot: string = optInner?._def?.typeName ?? ""; + if (ot === "ZodObject") { + const optAnchor = slugify(`${anchor}-option-${i + 1}`); + const childParams: ExtParamEntry[] = Object.entries( + optInner.shape as Record<string, any> + ).map(([k, v]: [string, any]) => ({ + name: k, + type: liveZodTypeName(v), + required: !(v.isOptional?.() ?? false), + description: unwrapZod(v)?._def?.description ?? "", + schema: v + })); + const grandchildren = collectSubSections(childParams, optAnchor); + children.push({ + anchor: optAnchor, + heading: `${p.name} (option ${i + 1})`, + schema: optInner, + children: grandchildren + }); + } + }); + sections.push({ anchor, heading: p.name, schema: inner, children }); + } else if (t === "ZodArray") { + const el = unwrapZod(inner._def.type); + if (el?._def?.typeName === "ZodObject") { + const childParams: ExtParamEntry[] = Object.entries(el.shape as Record<string, any>).map( + ([k, v]: [string, any]) => ({ + name: k, + type: liveZodTypeName(v), + required: !(v.isOptional?.() ?? false), + description: unwrapZod(v)?._def?.description ?? "", + schema: v + }) + ); + const children = collectSubSections(childParams, anchor); + sections.push({ anchor, heading: p.name, schema: el, children }); + } + } else if (t === "ZodTuple") { + sections.push({ anchor, heading: p.name, schema: inner, children: [] }); + } + } + + return sections; +} + +/** Render a short inline type label (for table cells and union member lists) */ +function renderZodTypeShort(schema: any): string { + const inner = unwrapZod(schema); + const t: string = inner?._def?.typeName ?? "unknown"; + if (t === "ZodString") return "string"; + if (t === "ZodBoolean") return "boolean"; + if (t === "ZodNumber") return "number"; + if (t === "ZodAny") return "any"; + if (t === "ZodEffects") return "string"; + if (t === "ZodEnum") return inner._def.values.map((v: string) => `"${v}"`).join(" | "); + if (t === "ZodArray") return `${renderZodTypeShort(inner._def.type)}[]`; + if (t === "ZodRecord") return `Record<string, ${renderZodTypeShort(inner._def.valueType)}>`; + if (t === "ZodUnion") + return inner._def.options.map((o: any) => renderZodTypeShort(o)).join(" | "); + if (t === "ZodTuple") + return `[${inner._def.items.map((i: any) => renderZodTypeShort(i)).join(", ")}]`; + if (t === "ZodObject") return "object"; + return t.replace(/^Zod/, "").toLowerCase(); +} + +/** Render a TypeSubSection and all its children recursively into lines */ +function renderSubSection(sec: TypeSubSection, headingLevel: number): string[] { + const lines: string[] = []; + const hashes = "#".repeat(headingLevel); + + lines.push(`<span id="${sec.anchor}"></span>`); + lines.push(""); + lines.push(`${hashes} \`${sec.heading}\``); + lines.push(""); + + const inner = unwrapZod(sec.schema); + const t: string = inner?._def?.typeName ?? ""; + + if (t === "ZodObject") { + lines.push("| Field | Type | Required | Description |"); + lines.push("| ----- | ---- | -------- | ----------- |"); + for (const [key, val] of Object.entries(inner.shape as Record<string, any>)) { + const req = (val.isOptional?.() ?? false) ? "no" : "yes"; + const desc = unwrapZod(val)?._def?.description ?? "—"; + // Find a child sub-section for this field if it's complex + const child = sec.children.find(c => c.heading === key); + const typeCell = child + ? `[${renderZodTypeShort(val).replace(/\|/g, "\\|")}](#${child.anchor})` + : `\`${renderZodTypeShort(val)}\``; + lines.push(`| \`${key}\` | ${typeCell} | ${req} | ${desc || "—"} |`); + } + lines.push(""); + } else if (t === "ZodUnion") { + // List each member with a link if it has a sub-section + const options: any[] = inner._def.options; + lines.push("Accepts one of:"); + lines.push(""); + options.forEach((opt: any, i: number) => { + const child = sec.children.find(c => c.heading === `${sec.heading} (option ${i + 1})`); + const label = child ? `[object](#${child.anchor})` : `\`${renderZodTypeShort(opt)}\``; + lines.push(`- ${label}`); + }); + lines.push(""); + } else if (t === "ZodTuple") { + const items: string[] = inner._def.items.map((i: any) => `\`${renderZodTypeShort(i)}\``); + lines.push(`A tuple: \`[${items.join(", ")}]\``); + lines.push(""); + } + + // Render children recursively + for (const child of sec.children) { + lines.push(...renderSubSection(child, headingLevel)); + } + + return lines; +} + +/** Render the extensions.mdx page from extracted defineExtension data */ +function renderExtensionsMdx(extensions: ExtensionEntry[], id: string): string { + const lines: string[] = []; + + lines.push("---"); + lines.push(`id: ${id}`); + lines.push("title: Extensions"); + lines.push( + `description: "Reference for all webiny/extensions exports — React components used in webiny.config.tsx to wire extensions into the project."` + ); + lines.push("---"); + lines.push(""); + lines.push(`import {Alert} from "@/components/Alert";`); + lines.push(`import {SymbolList} from "@/components/SymbolList";`); + lines.push(""); + lines.push(`<Alert type="success" title="WHAT YOU'LL LEARN">`); + lines.push(""); + lines.push("- What extension components are available in `webiny/extensions`?"); + lines.push("- What parameters does each extension accept?"); + lines.push("- How to use each extension in your `webiny.config.tsx`?"); + lines.push(""); + lines.push("</Alert>"); + lines.push(""); + lines.push("## Overview"); + lines.push(""); + lines.push( + "The `webiny/extensions` package exports React components used inside `webiny.config.tsx` " + + "to wire extensions into your Webiny project. Each component corresponds to a `defineExtension()` " + + "call in the Webiny source and accepts typed props defined by its Zod schema." + ); + lines.push(""); + + // Group by top-level namespace (first segment of path) + const groups = new Map<string, ExtensionEntry[]>(); + for (const ext of extensions) { + const top = ext.path.split(".")[0]; + if (!groups.has(top)) groups.set(top, []); + groups.get(top)!.push(ext); + } + + // Chip lists grouped by namespace + for (const [groupName, exts] of Array.from(groups.entries())) { + if (groups.size > 1) { + lines.push(`**${groupName}**`); + lines.push(""); + } + const chips = exts.map(e => `{ name: "${e.path}", anchor: "${slugify(e.path)}" }`).join(", "); + lines.push(`<SymbolList symbols={[${chips}]} />`); + lines.push(""); + } + + // Detail sections per namespace group + for (const [groupName, exts] of Array.from(groups.entries())) { + if (groups.size > 1) { + lines.push(`## ${groupName}`); + lines.push(""); + } + for (const ext of exts) { + // Heading: last two segments of path for nested (e.g. "Infra.Admin.BeforeBuild" → "### `Admin.BeforeBuild`") + // Top-level (e.g. "EnvVar") → "### `EnvVar`" + const parts = ext.path.split("."); + const headingName = parts.length > 2 ? parts.slice(1).join(".") : parts[parts.length - 1]; + lines.push(`### \`${headingName}\``); + lines.push(""); + if (ext.description) { + lines.push(ext.description); + lines.push(""); + } + // Badges + const badge = ext.multiple ? "Can be used **multiple times**." : "Can only be used **once**."; + lines.push(badge); + lines.push(""); + // Params table + sub-sections + const topLevelParams = ext.params.filter(p => !p.name.includes(".")); + const anchorPrefix = slugify(ext.path); + const subSections = collectSubSections(topLevelParams, anchorPrefix); + + // Usage example (before props table) + const usageParts = topLevelParams + .filter(p => p.required) + .map(p => { + if (p.type === "unknown" || p.name === "src") + return `${p.name}="/extensions/my-extension.ts"`; + if (p.type === "string") return `${p.name}="value"`; + if (p.type === "boolean") return `${p.name}={true}`; + if (p.type === "array") return `${p.name}={[]}`; + if (p.type === "object") return `${p.name}={{}}`; + return `${p.name}={...}`; + }); + const selfClosing = usageParts.length <= 2; + lines.push("```tsx webiny.config.tsx"); + lines.push(`import { ${ext.path.split(".")[0]} } from "webiny/extensions";`); + lines.push(""); + lines.push("export const Extensions = () => ("); + if (selfClosing) { + lines.push(` <${ext.path}${usageParts.length ? " " + usageParts.join(" ") : ""} />`); + } else { + lines.push(` <${ext.path}`); + for (const p of usageParts) lines.push(` ${p}`); + lines.push(` />`); + } + lines.push(");"); + lines.push("```"); + lines.push(""); + + // Props table + if (topLevelParams.length > 0) { + lines.push("**Props**"); + lines.push(""); + lines.push("| Prop | Type | Required | Description |"); + lines.push("| ---- | ---- | -------- | ----------- |"); + for (const p of topLevelParams) { + const req = p.required ? "yes" : "no"; + const desc = p.description || "—"; + const sec = subSections.find(s => s.heading === p.name); + const typeCell = sec + ? `[${renderParamType(p)}](#${sec.anchor})` + : `\`${renderParamType(p)}\``; + lines.push(`| \`${p.name}\` | ${typeCell} | ${req} | ${desc} |`); + } + lines.push(""); + } + + // Type detail sub-sections + if (subSections.length > 0) { + for (const sec of subSections) { + lines.push(...renderSubSection(sec, 4)); + } + } + } + } + + return lines.join("\n"); +} + +function renderMdx(doc: EntryPointDoc, id: string): string { + const lines: string[] = []; + + lines.push("---"); + lines.push(`id: ${id}`); + lines.push(`title: ${doc.title}`); + lines.push(`description: "${doc.description}"`); + lines.push("---"); + lines.push(""); + lines.push(`import {Alert} from "@/components/Alert";`); + lines.push(`import {SymbolList} from "@/components/SymbolList";`); + lines.push(""); + lines.push(`<Alert type="success" title="WHAT YOU'LL LEARN">`); + lines.push(""); + lines.push(renderLearnBlock(doc.relPath, doc.symbols)); + lines.push(""); + lines.push("</Alert>"); + lines.push(""); + lines.push("## Overview"); + lines.push(""); + lines.push( + `This page documents everything exported from \`webiny/${doc.relPath}\`. Import any of the items below directly from this path in your Webiny extensions.` + ); + lines.push(""); + + if (doc.symbols.length === 0) { + lines.push("*No exported symbols found.*"); + lines.push(""); + } else { + const groups = groupSymbols(doc.relPath, doc.symbols); + const hasMultipleGroups = groups.length > 1; + + // Pre-sort symbols A-Z within each group + const sortedGroups = groups.map(g => ({ + ...g, + symbols: [...g.symbols].sort((a, b) => a.name.localeCompare(b.name)) + })); + + // --- All chip lists first, bold labels (visible on page, no sidebar sub-items) --- + for (const group of sortedGroups) { + if (hasMultipleGroups && group.title) { + lines.push(`**${group.title}**`); + lines.push(""); + } + const symbolsJson = group.symbols + .map(sym => { + const anchor = slugify(sym.name); + return `{ name: "${sym.name}", anchor: "${anchor}" }`; + }) + .join(", "); + lines.push(`<SymbolList symbols={[${symbolsJson}]} />`); + lines.push(""); + } + + // --- Symbol detail sections below --- + // Group headings are H2 (peers of ## Overview), symbol headings are H3 (multi-group) or H2 (single-group). + const headingLevel = hasMultipleGroups ? 3 : 2; + for (const group of sortedGroups) { + if (hasMultipleGroups && group.title) { + lines.push(`## ${group.title}`); + lines.push(""); + } + for (const sym of group.symbols) { + lines.push(renderSymbolSection(sym, `webiny/${doc.relPath}`, headingLevel)); + } + } + } + + return lines.join("\n"); +} + +// --------------------------------------------------------------------------- +// .ai.txt rendering +// --------------------------------------------------------------------------- + +function renderAiTxt(doc: EntryPointDoc): string { + const symbolNames = doc.symbols.map(s => s.name).join(", "); + const sourceFiles = Array.from(new Set(doc.symbols.map(s => s.sourceFile))); + + return `AI Context: ${doc.title} (reference/${doc.relPath}.mdx) + +Source of Information: +1. packages/webiny/src/${doc.relPath}.ts — barrel re-export file +${sourceFiles.map((f, i) => `${i + 2}. ${f} — originating source`).join("\n")} + +Key Documentation Decisions: +- This file is auto-generated by scripts/generate-reference.ts — do not edit manually +- Symbols are documented in the order they appear in the barrel file +- Declaration text is extracted from the TypeScript AST; method bodies are stripped +- Type-only exports are labeled as "Type"; namespace exports include member listings + +Exported Symbols: +${symbolNames} + +Import Path: webiny/${doc.relPath} + +Related Documents: +- docs/developer-docs/6.0.x/basic/di.mdx — DI pattern used by all abstractions +- docs/developer-docs/6.0.x/basic/result.mdx — Result type used in use case returns + +Tone Guidelines: +- This is a reference page — terse, API-focused, no prose beyond what's necessary +- Code blocks are the primary content; descriptions serve only to clarify intent +- Do not add analogies or long explanations — link to guide pages for those +`; +} + +// --------------------------------------------------------------------------- +// Navigation generation +// --------------------------------------------------------------------------- + +interface NavPage { + link: string; + title?: string; +} + +interface NavGroup { + title: string; + pages: Array<NavPage | NavGroup>; +} + +function isNavGroup(x: NavPage | NavGroup): x is NavGroup { + return "pages" in x; +} + +// Sub-domains that get their own sub-group within a layer +// key: "layer/subdomain", value: preferred landing link +const SUBDOMAIN_LANDING: Record<string, string> = { + "api/cms": "reference/api/cms/entry", + "api/website-builder": "reference/api/website-builder/page", + "api/security": "reference/api/security", + "admin/cms": "reference/admin/cms", + "admin/website-builder": "reference/admin/website-builder" +}; + +// Preferred landing page for each top-level layer group +const LAYER_LANDING: Record<string, string> = { + api: "reference/api/cms/entry", + admin: "reference/admin", + infra: "reference/infra/overview", + cli: "reference/cli/overview" +}; + +/** + * Some relPaths end in "index" which Next.js treats as a directory index route, + * causing 404s. Map those to a non-index output path here. + * Key: relPath (e.g. "cli/index"), Value: output path WITHOUT extension (e.g. "cli/overview") + */ +const OUTPUT_PATH_OVERRIDE: Record<string, string> = { + "cli/index": "cli/overview", + "infra/index": "infra/overview" +}; + +/** Return the output path for a given relPath (may be overridden to avoid index routes). */ +function toOutputPath(relPath: string): string { + return OUTPUT_PATH_OVERRIDE[relPath] ?? relPath; +} + +type NavGroupWithLink = NavGroup & { link: string }; + +function makeGroup(title: string, link: string): NavGroupWithLink { + return { title, link, pages: [] } as NavGroupWithLink; +} + +// Explicit layer order for navigation +const LAYER_ORDER = ["extensions", "admin", "api", "cli", "infra"]; + +function buildNavTree(entryPoints: EntryPointDoc[]): NavGroup { + const root: NavGroup = { title: "Reference", pages: [] }; + + // Layer map: "api" | "admin" | "infra" | "cli" | "extensions" + const byLayer = new Map<string, EntryPointDoc[]>(); + for (const ep of entryPoints) { + const layer = ep.relPath.split("/")[0]; + if (!byLayer.has(layer)) byLayer.set(layer, []); + byLayer.get(layer)!.push(ep); + } + + // Sort layers by explicit order, unknown layers go to the end alphabetically + const orderedLayers = Array.from(byLayer.keys()).sort((a, b) => { + const ai = LAYER_ORDER.indexOf(a); + const bi = LAYER_ORDER.indexOf(b); + if (ai === -1 && bi === -1) return a.localeCompare(b); + if (ai === -1) return 1; + if (bi === -1) return -1; + return ai - bi; + }); + + for (const layer of orderedLayers) { + const eps = byLayer.get(layer)!; + if (eps.length === 1) { + // Single entry (extensions) — flat page + root.pages.push({ link: `reference/${toOutputPath(eps[0].relPath)}` }); + continue; + } + + const layerGroup = makeGroup( + toTitle(layer), + LAYER_LANDING[layer] ?? `reference/${toOutputPath(eps[0].relPath)}` + ); + + // Within this layer, group by sub-domain (second segment) when applicable + // Sub-domains: cms, website-builder, security — anything else is flat + const SUB_DOMAINS = ["cms", "website-builder", "security"]; + const bySubDomain = new Map<string, EntryPointDoc[]>(); + const flat: EntryPointDoc[] = []; + + // Sub-domain index pages: 2-part paths where the second segment is a sub-domain + // e.g. "api/security" → becomes the "Overview" first child of the Security group + const subDomainIndex = new Map<string, EntryPointDoc>(); + + for (const ep of eps) { + const parts = ep.relPath.split("/"); // e.g. ["api","cms","entry"] + if (parts.length === 2 && SUB_DOMAINS.includes(parts[1])) { + subDomainIndex.set(parts[1], ep); + } else if (parts.length >= 3 && SUB_DOMAINS.includes(parts[1])) { + const subDomain = parts[1]; + if (!bySubDomain.has(subDomain)) bySubDomain.set(subDomain, []); + bySubDomain.get(subDomain)!.push(ep); + } else { + flat.push(ep); + } + } + + // Add flat items (e.g. api, api/logger, api/graphql…) + // Root page (landing) always goes first, rest in their natural order. + const layerLanding = LAYER_LANDING[layer] ?? `reference/${toOutputPath(eps[0].relPath)}`; + const rootFlat = flat.filter( + ep => `reference/${toOutputPath(ep.relPath)}` === layerLanding || ep.relPath === layer + ); + const otherFlat = flat.filter(ep => !rootFlat.includes(ep)); + + for (const ep of [...rootFlat, ...otherFlat]) { + const isLayerRoot = rootFlat.includes(ep); + const title = isLayerRoot ? "Root" : ep.title; + layerGroup.pages.push({ link: `reference/${toOutputPath(ep.relPath)}`, title }); + } + + // Add sub-domain groups — index page is "Overview" first child, then sub-pages + for (const [subDomain, subEps] of Array.from(bySubDomain.entries())) { + const key = `${layer}/${subDomain}`; + const subLanding = SUBDOMAIN_LANDING[key] ?? `reference/${toOutputPath(subEps[0].relPath)}`; + const subGroup = makeGroup(toTitle(subDomain), subLanding); + const indexEp = subDomainIndex.get(subDomain); + if (indexEp) { + subGroup.pages.push({ + link: `reference/${toOutputPath(indexEp.relPath)}`, + title: "Root" + }); + } + for (const ep of subEps) { + subGroup.pages.push({ link: `reference/${toOutputPath(ep.relPath)}`, title: ep.title }); + } + layerGroup.pages.push(subGroup); + } + + root.pages.push(layerGroup); + } + + return root; +} + +function renderNavGroup(group: NavGroup, indent: number): string { + const pad = " ".repeat(indent); + const lines: string[] = []; + + if (indent === 0) { + // root Reference group — already in navigation.tsx, we just emit children + for (const page of group.pages) { + lines.push(renderNavItem(page, indent + 1)); + } + } else { + const groupLink = (group as NavGroup & { link?: string }).link ?? findFirstLink(group); + lines.push(`${pad}<Group title={"${group.title}"} link={"${groupLink}"}>`); + for (const page of group.pages) { + lines.push(renderNavItem(page, indent + 1)); + } + lines.push(`${pad}</Group>`); + } + + return lines.join("\n"); +} + +function findFirstLink(group: NavGroup): string { + for (const p of group.pages) { + if (!isNavGroup(p)) return p.link; + const nested = findFirstLink(p); + if (nested) return nested; + } + return ""; +} + +function renderNavItem(item: NavPage | NavGroup, indent: number): string { + const pad = " ".repeat(indent); + if (isNavGroup(item)) { + return renderNavGroup(item, indent); + } + if (item.title) { + return `${pad}<Page link={"${item.link}"} title={"${item.title}"} />`; + } + return `${pad}<Page link={"${item.link}"} />`; +} + +const NAV_MARKER_START = " {/* __REFERENCE_PAGES_START__ */}"; +const NAV_MARKER_END = " {/* __REFERENCE_PAGES_END__ */}"; + +function rewriteNavigation(entryPoints: EntryPointDoc[]): void { + const nav = readFileSync(NAV_FILE, "utf-8"); + const tree = buildNavTree(entryPoints); + + // Build inner content for the Reference group + const innerLines: string[] = []; + for (const page of tree.pages) { + innerLines.push(renderNavItem(page, 2)); + } + const inner = innerLines.join("\n"); + + // Replace between markers + const startIdx = nav.indexOf(NAV_MARKER_START); + const endIdx = nav.indexOf(NAV_MARKER_END); + + if (startIdx === -1 || endIdx === -1) { + console.warn(" [nav] Markers not found in navigation.tsx — skipping nav update"); + console.warn(` [nav] Add these markers inside the Reference <Group>:`); + console.warn(` ${NAV_MARKER_START}`); + console.warn(` ${NAV_MARKER_END}`); + return; + } + + const before = nav.slice(0, startIdx + NAV_MARKER_START.length); + const after = nav.slice(endIdx); + const updated = `${before}\n${inner}\n ${after}`; + + writeFileSync(NAV_FILE, updated, "utf-8"); + console.log(` [nav] Updated navigation.tsx Reference group`); +} + +// --------------------------------------------------------------------------- +// Main +// --------------------------------------------------------------------------- + +async function main(): Promise<void> { + console.log("Reading webiny package..."); + + const pkgJson = JSON.parse(readFileSync(join(WEBINY_PKG, "package.json"), "utf-8")); + const exports: Record<string, string> = pkgJson.exports ?? {}; + const pkgMap = buildPackagePathMap(); + PKG_MAP = pkgMap; + + console.log(` Found ${Object.keys(exports).length} export paths`); + console.log(` Found ${pkgMap.size} @webiny/* package aliases`); + + // Set up ts-morph project pointing at the webiny package tsconfig + const project = new Project({ + tsConfigFilePath: join(WEBINY_PKG, "tsconfig.json"), + skipAddingFilesFromTsConfig: true + }); + + // Entry points to process — derive from exports map + // Filter out non-JS entries (tsconfig.json, global.ts, icons/*) + const entryPaths: string[] = Object.keys(exports) + .filter(k => !k.includes("*") && !k.endsWith(".json") && !k.endsWith(".ts")) + .map(k => k.replace(/^\.\//, "")) // strip leading "./" + .sort(); + + console.log(` Processing ${entryPaths.length} entry points...`); + + const docs: EntryPointDoc[] = []; + + for (const relPath of entryPaths) { + const barrelSrc = join(WEBINY_PKG, "src", relPath + ".ts"); + + if (!existsSync(barrelSrc)) { + console.warn(` [skip] ${relPath} — barrel not found at ${barrelSrc}`); + continue; + } + + process.stdout.write(` [parse] ${relPath}...`); + + // Add barrel file to project + let barrelFile: SourceFile; + try { + barrelFile = project.addSourceFileAtPath(barrelSrc); + } catch { + console.log(" ERROR adding to project"); + continue; + } + + // Parse barrel to get all re-exported names + their source files + const exports_ = parseBarrel(barrelFile, pkgMap); + + // For each exported name, open the source file and extract the symbol + const symbols: ExtractedSymbol[] = []; + const loadedSourceFiles = new Map<string, SourceFile>(); + + for (const entry of exports_) { + if (entry.exportedName === "*") { + // export * — we can't enumerate without resolving, skip for now + continue; + } + + let sourceSf = loadedSourceFiles.get(entry.sourceFile); + if (!sourceSf) { + if (!existsSync(entry.sourceFile)) continue; + try { + sourceSf = project.addSourceFileAtPath(entry.sourceFile); + loadedSourceFiles.set(entry.sourceFile, sourceSf); + } catch { + continue; + } + } + + const sym = extractSymbol(sourceSf, entry.originalName); + if (sym) { + symbols.push({ + ...sym, + name: entry.exportedName, + isTypeOnly: entry.isTypeOnly || sym.isTypeOnly + }); + } else { + // Symbol not found via exported declarations — add a stub + symbols.push({ + name: entry.exportedName, + kind: "other", + isTypeOnly: entry.isTypeOnly, + declarationText: "", + jsDoc: "", + namespaceMembers: [], + sourceFile: entry.sourceFile + }); + } + } + + const doc: EntryPointDoc = { + importPath: `webiny/${relPath}`, + relPath, + title: toTitle(relPath), + description: toDescription(relPath), + symbols: mergeNamespaceSymbols(symbols) + }; + + docs.push(doc); + console.log(` ${symbols.length} symbols`); + } + + // Pre-extract extensions data (used when writing the extensions page) + console.log("\nExtracting defineExtension metadata..."); + const extensionEntries = await extractExtensions(); + console.log(` Found ${extensionEntries.length} extension definitions`); + + // Write MDX + .ai.txt files + console.log("\nWriting documentation files..."); + + for (const doc of docs) { + const outputPath = toOutputPath(doc.relPath); + const dir = join(REF_DIR, dirname(outputPath)); + mkdirSync(dir, { recursive: true }); + + const mdxPath = join(REF_DIR, outputPath + ".mdx"); + const aiTxtPath = join(REF_DIR, outputPath + ".ai.txt"); + + // Generate stable ID from path (8 chars) + const id = Buffer.from(doc.relPath) + .toString("base64") + .replace(/[^a-z0-9]/gi, "") + .slice(0, 8) + .toLowerCase() + .padEnd(8, "0"); + + // Extensions page gets its own dedicated renderer + const mdxContent = + doc.relPath === "extensions" ? renderExtensionsMdx(extensionEntries, id) : renderMdx(doc, id); + const aiTxtContent = renderAiTxt(doc); + + writeFileSync(mdxPath, mdxContent, "utf-8"); + writeFileSync(aiTxtPath, aiTxtContent, "utf-8"); + console.log(` [write] reference/${outputPath}.mdx (${doc.symbols.length} symbols)`); + } + + // Rewrite navigation + console.log("\nUpdating navigation.tsx..."); + rewriteNavigation(docs); + + console.log(`\nDone. Generated ${docs.length} reference pages.`); +} + +main().catch(err => { + console.error("Fatal error:", err); + process.exit(1); +}); diff --git a/scripts/validate-mdx-pairing.ts b/scripts/validate-mdx-pairing.ts new file mode 100644 index 000000000..334b92da8 --- /dev/null +++ b/scripts/validate-mdx-pairing.ts @@ -0,0 +1,198 @@ +/** + * MDX/.ai.txt Pairing Validation Script + * + * Validates that every .mdx file in docs/developer-docs/6.0.x/ has a corresponding + * .ai.txt companion file, and vice versa. + * + * Configuration: .mdx-validation.json (project root) + * Usage: yarn validate:mdx + * + * Exit codes: + * 0 - All files properly paired + * 1 - Validation failed (missing pairs found) + * 2 - Fatal error (config/directory issues) + */ + +import { readFileSync, existsSync } from "fs"; +import { join } from "path"; +import globby from "globby"; +import minimatch from "minimatch"; + +interface Config { + targetDir: string; + exceptions: string[]; +} + +interface ValidationResult { + mdxWithoutAiTxt: string[]; + aiTxtWithoutMdx: string[]; +} + +function loadConfig(): Config { + const configPath = ".mdx-validation.json"; + + if (!existsSync(configPath)) { + throw new Error(`Config file not found: ${configPath}`); + } + + let configContent: string; + try { + configContent = readFileSync(configPath, "utf-8"); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + throw new Error(`Cannot read config file: ${configPath} - ${message}`); + } + + let config: unknown; + try { + config = JSON.parse(configContent); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + throw new Error(`Invalid JSON in ${configPath}: ${message}`); + } + + // Type guard: ensure config is an object + if (typeof config !== "object" || config === null) { + throw new Error("Config must be a JSON object"); + } + + // Now we can safely access properties with type assertions + const configObj = config as Record<string, unknown>; + + // Validate required fields + if (!configObj.targetDir || typeof configObj.targetDir !== "string") { + throw new Error("Config missing required field: targetDir"); + } + + if (!Array.isArray(configObj.exceptions)) { + throw new Error("Config field 'exceptions' must be an array"); + } + + return { + targetDir: configObj.targetDir, + exceptions: configObj.exceptions, + }; +} + +async function scanFiles(baseDir: string, pattern: string): Promise<string[]> { + const targetPath = join(process.cwd(), baseDir); + + if (!existsSync(targetPath)) { + throw new Error(`Target directory not found: ${baseDir}`); + } + + const files = await globby(pattern, { + cwd: targetPath, + onlyFiles: true, + }); + + return files.sort(); +} + +function applyExceptions(files: string[], patterns: string[]): string[] { + if (patterns.length === 0) { + return files; + } + + return files.filter((file) => { + // Check if file matches any exception pattern + for (const pattern of patterns) { + if (minimatch(file, pattern)) { + return false; // Exclude this file + } + } + return true; // Keep this file + }); +} + +function validatePairing( + mdxFiles: string[], + aiTxtFiles: string[] +): ValidationResult { + const result: ValidationResult = { + mdxWithoutAiTxt: [], + aiTxtWithoutMdx: [], + }; + + // Create sets for efficient lookup + const mdxSet = new Set(mdxFiles.map((f) => f.replace(/\.mdx$/, ""))); + const aiTxtSet = new Set(aiTxtFiles.map((f) => f.replace(/\.ai\.txt$/, ""))); + + // Check for .mdx files without .ai.txt + for (const mdxFile of mdxFiles) { + const baseName = mdxFile.replace(/\.mdx$/, ""); + if (!aiTxtSet.has(baseName)) { + result.mdxWithoutAiTxt.push(mdxFile); + } + } + + // Check for .ai.txt files without .mdx + for (const aiTxtFile of aiTxtFiles) { + const baseName = aiTxtFile.replace(/\.ai\.txt$/, ""); + if (!mdxSet.has(baseName)) { + result.aiTxtWithoutMdx.push(aiTxtFile); + } + } + + return result; +} + +function printResults(result: ValidationResult): number { + const hasMissingAiTxt = result.mdxWithoutAiTxt.length > 0; + const hasOrphanedAiTxt = result.aiTxtWithoutMdx.length > 0; + + if (!hasMissingAiTxt && !hasOrphanedAiTxt) { + console.log("\n✓ All .mdx/.ai.txt files are properly paired"); + return 0; + } + + console.log("\n✗ Validation failed\n"); + + if (hasMissingAiTxt) { + console.log(`Missing .ai.txt files (${result.mdxWithoutAiTxt.length}):`); + for (const file of result.mdxWithoutAiTxt) { + console.log(` - ${file}`); + } + console.log(""); + } + + if (hasOrphanedAiTxt) { + console.log(`Orphaned .ai.txt files (${result.aiTxtWithoutMdx.length}):`); + for (const file of result.aiTxtWithoutMdx) { + console.log(` - ${file}`); + } + console.log(""); + } + + return 1; +} + +async function main(): Promise<void> { + try { + const config = loadConfig(); + console.log(`✓ Config loaded: ${config.targetDir}`); + console.log(`✓ Exceptions: ${config.exceptions.length}`); + + const allMdxFiles = await scanFiles(config.targetDir, "**/*.mdx"); + const aiTxtFiles = await scanFiles(config.targetDir, "**/*.ai.txt"); + + console.log(`✓ Found ${allMdxFiles.length} .mdx files`); + const mdxFiles = applyExceptions(allMdxFiles, config.exceptions); + console.log(`✓ After exceptions: ${mdxFiles.length} .mdx files to validate`); + console.log(`✓ Found ${aiTxtFiles.length} .ai.txt files`); + + // Validate pairing + const result = validatePairing(mdxFiles, aiTxtFiles); + + // Print results and exit + const exitCode = printResults(result); + process.exit(exitCode); + } catch (error) { + if (error instanceof Error) { + console.error(`Error: ${error.message}`); + } + process.exit(2); + } +} + +main(); diff --git a/src/components/ExtensionsGettingStarted.js b/src/components/ExtensionsGettingStarted.js index 45a9523e1..5bee2b999 100644 --- a/src/components/ExtensionsGettingStarted.js +++ b/src/components/ExtensionsGettingStarted.js @@ -119,10 +119,7 @@ export const ExtensionsGettingStarted = ({ <p> Once the extension is scaffolded, in order to start developing, we run the following <code> - <Link - href={"/docs/core-development-concepts/basics/watch-command"} - legacyBehavior - > + <Link href={"/docs/core-development-concepts/basics/watch-command"}> webiny watch </Link> </code>{" "} diff --git a/src/components/SymbolList.js b/src/components/SymbolList.js new file mode 100644 index 000000000..787b57e58 --- /dev/null +++ b/src/components/SymbolList.js @@ -0,0 +1,34 @@ +export const SymbolList = ({ symbols }) => { + return ( + <div + style={{ + display: "flex", + flexWrap: "wrap", + columnGap: "8px", + rowGap: "1px", + margin: "-10px 0 12px" + }} + > + {symbols.map(({ name, anchor }) => ( + <a + key={name} + href={`#${anchor}`} + style={{ + marginTop: 10, + display: "inline-block", + borderRadius: "4px", + border: "1px solid #e97132", + background: "rgba(233, 113, 50, 0.1)", + padding: "3px 10px", + fontSize: "13px", + fontFamily: "monospace", + color: "#e97132", + textDecoration: "none" + }} + > + {name} + </a> + ))} + </div> + ); +}; diff --git a/src/components/mdxComponents.js b/src/components/mdxComponents.js index 67df51b65..cec96650e 100644 --- a/src/components/mdxComponents.js +++ b/src/components/mdxComponents.js @@ -34,21 +34,21 @@ export const mdxComponents = { if (props?.children?.props?.originalType === "inlineCode") { return ( <code> - <Link href={props.href} legacyBehavior> + <Link href={props.href}> {props.children.props.children} </Link> </code> ); } else { return ( - <Link href={props.href} legacyBehavior> + <Link href={props.href}> {props.children} </Link> ); } } else { return ( - <Link href={props.href} legacyBehavior> + <Link href={props.href}> {props.children} </Link> ); diff --git a/src/components/page/Footer.js b/src/components/page/Footer.js index 65c842c22..94f7ee537 100644 --- a/src/components/page/Footer.js +++ b/src/components/page/Footer.js @@ -18,29 +18,31 @@ export function Footer({ previous, next }) { {(previous || next) && ( <div className="grid grid-cols-2 content-center w-full border-t border-b border-neutral-200 dark:border-neutral-200 dark:border-zinc-200 pt-2 md:pt-[1.4375rem] pb-2 md:pb-[1.8125rem] text-sm md:text-base font-semibold"> {previous ? ( - <Link href={previous.link} legacyBehavior> - <a className="group flex items-center justify-start md:justify-end pr-[2.1875rem] border-r border-neutral-200"> - <img - src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxOCAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggb3BhY2l0eT0iMC41IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTYuNjQyMSAwLjI0MzYwN0M2LjMxNDgxIC0wLjA4MTE5OTkgNS43ODM5NCAtMC4wODExOTk5IDUuNDU2NjUgMC4yNDM1ODlMMC4yNDU2MTcgNS40MTIxMkMwLjA4MTg3MDggNS41NzQyOSAtMi41Mjk3NGUtMDcgNS43ODczOCAtMi42MjI2OWUtMDcgNkMtMi43MTU2NGUtMDcgNi4yMTI2NSAwLjA4MTg3MDggNi40MjU3IDAuMjQ1NjE3IDYuNTg4MDlMNS40NTY2NSAxMS43NTY2QzUuNzgzMDUgMTIuMDgwMSA2LjMxMTk0IDEyLjA4MTQgNi42Mzk2NCAxMS43NTg4QzYuOTY3NzQgMTEuNDM2MiA2Ljk3MDgxIDEwLjkxNzMgNi42NDcwNyAxMC41OTEyTDIuOTI0NjggNi44NDI1NEwxNy4xNjE3IDYuODQyNTVDMTcuNjI0OCA2Ljg0MjU1IDE4IDYuNDU5OTkgMTggNi4wMDA5NEMxOCA1LjU0MTcgMTcuNjI0OCA1LjE1OTMyIDE3LjE2MTcgNS4xNTkzMkwyLjg2MjI2IDUuMTU5MzFMNi42NDIxIDEuNDE0NzVDNi45Njk1MiAxLjA4OTk3IDYuOTY5NTIgMC41NjgzODYgNi42NDIxIDAuMjQzNjA3WiIgZmlsbD0iIzk0QTNCOCIvPgo8L3N2Zz4K" - className="mr-3" - alt="arrow" - /> - {previous.shortTitle || previous.title} - </a> + <Link + href={previous.link} + className="group flex items-center justify-start md:justify-end pr-[2.1875rem] border-r border-neutral-200" + > + <img + src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxOCAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggb3BhY2l0eT0iMC41IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTYuNjQyMSAwLjI0MzYwN0M2LjMxNDgxIC0wLjA4MTE5OTkgNS43ODM5NCAtMC4wODExOTk5IDUuNDU2NjUgMC4yNDM1ODlMMC4yNDU2MTcgNS40MTIxMkMwLjA4MTg3MDggNS41NzQyOSAtMi41Mjk3NGUtMDcgNS43ODczOCAtMi42MjI2OWUtMDcgNkMtMi43MTU2NGUtMDcgNi4yMTI2NSAwLjA4MTg3MDggNi40MjU3IDAuMjQ1NjE3IDYuNTg4MDlMNS40NTY2NSAxMS43NTY2QzUuNzgzMDUgMTIuMDgwMSA2LjMxMTk0IDEyLjA4MTQgNi42Mzk2NCAxMS43NTg4QzYuOTY3NzQgMTEuNDM2MiA2Ljk3MDgxIDEwLjkxNzMgNi42NDcwNyAxMC41OTEyTDIuOTI0NjggNi44NDI1NEwxNy4xNjE3IDYuODQyNTVDMTcuNjI0OCA2Ljg0MjU1IDE4IDYuNDU5OTkgMTggNi4wMDA5NEMxOCA1LjU0MTcgMTcuNjI0OCA1LjE1OTMyIDE3LjE2MTcgNS4xNTkzMkwyLjg2MjI2IDUuMTU5MzFMNi42NDIxIDEuNDE0NzVDNi45Njk1MiAxLjA4OTk3IDYuOTY5NTIgMC41NjgzODYgNi42NDIxIDAuMjQzNjA3WiIgZmlsbD0iIzk0QTNCOCIvPgo8L3N2Zz4K" + className="mr-3" + alt="arrow" + /> + {previous.shortTitle || previous.title} </Link> ) : ( <div /> )} {next ? ( - <Link href={next.link}> - <a className="group flex items-center justify-end md:justify-start pl-[2.1875rem] border-l border-neutral-200"> - {next.shortTitle || next.title} - <img - src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxOCAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggb3BhY2l0eT0iMC41IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTExLjM1NzkgMTEuNzU2NEMxMS42ODUyIDEyLjA4MTIgMTIuMjE2MSAxMi4wODEyIDEyLjU0MzMgMTEuNzU2NEwxNy43NTQ0IDYuNTg3ODhDMTcuOTE4MSA2LjQyNTcxIDE4IDYuMjEyNjIgMTggNkMxOCA1Ljc4NzM1IDE3LjkxODEgNS41NzQzIDE3Ljc1NDQgNS40MTE5MUwxMi41NDMzIDAuMjQzMzcxQzEyLjIxNjkgLTAuMDgwMTEwNCAxMS42ODgxIC0wLjA4MTQwODQgMTEuMzYwNCAwLjI0MTIwMkMxMS4wMzIzIDAuNTYzODMxIDExLjAyOTIgMS4wODI3NCAxMS4zNTI5IDEuNDA4ODFMMTUuMDc1MyA1LjE1NzQ2TDAuODM4MzA0IDUuMTU3NDVDMC4zNzUyNDggNS4xNTc0NSA3LjcwMzQ2ZS0wOCA1LjU0MDAxIDcuMTU2MDVlLTA4IDUuOTk5MDZDNi42MDg0ZS0wOCA2LjQ1ODMxIDAuMzc1MjQ4IDYuODQwNjggMC44MzgzMDQgNi44NDA2OEwxNS4xMzc3IDYuODQwNjlMMTEuMzU3OSAxMC41ODUzQzExLjAzMDUgMTAuOTEgMTEuMDMwNSAxMS40MzE2IDExLjM1NzkgMTEuNzU2NFoiIGZpbGw9IiM5NEEzQjgiLz4KPC9zdmc+Cg==" - className="ml-3" - alt="arrow" - /> - </a> + <Link + href={next.link} + className="group flex items-center justify-end md:justify-start pl-[2.1875rem] border-l border-neutral-200" + > + {next.shortTitle || next.title} + <img + src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTgiIGhlaWdodD0iMTIiIHZpZXdCb3g9IjAgMCAxOCAxMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggb3BhY2l0eT0iMC41IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTExLjM1NzkgMTEuNzU2NEMxMS42ODUyIDEyLjA4MTIgMTIuMjE2MSAxMi4wODEyIDEyLjU0MzMgMTEuNzU2NEwxNy43NTQ0IDYuNTg3ODhDMTcuOTE4MSA2LjQyNTcxIDE4IDYuMjEyNjIgMTggNkMxOCA1Ljc4NzM1IDE3LjkxODEgNS41NzQzIDE3Ljc1NDQgNS40MTE5MUwxMi41NDMzIDAuMjQzMzcxQzEyLjIxNjkgLTAuMDgwMTEwNCAxMS42ODgxIC0wLjA4MTQwODQgMTEuMzYwNCAwLjI0MTIwMkMxMS4wMzIzIDAuNTYzODMxIDExLjAyOTIgMS4wODI3NCAxMS4zNTI5IDEuNDA4ODFMMTUuMDc1MyA1LjE1NzQ2TDAuODM4MzA0IDUuMTU3NDVDMC4zNzUyNDggNS4xNTc0NSA3LjcwMzQ2ZS0wOCA1LjU0MDAxIDcuMTU2MDVlLTA4IDUuOTk5MDZDNi42MDg0ZS0wOCA2LjQ1ODMxIDAuMzc1MjQ4IDYuODQwNjggMC44MzgzMDQgNi44NDA2OEwxNS4xMzc3IDYuODQwNjlMMTEuMzU3OSAxMC41ODUzQzExLjAzMDUgMTAuOTEgMTEuMDMwNSAxMS40MzE2IDExLjM1NzkgMTEuNzU2NFoiIGZpbGw9IiM5NEEzQjgiLz4KPC9zdmc+Cg==" + className="ml-3" + alt="arrow" + /> </Link> ) : ( <div /> diff --git a/src/components/page/Header.js b/src/components/page/Header.js index 311c8dbff..5fb7c7e6d 100644 --- a/src/components/page/Header.js +++ b/src/components/page/Header.js @@ -124,29 +124,35 @@ export function NavItems() { return ( <> <li> - <Link href="/docs/get-started/welcome" legacyBehavior> - <a className={`text-nav-subdirectory ${activeClass("docs")}`}>Developer Docs</a> + <Link + href="/docs/get-started/welcome" + className={`text-nav-subdirectory ${activeClass("docs")}`} + > + Developer Docs </Link> </li> <li> - <Link href="/docs/release-notes/upgrade-webiny" legacyBehavior> - <a className={`text-nav-subdirectory ${activeClass("release-notes")}`}> - Release Notes - </a> + <Link + href="/docs/release-notes/upgrade-webiny" + className={`text-nav-subdirectory ${activeClass("release-notes")}`} + > + Release Notes </Link> </li> <li> - <Link href="/docs/user-guides/overview" legacyBehavior> - <a className={`text-nav-subdirectory ${activeClass("user-guides")}`}> - User Guides - </a> + <Link + href="/docs/user-guides/overview" + className={`text-nav-subdirectory ${activeClass("user-guides")}`} + > + User Guides </Link> </li> <li> - <Link href="/docs/handbook/company/why-webiny-exists" legacyBehavior> - <a className={`text-nav-subdirectory ${activeClass("handbook")}`}> - Company Handbook - </a> + <Link + href="/docs/handbook/company/why-webiny-exists" + className={`text-nav-subdirectory ${activeClass("handbook")}`} + > + Company Handbook </Link> </li> </> @@ -177,16 +183,15 @@ export function Header() { /> </svg> </button> - <Link href={homepageUrl} legacyBehavior> - <a - className="flex-none w-[1.5925rem] lg:pr-[8.3875rem] lg:border-r border-border dark:border-dark-grey overflow-hidden lg:w-auto" - onContextMenu={e => { - e.preventDefault(); - }} - > - <span className="sr-only">Webiny Docs home page</span> - <Logo className="w-auto h-[1.8025rem] lg:h-10" /> - </a> + <Link + href={homepageUrl} + className="flex-none w-[1.5925rem] lg:pr-[8.3875rem] lg:border-r border-border dark:border-dark-grey overflow-hidden lg:w-auto" + onContextMenu={e => { + e.preventDefault(); + }} + > + <span className="sr-only">Webiny Docs home page</span> + <Logo className="w-auto h-[1.8025rem] lg:h-10" /> </Link> <div className="relative items-center hidden ml-auto lg:flex"> <nav className="flex items-center h-[2.375rem] text-sm leading-6 font-semibold text-slate-700 dark:text-slate-200 ml-[1.875rem] pl-[1.875rem]"> diff --git a/src/components/page/Search.js b/src/components/page/Search.js index 3783313b0..b0dfe197a 100644 --- a/src/components/page/Search.js +++ b/src/components/page/Search.js @@ -116,11 +116,7 @@ export function SearchProvider({ children }) { } function Hit({ hit, children }) { - return ( - <Link href={hit.url} legacyBehavior> - <a>{children}</a> - </Link> - ); + return <Link href={hit.url}>{children}</Link>; } export function SearchButton({ children, ...props }) { diff --git a/src/layouts/NonVersionedLayout.js b/src/layouts/NonVersionedLayout.js index a9d90a249..7010f723b 100644 --- a/src/layouts/NonVersionedLayout.js +++ b/src/layouts/NonVersionedLayout.js @@ -20,7 +20,15 @@ export function NonVersionedLayout({ titleSuffix, children }) { <Title suffix={titleSuffix} /> <SidebarLayout nav={page.navigation}> <TableOfContentsProvider tableOfContents={page.tableOfContents}> - <div className={"container max-w-3xl mx-auto mt-[5.25rem] md:mt-[5.875rem] lg:mt-[8rem] mb-[1.875rem] md:mb-[3.75rem] xl:pt-10 xl:max-w-[100%] xl:mr-0 xl:w-[calc("+(page.fullWidth ? '100%' : '100%-245px')+")] xl:ml-0 xl:px-10 xl:border 2xl:max-w-["+(page.fullWidth ? '100%' : '53.6875rem')+"] border-neutral-200 dark:border-dark-grey rounded-[0.625rem]"}> + <div + className={ + "container max-w-3xl mx-auto mt-[5.25rem] md:mt-[5.875rem] lg:mt-[8rem] mb-[1.875rem] md:mb-[3.75rem] xl:pt-10 xl:max-w-[100%] xl:mr-0 xl:w-[calc(" + + (page.fullWidth ? "100%" : "100%-245px") + + ")] xl:ml-0 xl:px-10 xl:border 2xl:max-w-[" + + (page.fullWidth ? "100%" : "53.6875rem") + + "] border-neutral-200 dark:border-dark-grey rounded-[0.625rem]" + } + > <article className={"DocSearch-content prose md:prose-md prose-slate"}> {page.showPageHeader ? ( <PageHeader @@ -36,10 +44,11 @@ export function NonVersionedLayout({ titleSuffix, children }) { </article> <Footer previous={prev} next={next}> - <Link href={`https://github.com/webiny/docs.webiny.com`} legacyBehavior> - <a className="hover:text-slate-900 dark:hover:text-slate-400"> - Edit this page on GitHub - </a> + <Link + href={`https://github.com/webiny/docs.webiny.com`} + className="hover:text-slate-900 dark:hover:text-slate-400" + > + Edit this page on GitHub </Link> <SourceFile /> </Footer> diff --git a/src/layouts/SidebarLayout.js b/src/layouts/SidebarLayout.js index caf9805fe..9ab579e27 100644 --- a/src/layouts/SidebarLayout.js +++ b/src/layouts/SidebarLayout.js @@ -71,6 +71,20 @@ function nearestScrollableContainer(el) { const NavTreeElement = forwardRef(({ element, depth = 0 }, ref) => { const { type, title, link, icon, items, isActive, isActiveChild } = element; + if (type === "group" && depth >= 1) { + return ( + <GenericMenuSection + subElements={items} + isActiveChild={isActiveChild} + title={title} + link={link} + icon={icon} + ref={ref} + depth={depth} + /> + ); + } + if (type === "group" && depth !== 1) { return ( <Collapsable @@ -83,7 +97,9 @@ const NavTreeElement = forwardRef(({ element, depth = 0 }, ref) => { depth={depth} /> ); - } else if (type === "group" && depth === 1) { + } + + if (type === "group" && depth === 1) { return ( <Section subElements={items} @@ -93,9 +109,13 @@ const NavTreeElement = forwardRef(({ element, depth = 0 }, ref) => { depth={depth} /> ); - } else if (type === "page") { + } + + if (type === "page") { return <Page title={title} link={link} isActive={isActive} ref={ref} depth={depth} />; - } else if (type === "separator") { + } + + if (type === "separator") { return <HorizontalLine />; } return null; @@ -435,9 +455,8 @@ const Page = forwardRef(({ title, link, isActive, depth = 0 }, ref) => { } )} > - <Link href={link} legacyBehavior> - {/* first line */} - <a className="leading-6">{title}</a> + <Link href={link} className="leading-6"> + {title} </Link> </li> ); diff --git a/src/layouts/VersionedLayout.js b/src/layouts/VersionedLayout.js index b13625ea1..35ce06d6a 100644 --- a/src/layouts/VersionedLayout.js +++ b/src/layouts/VersionedLayout.js @@ -22,7 +22,15 @@ export function VersionedLayout({ titleSuffix, children, ...props }) { <Title suffix={titleSuffix} /> <VersionedSidebarLayout nav={page.navigation} {...props}> <TableOfContentsProvider tableOfContents={page.tableOfContents}> - <div className={"container max-w-3xl mx-auto mt-[5.25rem] md:mt-[5.875rem] lg:mt-[8rem] mb-[1.875rem] md:mb-[3.75rem] xl:pt-10 xl:max-w-[100%] xl:mr-0 xl:w-[calc("+(page.fullWidth ? '100%' : '100%-245px')+")] xl:ml-0 xl:px-10 xl:border 2xl:max-w-["+(page.fullWidth ? '100%' : '53.6875rem')+"] border-neutral-200 dark:border-dark-grey rounded-[0.625rem]"}> + <div + className={ + "container max-w-3xl mx-auto mt-[5.25rem] md:mt-[5.875rem] lg:mt-[8rem] mb-[1.875rem] md:mb-[3.75rem] xl:pt-10 xl:max-w-[100%] xl:mr-0 xl:w-[calc(" + + (page.fullWidth ? "100%" : "100%-245px") + + ")] xl:ml-0 xl:px-10 xl:border 2xl:max-w-[" + + (page.fullWidth ? "100%" : "53.6875rem") + + "] border-neutral-200 dark:border-dark-grey rounded-[0.625rem]" + } + > <div className={"flex lg:hidden w-full pb-5"}> <VersionSelector /> </div> @@ -43,10 +51,11 @@ export function VersionedLayout({ titleSuffix, children, ...props }) { </article> <Footer previous={prev} next={next}> - <Link href={`https://github.com/webiny/docs.webiny.com`} legacyBehavior> - <a className="hover:text-slate-900 dark:hover:text-slate-400"> - Edit this page on GitHub - </a> + <Link + href={`https://github.com/webiny/docs.webiny.com`} + className="hover:text-slate-900 dark:hover:text-slate-400" + > + Edit this page on GitHub </Link> </Footer> diff --git a/src/middleware.js b/src/middleware.js new file mode 100644 index 000000000..5027204d0 --- /dev/null +++ b/src/middleware.js @@ -0,0 +1,27 @@ +import { NextResponse } from "next/server"; + +export function middleware(request) { + const { pathname } = request.nextUrl; + const acceptHeader = request.headers.get("accept") || ""; + + const wantsMdxExtension = pathname.endsWith(".mdx") || pathname.endsWith(".md"); + const wantsMarkdownHeader = acceptHeader.includes("text/markdown"); + + if (wantsMdxExtension || wantsMarkdownHeader) { + const cleanPath = pathname.replace(/\.(mdx|md)$/, ""); + const url = request.nextUrl.clone(); + + // Rewrite to static file in public/raw/ + url.pathname = "/docs-static/raw" + cleanPath + ".mdx"; + + const response = NextResponse.rewrite(url); + response.headers.set("Content-Type", "text/plain; charset=utf-8"); + return response; + } + + return NextResponse.next(); +} + +export const config = { + matcher: ["/((?!_next|api|raw|favicon.ico).*)"] +}; diff --git a/yarn.lock b/yarn.lock index 61a9289a9..43f168787 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,163 +5,200 @@ __metadata: version: 6 cacheKey: 8 -"@algolia/autocomplete-core@npm:1.7.1": - version: 1.7.1 - resolution: "@algolia/autocomplete-core@npm:1.7.1" +"@algolia/abtesting@npm:1.14.2": + version: 1.14.2 + resolution: "@algolia/abtesting@npm:1.14.2" dependencies: - "@algolia/autocomplete-shared": 1.7.1 - checksum: 511176e9c2a9f2e2be62552e48e72dadfcc6638cda4a2990fd3453aed3ce4e7d8ca1bd6a9ccb912430c77734b00a8b836aaad97facc1987157af4ac00f590f4a + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: 70c56081c26684e8b12cacb292cd2ce8cdc5763dab26bd43449ee11e0788b035786ac87e42684df98adfc783ddd178c0fbcaaf2546b7e162904b0337e7f95bae languageName: node linkType: hard -"@algolia/autocomplete-preset-algolia@npm:1.7.1": - version: 1.7.1 - resolution: "@algolia/autocomplete-preset-algolia@npm:1.7.1" +"@algolia/autocomplete-core@npm:1.17.9": + version: 1.17.9 + resolution: "@algolia/autocomplete-core@npm:1.17.9" dependencies: - "@algolia/autocomplete-shared": 1.7.1 - peerDependencies: - "@algolia/client-search": ^4.9.1 - algoliasearch: ^4.9.1 - checksum: cb031d5ed43f2e10f325f6291cfab851cc5622d96ae8ba1913815ead16b7ce2969b0c51f921d54c47195b2200af8ceecf1c587d2580f842c337f1d8e2f6317c2 + "@algolia/autocomplete-plugin-algolia-insights": 1.17.9 + "@algolia/autocomplete-shared": 1.17.9 + checksum: dde242b1a2d8485e6c7bc94d00e25d707aa66dcd276ee1dde13213f1620bf6a1d289a61c657e40c707ca726a8aa009ab5e8229f92ae5cf22266de490b0634d20 languageName: node linkType: hard -"@algolia/autocomplete-shared@npm:1.7.1": - version: 1.7.1 - resolution: "@algolia/autocomplete-shared@npm:1.7.1" - checksum: 0e137f1a470fab9b1bc493284b0be9b83503bda8aa37be9726a8fddf4791dccbd28f9eec399a7c75c1eb3196510dac7be454307fc97fbca2999f3fbc30756c28 +"@algolia/autocomplete-plugin-algolia-insights@npm:1.17.9": + version: 1.17.9 + resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.17.9" + dependencies: + "@algolia/autocomplete-shared": 1.17.9 + peerDependencies: + search-insights: ">= 1 < 3" + checksum: 32761d44a407d7c5ecfae98bb78b45a1ca85c59f44167ea36057315fb357c49684e9126bb7a67a513a27bda60a9661cecd6215f2daa903288860201b0b18c745 languageName: node linkType: hard -"@algolia/cache-browser-local-storage@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/cache-browser-local-storage@npm:4.13.1" +"@algolia/autocomplete-preset-algolia@npm:1.17.9": + version: 1.17.9 + resolution: "@algolia/autocomplete-preset-algolia@npm:1.17.9" dependencies: - "@algolia/cache-common": 4.13.1 - checksum: ee7674971ab22c34f17cdf06589286695b40efaa7fd9b8f25833735bbd39919f2fe4973ca4de314f639574ae28d087ff43abef50e9e16b2f51b459a451e4c38d + "@algolia/autocomplete-shared": 1.17.9 + peerDependencies: + "@algolia/client-search": ">= 4.9.1 < 6" + algoliasearch: ">= 4.9.1 < 6" + checksum: 0dac2aae02121d37466b4ce1ca533420b25cd70e218a9e645e6194bd84a6012a0e94c22125437adb89599ecf14e4488882f91da382c6c9a8d9447e929b317522 languageName: node linkType: hard -"@algolia/cache-common@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/cache-common@npm:4.13.1" - checksum: 0ec5f1344177fbcfa5e2386e3841d7e162f0f9de06a9c3faa31a5f4793153f4d084ec08f22a10645ebce35d5146944f52c59d657c980c19a0bb9079b1f338f47 +"@algolia/autocomplete-shared@npm:1.17.9": + version: 1.17.9 + resolution: "@algolia/autocomplete-shared@npm:1.17.9" + peerDependencies: + "@algolia/client-search": ">= 4.9.1 < 6" + algoliasearch: ">= 4.9.1 < 6" + checksum: f16223f5995db0deb014a066e3587ec2da76e62b861aa21411be92cb255b7023507803283803d8c960b396a2c6b690951337c32fef34f68c59ecfb3822dee577 languageName: node linkType: hard -"@algolia/cache-in-memory@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/cache-in-memory@npm:4.13.1" +"@algolia/client-abtesting@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/client-abtesting@npm:5.48.2" dependencies: - "@algolia/cache-common": 4.13.1 - checksum: d1a5935de618d2480bc25f9c563fd45383a024d3f64e44ad35d1eb18b59b7654ec1cfd7dcb1fc7bd391709e85f4cd7f4602f54772ba85d1993520ce48252f22e + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: 8050495b02afe5e0ee4471a237e5fa0ca0751d79a5523fe36fed4ab81db7e497ac1e3124ae004a3f18bde5acae1f3277221ebddf2d0a6e3a73ea75f4c6ed93d9 languageName: node linkType: hard -"@algolia/client-account@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/client-account@npm:4.13.1" +"@algolia/client-analytics@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/client-analytics@npm:5.48.2" dependencies: - "@algolia/client-common": 4.13.1 - "@algolia/client-search": 4.13.1 - "@algolia/transporter": 4.13.1 - checksum: 3a3fb580c5ef2b57dbcf005a74a56590a87658532d114b4be8c0eb20eb1169d932090b9688eb8690782c71e99650f37896d4e3386b325c292f01f4c0821502c5 + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: 628012079562169eaecb27e93508e93ed103b809f42a1ee6206c2098b6c1639350f72194ddd76b059af2802d39dd166f4ae61188d2646d0bbd22194d39d80302 + languageName: node + linkType: hard + +"@algolia/client-common@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/client-common@npm:5.48.2" + checksum: 8dd80e5fdbcc23b9619948d5fed6a36091a61d106a3340edc8c0dbf2e20e20b5fdd2874322557f876a01cce788a2093e2515ea868892eb8a9bb84a4e5c81e677 languageName: node linkType: hard -"@algolia/client-analytics@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/client-analytics@npm:4.13.1" +"@algolia/client-insights@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/client-insights@npm:5.48.2" dependencies: - "@algolia/client-common": 4.13.1 - "@algolia/client-search": 4.13.1 - "@algolia/requester-common": 4.13.1 - "@algolia/transporter": 4.13.1 - checksum: b593011160d024cddd1871ed70e7ef5231d7e6a7bac94a6b990d81aea6965b51181232b98c64f0eab7a45ab639d43d252b8655f34c8c9b8d1563ab8653da8c9b + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: 2635e4444ba37409726b7c74ea36f19ea54a13b8f1274d9dce857a060b71b8a2a29210724244d1fd4438a156577e96e1c9bff7fa4bd34a9119ac3390a06ac2e7 languageName: node linkType: hard -"@algolia/client-common@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/client-common@npm:4.13.1" +"@algolia/client-personalization@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/client-personalization@npm:5.48.2" dependencies: - "@algolia/requester-common": 4.13.1 - "@algolia/transporter": 4.13.1 - checksum: 4a3d5a14f4ad95740414419ceb4b2df60ebbc53a25a0ffb2a96e46f34fe797bf82e85c376bb5cdd9456717cd2e3115444dd18aaa238005efe622c0589ec9e9a5 + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: 69cec8e93f2c9350b411ed3de861eccd1055e30f50e4b810cd072de319bd9ddcfa02d41737dd3689267f649cb60eb7b443f3dda1c957044c6b02d735fabd7fa3 languageName: node linkType: hard -"@algolia/client-personalization@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/client-personalization@npm:4.13.1" +"@algolia/client-query-suggestions@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/client-query-suggestions@npm:5.48.2" dependencies: - "@algolia/client-common": 4.13.1 - "@algolia/requester-common": 4.13.1 - "@algolia/transporter": 4.13.1 - checksum: 9a318235f54e9e0a9cc5a6b54d84fe2cfd78fdc616172ca9be4ace9519d89ac1c32025f7d365db349b48e23f7e9c2a46da7b24c435584f633e5f55050df340d4 + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: 15abc1a8b94fb2df56f75e0fcf2c504d51a060711f00e5bd7d364529c63956278d83363107068a0bfcb4a7fcb4227d631b2314700bc7e84c04ee76af68e93add languageName: node linkType: hard -"@algolia/client-search@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/client-search@npm:4.13.1" +"@algolia/client-search@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/client-search@npm:5.48.2" dependencies: - "@algolia/client-common": 4.13.1 - "@algolia/requester-common": 4.13.1 - "@algolia/transporter": 4.13.1 - checksum: 44e630b866756ce5ece0c86eaa9f48fe9d4e8faabcc63d3eece851f9496d97e14f2576ea83cdbc154a7af6e11e75ec3671356053026577c7db316a8405d6ebfc + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: 8072d6c0b3176c02f09abfd521f2932d7f826f1b24a835bb29bf0d5486668ca0a5d5f7cb66233f611ab682199035a1a84df7d81cf4ffb75d55b74b05fa7a74ea languageName: node linkType: hard -"@algolia/logger-common@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/logger-common@npm:4.13.1" - checksum: 7330b794af2e4d648b2e4edcfbdda9ea1c154b2f4107505f6d6b0ec513d90df9e809ef55775c2baccfb909ed894ccc55c626665d44a86a12fb9e9b499eb25d6f +"@algolia/ingestion@npm:1.48.2": + version: 1.48.2 + resolution: "@algolia/ingestion@npm:1.48.2" + dependencies: + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: 84dc3ac1dc01c93a2c410a0d4ede7fed15d095e843da983068440ab47e42a33da40c5982970cb37d6a324993a691a7421ea7fd784c44b40e30dc2513b48adf13 languageName: node linkType: hard -"@algolia/logger-console@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/logger-console@npm:4.13.1" +"@algolia/monitoring@npm:1.48.2": + version: 1.48.2 + resolution: "@algolia/monitoring@npm:1.48.2" dependencies: - "@algolia/logger-common": 4.13.1 - checksum: c78f50a784196387c3b1577b683acd66f8aa2d37fc022638f0e8d9635f0c003407d7595c4080e46bd47e1d1e635cace396f75b93c71c465bb0cfbd456dc91ad7 + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: 4a9692a24ea3ed4517998f942d0c83045bc897158efce3a992ecbb4c00edd134c95116dd089285339b532dd3b6f2dabe4feaf240fbc3221fb7b1eabfd5df0cc8 languageName: node linkType: hard -"@algolia/requester-browser-xhr@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/requester-browser-xhr@npm:4.13.1" +"@algolia/recommend@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/recommend@npm:5.48.2" dependencies: - "@algolia/requester-common": 4.13.1 - checksum: 6ae8e3b03b66410e809aa649b93d6f72fd4520c8f50517b37646b37d80c55ec1f519f2059ecc5a63929ba9ca0ce1ef45cd3a7d20f7abdda4f216a67d93736765 + "@algolia/client-common": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: f1fa8d251ac847fc3ab9b20c536b7ed357e30a6268c5934fa4ed8facfc0f6b210908f8236773a95bbaf98258fc98b732d15686dd1d908ca6912ab4266c7e7341 languageName: node linkType: hard -"@algolia/requester-common@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/requester-common@npm:4.13.1" - checksum: 4e8039f7fda7dd8bfb8689bfda9cb7297972e27c329e2b813e8df7390d6dd7ce169907e307b039c57905010d6468e85908830d6be0eeef3664c8fc01fafff957 +"@algolia/requester-browser-xhr@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/requester-browser-xhr@npm:5.48.2" + dependencies: + "@algolia/client-common": 5.48.2 + checksum: da9d0986257c9aed91d0a3124e21f6f78024f753e49cc202192ac870029ba41c638660ed6e467bde44d3cc07e93ff0374088b5e7e02031dd8289e5cd12c7c637 languageName: node linkType: hard -"@algolia/requester-node-http@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/requester-node-http@npm:4.13.1" +"@algolia/requester-fetch@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/requester-fetch@npm:5.48.2" dependencies: - "@algolia/requester-common": 4.13.1 - checksum: d25fe56c4acc5e032a2a1d0b5a85b2cebb58c0a581ed9f862df9e43378e7523948ca9aa377589405efe7bc951b0ea6e0011963d73a8b11a5f0d426123f9bb4ec + "@algolia/client-common": 5.48.2 + checksum: 779da5a1a00267ae865868634f15bc2b9f3c97e9c96a3b3c900bc99cecc914b926c9300fc373f9ff0787ca83a7a0dfc51a61cbc8b7f63cfdc52d610ecf8b8172 languageName: node linkType: hard -"@algolia/transporter@npm:4.13.1": - version: 4.13.1 - resolution: "@algolia/transporter@npm:4.13.1" +"@algolia/requester-node-http@npm:5.48.2": + version: 5.48.2 + resolution: "@algolia/requester-node-http@npm:5.48.2" dependencies: - "@algolia/cache-common": 4.13.1 - "@algolia/logger-common": 4.13.1 - "@algolia/requester-common": 4.13.1 - checksum: c99451f37172ae499bf0aa83d32b1785b63744498c1978c274ddf865ae5a91c05d92570450ebb39ae91a3d4d4593415aaad9c93c4d78229ddc8ba8b42fb0ce3a + "@algolia/client-common": 5.48.2 + checksum: 7f7b0f762dabc1acc6017171c14859915038ab7c8260a0d1c128212fc0c1f2c1e8d56401c751bb4f3f9b343132dbc451abad2a9b322d3216b10c4887fb5c5526 languageName: node linkType: hard @@ -172,26 +209,6 @@ __metadata: languageName: node linkType: hard -"@ampproject/remapping@npm:^2.1.0": - version: 2.2.0 - resolution: "@ampproject/remapping@npm:2.2.0" - dependencies: - "@jridgewell/gen-mapping": ^0.1.0 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: d74d170d06468913921d72430259424b7e4c826b5a7d39ff839a29d547efb97dc577caa8ba3fb5cf023624e9af9d09651afc3d4112a45e2050328abc9b3a2292 - languageName: node - linkType: hard - -"@ampproject/remapping@npm:^2.2.0": - version: 2.2.1 - resolution: "@ampproject/remapping@npm:2.2.1" - dependencies: - "@jridgewell/gen-mapping": ^0.3.0 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 03c04fd526acc64a1f4df22651186f3e5ef0a9d6d6530ce4482ec9841269cf7a11dbb8af79237c282d721c5312024ff17529cd72cc4768c11e999b58e2302079 - languageName: node - linkType: hard - "@babel/code-frame@npm:7.12.11": version: 7.12.11 resolution: "@babel/code-frame@npm:7.12.11" @@ -201,55 +218,21 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/code-frame@npm:7.18.6" - dependencies: - "@babel/highlight": ^7.18.6 - checksum: 195e2be3172d7684bf95cff69ae3b7a15a9841ea9d27d3c843662d50cdd7d6470fd9c8e64be84d031117e4a4083486effba39f9aef6bbb2c89f7f21bcfba33ba - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/code-frame@npm:7.22.5" - dependencies: - "@babel/highlight": ^7.22.5 - checksum: cfe804f518f53faaf9a1d3e0f9f74127ab9a004912c3a16fda07fb6a633393ecb9918a053cb71804204c1b7ec3d49e1699604715e2cfb0c9f7bc4933d324ebb6 - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/code-frame@npm:7.23.5" - dependencies: - "@babel/highlight": ^7.23.4 - chalk: ^2.4.2 - checksum: d90981fdf56a2824a9b14d19a4c0e8db93633fd488c772624b4e83e0ceac6039a27cd298a247c3214faa952bf803ba23696172ae7e7235f3b97f43ba278c569a - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.22.13": - version: 7.22.13 - resolution: "@babel/code-frame@npm:7.22.13" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.28.6, @babel/code-frame@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/code-frame@npm:7.29.0" dependencies: - "@babel/highlight": ^7.22.13 - chalk: ^2.4.2 - checksum: 22e342c8077c8b77eeb11f554ecca2ba14153f707b85294fcf6070b6f6150aae88a7b7436dd88d8c9289970585f3fe5b9b941c5aa3aa26a6d5a8ef3f292da058 - languageName: node - linkType: hard - -"@babel/compat-data@npm:^7.13.11, @babel/compat-data@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/compat-data@npm:7.18.6" - checksum: fd73a1bd7bc29be5528d2ef78248929ed3ee72e0edb69cef6051e0aad0bf8087594db6cd9e981f0d7f5bfc274fdbb77306d8abea8ceb71e95c18afc3ebd81828 + "@babel/helper-validator-identifier": ^7.28.5 + js-tokens: ^4.0.0 + picocolors: ^1.1.1 + checksum: 39f5b303757e4d63bbff8133e251094cd4f952b46e3fa9febc7368d907583911d6a1eded6090876dc1feeff5cf6e134fb19b706f8d58d26c5402cd50e5e1aeb2 languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.9": - version: 7.23.5 - resolution: "@babel/compat-data@npm:7.23.5" - checksum: 06ce244cda5763295a0ea924728c09bae57d35713b675175227278896946f922a63edf803c322f855a3878323d48d0255a2a3023409d2a123483c8a69ebb4744 +"@babel/compat-data@npm:^7.28.6, @babel/compat-data@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/compat-data@npm:7.29.0" + checksum: ad19db279dfd06cbe91b505d03be00d603c6d3fcc141cfc14f4ace5c558193e9b6aae4788cb01fd209c4c850e52d73c8f3c247680e3c0d84fa17ab8b3d50c808 languageName: node linkType: hard @@ -277,1841 +260,1647 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.11.6": - version: 7.23.5 - resolution: "@babel/core@npm:7.23.5" +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9": + version: 7.29.0 + resolution: "@babel/core@npm:7.29.0" dependencies: - "@ampproject/remapping": ^2.2.0 - "@babel/code-frame": ^7.23.5 - "@babel/generator": ^7.23.5 - "@babel/helper-compilation-targets": ^7.22.15 - "@babel/helper-module-transforms": ^7.23.3 - "@babel/helpers": ^7.23.5 - "@babel/parser": ^7.23.5 - "@babel/template": ^7.22.15 - "@babel/traverse": ^7.23.5 - "@babel/types": ^7.23.5 + "@babel/code-frame": ^7.29.0 + "@babel/generator": ^7.29.0 + "@babel/helper-compilation-targets": ^7.28.6 + "@babel/helper-module-transforms": ^7.28.6 + "@babel/helpers": ^7.28.6 + "@babel/parser": ^7.29.0 + "@babel/template": ^7.28.6 + "@babel/traverse": ^7.29.0 + "@babel/types": ^7.29.0 + "@jridgewell/remapping": ^2.3.5 convert-source-map: ^2.0.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.3 semver: ^6.3.1 - checksum: 5e5dfb1e61f298676f1fca18c646dbf6fb164ca1056b0169b8d42b7f5c35e026d81823582ccb2358e93a61b035e22b3ad37e2abaae4bf43f1ffb93b6ce19466e + checksum: 85e1df6e213382c46dee27bcd07ed9202fa108a85bb74eb37be656308fd949349171ad2aa17cc84cf0720c908dc9ea6309d25e64d2a7fcdaa63721ce0c67c10b languageName: node linkType: hard -"@babel/core@npm:^7.12.3": - version: 7.18.6 - resolution: "@babel/core@npm:7.18.6" - dependencies: - "@ampproject/remapping": ^2.1.0 - "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.18.6 - "@babel/helper-compilation-targets": ^7.18.6 - "@babel/helper-module-transforms": ^7.18.6 - "@babel/helpers": ^7.18.6 - "@babel/parser": ^7.18.6 - "@babel/template": ^7.18.6 - "@babel/traverse": ^7.18.6 - "@babel/types": ^7.18.6 - convert-source-map: ^1.7.0 - debug: ^4.1.0 - gensync: ^1.0.0-beta.2 - json5: ^2.2.1 - semver: ^6.3.0 - checksum: 711459ebf7afab7b8eff88b7155c3f4a62690545f1c8c2eb6ba5ebaed01abeecb984cf9657847a2151ad24a5645efce765832aa343ce0f0386f311b67b59589a - languageName: node - linkType: hard - -"@babel/generator@npm:^7.12.5": - version: 7.22.7 - resolution: "@babel/generator@npm:7.22.7" - dependencies: - "@babel/types": ^7.22.5 - "@jridgewell/gen-mapping": ^0.3.2 - "@jridgewell/trace-mapping": ^0.3.17 - jsesc: ^2.5.1 - checksum: cee15558888bdf5564e19cfaf95101b2910fa425f30cc1a25ac9b8621bd62b63544eb1b36ad89c80b5e41915699219f78712cab128d1f7e3da6a21fbf4143927 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.18.6": - version: 7.18.7 - resolution: "@babel/generator@npm:7.18.7" +"@babel/generator@npm:^7.12.5, @babel/generator@npm:^7.29.0, @babel/generator@npm:^7.7.2": + version: 7.29.1 + resolution: "@babel/generator@npm:7.29.1" dependencies: - "@babel/types": ^7.18.7 - "@jridgewell/gen-mapping": ^0.3.2 - jsesc: ^2.5.1 - checksum: aad4b6873130165e9483af2888bce5a3a5ad9cca0757fc90ae11a0396757d0b295a3bff49282c8df8ab01b31972cc855ae88fd9ddc9ab00d9427dc0e01caeea9 + "@babel/parser": ^7.29.0 + "@babel/types": ^7.29.0 + "@jridgewell/gen-mapping": ^0.3.12 + "@jridgewell/trace-mapping": ^0.3.28 + jsesc: ^3.0.2 + checksum: d8e6863b2d04f684e65ad72731049ac7d754d3a3d1a67cdfc20807b109ba3180ed90d7ccef58ce5d38ded2eaeb71983a76c711eecb9b6266118262378f6c7226 languageName: node linkType: hard -"@babel/generator@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/generator@npm:7.23.3" +"@babel/helper-annotate-as-pure@npm:^7.27.1, @babel/helper-annotate-as-pure@npm:^7.27.3": + version: 7.27.3 + resolution: "@babel/helper-annotate-as-pure@npm:7.27.3" dependencies: - "@babel/types": ^7.23.3 - "@jridgewell/gen-mapping": ^0.3.2 - "@jridgewell/trace-mapping": ^0.3.17 - jsesc: ^2.5.1 - checksum: b6e71cca852d4e1aa01a28a30b8c74ffc3b8d56ccb7ae3ee783028ee015f63ad861a2e386c3eb490a9a8634db485a503a33521680f4af510151e90346c46da17 + "@babel/types": ^7.27.3 + checksum: 63863a5c936ef82b546ca289c9d1b18fabfc24da5c4ee382830b124e2e79b68d626207febc8d4bffc720f50b2ee65691d7d12cc0308679dee2cd6bdc926b7190 languageName: node linkType: hard -"@babel/generator@npm:^7.23.5, @babel/generator@npm:^7.7.2": - version: 7.23.5 - resolution: "@babel/generator@npm:7.23.5" +"@babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-compilation-targets@npm:7.28.6" dependencies: - "@babel/types": ^7.23.5 - "@jridgewell/gen-mapping": ^0.3.2 - "@jridgewell/trace-mapping": ^0.3.17 - jsesc: ^2.5.1 - checksum: 845ddda7cf38a3edf4be221cc8a439dee9ea6031355146a1a74047aa8007bc030305b27d8c68ec9e311722c910610bde38c0e13a9ce55225251e7cb7e7f3edc8 - languageName: node - linkType: hard - -"@babel/helper-annotate-as-pure@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-annotate-as-pure@npm:7.18.6" - dependencies: - "@babel/types": ^7.18.6 - checksum: 88ccd15ced475ef2243fdd3b2916a29ea54c5db3cd0cfabf9d1d29ff6e63b7f7cd1c27264137d7a40ac2e978b9b9a542c332e78f40eb72abe737a7400788fc1b - languageName: node - linkType: hard - -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.18.6" - dependencies: - "@babel/helper-explode-assignable-expression": ^7.18.6 - "@babel/types": ^7.18.6 - checksum: c4d71356e0adbc20ce9fe7c1e1181ff65a78603f8bba7615745f0417fed86bad7dc0a54a840bc83667c66709b3cb3721edcb9be0d393a298ce4e9eb6d085f3c1 - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.13.0, @babel/helper-compilation-targets@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-compilation-targets@npm:7.18.6" - dependencies: - "@babel/compat-data": ^7.18.6 - "@babel/helper-validator-option": ^7.18.6 - browserslist: ^4.20.2 - semver: ^6.3.0 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: f09ddaddc83c241cb7a040025e2ba558daa1c950ce878604d91230aed8d8a90f10dfd5bb0b67bc5b3db8af1576a0d0dac1d65959a06a17259243dbb5730d0ed1 - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-compilation-targets@npm:7.22.15" - dependencies: - "@babel/compat-data": ^7.22.9 - "@babel/helper-validator-option": ^7.22.15 - browserslist: ^4.21.9 + "@babel/compat-data": ^7.28.6 + "@babel/helper-validator-option": ^7.27.1 + browserslist: ^4.24.0 lru-cache: ^5.1.1 semver: ^6.3.1 - checksum: ce85196769e091ae54dd39e4a80c2a9df1793da8588e335c383d536d54f06baf648d0a08fc873044f226398c4ded15c4ae9120ee18e7dfd7c639a68e3cdc9980 + checksum: 8151e36b74eb1c5e414fe945c189436421f7bfa011884de5be3dd7fd77f12f1f733ff7c982581dfa0a49d8af724450243c2409427114b4a6cfeb8333259d001c languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-create-class-features-plugin@npm:7.18.6" +"@babel/helper-create-class-features-plugin@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-create-class-features-plugin@npm:7.28.6" dependencies: - "@babel/helper-annotate-as-pure": ^7.18.6 - "@babel/helper-environment-visitor": ^7.18.6 - "@babel/helper-function-name": ^7.18.6 - "@babel/helper-member-expression-to-functions": ^7.18.6 - "@babel/helper-optimise-call-expression": ^7.18.6 - "@babel/helper-replace-supers": ^7.18.6 - "@babel/helper-split-export-declaration": ^7.18.6 + "@babel/helper-annotate-as-pure": ^7.27.3 + "@babel/helper-member-expression-to-functions": ^7.28.5 + "@babel/helper-optimise-call-expression": ^7.27.1 + "@babel/helper-replace-supers": ^7.28.6 + "@babel/helper-skip-transparent-expression-wrappers": ^7.27.1 + "@babel/traverse": ^7.28.6 + semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 4d6da441ce329867338825c044c143f0b273cbfc6a20b9099e824a46f916584f44eabab073f78f02047d86719913e8f1a8bd72f42099ebe52691c29fabb992e4 + checksum: f886ab302a83f8e410384aa635806b22374897fd9e3387c737ab9d91d1214bf9f7e57ae92619bd25dea63c9c0a49b25b44eb807873332e0eb9549219adc73639 languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.18.6" +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.27.1, @babel/helper-create-regexp-features-plugin@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.28.5" dependencies: - "@babel/helper-annotate-as-pure": ^7.18.6 - regexpu-core: ^5.1.0 + "@babel/helper-annotate-as-pure": ^7.27.3 + regexpu-core: ^6.3.1 + semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 2d76e660cbfd0bfcb01ca9f177f0e9091c871a6b99f68ece6bcf4ab4a9df073485bdc2d87ecdfbde44b7f3723b26d13085d0f92082adb3ae80d31b246099f10a + checksum: de202103e6ff8cd8da0d62eb269fcceb29857f3fa16173f0ff38188fd514e9ad4901aef1d590ff8ba25381644b42eaf70ad9ba91fda59fe7aa6a5e694cdde267 languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.3.1": - version: 0.3.1 - resolution: "@babel/helper-define-polyfill-provider@npm:0.3.1" +"@babel/helper-define-polyfill-provider@npm:^0.6.6": + version: 0.6.6 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.6" dependencies: - "@babel/helper-compilation-targets": ^7.13.0 - "@babel/helper-module-imports": ^7.12.13 - "@babel/helper-plugin-utils": ^7.13.0 - "@babel/traverse": ^7.13.0 - debug: ^4.1.1 + "@babel/helper-compilation-targets": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + debug: ^4.4.3 lodash.debounce: ^4.0.8 - resolve: ^1.14.2 - semver: ^6.1.2 + resolve: ^1.22.11 peerDependencies: - "@babel/core": ^7.4.0-0 - checksum: e3e93cb22febfc0449a210cdafb278e5e1a038af2ca2b02f5dee71c7a49e8ba26e469d631ee11a4243885961a62bb2e5b0a4deb3ec1d7918a33c953d05c3e584 + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 582efe522e7ef75228f7eeea63fd659567ce865365e3d4b9d94451825114a7f1c8b61791bbbf134aa1b2aa6ee37620b145e74879dace7568107057180153e72e languageName: node linkType: hard -"@babel/helper-environment-visitor@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-environment-visitor@npm:7.18.6" - checksum: 64fce65a26efb50d2496061ab2de669dc4c42175a8e05c82279497127e5c542538ed22b38194f6f5a4e86bed6ef5a4890aed23408480db0555728b4ca660fc9c - languageName: node - linkType: hard - -"@babel/helper-environment-visitor@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-environment-visitor@npm:7.22.20" - checksum: d80ee98ff66f41e233f36ca1921774c37e88a803b2f7dca3db7c057a5fea0473804db9fb6729e5dbfd07f4bed722d60f7852035c2c739382e84c335661590b69 - languageName: node - linkType: hard - -"@babel/helper-environment-visitor@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-environment-visitor@npm:7.22.5" - checksum: 248532077d732a34cd0844eb7b078ff917c3a8ec81a7f133593f71a860a582f05b60f818dc5049c2212e5baa12289c27889a4b81d56ef409b4863db49646c4b1 - languageName: node - linkType: hard - -"@babel/helper-explode-assignable-expression@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-explode-assignable-expression@npm:7.18.6" - dependencies: - "@babel/types": ^7.18.6 - checksum: 225cfcc3376a8799023d15dc95000609e9d4e7547b29528c7f7111a0e05493ffb12c15d70d379a0bb32d42752f340233c4115bded6d299bc0c3ab7a12be3d30f +"@babel/helper-globals@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/helper-globals@npm:7.28.0" + checksum: d8d7b91c12dad1ee747968af0cb73baf91053b2bcf78634da2c2c4991fb45ede9bd0c8f9b5f3254881242bc0921218fcb7c28ae885477c25177147e978ce4397 languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-function-name@npm:7.18.6" +"@babel/helper-member-expression-to-functions@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-member-expression-to-functions@npm:7.28.5" dependencies: - "@babel/template": ^7.18.6 - "@babel/types": ^7.18.6 - checksum: bf84c2e0699aa07c3559d4262d199d4a9d0320037c2932efe3246866c3e01ce042c9c2131b5db32ba2409a9af01fb468171052819af759babc8ca93bdc6c9aeb + "@babel/traverse": ^7.28.5 + "@babel/types": ^7.28.5 + checksum: 447d385233bae2eea713df1785f819b5a5ca272950740da123c42d23f491045120f0fbbb5609c091f7a9bbd40f289a442846dde0cb1bf0c59440fa093690cf7c languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-function-name@npm:7.23.0" +"@babel/helper-module-imports@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-module-imports@npm:7.28.6" dependencies: - "@babel/template": ^7.22.15 - "@babel/types": ^7.23.0 - checksum: e44542257b2d4634a1f979244eb2a4ad8e6d75eb6761b4cfceb56b562f7db150d134bc538c8e6adca3783e3bc31be949071527aa8e3aab7867d1ad2d84a26e10 + "@babel/traverse": ^7.28.6 + "@babel/types": ^7.28.6 + checksum: 437513aa029898b588a38f7991d7656c539b22f595207d85d0c407240c9e3f2aff8b9d0d7115fdedc91e7fdce4465100549a052024e2fba6a810bcbb7584296b languageName: node linkType: hard -"@babel/helper-hoist-variables@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-hoist-variables@npm:7.18.6" +"@babel/helper-module-transforms@npm:^7.12.1, @babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-module-transforms@npm:7.28.6" dependencies: - "@babel/types": ^7.18.6 - checksum: fd9c35bb435fda802bf9ff7b6f2df06308a21277c6dec2120a35b09f9de68f68a33972e2c15505c1a1a04b36ec64c9ace97d4a9e26d6097b76b4396b7c5fa20f - languageName: node - linkType: hard - -"@babel/helper-hoist-variables@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-hoist-variables@npm:7.22.5" - dependencies: - "@babel/types": ^7.22.5 - checksum: 394ca191b4ac908a76e7c50ab52102669efe3a1c277033e49467913c7ed6f7c64d7eacbeabf3bed39ea1f41731e22993f763b1edce0f74ff8563fd1f380d92cc - languageName: node - linkType: hard - -"@babel/helper-member-expression-to-functions@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-member-expression-to-functions@npm:7.18.6" - dependencies: - "@babel/types": ^7.18.6 - checksum: 20c8e82d2375534dfe4d4adeb01d94906e5e616143bb2775e9f1d858039d87a0f79220e0a5c2ed410c54ccdeda47a4c09609b396db1f98fe8ce9e420894ac2f3 - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.12.13, @babel/helper-module-imports@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-module-imports@npm:7.18.6" - dependencies: - "@babel/types": ^7.18.6 - checksum: f393f8a3b3304b1b7a288a38c10989de754f01d29caf62ce7c4e5835daf0a27b81f3ac687d9d2780d39685aae7b55267324b512150e7b2be967b0c493b6a1def + "@babel/helper-module-imports": ^7.28.6 + "@babel/helper-validator-identifier": ^7.28.5 + "@babel/traverse": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 522f7d1d08b5e2ccd4ec912aca879bd1506af78d1fb30f46e3e6b4bb69c6ae6ab4e379a879723844230d27dc6d04a55b03f5215cd3141b7a2b40bb4a02f71a9f languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-module-imports@npm:7.22.15" +"@babel/helper-optimise-call-expression@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-optimise-call-expression@npm:7.27.1" dependencies: - "@babel/types": ^7.22.15 - checksum: ecd7e457df0a46f889228f943ef9b4a47d485d82e030676767e6a2fdcbdaa63594d8124d4b55fd160b41c201025aec01fc27580352b1c87a37c9c6f33d116702 + "@babel/types": ^7.27.1 + checksum: 0fb7ee824a384529d6b74f8a58279f9b56bfe3cce332168067dddeab2552d8eeb56dc8eaf86c04a3a09166a316cb92dfc79c4c623cd034ad4c563952c98b464f languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-module-imports@npm:7.22.5" - dependencies: - "@babel/types": ^7.22.5 - checksum: 9ac2b0404fa38b80bdf2653fbeaf8e8a43ccb41bd505f9741d820ed95d3c4e037c62a1bcdcb6c9527d7798d2e595924c4d025daed73283badc180ada2c9c49ad +"@babel/helper-plugin-utils@npm:7.10.4": + version: 7.10.4 + resolution: "@babel/helper-plugin-utils@npm:7.10.4" + checksum: 639ed8fc462b97a83226cee6bb081b1d77e7f73e8b033d2592ed107ee41d96601e321e5ea53a33e47469c7f1146b250a3dcda5ab873c7de162ab62120c341a41 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.12.1": - version: 7.22.5 - resolution: "@babel/helper-module-transforms@npm:7.22.5" - dependencies: - "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-module-imports": ^7.22.5 - "@babel/helper-simple-access": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.5 - "@babel/helper-validator-identifier": ^7.22.5 - "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.5 - "@babel/types": ^7.22.5 - checksum: 8985dc0d971fd17c467e8b84fe0f50f3dd8610e33b6c86e5b3ca8e8859f9448bcc5c84e08a2a14285ef388351c0484797081c8f05a03770bf44fc27bf4900e68 +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.28.6, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.28.6 + resolution: "@babel/helper-plugin-utils@npm:7.28.6" + checksum: a0b4caab5e2180b215faa4d141ceac9e82fad9d446b8023eaeb8d82a6e62024726675b07fe8e616dd12f34e2bb59747e8d57aa8adab3e0717d1b8d691b118379 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-module-transforms@npm:7.18.6" +"@babel/helper-remap-async-to-generator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-remap-async-to-generator@npm:7.27.1" dependencies: - "@babel/helper-environment-visitor": ^7.18.6 - "@babel/helper-module-imports": ^7.18.6 - "@babel/helper-simple-access": ^7.18.6 - "@babel/helper-split-export-declaration": ^7.18.6 - "@babel/helper-validator-identifier": ^7.18.6 - "@babel/template": ^7.18.6 - "@babel/traverse": ^7.18.6 - "@babel/types": ^7.18.6 - checksum: 75d90be9ecd314fe2f1b668ce065d7e8b3dff82eddea88480259c5d4bd54f73a909d0998909ffe734a44ba8be85ba233359033071cc800db209d37173bd26db2 + "@babel/helper-annotate-as-pure": ^7.27.1 + "@babel/helper-wrap-function": ^7.27.1 + "@babel/traverse": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 0747397ba013f87dbf575454a76c18210d61c7c9af0f697546b4bcac670b54ddc156330234407b397f0c948738c304c228e0223039bc45eab4fbf46966a5e8cc languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/helper-module-transforms@npm:7.23.3" +"@babel/helper-replace-supers@npm:^7.27.1, @babel/helper-replace-supers@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-replace-supers@npm:7.28.6" dependencies: - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-module-imports": ^7.22.15 - "@babel/helper-simple-access": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/helper-validator-identifier": ^7.22.20 + "@babel/helper-member-expression-to-functions": ^7.28.5 + "@babel/helper-optimise-call-expression": ^7.27.1 + "@babel/traverse": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0 - checksum: 5d0895cfba0e16ae16f3aa92fee108517023ad89a855289c4eb1d46f7aef4519adf8e6f971e1d55ac20c5461610e17213f1144097a8f932e768a9132e2278d71 + checksum: aa6530a52010883b6be88465e3b9e789509786a40203650a23a51c315f7442b196e5925fb8e2d66d1e3dc2c604cdc817bd8c5c170dbb322ab5ebc7486fd8a022 languageName: node linkType: hard -"@babel/helper-optimise-call-expression@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-optimise-call-expression@npm:7.18.6" +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.27.1" dependencies: - "@babel/types": ^7.18.6 - checksum: e518fe8418571405e21644cfb39cf694f30b6c47b10b006609a92469ae8b8775cbff56f0b19732343e2ea910641091c5a2dc73b56ceba04e116a33b0f8bd2fbd + "@babel/traverse": ^7.27.1 + "@babel/types": ^7.27.1 + checksum: 4f380c5d0e0769fa6942a468b0c2d7c8f0c438f941aaa88f785f8752c103631d0904c7b4e76207a3b0e6588b2dec376595370d92ca8f8f1b422c14a69aa146d4 languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:7.10.4": - version: 7.10.4 - resolution: "@babel/helper-plugin-utils@npm:7.10.4" - checksum: 639ed8fc462b97a83226cee6bb081b1d77e7f73e8b033d2592ed107ee41d96601e321e5ea53a33e47469c7f1146b250a3dcda5ab873c7de162ab62120c341a41 +"@babel/helper-string-parser@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-string-parser@npm:7.27.1" + checksum: 0a8464adc4b39b138aedcb443b09f4005d86207d7126e5e079177e05c3116107d856ec08282b365e9a79a9872f40f4092a6127f8d74c8a01c1ef789dacfc25d6 languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.13.0, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.18.6 - resolution: "@babel/helper-plugin-utils@npm:7.18.6" - checksum: 3dbfceb6c10fdf6c78a0e57f24e991ff8967b8a0bd45fe0314fb4a8ccf7c8ad4c3778c319a32286e7b1f63d507173df56b4e69fb31b71e1b447a73efa1ca723e +"@babel/helper-validator-identifier@npm:^7.25.9, @babel/helper-validator-identifier@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-validator-identifier@npm:7.28.5" + checksum: 5a251a6848e9712aea0338f659a1a3bd334d26219d5511164544ca8ec20774f098c3a6661e9da65a0d085c745c00bb62c8fada38a62f08fa1f8053bc0aeb57e4 languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-plugin-utils@npm:7.22.5" - checksum: c0fc7227076b6041acd2f0e818145d2e8c41968cc52fb5ca70eed48e21b8fe6dd88a0a91cbddf4951e33647336eb5ae184747ca706817ca3bef5e9e905151ff5 +"@babel/helper-validator-option@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-option@npm:7.27.1" + checksum: db73e6a308092531c629ee5de7f0d04390835b21a263be2644276cb27da2384b64676cab9f22cd8d8dbd854c92b1d7d56fc8517cf0070c35d1c14a8c828b0903 languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-remap-async-to-generator@npm:7.18.6" +"@babel/helper-wrap-function@npm:^7.27.1": + version: 7.28.6 + resolution: "@babel/helper-wrap-function@npm:7.28.6" dependencies: - "@babel/helper-annotate-as-pure": ^7.18.6 - "@babel/helper-environment-visitor": ^7.18.6 - "@babel/helper-wrap-function": ^7.18.6 - "@babel/types": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 83e890624da9413c74a8084f6b5f7bfe93abad8a6e1a33464f3086e2a1336751672e6ac6d74dddd35b641d19584cc0f93d02c52a4f33385b3be5b40942fe30da + "@babel/template": ^7.28.6 + "@babel/traverse": ^7.28.6 + "@babel/types": ^7.28.6 + checksum: 1281f45d55ff291711de7cf05b8132fc28b8d2b30c6c9cf8fce68669bbe318503ed485057d434efa1a4f91ab55d62bf8f3ecb0a889a9f81d357ad4614cd0fa6c languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-replace-supers@npm:7.18.6" +"@babel/helpers@npm:^7.12.5, @babel/helpers@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helpers@npm:7.28.6" dependencies: - "@babel/helper-environment-visitor": ^7.18.6 - "@babel/helper-member-expression-to-functions": ^7.18.6 - "@babel/helper-optimise-call-expression": ^7.18.6 - "@babel/traverse": ^7.18.6 - "@babel/types": ^7.18.6 - checksum: 48e869dc8d3569136d239cd6354687e49c3225b114cb2141ed3a5f31cff5278f463eb25913df3345489061f377ad5d6e49778bddedd098fa8ee3adcec07cc1d3 + "@babel/template": ^7.28.6 + "@babel/types": ^7.28.6 + checksum: 4f3d555ec20dde40a2fcb244c86bfd9ec007b57ec9b30a9d04334c1ea2c1670bb82c151024124e1ab27ccf0b1f5ad30167633457a7c9ffbf4064fad2643f12fc languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-simple-access@npm:7.18.6" +"@babel/highlight@npm:^7.10.4": + version: 7.25.9 + resolution: "@babel/highlight@npm:7.25.9" dependencies: - "@babel/types": ^7.18.6 - checksum: 37cd36eef199e0517845763c1e6ff6ea5e7876d6d707a6f59c9267c547a50aa0e84260ba9285d49acfaf2cfa0a74a772d92967f32ac1024c961517d40b6c16a5 + "@babel/helper-validator-identifier": ^7.25.9 + chalk: ^2.4.2 + js-tokens: ^4.0.0 + picocolors: ^1.0.0 + checksum: a6e0ac0a1c4bef7401915ca3442ab2b7ae4adf360262ca96b91396bfb9578abb28c316abf5e34460b780696db833b550238d9256bdaca60fade4ba7a67645064 languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-simple-access@npm:7.22.5" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.12.7, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.3, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0, @babel/parser@npm:^7.7.0": + version: 7.29.0 + resolution: "@babel/parser@npm:7.29.0" dependencies: - "@babel/types": ^7.22.5 - checksum: fe9686714caf7d70aedb46c3cce090f8b915b206e09225f1e4dbc416786c2fdbbee40b38b23c268b7ccef749dd2db35f255338fb4f2444429874d900dede5ad2 + "@babel/types": ^7.29.0 + bin: + parser: ./bin/babel-parser.js + checksum: b4a1bd3cf46712e439286db9a4105dfa741b5a7720fa1f38f33719cf4f1da9df9fc5b6686128890bd6a62debba287d8d472af153dd629fd4a0a44fe55413cd68 languageName: node linkType: hard -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.18.6" +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.28.5" dependencies: - "@babel/types": ^7.18.6 - checksum: 069750f9690b2995617c42be4b7848a4490cd30f1edc72401d9d2ae362bc186d395b7d8c1e171c1b6c09751642ab1bba578cccf8c0dfc82b4541f8627965aea7 + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/traverse": ^7.28.5 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 749b40a963d5633f554cad0336245cb6c1c1393c70a3fddcf302d86a1a42b35efdd2ed62056b88db66f3900887ae1cee9a3eeec89799c22e0cf65059f0dfd142 languageName: node linkType: hard -"@babel/helper-split-export-declaration@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-split-export-declaration@npm:7.18.6" +"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.27.1" dependencies: - "@babel/types": ^7.18.6 - checksum: c6d3dede53878f6be1d869e03e9ffbbb36f4897c7cc1527dc96c56d127d834ffe4520a6f7e467f5b6f3c2843ea0e81a7819d66ae02f707f6ac057f3d57943a2b + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: eb7f4146dc01f1198ce559a90b077e58b951a07521ec414e3c7d4593bf6c4ab5c2af22242a7e9fec085e20299e0ba6ea97f44a45e84ab148141bf9eb959ad25e languageName: node linkType: hard -"@babel/helper-split-export-declaration@npm:^7.22.5, @babel/helper-split-export-declaration@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/helper-split-export-declaration@npm:7.22.6" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.27.1" dependencies: - "@babel/types": ^7.22.5 - checksum: e141cace583b19d9195f9c2b8e17a3ae913b7ee9b8120246d0f9ca349ca6f03cb2c001fd5ec57488c544347c0bb584afec66c936511e447fd20a360e591ac921 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-string-parser@npm:7.22.5" - checksum: 836851ca5ec813077bbb303acc992d75a360267aa3b5de7134d220411c852a6f17de7c0d0b8c8dcc0f567f67874c00f4528672b2a4f1bc978a3ada64c8c78467 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/helper-string-parser@npm:7.23.4" - checksum: c0641144cf1a7e7dc93f3d5f16d5327465b6cf5d036b48be61ecba41e1eece161b48f46b7f960951b67f8c3533ce506b16dece576baef4d8b3b49f8c65410f90 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-validator-identifier@npm:7.18.6" - checksum: e295254d616bbe26e48c196a198476ab4d42a73b90478c9842536cf910ead887f5af6b5c4df544d3052a25ccb3614866fa808dc1e3a5a4291acd444e243c0648 + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 621cfddfcc99a81e74f8b6f9101fd260b27500cb1a568e3ceae9cc8afe9aee45ac3bca3900a2b66c612b1a2366d29ef67d4df5a1c975be727eaad6906f98c2c6 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-validator-identifier@npm:7.22.20" - checksum: 136412784d9428266bcdd4d91c32bcf9ff0e8d25534a9d94b044f77fe76bc50f941a90319b05aafd1ec04f7d127cd57a179a3716009ff7f3412ef835ada95bdc +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/helper-skip-transparent-expression-wrappers": ^7.27.1 + "@babel/plugin-transform-optional-chaining": ^7.27.1 + peerDependencies: + "@babel/core": ^7.13.0 + checksum: f07aa80272bd7a46b7ba11a4644da6c9b6a5a64e848dfaffdad6f02663adefd512e1aaebe664c4dd95f7ed4f80c872c7f8db8d8e34b47aae0930b412a28711a0 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-validator-identifier@npm:7.22.5" - checksum: 7f0f30113474a28298c12161763b49de5018732290ca4de13cdaefd4fd0d635a6fe3f6686c37a02905fb1e64f21a5ee2b55140cf7b070e729f1bd66866506aea +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/traverse": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: f1341f829f809c8685d839669953a478f8a40d1d53f4f5e1972bf39ff4e1ece148319340292d6e0c3641157268b435cbb99b3ac2f3cefe9fca9e81b8f62d6d71 languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-validator-option@npm:7.18.6" - checksum: f9cc6eb7cc5d759c5abf006402180f8d5e4251e9198197428a97e05d65eb2f8ae5a0ce73b1dfd2d35af41d0eb780627a64edf98a4e71f064eeeacef8de58f2cf +"@babel/plugin-proposal-object-rest-spread@npm:7.12.1": + version: 7.12.1 + resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.12.1" + dependencies: + "@babel/helper-plugin-utils": ^7.10.4 + "@babel/plugin-syntax-object-rest-spread": ^7.8.0 + "@babel/plugin-transform-parameters": ^7.12.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 221a41630c9a7162bf0416c71695b3f7f38482078a1d0d3af7abdc4f07ea1c9feed890399158d56c1d0278c971fe6f565ce822e9351e4481f7d98e9ff735dced languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.22.15": - version: 7.23.5 - resolution: "@babel/helper-validator-option@npm:7.23.5" - checksum: 537cde2330a8aede223552510e8a13e9c1c8798afee3757995a7d4acae564124fe2bf7e7c3d90d62d3657434a74340a274b3b3b1c6f17e9a2be1f48af29cb09e +"@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": + version: 7.21.0-placeholder-for-preset-env.2 + resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d97745d098b835d55033ff3a7fb2b895b9c5295b08a5759e4f20df325aa385a3e0bc9bd5ad8f2ec554a44d4e6525acfc257b8c5848a1345cb40f26a30e277e91 languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-wrap-function@npm:7.18.6" +"@babel/plugin-syntax-async-generators@npm:^7.8.4": + version: 7.8.4 + resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" dependencies: - "@babel/helper-function-name": ^7.18.6 - "@babel/template": ^7.18.6 - "@babel/traverse": ^7.18.6 - "@babel/types": ^7.18.6 - checksum: b7a4f59b302ed77407e5c2005d8677ebdeabbfa69230e15f80b5e06cc532369c1e48399ec3e67dd3341e7ab9b3f84f17a255e2c1ec4e0d42bb571a4dac5472d6 + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 languageName: node linkType: hard -"@babel/helpers@npm:^7.12.5": - version: 7.22.6 - resolution: "@babel/helpers@npm:7.22.6" +"@babel/plugin-syntax-bigint@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" dependencies: - "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.6 - "@babel/types": ^7.22.5 - checksum: 5c1f33241fe7bf7709868c2105134a0a86dca26a0fbd508af10a89312b1f77ca38ebae43e50be3b208613c5eacca1559618af4ca236f0abc55d294800faeff30 + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3a10849d83e47aec50f367a9e56a6b22d662ddce643334b087f9828f4c3dd73bdc5909aaeabe123fed78515767f9ca43498a0e621c438d1cd2802d7fae3c9648 languageName: node linkType: hard -"@babel/helpers@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helpers@npm:7.18.6" +"@babel/plugin-syntax-class-properties@npm:^7.12.13": + version: 7.12.13 + resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" dependencies: - "@babel/template": ^7.18.6 - "@babel/traverse": ^7.18.6 - "@babel/types": ^7.18.6 - checksum: 5dea4fa53776703ae4190cacd3f81464e6e00cf0b6908ea9b0af2b3d9992153f3746dd8c33d22ec198f77a8eaf13a273d83cd8847f7aef983801e7bfafa856ec + "@babel/helper-plugin-utils": ^7.12.13 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc languageName: node linkType: hard -"@babel/helpers@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helpers@npm:7.23.5" +"@babel/plugin-syntax-class-static-block@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" dependencies: - "@babel/template": ^7.22.15 - "@babel/traverse": ^7.23.5 - "@babel/types": ^7.23.5 - checksum: c16dc8a3bb3d0e02c7ee1222d9d0865ed4b92de44fb8db43ff5afd37a0fc9ea5e2906efa31542c95b30c1a3a9540d66314663c9a23b5bb9b5ec76e8ebc896064 + "@babel/helper-plugin-utils": ^7.14.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 3e80814b5b6d4fe17826093918680a351c2d34398a914ce6e55d8083d72a9bdde4fbaf6a2dcea0e23a03de26dc2917ae3efd603d27099e2b98380345703bf948 languageName: node linkType: hard -"@babel/highlight@npm:^7.10.4, @babel/highlight@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/highlight@npm:7.18.6" +"@babel/plugin-syntax-import-assertions@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.28.6" dependencies: - "@babel/helper-validator-identifier": ^7.18.6 - chalk: ^2.0.0 - js-tokens: ^4.0.0 - checksum: 92d8ee61549de5ff5120e945e774728e5ccd57fd3b2ed6eace020ec744823d4a98e242be1453d21764a30a14769ecd62170fba28539b211799bbaf232bbb2789 + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 25017235e1e2c4ed892aa327a3fa10f4209cc618c6dd7806fc40c07d8d7d24a39743d3d5568b8d1c8f416cffe03c174e78874ded513c9338b07a7ab1dcbab050 languageName: node linkType: hard -"@babel/highlight@npm:^7.22.13": - version: 7.22.20 - resolution: "@babel/highlight@npm:7.22.20" +"@babel/plugin-syntax-import-attributes@npm:^7.24.7, @babel/plugin-syntax-import-attributes@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.28.6" dependencies: - "@babel/helper-validator-identifier": ^7.22.20 - chalk: ^2.4.2 - js-tokens: ^4.0.0 - checksum: 84bd034dca309a5e680083cd827a766780ca63cef37308404f17653d32366ea76262bd2364b2d38776232f2d01b649f26721417d507e8b4b6da3e4e739f6d134 + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 6c8c6a5988dbb9799d6027360d1a5ba64faabf551f2ef11ba4eade0c62253b5c85d44ddc8eb643c74b9acb2bcaa664a950bd5de9a5d4aef291c4f2a48223bb4b languageName: node linkType: hard -"@babel/highlight@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/highlight@npm:7.22.5" +"@babel/plugin-syntax-import-meta@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" dependencies: - "@babel/helper-validator-identifier": ^7.22.5 - chalk: ^2.0.0 - js-tokens: ^4.0.0 - checksum: f61ae6de6ee0ea8d9b5bcf2a532faec5ab0a1dc0f7c640e5047fc61630a0edb88b18d8c92eb06566d30da7a27db841aca11820ecd3ebe9ce514c9350fbed39c4 + "@babel/helper-plugin-utils": ^7.10.4 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b languageName: node linkType: hard -"@babel/highlight@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/highlight@npm:7.23.4" +"@babel/plugin-syntax-json-strings@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" dependencies: - "@babel/helper-validator-identifier": ^7.22.20 - chalk: ^2.4.2 - js-tokens: ^4.0.0 - checksum: 643acecdc235f87d925979a979b539a5d7d1f31ae7db8d89047269082694122d11aa85351304c9c978ceeb6d250591ccadb06c366f358ccee08bb9c122476b89 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/parser@npm:7.23.5" - bin: - parser: ./bin/babel-parser.js - checksum: ea763629310f71580c4a3ea9d3705195b7ba994ada2cc98f9a584ebfdacf54e92b2735d351672824c2c2b03c7f19206899f4d95650d85ce514a822b19a8734c7 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.12.7, @babel/parser@npm:^7.22.5": - version: 7.22.7 - resolution: "@babel/parser@npm:7.22.7" - bin: - parser: ./bin/babel-parser.js - checksum: 02209ddbd445831ee8bf966fdf7c29d189ed4b14343a68eb2479d940e7e3846340d7cc6bd654a5f3d87d19dc84f49f50a58cf9363bee249dc5409ff3ba3dab54 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.18.6, @babel/parser@npm:^7.7.0": - version: 7.18.6 - resolution: "@babel/parser@npm:7.18.6" - bin: - parser: ./bin/babel-parser.js - checksum: 533ffc26667b7e2e0d87ae11368d90b6a3a468734d6dfe9c4697c24f48373cf9cc35ee08e416728f087fc56531b68022f752097941feddc60e0223d69a4d4cad - languageName: node - linkType: hard - -"@babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/parser@npm:7.23.3" - bin: - parser: ./bin/babel-parser.js - checksum: 4aa7366e401b5467192c1dbf2bef99ac0958c45ef69ed6704abbae68f98fab6409a527b417d1528fddc49d7664450670528adc7f45abb04db5fafca7ed766d57 + "@babel/helper-plugin-utils": ^7.8.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.18.6" +"@babel/plugin-syntax-jsx@npm:7.12.1": + version: 7.12.1 + resolution: "@babel/plugin-syntax-jsx@npm:7.12.1" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.10.4 peerDependencies: - "@babel/core": ^7.0.0 - checksum: 845bd280c55a6a91d232cfa54eaf9708ec71e594676fe705794f494bb8b711d833b752b59d1a5c154695225880c23dbc9cab0e53af16fd57807976cd3ff41b8d + "@babel/core": ^7.0.0-0 + checksum: d4b9b589c484b2e0856799770f060dff34c67b24d7f4526f66309a0e0e9cf388a5c1f2c0da329d1973cc87d1b2cede8f3dc8facfac59e785d6393a003bcdd0f9 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.18.6" +"@babel/plugin-syntax-jsx@npm:^7.28.6, @babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.28.6 + resolution: "@babel/plugin-syntax-jsx@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-skip-transparent-expression-wrappers": ^7.18.6 - "@babel/plugin-proposal-optional-chaining": ^7.18.6 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: - "@babel/core": ^7.13.0 - checksum: 0f0057cd12e98e297fd952c9cfdbffe5e34813f1b302e941fc212ca2a7b183ec2a227a1c49e104bbda528a4da6be03dbfb6e0d275d9572fb16b6ac5cda09fcd7 + "@babel/core": ^7.0.0-0 + checksum: 572e38f5c1bb4b8124300e7e3dd13e82ae84a21f90d3f0786c98cd05e63c78ca1f32d1cfe462dfbaf5e7d5102fa7cd8fd741dfe4f3afc2e01a3b2877dcc8c866 languageName: node linkType: hard -"@babel/plugin-proposal-async-generator-functions@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-async-generator-functions@npm:7.18.6" +"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" dependencies: - "@babel/helper-environment-visitor": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-remap-async-to-generator": ^7.18.6 - "@babel/plugin-syntax-async-generators": ^7.8.4 + "@babel/helper-plugin-utils": ^7.10.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 3f708808ba6f8a9bd18805b1b22ab90ec0b362d949111a776e0bade5391f143f55479dcc444b2cec25fc89ac21035ee92e9a5ec37c02c610639197a0c2f7dcb0 + checksum: aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 languageName: node linkType: hard -"@babel/plugin-proposal-class-properties@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-class-properties@npm:7.18.6" +"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" dependencies: - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.8.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 49a78a2773ec0db56e915d9797e44fd079ab8a9b2e1716e0df07c92532f2c65d76aeda9543883916b8e0ff13606afeffa67c5b93d05b607bc87653ad18a91422 + checksum: 87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 languageName: node linkType: hard -"@babel/plugin-proposal-class-static-block@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-class-static-block@npm:7.18.6" +"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": + version: 7.10.4 + resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" dependencies: - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-class-static-block": ^7.14.5 + "@babel/helper-plugin-utils": ^7.10.4 peerDependencies: - "@babel/core": ^7.12.0 - checksum: b8d7ae99ed5ad784f39e7820e3ac03841f91d6ed60ab4a98c61d6112253da36013e12807bae4ffed0ef3cb318e47debac112ed614e03b403fb8b075b09a828ee + "@babel/core": ^7.0.0-0 + checksum: 01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 languageName: node linkType: hard -"@babel/plugin-proposal-dynamic-import@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-dynamic-import@npm:7.18.6" +"@babel/plugin-syntax-object-rest-spread@npm:7.8.3, @babel/plugin-syntax-object-rest-spread@npm:^7.8.0, @babel/plugin-syntax-object-rest-spread@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-dynamic-import": ^7.8.3 + "@babel/helper-plugin-utils": ^7.8.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 96b1c8a8ad8171d39e9ab106be33bde37ae09b22fb2c449afee9a5edf3c537933d79d963dcdc2694d10677cb96da739cdf1b53454e6a5deab9801f28a818bb2f + checksum: fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf languageName: node linkType: hard -"@babel/plugin-proposal-export-namespace-from@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-export-namespace-from@npm:7.18.6" +"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-export-namespace-from": ^7.8.3 + "@babel/helper-plugin-utils": ^7.8.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 3227307e1155e8434825c02fb2e4e91e590aeb629ce6ce23e4fe869d0018a144c4674bf98863e1bb6d4e4a6f831e686ae43f46a87894e4286e31e6492a5571eb + checksum: 910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 languageName: node linkType: hard -"@babel/plugin-proposal-json-strings@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-json-strings@npm:7.18.6" +"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-json-strings": ^7.8.3 + "@babel/helper-plugin-utils": ^7.8.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 25ba0e6b9d6115174f51f7c6787e96214c90dd4026e266976b248a2ed417fe50fddae72843ffb3cbe324014a18632ce5648dfac77f089da858022b49fd608cb3 + checksum: eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 languageName: node linkType: hard -"@babel/plugin-proposal-logical-assignment-operators@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-logical-assignment-operators@npm:7.18.6" +"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 + "@babel/helper-plugin-utils": ^7.14.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 4fe0a0d6739da6b1929f5015846e1de3b72d7dd07c665975ca795850ad7d048f8a0756c057a4cd1d71080384ad6283c30fcc239393da6848eabc38e38d3206c5 + checksum: b317174783e6e96029b743ccff2a67d63d38756876e7e5d0ba53a322e38d9ca452c13354a57de1ad476b4c066dbae699e0ca157441da611117a47af88985ecda languageName: node linkType: hard -"@babel/plugin-proposal-nullish-coalescing-operator@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-nullish-coalescing-operator@npm:7.18.6" +"@babel/plugin-syntax-top-level-await@npm:^7.14.5": + version: 7.14.5 + resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 + "@babel/helper-plugin-utils": ^7.14.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 949c9ddcdecdaec766ee610ef98f965f928ccc0361dd87cf9f88cf4896a6ccd62fce063d4494778e50da99dea63d270a1be574a62d6ab81cbe9d85884bf55a7d + checksum: bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e languageName: node linkType: hard -"@babel/plugin-proposal-numeric-separator@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-numeric-separator@npm:7.18.6" +"@babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.28.6 + resolution: "@babel/plugin-syntax-typescript@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-numeric-separator": ^7.10.4 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f370ea584c55bf4040e1f78c80b4eeb1ce2e6aaa74f87d1a48266493c33931d0b6222d8cee3a082383d6bb648ab8d6b7147a06f974d3296ef3bc39c7851683ec + checksum: 5c55f9c63bd36cf3d7e8db892294c8f85000f9c1526c3a1cc310d47d1e174f5c6f6605e5cc902c4636d885faba7a9f3d5e5edc6b35e4f3b1fd4c2d58d0304fa5 languageName: node linkType: hard -"@babel/plugin-proposal-object-rest-spread@npm:7.12.1": - version: 7.12.1 - resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.12.1" +"@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" dependencies: - "@babel/helper-plugin-utils": ^7.10.4 - "@babel/plugin-syntax-object-rest-spread": ^7.8.0 - "@babel/plugin-transform-parameters": ^7.12.1 + "@babel/helper-create-regexp-features-plugin": ^7.18.6 + "@babel/helper-plugin-utils": ^7.18.6 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 221a41630c9a7162bf0416c71695b3f7f38482078a1d0d3af7abdc4f07ea1c9feed890399158d56c1d0278c971fe6f565ce822e9351e4481f7d98e9ff735dced + "@babel/core": ^7.0.0 + checksum: a651d700fe63ff0ddfd7186f4ebc24447ca734f114433139e3c027bc94a900d013cf1ef2e2db8430425ba542e39ae160c3b05f06b59fd4656273a3df97679e9c languageName: node linkType: hard -"@babel/plugin-proposal-object-rest-spread@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.18.6" +"@babel/plugin-transform-arrow-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.27.1" dependencies: - "@babel/compat-data": ^7.18.6 - "@babel/helper-compilation-targets": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-transform-parameters": ^7.18.6 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 9b7516bad285a8706beb5e619cf505364bfbe79e219ae86d2139b32010d238d146301c1424488926a57f6d729556e21cfccab29f28c26ecd0dda05e53d7160b1 + checksum: 62c2cc0ae2093336b1aa1376741c5ed245c0987d9e4b4c5313da4a38155509a7098b5acce582b6781cc0699381420010da2e3086353344abe0a6a0ec38961eb7 languageName: node linkType: hard -"@babel/plugin-proposal-optional-catch-binding@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-optional-catch-binding@npm:7.18.6" +"@babel/plugin-transform-async-generator-functions@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.29.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-remap-async-to-generator": ^7.27.1 + "@babel/traverse": ^7.29.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7b5b39fb5d8d6d14faad6cb68ece5eeb2fd550fb66b5af7d7582402f974f5bc3684641f7c192a5a57e0f59acfae4aada6786be1eba030881ddc590666eff4d1e + checksum: bd549b54283034dd3e2f6c4b41b99a0caba0ddc8e9418490a611136ddb01e62235f14b233fcc172902fd1d18eec6e029245d22212566ea5cb5e24c7450d6005d languageName: node linkType: hard -"@babel/plugin-proposal-optional-chaining@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-optional-chaining@npm:7.18.6" +"@babel/plugin-transform-async-to-generator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-skip-transparent-expression-wrappers": ^7.18.6 - "@babel/plugin-syntax-optional-chaining": ^7.8.3 + "@babel/helper-module-imports": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-remap-async-to-generator": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 9c3bf80cfb41ee53a2a5d0f316ef5d125bb0d400ede1ee1a68a9b7dfc998036cca20c3901cb5c9e24fdd9f08c0056030e042f4637bc9bbc36b682384b38e2d96 + checksum: bca5774263ec01dd2bf71c74bbaf7baa183bf03576636b7826c3346be70c8c8cb15cff549112f2983c36885131a0afde6c443591278c281f733ee17f455aa9b1 languageName: node linkType: hard -"@babel/plugin-proposal-private-methods@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-private-methods@npm:7.18.6" +"@babel/plugin-transform-block-scoped-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.27.1" dependencies: - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 22d8502ee96bca99ad2c8393e8493e2b8d4507576dd054490fd8201a36824373440106f5b098b6d821b026c7e72b0424ff4aeca69ed5f42e48f029d3a156d5ad + checksum: 7fb4988ca80cf1fc8345310d5edfe38e86b3a72a302675cdd09404d5064fe1d1fe1283ebe658ad2b71445ecef857bfb29a748064306b5f6c628e0084759c2201 languageName: node linkType: hard -"@babel/plugin-proposal-private-property-in-object@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.18.6" +"@babel/plugin-transform-block-scoping@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-block-scoping@npm:7.28.6" dependencies: - "@babel/helper-annotate-as-pure": ^7.18.6 - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-private-property-in-object": ^7.14.5 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c8e56a972930730345f39f2384916fd8e711b3f4b4eae2ca9740e99958980118120d5cc9b6ac150f0965a5a35f825910e2c3013d90be3e9993ab6111df444569 + checksum: cb4f71ac4fc7b32c2e3cc167eb9e7a1a11562127d702e3b5093567750e9a4eb11a29ae5a917f62741bf9d5792bfe3022cbcdcc7bb927ddb6f627b6749a38c118 languageName: node linkType: hard -"@babel/plugin-proposal-unicode-property-regex@npm:^7.18.6, @babel/plugin-proposal-unicode-property-regex@npm:^7.4.4": - version: 7.18.6 - resolution: "@babel/plugin-proposal-unicode-property-regex@npm:7.18.6" +"@babel/plugin-transform-class-properties@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-class-properties@npm:7.28.6" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-create-class-features-plugin": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a8575ecb7ff24bf6c6e94808d5c84bb5a0c6dd7892b54f09f4646711ba0ee1e1668032b3c43e3e1dfec2c5716c302e851ac756c1645e15882d73df6ad21ae951 + checksum: 200f30d44b36a768fa3a8cf690db9e333996af2ad14d9fa1b4c91a427ed9302907873b219b4ce87517ca1014a810eb2e929a6a66be68473f72b546fc64d04fbc languageName: node linkType: hard -"@babel/plugin-syntax-async-generators@npm:^7.8.4": - version: 7.8.4 - resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" +"@babel/plugin-transform-class-static-block@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-class-static-block@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 + "@babel/helper-create-class-features-plugin": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 + "@babel/core": ^7.12.0 + checksum: 3db326156f73a0c0d1e2ea4d73e082b9ace2f6a9c965db1c2e51f3a186751b8b91bafb184d05e046bf970b50ecfde1f74862dd895f9a5ea0fad328369d74cfc4 languageName: node linkType: hard -"@babel/plugin-syntax-bigint@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-bigint@npm:7.8.3" +"@babel/plugin-transform-classes@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-classes@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 + "@babel/helper-annotate-as-pure": ^7.27.3 + "@babel/helper-compilation-targets": ^7.28.6 + "@babel/helper-globals": ^7.28.0 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-replace-supers": ^7.28.6 + "@babel/traverse": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 3a10849d83e47aec50f367a9e56a6b22d662ddce643334b087f9828f4c3dd73bdc5909aaeabe123fed78515767f9ca43498a0e621c438d1cd2802d7fae3c9648 + checksum: bddeefbfd1966272e5da6a0844d68369a0f43c286816c8b379dfd576cf835b8bc652089ef337b0334ff3ae6c9652d56d8332b78a7d29176534265c39856e4822 languageName: node linkType: hard -"@babel/plugin-syntax-class-properties@npm:^7.12.13, @babel/plugin-syntax-class-properties@npm:^7.8.3": - version: 7.12.13 - resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" +"@babel/plugin-transform-computed-properties@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-computed-properties@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.12.13 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/template": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc + checksum: fd1fcc55003a2584c7461bf214ae9e9fce370ad09339319e99e29e5e55a8a3bd485d10805b3d69636a738208761b3a5b0dafdd023534396be45a36409082b014 languageName: node linkType: hard -"@babel/plugin-syntax-class-static-block@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" +"@babel/plugin-transform-destructuring@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-transform-destructuring@npm:7.28.5" dependencies: - "@babel/helper-plugin-utils": ^7.14.5 + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/traverse": ^7.28.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 3e80814b5b6d4fe17826093918680a351c2d34398a914ce6e55d8083d72a9bdde4fbaf6a2dcea0e23a03de26dc2917ae3efd603d27099e2b98380345703bf948 + checksum: 74a06e55e715cfda0fdd8be53d2655d64dfdc28dffaede329d42548fd5b1449ad26a4ce43a24c3fd277b96f8b2010c7b3915afa8297911cda740cc5cc3a81f38 languageName: node linkType: hard -"@babel/plugin-syntax-dynamic-import@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-dynamic-import@npm:7.8.3" +"@babel/plugin-transform-dotall-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 + "@babel/helper-create-regexp-features-plugin": ^7.28.5 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ce307af83cf433d4ec42932329fad25fa73138ab39c7436882ea28742e1c0066626d224e0ad2988724c82644e41601cef607b36194f695cb78a1fcdc959637bd + checksum: 866ffbbdee77fa955063b37c75593db8dbbe46b1ebb64cc788ea437e3a9aa41cb7b9afcee617c678a32b6705baa0892ec8e5d4b8af3bbb0ab1b254514ccdbd37 languageName: node linkType: hard -"@babel/plugin-syntax-export-namespace-from@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-export-namespace-from@npm:7.8.3" +"@babel/plugin-transform-duplicate-keys@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.8.3 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 85740478be5b0de185228e7814451d74ab8ce0a26fcca7613955262a26e99e8e15e9da58f60c754b84515d4c679b590dbd3f2148f0f58025f4ae706f1c5a5d4a + checksum: ef2112d658338e3ff0827f39a53c0cfa211f1cbbe60363bca833a5269df389598ec965e7283600b46533c39cdca82307d0d69c0f518290ec5b00bb713044715b languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.18.6" +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.29.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-create-regexp-features-plugin": ^7.28.5 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 54918a05375325ba0c60bc81abfb261e6f118bed2de94e4c17dca9a2006fc25e13b1a8b5504b9a881238ea394fd2f098f60b2eb3a392585d6348874565445e7b + "@babel/core": ^7.0.0 + checksum: 7fa7b773259a578c9e01c80946f75ecc074520064aa7a87a65db06c7df70766e2fa6be78cda55fa9418a14e30b2b9d595484a46db48074d495d9f877a4276065 languageName: node linkType: hard -"@babel/plugin-syntax-import-meta@npm:^7.8.3": - version: 7.10.4 - resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" +"@babel/plugin-transform-dynamic-import@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.10.4 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b + checksum: 7a9fbc8d17148b7f11a1d1ca3990d2c2cd44bd08a45dcaf14f20a017721235b9044b20e6168b6940282bb1b48fb78e6afbdfb9dd9d82fde614e15baa7d579932 languageName: node linkType: hard -"@babel/plugin-syntax-json-strings@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" +"@babel/plugin-transform-explicit-resource-management@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-explicit-resource-management@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/plugin-transform-destructuring": ^7.28.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a + checksum: be65403694d360793b1b626ac0dfa7c120cfe4dd1c95a81a30b6e7426dc317643e60a486d642e318a4d3d9a7193e72fdb36e2ec140c25c773dcb9c3b1e2854ef languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:7.12.1": - version: 7.12.1 - resolution: "@babel/plugin-syntax-jsx@npm:7.12.1" +"@babel/plugin-transform-exponentiation-operator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.10.4 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d4b9b589c484b2e0856799770f060dff34c67b24d7f4526f66309a0e0e9cf388a5c1f2c0da329d1973cc87d1b2cede8f3dc8facfac59e785d6393a003bcdd0f9 + checksum: b232152499370435c7cd4bf3321f58e189150e35ca3722ea16533d33434b97294df1342f5499671ec48e62b71c34cdea0ca8cf317ad12594a10f6fc670315e62 languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-syntax-jsx@npm:7.18.6" +"@babel/plugin-transform-export-namespace-from@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6d37ea972970195f1ffe1a54745ce2ae456e0ac6145fae9aa1480f297248b262ea6ebb93010eddb86ebfacb94f57c05a1fc5d232b9a67325b09060299d515c67 + checksum: 85082923eca317094f08f4953d8ea2a6558b3117826c0b740676983902b7236df1f4213ad844cb38c2dae104753dbe8f1cc51f01567835d476d32f5f544a4385 languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.7.2": - version: 7.23.3 - resolution: "@babel/plugin-syntax-jsx@npm:7.23.3" +"@babel/plugin-transform-for-of@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-for-of@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/helper-skip-transparent-expression-wrappers": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 89037694314a74e7f0e7a9c8d3793af5bf6b23d80950c29b360db1c66859d67f60711ea437e70ad6b5b4b29affe17eababda841b6c01107c2b638e0493bafb4e + checksum: c9224e08de5d80b2c834383d4359aa9e519db434291711434dd996a4f86b7b664ad67b45d65459b7ec11fa582e3e11a3c769b8a8ca71594bdd4e2f0503f84126 languageName: node linkType: hard -"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4, @babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": - version: 7.10.4 - resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" +"@babel/plugin-transform-function-name@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-function-name@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.10.4 + "@babel/helper-compilation-targets": ^7.27.1 + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/traverse": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 + checksum: 26a2a183c3c52a96495967420a64afc5a09f743a230272a131668abf23001e393afa6371e6f8e6c60f4182bea210ed31d1caf866452d91009c1daac345a52f23 languageName: node linkType: hard -"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" +"@babel/plugin-transform-json-strings@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-json-strings@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 + checksum: 69d82a1a0a72ed6e6f7969e09cf330516599d79b2b4e680e9dd3c57616a8c6af049b5103456e370ab56642815e80e46ed88bb81e9e059304a85c5fe0bf137c29 languageName: node linkType: hard -"@babel/plugin-syntax-numeric-separator@npm:^7.10.4, @babel/plugin-syntax-numeric-separator@npm:^7.8.3": - version: 7.10.4 - resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" +"@babel/plugin-transform-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-literals@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.10.4 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 + checksum: 0a76d12ab19f32dd139964aea7da48cecdb7de0b75e207e576f0f700121fe92367d788f328bf4fb44b8261a0f605c97b44e62ae61cddbb67b14e94c88b411f95 languageName: node linkType: hard -"@babel/plugin-syntax-object-rest-spread@npm:7.8.3, @babel/plugin-syntax-object-rest-spread@npm:^7.8.0, @babel/plugin-syntax-object-rest-spread@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf + checksum: 36095d5d1cfc680e95298b5389a16016da800ae3379b130dabf557e94652c47b06610407e9fa44aaa03e9b0a5aa7b4b93348123985d44a45e369bf5f3497d149 languageName: node linkType: hard -"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" +"@babel/plugin-transform-member-expression-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 + checksum: 804121430a6dcd431e6ffe99c6d1fbbc44b43478113b79c677629e7f877b4f78a06b69c6bfb2747fd84ee91879fe2eb32e4620b53124603086cf5b727593ebe8 languageName: node linkType: hard -"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" +"@babel/plugin-transform-modules-amd@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-amd@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.8.0 + "@babel/helper-module-transforms": ^7.27.1 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 + checksum: 8bb36d448e438d5d30f4faf19120e8c18aa87730269e65d805bf6032824d175ed738057cc392c2c8a650028f1ae0f346cad8d6b723f31a037b586e2092a7be18 languageName: node linkType: hard -"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" +"@babel/plugin-transform-modules-commonjs@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.14.5 + "@babel/helper-module-transforms": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b317174783e6e96029b743ccff2a67d63d38756876e7e5d0ba53a322e38d9ca452c13354a57de1ad476b4c066dbae699e0ca157441da611117a47af88985ecda + checksum: b48cab26fda72894c7002a9c783befbc8a643d827c52bdcc5adf83e418ca93224a15aaf7ed2d1e6284627be55913696cfa2119242686cfa77a473bf79314df26 languageName: node linkType: hard -"@babel/plugin-syntax-top-level-await@npm:^7.14.5, @babel/plugin-syntax-top-level-await@npm:^7.8.3": - version: 7.14.5 - resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" +"@babel/plugin-transform-modules-systemjs@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.29.0" dependencies: - "@babel/helper-plugin-utils": ^7.14.5 + "@babel/helper-module-transforms": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-validator-identifier": ^7.28.5 + "@babel/traverse": ^7.29.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e + checksum: 36fd7bcd694549effdbdf733c32f0c9dbadea052316ff5e0830b07482a60c8ff1ee79850efff05e8046c4b99c241832f2c5267e0ae7c721c531c8ef12930c4b9 languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.23.3 - resolution: "@babel/plugin-syntax-typescript@npm:7.23.3" +"@babel/plugin-transform-modules-umd@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-umd@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-module-transforms": ^7.27.1 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: abfad3a19290d258b028e285a1f34c9b8a0cbe46ef79eafed4ed7ffce11b5d0720b5e536c82f91cbd8442cde35a3dd8e861fa70366d87ff06fdc0d4756e30876 + checksum: b007dd89231f2eeccf1c71a85629bcb692573303977a4b1c5f19a835ea6b5142c18ef07849bc6d752b874a11bc0ddf3c67468b77c8ee8310290b688a4f01ef31 languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.18.6" +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.29.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-create-regexp-features-plugin": ^7.28.5 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 900f5c695755062b91eec74da6f9092f40b8fada099058b92576f1e23c55e9813ec437051893a9b3c05cefe39e8ac06303d4a91b384e1c03dd8dc1581ea11602 + "@babel/core": ^7.0.0 + checksum: ed8c27699ca82a6c01cbfd39f3de16b90cfea4f8146a358057f76df290d308a66a8bd2e6734e6a87f68c18576e15d2d70548a84cd474d26fdf256c3f5ae44d8c languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.18.6" +"@babel/plugin-transform-new-target@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-new-target@npm:7.27.1" dependencies: - "@babel/helper-module-imports": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-remap-async-to-generator": ^7.18.6 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c2cca47468cf1aeefdc7ec35d670e195c86cee4de28a1970648c46a88ce6bd1806ef0bab27251b9e7fb791bb28a64dcd543770efd899f28ee5f7854e64e873d3 + checksum: 32c8078d843bda001244509442d68fd3af088d7348ba883f45c262b2c817a27ffc553b0d78e7f7a763271b2ece7fac56151baad7a91fb21f5bb1d2f38e5acad7 languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.18.6" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 0a0df61f94601e3666bf39f2cc26f5f7b22a94450fb93081edbed967bd752ce3f81d1227fefd3799f5ee2722171b5e28db61379234d1bb85b6ec689589f99d7e + checksum: 1cdd3ca48a8fffa13dbb9949748d3dd2183cf24110cd55d702da4549205611fc12978b49886be809ec1929ff6304ac4eecc747a33dca2484f9dc655928ab5a89 languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-block-scoping@npm:7.18.6" +"@babel/plugin-transform-numeric-separator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b117a005a9d5aedacc4a899a4d504b7f46e4c1e852b62d34a7f1cb06caecb1f69507b6a07d0ba6c6241ddd8f470bc6f483513d87637e49f6c508aadf23cf391a + checksum: 4b5ca60e481e22f0842761a3badca17376a230b5a7e5482338604eb95836c2d0c9c9bde53bdc5c2de1c6a12ae6c12de7464d098bf74b0943f85905ca358f0b68 languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-classes@npm:7.18.6" +"@babel/plugin-transform-object-rest-spread@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.28.6" dependencies: - "@babel/helper-annotate-as-pure": ^7.18.6 - "@babel/helper-environment-visitor": ^7.18.6 - "@babel/helper-function-name": ^7.18.6 - "@babel/helper-optimise-call-expression": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-replace-supers": ^7.18.6 - "@babel/helper-split-export-declaration": ^7.18.6 - globals: ^11.1.0 + "@babel/helper-compilation-targets": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/plugin-transform-destructuring": ^7.28.5 + "@babel/plugin-transform-parameters": ^7.27.7 + "@babel/traverse": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 661e37037912a25a77fe8bef7e9d480c24ff4ba4000a3137243b098c86cf5ddc970af66c5c245f828c7dcfafc24e80d260f31274e2f2d6dce49a0964a7648a0c + checksum: ab85b1321f86db91aba22ad9d8e6ab65448c983214998012229f5302468527d27b908ad6b14755991c317e35d2f54ec8459a2a094a755999651fe0ac9bd2e9a6 languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-computed-properties@npm:7.18.6" +"@babel/plugin-transform-object-super@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-object-super@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/helper-replace-supers": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 686d7b9d03192959684de11ddf9c616ecfb314b199e9191f2ebbbfe0e0c9d6a3a5245668cde620e949e5891ca9a9d90a224fbf605dfb94d05b81aff127c5ae60 + checksum: 46b819cb9a6cd3cfefe42d07875fee414f18d5e66040366ae856116db560ad4e16f3899a0a7fddd6773e0d1458444f94b208b67c0e3b6977a27ea17a5c13dbf6 languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-destructuring@npm:7.18.6" +"@babel/plugin-transform-optional-catch-binding@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 256573bd2712e292784befb82fcb88b070c16b4d129469ea886885d8fbafdbb072c9fcf7f82039d2c61b05f2005db34e5068b2a6e813941c41ce709249f357c1 + checksum: ee24a17defec056eb9ef01824d7e4a1f65d531af6b4b79acfd0bcb95ce0b47926e80c61897f36f8c01ce733b069c9acdb1c9ce5ec07a729d0dbf9e8d859fe992 languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.18.6, @babel/plugin-transform-dotall-regex@npm:^7.4.4": - version: 7.18.6 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.18.6" +"@babel/plugin-transform-optional-chaining@npm:^7.27.1, @babel/plugin-transform-optional-chaining@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.28.6" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-skip-transparent-expression-wrappers": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: cbe5d7063eb8f8cca24cd4827bc97f5641166509e58781a5f8aa47fb3d2d786ce4506a30fca2e01f61f18792783a5cb5d96bf5434c3dd1ad0de8c9cc625a53da + checksum: a40dbe709671a436bb69e14524805e10af81b44c422e4fc5dc905cb91adb92d650c9d266c3c2c0da0d410dea89ce784995d4118b7ab6a7544f4923e61590b386 languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.18.6" +"@babel/plugin-transform-parameters@npm:^7.12.1, @babel/plugin-transform-parameters@npm:^7.27.7": + version: 7.27.7 + resolution: "@babel/plugin-transform-parameters@npm:7.27.7" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c21797ae06e84e3d1502b1214279215e4dcb2e181198bfb9b1644e65ca0288441d3d70a9ea745f687095e9226b9a4a62b9e53fb944c8924b9591ce4e0039b042 + checksum: d51f195e1d6ac5d9fce583e9a70a5bfe403e62386e5eb06db9fbc6533f895a98ff7e7c3dcaa311a8e6fa7a9794466e81cdabcba6af9f59d787fb767bfe7868b4 languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.18.6" +"@babel/plugin-transform-private-methods@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-private-methods@npm:7.28.6" dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-create-class-features-plugin": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7f70222f6829c82a36005508d34ddbe6fd0974ae190683a8670dd6ff08669aaf51fef2209d7403f9bd543cb2d12b18458016c99a6ed0332ccedb3ea127b01229 + checksum: b80179b28f6a165674d0b0d6c6349b13a01dd282b18f56933423c0a33c23fc0626c8f011f859fc20737d021fe966eb8474a5233e4596401482e9ee7fb00e2aa2 languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-for-of@npm:7.18.6" +"@babel/plugin-transform-private-property-in-object@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-annotate-as-pure": ^7.27.3 + "@babel/helper-create-class-features-plugin": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: fd92e18d6cd90063c4d5c7562d8b6ed1c7bd6c13a9451966ebfcc5f0f5645f306de615207322eafd06e297ea2339e28ba664e3ed276759dde8e14fbdce4cf108 + checksum: 32a935e44872e90607851be5bc2cd3365f29c0e0e3853ef3e2b6a7da4d08c647379bf2f2dc4f14a9064d7d72e2cf75da85e55baeeec1ffc25cf6088fe24422f7 languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-function-name@npm:7.18.6" +"@babel/plugin-transform-property-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-property-literals@npm:7.27.1" dependencies: - "@babel/helper-compilation-targets": ^7.18.6 - "@babel/helper-function-name": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d15d36f52d11a1b6dde3cfc0975eb9c030d66207875a722860bc0637f7515f94107b35320306967faaaa896523097e8f5c3dd6982d926f52016525ceaa9e3e42 + checksum: 7caec27d5ed8870895c9faf4f71def72745d69da0d8e77903146a4e135fd7bed5778f5f9cebb36c5fba86338e6194dd67a08c033fc84b4299b7eceab6d9630cb languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-literals@npm:7.18.6" +"@babel/plugin-transform-react-constant-elements@npm:^7.12.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-react-constant-elements@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 859e2405d51931c8c0ea39890c0bcf6c7c01793fe99409844fe122e4c342528f87cd13b8210dd2873ecf5c643149b310c4bc5eb9a4c45928de142063ab04b2b8 + checksum: 8372cf17ed551cd2e3da4f32a211881265692a17ad4c4fd40a8adcb89316d147db54f023630022ad7ec7474c4108647f67e3a62db43e515246a7574dcb5eeefe languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.18.6" +"@babel/plugin-transform-react-display-name@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-react-display-name@npm:7.28.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 35a3d04f6693bc6b298c05453d85ee6e41cc806538acb6928427e0e97ae06059f97d2f07d21495fcf5f70d3c13a242e2ecbd09d5c1fcb1b1a73ff528dcb0b695 + checksum: 268b1a9192974439d17949e170b01cac2a2aa003c844e2fe3b8361146f42f66487178cffdfa8ce862aa9e6c814bc37f879a70300cb3f067815d15fa6aad04e6d languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-modules-amd@npm:7.18.6" +"@babel/plugin-transform-react-jsx-development@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-react-jsx-development@npm:7.27.1" dependencies: - "@babel/helper-module-transforms": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - babel-plugin-dynamic-import-node: ^2.3.3 + "@babel/plugin-transform-react-jsx": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f60c4c4e0eaec41e42c003cbab44305da7a8e05b2c9bdfc2b3fe0f9e1d7441c959ff5248aa03e350abe530e354028cbf3aa20bf07067b11510997dad8dd39be0 + checksum: b88865d5b8c018992f2332da939faa15c4d4a864c9435a5937beaff3fe43781432cc42e0a5d5631098e0bd4066fc33f5fa72203b388b074c3545fe7aaa21e474 languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.18.6" +"@babel/plugin-transform-react-jsx@npm:^7.27.1": + version: 7.28.6 + resolution: "@babel/plugin-transform-react-jsx@npm:7.28.6" dependencies: - "@babel/helper-module-transforms": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-simple-access": ^7.18.6 - babel-plugin-dynamic-import-node: ^2.3.3 + "@babel/helper-annotate-as-pure": ^7.27.3 + "@babel/helper-module-imports": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/plugin-syntax-jsx": ^7.28.6 + "@babel/types": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7e356e3df8a6a8542cced7491ec5b1cc1093a88d216a59e63a5d2b9fe9d193cbea864f680a41429e41a4f9ecec930aa5b0b8f57e2b17b3b4d27923bb12ba5d14 + checksum: e7d093b5ed6c06563e801d44d1212b451445d7600756efd7b8b8e6db4585c27fa8145176dcb3350968c59381af6c566dae9b6dc97ec15d2837493b238904d1c2 languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.18.6" +"@babel/plugin-transform-react-pure-annotations@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.27.1" dependencies: - "@babel/helper-hoist-variables": ^7.18.6 - "@babel/helper-module-transforms": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-validator-identifier": ^7.18.6 - babel-plugin-dynamic-import-node: ^2.3.3 + "@babel/helper-annotate-as-pure": ^7.27.1 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 69e476477fe4c18a5975aa683684b2db76c76013d2387110ffc7b221071ec611cd3961b68631bdae7a57cb5cc0decdbb07119ef168e9dcdae9ba803a7b352ab0 + checksum: a6f591c5e85a1ab0685d4a25afe591fe8d11dc0b73c677cf9560ff8d540d036a1cce9efcb729fc9092def4d854dc304ffdc063a89a9247900b69c516bf971a4c languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-modules-umd@npm:7.18.6" +"@babel/plugin-transform-regenerator@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-regenerator@npm:7.29.0" dependencies: - "@babel/helper-module-transforms": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c3b6796c6f4579f1ba5ab0cdcc73910c1e9c8e1e773c507c8bb4da33072b3ae5df73c6d68f9126dab6e99c24ea8571e1563f8710d7c421fac1cde1e434c20153 + checksum: f48bc814f11239f2bfe010a6e29d5ac2443e7b1d8004e7c022effa111b743491127acf8644cfef475edb86b91f123829585867bc13762652aabd9b85ed6ce61e languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.18.6" +"@babel/plugin-transform-regexp-modifiers@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.28.6" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-create-regexp-features-plugin": ^7.28.5 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0 - checksum: 6ef64aa3dad68df139eeaa7b6e9bb626be8f738ed5ed4db765d516944b1456d513b6bad3bb60fff22babe73de26436fd814a4228705b2d3d2fdb272c31da35e2 + checksum: 5aacc570034c085afa0165137bb9a04cd4299b86eb9092933a96dcc1132c8f591d9d534419988f5f762b2f70d43a3c719a6b8fa05fdd3b2b1820d01cf85500da languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-new-target@npm:7.18.6" +"@babel/plugin-transform-reserved-words@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-reserved-words@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: bd780e14f46af55d0ae8503b3cb81ca86dcc73ed782f177e74f498fff934754f9e9911df1f8f3bd123777eed7c1c1af4d66abab87c8daae5403e7719a6b845d1 + checksum: dea0b66742d2863b369c06c053e11e15ba785892ea19cccf7aef3c1bdaa38b6ab082e19984c5ea7810d275d9445c5400fcc385ad71ce707ed9256fadb102af3b languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-object-super@npm:7.18.6" +"@babel/plugin-transform-shorthand-properties@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-replace-supers": ^7.18.6 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 0fcb04e15deea96ae047c21cb403607d49f06b23b4589055993365ebd7a7d7541334f06bf9642e90075e66efce6ebaf1eb0ef066fbbab802d21d714f1aac3aef + checksum: fbba6e2aef0b69681acb68202aa249c0598e470cc0853d7ff5bd0171fd6a7ec31d77cfabcce9df6360fc8349eded7e4a65218c32551bd3fc0caaa1ac899ac6d4 languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.12.1": - version: 7.22.15 - resolution: "@babel/plugin-transform-parameters@npm:7.22.15" +"@babel/plugin-transform-spread@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-spread@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-skip-transparent-expression-wrappers": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 541188bb7d1876cad87687b5c7daf90f63d8208ae83df24acb1e2b05020ad1c78786b2723ca4054a83fcb74fb6509f30c4cacc5b538ee684224261ad5fb047c1 + checksum: e4782578904df68f7d2b3e865f20701c71d6aba0027c4794c1dc08a2f805a12892a078dab483714552398a689ad4ff6786cdf4e088b073452aee7db67e37a09c languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-parameters@npm:7.18.6" +"@babel/plugin-transform-sticky-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 35bfdf5b2e7f4c10b68aff317b6d47cc5b2261b85158f427696e1ce17f3da466a098ad4e57dc3deb4e7b349994313cfe459d42ecd5f4028989bcc710e62ed709 + checksum: e1414a502efba92c7974681767e365a8cda6c5e9e5f33472a9eaa0ce2e75cea0a9bef881ff8dda37c7810ad902f98d3c00ead92a3ac3b73a79d011df85b5a189 languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-property-literals@npm:7.18.6" +"@babel/plugin-transform-template-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-template-literals@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1c16e64de554703f4b547541de2edda6c01346dd3031d4d29e881aa7733785cd26d53611a4ccf5353f4d3e69097bb0111c0a93ace9e683edd94fea28c4484144 + checksum: 93aad782503b691faef7c0893372d5243df3219b07f1f22cfc32c104af6a2e7acd6102c128439eab15336d048f1b214ca134b87b0630d8cd568bf447f78b25ce languageName: node linkType: hard -"@babel/plugin-transform-react-constant-elements@npm:^7.12.1": - version: 7.18.6 - resolution: "@babel/plugin-transform-react-constant-elements@npm:7.18.6" +"@babel/plugin-transform-typeof-symbol@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 8ad4773193e2b2164f7ac0e717e493351127414aa5e7b7bcc95abe52319962bb83338dc44baf24486d3bc2186c8174ef74aeb6e4d9602bda580829cc6a63620e + checksum: ed8048c8de72c60969a64cf2273cc6d9275d8fa8db9bd25a1268273a00fb9cbd79931140311411bda1443aa56cb3961fb911d1795abacde7f0482f1d8fdf0356 languageName: node linkType: hard -"@babel/plugin-transform-react-display-name@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-react-display-name@npm:7.18.6" +"@babel/plugin-transform-unicode-escapes@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 51c087ab9e41ef71a29335587da28417536c6f816c292e092ffc0e0985d2f032656801d4dd502213ce32481f4ba6c69402993ffa67f0818a07606ff811e4be49 + checksum: d817154bc10758ddd85b716e0bc1af1a1091e088400289ab6b78a1a4d609907ce3d2f1fd51a6fd0e0c8ecbb5f8e3aab4957e0747776d132d2379e85c3ef0520a languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-development@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-react-jsx-development@npm:7.18.6" +"@babel/plugin-transform-unicode-property-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.28.6" dependencies: - "@babel/plugin-transform-react-jsx": ^7.18.6 + "@babel/helper-create-regexp-features-plugin": ^7.28.5 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ec9fa65db66f938b75c45e99584367779ac3e0af8afc589187262e1337c7c4205ea312877813ae4df9fb93d766627b8968d74ac2ba702e4883b1dbbe4953ecee + checksum: d14e8c51aa73f592575c1543400fd67d96df6410d75c9dc10dd640fd7eecb37366a2f2368bbdd7529842532eda4af181c921bda95146c6d373c64ea59c6e9991 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-react-jsx@npm:7.18.6" +"@babel/plugin-transform-unicode-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.27.1" dependencies: - "@babel/helper-annotate-as-pure": ^7.18.6 - "@babel/helper-module-imports": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-jsx": ^7.18.6 - "@babel/types": ^7.18.6 + "@babel/helper-create-regexp-features-plugin": ^7.27.1 + "@babel/helper-plugin-utils": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 46129eaf1ab7a7a73e3e8c9d9859b630f5b381c5e19fb1559e2db7b943a7825b6715ad950623fb03fe7bd31ed618ce1d0bd539b13fa030a50c39d5a873a5ba00 + checksum: a34d89a2b75fb78e66d97c3dc90d4877f7e31f43316b52176f95a5dee20e9bb56ecf158eafc42a001676ddf7b393d9e67650bad6b32f5405780f25fb83cd68e3 languageName: node linkType: hard -"@babel/plugin-transform-react-pure-annotations@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.18.6" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.28.6" dependencies: - "@babel/helper-annotate-as-pure": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-create-regexp-features-plugin": ^7.28.5 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 97c4873d409088f437f9084d084615948198dd87fc6723ada0e7e29c5a03623c2f3e03df3f52e7e7d4d23be32a08ea00818bff302812e48713c706713bd06219 + "@babel/core": ^7.0.0 + checksum: 423971fe2eef9d18782b1c30f5f42613ee510e5b9c08760c5538a0997b36c34495acce261e0e37a27831f81330359230bd1f33c2e1822de70241002b45b7d68e languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-regenerator@npm:7.18.6" - dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - regenerator-transform: ^0.15.0 +"@babel/preset-env@npm:^7.12.1, @babel/preset-env@npm:^7.18.6": + version: 7.29.0 + resolution: "@babel/preset-env@npm:7.29.0" + dependencies: + "@babel/compat-data": ^7.29.0 + "@babel/helper-compilation-targets": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-validator-option": ^7.27.1 + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ^7.28.5 + "@babel/plugin-bugfix-safari-class-field-initializer-scope": ^7.27.1 + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.27.1 + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.27.1 + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ^7.28.6 + "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2 + "@babel/plugin-syntax-import-assertions": ^7.28.6 + "@babel/plugin-syntax-import-attributes": ^7.28.6 + "@babel/plugin-syntax-unicode-sets-regex": ^7.18.6 + "@babel/plugin-transform-arrow-functions": ^7.27.1 + "@babel/plugin-transform-async-generator-functions": ^7.29.0 + "@babel/plugin-transform-async-to-generator": ^7.28.6 + "@babel/plugin-transform-block-scoped-functions": ^7.27.1 + "@babel/plugin-transform-block-scoping": ^7.28.6 + "@babel/plugin-transform-class-properties": ^7.28.6 + "@babel/plugin-transform-class-static-block": ^7.28.6 + "@babel/plugin-transform-classes": ^7.28.6 + "@babel/plugin-transform-computed-properties": ^7.28.6 + "@babel/plugin-transform-destructuring": ^7.28.5 + "@babel/plugin-transform-dotall-regex": ^7.28.6 + "@babel/plugin-transform-duplicate-keys": ^7.27.1 + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": ^7.29.0 + "@babel/plugin-transform-dynamic-import": ^7.27.1 + "@babel/plugin-transform-explicit-resource-management": ^7.28.6 + "@babel/plugin-transform-exponentiation-operator": ^7.28.6 + "@babel/plugin-transform-export-namespace-from": ^7.27.1 + "@babel/plugin-transform-for-of": ^7.27.1 + "@babel/plugin-transform-function-name": ^7.27.1 + "@babel/plugin-transform-json-strings": ^7.28.6 + "@babel/plugin-transform-literals": ^7.27.1 + "@babel/plugin-transform-logical-assignment-operators": ^7.28.6 + "@babel/plugin-transform-member-expression-literals": ^7.27.1 + "@babel/plugin-transform-modules-amd": ^7.27.1 + "@babel/plugin-transform-modules-commonjs": ^7.28.6 + "@babel/plugin-transform-modules-systemjs": ^7.29.0 + "@babel/plugin-transform-modules-umd": ^7.27.1 + "@babel/plugin-transform-named-capturing-groups-regex": ^7.29.0 + "@babel/plugin-transform-new-target": ^7.27.1 + "@babel/plugin-transform-nullish-coalescing-operator": ^7.28.6 + "@babel/plugin-transform-numeric-separator": ^7.28.6 + "@babel/plugin-transform-object-rest-spread": ^7.28.6 + "@babel/plugin-transform-object-super": ^7.27.1 + "@babel/plugin-transform-optional-catch-binding": ^7.28.6 + "@babel/plugin-transform-optional-chaining": ^7.28.6 + "@babel/plugin-transform-parameters": ^7.27.7 + "@babel/plugin-transform-private-methods": ^7.28.6 + "@babel/plugin-transform-private-property-in-object": ^7.28.6 + "@babel/plugin-transform-property-literals": ^7.27.1 + "@babel/plugin-transform-regenerator": ^7.29.0 + "@babel/plugin-transform-regexp-modifiers": ^7.28.6 + "@babel/plugin-transform-reserved-words": ^7.27.1 + "@babel/plugin-transform-shorthand-properties": ^7.27.1 + "@babel/plugin-transform-spread": ^7.28.6 + "@babel/plugin-transform-sticky-regex": ^7.27.1 + "@babel/plugin-transform-template-literals": ^7.27.1 + "@babel/plugin-transform-typeof-symbol": ^7.27.1 + "@babel/plugin-transform-unicode-escapes": ^7.27.1 + "@babel/plugin-transform-unicode-property-regex": ^7.28.6 + "@babel/plugin-transform-unicode-regex": ^7.27.1 + "@babel/plugin-transform-unicode-sets-regex": ^7.28.6 + "@babel/preset-modules": 0.1.6-no-external-plugins + babel-plugin-polyfill-corejs2: ^0.4.15 + babel-plugin-polyfill-corejs3: ^0.14.0 + babel-plugin-polyfill-regenerator: ^0.6.6 + core-js-compat: ^3.48.0 + semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 60bd482cb0343c714f85c3e19a13b3b5fa05ee336c079974091c0b35e263307f4e661f4555dff90707a87d5efe19b1d51835db44455405444ac1813e268ad750 + checksum: 740eb61714f3671adde2ae4066c708837587b0f30ddee7fbf6c85ea5a3823f5dd08413b1ee5fcb1abf26ec6d7e31060bae065d7032d3a2f62a43c80232bb54e9 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-reserved-words@npm:7.18.6" +"@babel/preset-modules@npm:0.1.6-no-external-plugins": + version: 0.1.6-no-external-plugins + resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.0.0 + "@babel/types": ^7.4.4 + esutils: ^2.0.2 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0738cdc30abdae07c8ec4b233b30c31f68b3ff0eaa40eddb45ae607c066127f5fa99ddad3c0177d8e2832e3a7d3ad115775c62b431ebd6189c40a951b867a80c + "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 + checksum: 4855e799bc50f2449fb5210f78ea9e8fd46cf4f242243f1e2ed838e2bd702e25e73e822e7f8447722a5f4baa5e67a8f7a0e403f3e7ce04540ff743a9c411c375 languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.18.6" +"@babel/preset-react@npm:^7.12.5, @babel/preset-react@npm:^7.18.6": + version: 7.28.5 + resolution: "@babel/preset-react@npm:7.28.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/helper-validator-option": ^7.27.1 + "@babel/plugin-transform-react-display-name": ^7.28.0 + "@babel/plugin-transform-react-jsx": ^7.27.1 + "@babel/plugin-transform-react-jsx-development": ^7.27.1 + "@babel/plugin-transform-react-pure-annotations": ^7.27.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b8e4e8acc2700d1e0d7d5dbfd4fdfb935651913de6be36e6afb7e739d8f9ca539a5150075a0f9b79c88be25ddf45abb912fe7abf525f0b80f5b9d9860de685d7 + checksum: 13bc1fe4dde0a29d00323e46749e5beb457844507cb3afa2fefbd85d283c2d4836f9e4a780be735de58a44c505870476dc2838f1f8faf9d6f056481e65f1a0fb languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-spread@npm:7.18.6" +"@babel/register@npm:^7.18.6": + version: 7.28.6 + resolution: "@babel/register@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-skip-transparent-expression-wrappers": ^7.18.6 + clone-deep: ^4.0.1 + find-cache-dir: ^2.0.0 + make-dir: ^2.1.0 + pirates: ^4.0.6 + source-map-support: ^0.5.16 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 996b139ed68503700184f709dc996f285be285282d1780227185b622d9642f5bd60996fcfe910ed0495834f1935df805e7abb36b4b587222264c61020ba4485b + checksum: ab08a254923ce045aded3ea85945bc44f2b4ec4edc03008820fb6648fdbafc2e6906e63722090fdd723e10153afe5af2806b9cee69df4716f0d3a77bbdc37b3b languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.18.6" +"@babel/runtime@npm:^7.21.0": + version: 7.28.6 + resolution: "@babel/runtime@npm:7.28.6" + checksum: 42d8a868c2fc2e9a77927945a6daa7ec03c7ea49e611e0d15442933cdabb12f20e3a6849c729259076c10a4247adec229331d1f94c2d0073ea0979d7853e29fd + languageName: node + linkType: hard + +"@babel/template@npm:^7.12.7, @babel/template@npm:^7.28.6, @babel/template@npm:^7.3.3": + version: 7.28.6 + resolution: "@babel/template@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 68ea18884ae9723443ffa975eb736c8c0d751265859cd3955691253f7fee37d7a0f7efea96c8a062876af49a257a18ea0ed5fea0d95a7b3611ce40f7ee23aee3 + "@babel/code-frame": ^7.28.6 + "@babel/parser": ^7.28.6 + "@babel/types": ^7.28.6 + checksum: 8ab6383053e226025d9491a6e795293f2140482d14f60c1244bece6bf53610ed1e251d5e164de66adab765629881c7d9416e1e540c716541d2fd0f8f36a013d7 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-template-literals@npm:7.18.6" +"@babel/traverse@npm:^7.12.9, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.5, @babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0, @babel/traverse@npm:^7.7.0": + version: 7.29.0 + resolution: "@babel/traverse@npm:7.29.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 6ec354415f92850c927dd3ad90e337df8ee1aeb4cdb2c643208bc8652be91f647c137846586b14bc2b2d7ec408c2b74af2d154ba0972a4fe8b559f8c3e07a3aa + "@babel/code-frame": ^7.29.0 + "@babel/generator": ^7.29.0 + "@babel/helper-globals": ^7.28.0 + "@babel/parser": ^7.29.0 + "@babel/template": ^7.28.6 + "@babel/types": ^7.29.0 + debug: ^4.3.1 + checksum: fbb5085aa525b5d4ecd9fe2f5885d88413fff6ad9c0fac244c37f96069b6d3af9ce825750cd16af1d97d26fa3d354b38dbbdb5f31430e0d99ed89660ab65430e languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.18.6" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.12.6, @babel/types@npm:^7.12.7, @babel/types@npm:^7.20.7, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.5, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.7.0": + version: 7.29.0 + resolution: "@babel/types@npm:7.29.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: b018ac3275958ed74caa2fdb900873bc61907e0cb8b70197ecd2f0e98611119d7a5831761bd14710882c94903e220e6338dd2e7346eca678c788b30457080a7e + "@babel/helper-string-parser": ^7.27.1 + "@babel/helper-validator-identifier": ^7.28.5 + checksum: 83f190438e94c22b2574aaeef7501830311ef266eaabfb06523409f64e2fe855e522951607085d71cad286719adef14e1ba37b671f334a7cd25b0f8506a01e0b languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.18.6" +"@badrap/bar-of-progress@npm:^0.1.1": + version: 0.1.2 + resolution: "@badrap/bar-of-progress@npm:0.1.2" + checksum: da8dfa9e0158d90ba446fecc47458d7949631dd1003038d4f0e17c55d807f2e174210c4e00474264f3de4185c66fb3ad037683ae30a68e6ea96ce3cfb60d809f + languageName: node + linkType: hard + +"@bcoe/v8-coverage@npm:^0.2.3": + version: 0.2.3 + resolution: "@bcoe/v8-coverage@npm:0.2.3" + checksum: 850f9305536d0f2bd13e9e0881cb5f02e4f93fad1189f7b2d4bebf694e3206924eadee1068130d43c11b750efcc9405f88a8e42ef098b6d75239c0f047de1a27 + languageName: node + linkType: hard + +"@cspotcode/source-map-support@npm:^0.8.0": + version: 0.8.1 + resolution: "@cspotcode/source-map-support@npm:0.8.1" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 297a03706723164a777263f76a8d89bccfb1d3fbc5e1075079dfd84372a5416d579da7d44c650abf935a1150a995bfce0e61966447b657f958e51c4ea45b72dc + "@jridgewell/trace-mapping": 0.3.9 + checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.18.6" +"@docsearch/css@npm:3.9.0": + version: 3.9.0 + resolution: "@docsearch/css@npm:3.9.0" + checksum: 8e6f5a995d17881c76b31e5364274b3387917ccbc417ba183009f2655dd507244f7009d27807675f09011efcd8e13d80505e7e17eff1a5d93bcd71324a5fc262 + languageName: node + linkType: hard + +"@docsearch/react@npm:^3.1.1": + version: 3.9.0 + resolution: "@docsearch/react@npm:3.9.0" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@algolia/autocomplete-core": 1.17.9 + "@algolia/autocomplete-preset-algolia": 1.17.9 + "@docsearch/css": 3.9.0 + algoliasearch: ^5.14.2 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: d9e18d57536a2d317fb0b7c04f8f55347f3cfacb75e636b4c6fa2080ab13a3542771b5120e726b598b815891fc606d1472ac02b749c69fd527b03847f22dc25e + "@types/react": ">= 16.8.0 < 20.0.0" + react: ">= 16.8.0 < 20.0.0" + react-dom: ">= 16.8.0 < 20.0.0" + search-insights: ">= 1 < 3" + peerDependenciesMeta: + "@types/react": + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + checksum: af6c531af5f4c10fb57d4d29ae47fe297e4201c5130492e2c73c34306348bf87ab05b7eeae2cb83a6c33dbe8da3754b82275b86ae0116df65f34a9e51f9291bc + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.7.0": + version: 1.8.1 + resolution: "@emnapi/runtime@npm:1.8.1" + dependencies: + tslib: ^2.4.0 + checksum: 0000a91d2d0ec3aaa37cbab9c360de3ff8250592f3ce4706b8c9c6d93e54151e623a8983c85543f33cb6f66cf30bb24bf0ddde466de484d6a6bf1fb2650382de + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/aix-ppc64@npm:0.27.3" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/android-arm64@npm:0.27.3" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/android-arm@npm:0.27.3" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/android-x64@npm:0.27.3" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/darwin-arm64@npm:0.27.3" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@babel/preset-env@npm:^7.12.1, @babel/preset-env@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/preset-env@npm:7.18.6" - dependencies: - "@babel/compat-data": ^7.18.6 - "@babel/helper-compilation-targets": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-validator-option": ^7.18.6 - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.18.6 - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.18.6 - "@babel/plugin-proposal-async-generator-functions": ^7.18.6 - "@babel/plugin-proposal-class-properties": ^7.18.6 - "@babel/plugin-proposal-class-static-block": ^7.18.6 - "@babel/plugin-proposal-dynamic-import": ^7.18.6 - "@babel/plugin-proposal-export-namespace-from": ^7.18.6 - "@babel/plugin-proposal-json-strings": ^7.18.6 - "@babel/plugin-proposal-logical-assignment-operators": ^7.18.6 - "@babel/plugin-proposal-nullish-coalescing-operator": ^7.18.6 - "@babel/plugin-proposal-numeric-separator": ^7.18.6 - "@babel/plugin-proposal-object-rest-spread": ^7.18.6 - "@babel/plugin-proposal-optional-catch-binding": ^7.18.6 - "@babel/plugin-proposal-optional-chaining": ^7.18.6 - "@babel/plugin-proposal-private-methods": ^7.18.6 - "@babel/plugin-proposal-private-property-in-object": ^7.18.6 - "@babel/plugin-proposal-unicode-property-regex": ^7.18.6 - "@babel/plugin-syntax-async-generators": ^7.8.4 - "@babel/plugin-syntax-class-properties": ^7.12.13 - "@babel/plugin-syntax-class-static-block": ^7.14.5 - "@babel/plugin-syntax-dynamic-import": ^7.8.3 - "@babel/plugin-syntax-export-namespace-from": ^7.8.3 - "@babel/plugin-syntax-import-assertions": ^7.18.6 - "@babel/plugin-syntax-json-strings": ^7.8.3 - "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 - "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 - "@babel/plugin-syntax-numeric-separator": ^7.10.4 - "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 - "@babel/plugin-syntax-optional-chaining": ^7.8.3 - "@babel/plugin-syntax-private-property-in-object": ^7.14.5 - "@babel/plugin-syntax-top-level-await": ^7.14.5 - "@babel/plugin-transform-arrow-functions": ^7.18.6 - "@babel/plugin-transform-async-to-generator": ^7.18.6 - "@babel/plugin-transform-block-scoped-functions": ^7.18.6 - "@babel/plugin-transform-block-scoping": ^7.18.6 - "@babel/plugin-transform-classes": ^7.18.6 - "@babel/plugin-transform-computed-properties": ^7.18.6 - "@babel/plugin-transform-destructuring": ^7.18.6 - "@babel/plugin-transform-dotall-regex": ^7.18.6 - "@babel/plugin-transform-duplicate-keys": ^7.18.6 - "@babel/plugin-transform-exponentiation-operator": ^7.18.6 - "@babel/plugin-transform-for-of": ^7.18.6 - "@babel/plugin-transform-function-name": ^7.18.6 - "@babel/plugin-transform-literals": ^7.18.6 - "@babel/plugin-transform-member-expression-literals": ^7.18.6 - "@babel/plugin-transform-modules-amd": ^7.18.6 - "@babel/plugin-transform-modules-commonjs": ^7.18.6 - "@babel/plugin-transform-modules-systemjs": ^7.18.6 - "@babel/plugin-transform-modules-umd": ^7.18.6 - "@babel/plugin-transform-named-capturing-groups-regex": ^7.18.6 - "@babel/plugin-transform-new-target": ^7.18.6 - "@babel/plugin-transform-object-super": ^7.18.6 - "@babel/plugin-transform-parameters": ^7.18.6 - "@babel/plugin-transform-property-literals": ^7.18.6 - "@babel/plugin-transform-regenerator": ^7.18.6 - "@babel/plugin-transform-reserved-words": ^7.18.6 - "@babel/plugin-transform-shorthand-properties": ^7.18.6 - "@babel/plugin-transform-spread": ^7.18.6 - "@babel/plugin-transform-sticky-regex": ^7.18.6 - "@babel/plugin-transform-template-literals": ^7.18.6 - "@babel/plugin-transform-typeof-symbol": ^7.18.6 - "@babel/plugin-transform-unicode-escapes": ^7.18.6 - "@babel/plugin-transform-unicode-regex": ^7.18.6 - "@babel/preset-modules": ^0.1.5 - "@babel/types": ^7.18.6 - babel-plugin-polyfill-corejs2: ^0.3.1 - babel-plugin-polyfill-corejs3: ^0.5.2 - babel-plugin-polyfill-regenerator: ^0.3.1 - core-js-compat: ^3.22.1 - semver: ^6.3.0 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0598ff98b69116e289174d89d976f27eff54d9d7f9f95a1feadf743c18021cd9785ddf2439de9af360f5625450816e4bc3b76ddd0c20ecc64e8802f943f07302 +"@esbuild/darwin-x64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/darwin-x64@npm:0.27.3" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@babel/preset-modules@npm:^0.1.5": - version: 0.1.5 - resolution: "@babel/preset-modules@npm:0.1.5" - dependencies: - "@babel/helper-plugin-utils": ^7.0.0 - "@babel/plugin-proposal-unicode-property-regex": ^7.4.4 - "@babel/plugin-transform-dotall-regex": ^7.4.4 - "@babel/types": ^7.4.4 - esutils: ^2.0.2 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 8430e0e9e9d520b53e22e8c4c6a5a080a12b63af6eabe559c2310b187bd62ae113f3da82ba33e9d1d0f3230930ca702843aae9dd226dec51f7d7114dc1f51c10 +"@esbuild/freebsd-arm64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/freebsd-arm64@npm:0.27.3" + conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@babel/preset-react@npm:^7.12.5, @babel/preset-react@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/preset-react@npm:7.18.6" - dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-validator-option": ^7.18.6 - "@babel/plugin-transform-react-display-name": ^7.18.6 - "@babel/plugin-transform-react-jsx": ^7.18.6 - "@babel/plugin-transform-react-jsx-development": ^7.18.6 - "@babel/plugin-transform-react-pure-annotations": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 540d9cf0a0cc0bb07e6879994e6fb7152f87dafbac880b56b65e2f528134c7ba33e0cd140b58700c77b2ebf4c81fa6468fed0ba391462d75efc7f8c1699bb4c3 +"@esbuild/freebsd-x64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/freebsd-x64@npm:0.27.3" + conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@babel/register@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/register@npm:7.18.6" - dependencies: - clone-deep: ^4.0.1 - find-cache-dir: ^2.0.0 - make-dir: ^2.1.0 - pirates: ^4.0.5 - source-map-support: ^0.5.16 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 2e55995a7fe45cd5394c71c4f9c5b55c948c069a3369c4d3756ad5c26e560f16f655b207c5bb70d3d0eabf2c95daf4ae3a3444977e99678e365effafab1cc8f3 +"@esbuild/linux-arm64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/linux-arm64@npm:0.27.3" + conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@babel/runtime-corejs3@npm:^7.10.2": - version: 7.18.6 - resolution: "@babel/runtime-corejs3@npm:7.18.6" - dependencies: - core-js-pure: ^3.20.2 - regenerator-runtime: ^0.13.4 - checksum: 55a5315b2e2541aa0dcb6193b72f8f339045d1121ff08ca87b48cbcb89447bc4550a4658e8f149c05305edd75704176ba388d780f7f0461b1b8d956a00fcf123 +"@esbuild/linux-arm@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/linux-arm@npm:0.27.3" + conditions: os=linux & cpu=arm languageName: node linkType: hard -"@babel/runtime@npm:7.22.6": - version: 7.22.6 - resolution: "@babel/runtime@npm:7.22.6" - dependencies: - regenerator-runtime: ^0.13.11 - checksum: e585338287c4514a713babf4fdb8fc2a67adcebab3e7723a739fc62c79cfda875b314c90fd25f827afb150d781af97bc16c85bfdbfa2889f06053879a1ddb597 +"@esbuild/linux-ia32@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/linux-ia32@npm:0.27.3" + conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@babel/runtime@npm:^7.10.2, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.8.4": - version: 7.18.6 - resolution: "@babel/runtime@npm:7.18.6" - dependencies: - regenerator-runtime: ^0.13.4 - checksum: 8b707b64ae0524db617d0c49933b258b96376a38307dc0be8fb42db5697608bcc1eba459acce541e376cff5ed5c5287d24db5780bd776b7c75ba2c2e26ff8a2c +"@esbuild/linux-loong64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/linux-loong64@npm:0.27.3" + conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@babel/template@npm:^7.12.7, @babel/template@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/template@npm:7.22.5" - dependencies: - "@babel/code-frame": ^7.22.5 - "@babel/parser": ^7.22.5 - "@babel/types": ^7.22.5 - checksum: c5746410164039aca61829cdb42e9a55410f43cace6f51ca443313f3d0bdfa9a5a330d0b0df73dc17ef885c72104234ae05efede37c1cc8a72dc9f93425977a3 +"@esbuild/linux-mips64el@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/linux-mips64el@npm:0.27.3" + conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@babel/template@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/template@npm:7.18.6" - dependencies: - "@babel/code-frame": ^7.18.6 - "@babel/parser": ^7.18.6 - "@babel/types": ^7.18.6 - checksum: cb02ed804b7b1938dbecef4e01562013b80681843dd391933315b3dd9880820def3b5b1bff6320d6e4c6a1d63d1d5799630d658ec6b0369c5505e7e4029c38fb +"@esbuild/linux-ppc64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/linux-ppc64@npm:0.27.3" + conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.3.3": - version: 7.22.15 - resolution: "@babel/template@npm:7.22.15" - dependencies: - "@babel/code-frame": ^7.22.13 - "@babel/parser": ^7.22.15 - "@babel/types": ^7.22.15 - checksum: 1f3e7dcd6c44f5904c184b3f7fe280394b191f2fed819919ffa1e529c259d5b197da8981b6ca491c235aee8dbad4a50b7e31304aa531271cb823a4a24a0dd8fd +"@esbuild/linux-riscv64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/linux-riscv64@npm:0.27.3" + conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@babel/traverse@npm:^7.12.9, @babel/traverse@npm:^7.13.0, @babel/traverse@npm:^7.18.6, @babel/traverse@npm:^7.22.5, @babel/traverse@npm:^7.22.6, @babel/traverse@npm:^7.7.0": - version: 7.23.3 - resolution: "@babel/traverse@npm:7.23.3" - dependencies: - "@babel/code-frame": ^7.22.13 - "@babel/generator": ^7.23.3 - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-function-name": ^7.23.0 - "@babel/helper-hoist-variables": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/parser": ^7.23.3 - "@babel/types": ^7.23.3 - debug: ^4.1.0 - globals: ^11.1.0 - checksum: f4e0c05f2f82368b9be7e1fed38cfcc2e1074967a8b76ac837b89661adbd391e99d0b1fd8c31215ffc3a04d2d5d7ee5e627914a09082db84ec5606769409fe2b +"@esbuild/linux-s390x@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/linux-s390x@npm:0.27.3" + conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@babel/traverse@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/traverse@npm:7.23.5" - dependencies: - "@babel/code-frame": ^7.23.5 - "@babel/generator": ^7.23.5 - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-function-name": ^7.23.0 - "@babel/helper-hoist-variables": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/parser": ^7.23.5 - "@babel/types": ^7.23.5 - debug: ^4.1.0 - globals: ^11.1.0 - checksum: 0558b05360850c3ad6384e85bd55092126a8d5f93e29a8e227dd58fa1f9e1a4c25fd337c07c7ae509f0983e7a2b1e761ffdcfaa77a1e1bedbc867058e1de5a7d +"@esbuild/linux-x64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/linux-x64@npm:0.27.3" + conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.23.5, @babel/types@npm:^7.3.3": - version: 7.23.5 - resolution: "@babel/types@npm:7.23.5" - dependencies: - "@babel/helper-string-parser": ^7.23.4 - "@babel/helper-validator-identifier": ^7.22.20 - to-fast-properties: ^2.0.0 - checksum: 3d21774480a459ef13b41c2e32700d927af649e04b70c5d164814d8e04ab584af66a93330602c2925e1a6925c2b829cc153418a613a4e7d79d011be1f29ad4b2 +"@esbuild/netbsd-arm64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/netbsd-arm64@npm:0.27.3" + conditions: os=netbsd & cpu=arm64 languageName: node linkType: hard -"@babel/types@npm:^7.12.6, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.7, @babel/types@npm:^7.4.4, @babel/types@npm:^7.7.0, @babel/types@npm:^7.8.3": - version: 7.18.7 - resolution: "@babel/types@npm:7.18.7" - dependencies: - "@babel/helper-validator-identifier": ^7.18.6 - to-fast-properties: ^2.0.0 - checksum: 3114ce161c4ebcb70271e168aa5af5cecedf3278209161d5ba6124bd3f9cb02e3f3ace587ad1b53f7baa153b6b3714720721c72a9ef3ec451663862f9cc1f014 +"@esbuild/netbsd-x64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/netbsd-x64@npm:0.27.3" + conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@babel/types@npm:^7.12.7, @babel/types@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/types@npm:7.22.5" - dependencies: - "@babel/helper-string-parser": ^7.22.5 - "@babel/helper-validator-identifier": ^7.22.5 - to-fast-properties: ^2.0.0 - checksum: c13a9c1dc7d2d1a241a2f8363540cb9af1d66e978e8984b400a20c4f38ba38ca29f06e26a0f2d49a70bad9e57615dac09c35accfddf1bb90d23cd3e0a0bab892 +"@esbuild/openbsd-arm64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/openbsd-arm64@npm:0.27.3" + conditions: os=openbsd & cpu=arm64 languageName: node linkType: hard -"@babel/types@npm:^7.22.15, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/types@npm:7.23.3" - dependencies: - "@babel/helper-string-parser": ^7.22.5 - "@babel/helper-validator-identifier": ^7.22.20 - to-fast-properties: ^2.0.0 - checksum: b96f1ec495351aeb2a5f98dd494aafa17df02a351548ae96999460f35c933261c839002a34c1e83552ff0d9f5e94d0b5b8e105d38131c7c9b0f5a6588676f35d +"@esbuild/openbsd-x64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/openbsd-x64@npm:0.27.3" + conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@badrap/bar-of-progress@npm:^0.1.1": - version: 0.1.2 - resolution: "@badrap/bar-of-progress@npm:0.1.2" - checksum: da8dfa9e0158d90ba446fecc47458d7949631dd1003038d4f0e17c55d807f2e174210c4e00474264f3de4185c66fb3ad037683ae30a68e6ea96ce3cfb60d809f +"@esbuild/openharmony-arm64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/openharmony-arm64@npm:0.27.3" + conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard -"@bcoe/v8-coverage@npm:^0.2.3": - version: 0.2.3 - resolution: "@bcoe/v8-coverage@npm:0.2.3" - checksum: 850f9305536d0f2bd13e9e0881cb5f02e4f93fad1189f7b2d4bebf694e3206924eadee1068130d43c11b750efcc9405f88a8e42ef098b6d75239c0f047de1a27 +"@esbuild/sunos-x64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/sunos-x64@npm:0.27.3" + conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@cspotcode/source-map-support@npm:^0.8.0": - version: 0.8.1 - resolution: "@cspotcode/source-map-support@npm:0.8.1" - dependencies: - "@jridgewell/trace-mapping": 0.3.9 - checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa +"@esbuild/win32-arm64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/win32-arm64@npm:0.27.3" + conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@docsearch/css@npm:3.1.1": - version: 3.1.1 - resolution: "@docsearch/css@npm:3.1.1" - checksum: bbcee5b5cf050bffd6d0e6123f0cbcf3167569998fda5ae1b6def54eb341f23f592a30830e655fc8485591f9950abe4d63767ce7dbc91f88dec25e42ee2d951a +"@esbuild/win32-ia32@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/win32-ia32@npm:0.27.3" + conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@docsearch/react@npm:^3.1.1": - version: 3.1.1 - resolution: "@docsearch/react@npm:3.1.1" - dependencies: - "@algolia/autocomplete-core": 1.7.1 - "@algolia/autocomplete-preset-algolia": 1.7.1 - "@docsearch/css": 3.1.1 - algoliasearch: ^4.0.0 - peerDependencies: - "@types/react": ">= 16.8.0 < 19.0.0" - react: ">= 16.8.0 < 19.0.0" - react-dom: ">= 16.8.0 < 19.0.0" - checksum: 36035fc878b563e49b3aafc102372075118f2ebaea74b29f0048da6a92025ff9e14936706280f70003076aa5e9272eb6370f3564601a79660bd83bc62778934f +"@esbuild/win32-x64@npm:0.27.3": + version: 0.27.3 + resolution: "@esbuild/win32-x64@npm:0.27.3" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -2140,12 +1929,15 @@ __metadata: linkType: hard "@headlessui/react@npm:^1.6.5": - version: 1.6.5 - resolution: "@headlessui/react@npm:1.6.5" + version: 1.7.19 + resolution: "@headlessui/react@npm:1.7.19" + dependencies: + "@tanstack/react-virtual": ^3.0.0-beta.60 + client-only: ^0.0.1 peerDependencies: react: ^16 || ^17 || ^18 react-dom: ^16 || ^17 || ^18 - checksum: 6e3db77c992b5346b7835ea23ab78f251dc2165f2848db38904e6e84a44a2039cf3d5ea94a3a709dd4fc783bccfa638fe3c7bb450216f02ebbac5bb54f29947e + checksum: 2a343a5fcf1f45e870cc94613231b89a8da78114001ffafa4751a0eceae7569ff9237aff1f2aedfa6f6e53ee3bb9ba5e5d19ebf1878fee3ff4f3c733fddc1087 languageName: node linkType: hard @@ -2176,17 +1968,261 @@ __metadata: languageName: node linkType: hard -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" +"@img/colour@npm:^1.0.0": + version: 1.0.0 + resolution: "@img/colour@npm:1.0.0" + checksum: 3ba417916c3b611b472e2bbfd6dd2b66e0683bd83e849422905c42eef5a87454e9c11602e8172b8be8169eef1d7cf2337d85dc7680890ee8c944fe3a147fdd6b + languageName: node + linkType: hard + +"@img/sharp-darwin-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-darwin-arm64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-darwin-arm64": 1.2.4 + dependenciesMeta: + "@img/sharp-libvips-darwin-arm64": + optional: true + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-darwin-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-darwin-x64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-darwin-x64": 1.2.4 + dependenciesMeta: + "@img/sharp-libvips-darwin-x64": + optional: true + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@img/sharp-libvips-darwin-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-darwin-arm64@npm:1.2.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-libvips-darwin-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-darwin-x64@npm:1.2.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-arm64@npm:1.2.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-arm@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-arm@npm:1.2.4" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-ppc64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-ppc64@npm:1.2.4" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-riscv64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-riscv64@npm:1.2.4" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-s390x@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-s390x@npm:1.2.4" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linux-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linux-x64@npm:1.2.4" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-libvips-linuxmusl-arm64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.2.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-libvips-linuxmusl-x64@npm:1.2.4": + version: 1.2.4 + resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.2.4" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-linux-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-arm64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-arm64": 1.2.4 + dependenciesMeta: + "@img/sharp-libvips-linux-arm64": + optional: true + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-arm@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-arm@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-arm": 1.2.4 + dependenciesMeta: + "@img/sharp-libvips-linux-arm": + optional: true + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-ppc64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-ppc64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-ppc64": 1.2.4 + dependenciesMeta: + "@img/sharp-libvips-linux-ppc64": + optional: true + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-riscv64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-riscv64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-riscv64": 1.2.4 + dependenciesMeta: + "@img/sharp-libvips-linux-riscv64": + optional: true + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-s390x@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-s390x@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-s390x": 1.2.4 + dependenciesMeta: + "@img/sharp-libvips-linux-s390x": + optional: true + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linux-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linux-x64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linux-x64": 1.2.4 + dependenciesMeta: + "@img/sharp-libvips-linux-x64": + optional: true + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@img/sharp-linuxmusl-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linuxmusl-arm64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linuxmusl-arm64": 1.2.4 + dependenciesMeta: + "@img/sharp-libvips-linuxmusl-arm64": + optional: true + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-linuxmusl-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-linuxmusl-x64@npm:0.34.5" + dependencies: + "@img/sharp-libvips-linuxmusl-x64": 1.2.4 + dependenciesMeta: + "@img/sharp-libvips-linuxmusl-x64": + optional: true + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@img/sharp-wasm32@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-wasm32@npm:0.34.5" + dependencies: + "@emnapi/runtime": ^1.7.0 + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@img/sharp-win32-arm64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-arm64@npm:0.34.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@img/sharp-win32-ia32@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-ia32@npm:0.34.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@img/sharp-win32-x64@npm:0.34.5": + version: 0.34.5 + resolution: "@img/sharp-win32-x64@npm:0.34.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@inquirer/external-editor@npm:^1.0.0": + version: 1.0.3 + resolution: "@inquirer/external-editor@npm:1.0.3" + dependencies: + chardet: ^2.1.1 + iconv-lite: ^0.7.0 + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 9bd7a05247a00408c194648c74046d8a212df1e6b9fe0879b945ebfc35c2524e995e43f7ecd83f14d0bd4e31f985d18819efc31c27810e2c2b838ded7261431f + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^9.0.0": + version: 9.0.0 + resolution: "@isaacs/cliui@npm:9.0.0" + checksum: 9b80836cd9fa64099faffc3cb9c0620fd8c1106670f507378c5030daecfe9a29012a67488299e69f3273c6421da2a27ea6a1f1d7600bac01b0cbb5da8eea6277 + languageName: node + linkType: hard + +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" dependencies: - string-width: ^5.1.2 - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: ^7.0.1 - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: ^8.1.0 - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb + minipass: ^7.0.4 + checksum: 5d36d289960e886484362d9eb6a51d1ea28baed5f5d0140bbe62b99bac52eaf06cc01c2bc0d3575977962f84f6b2c4387b043ee632216643d4787b0999465bf2 languageName: node linkType: hard @@ -2203,7 +2239,7 @@ __metadata: languageName: node linkType: hard -"@istanbuljs/schema@npm:^0.1.2": +"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": version: 0.1.3 resolution: "@istanbuljs/schema@npm:0.1.3" checksum: 5282759d961d61350f33d9118d16bcaed914ebf8061a52f4fa474b2cb08720c9c81d165e13b82f2e5a8a212cc5af482f0c6fc1ac27b9e067e5394c9a6ed186c9 @@ -2440,77 +2476,37 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.1.0": - version: 0.1.1 - resolution: "@jridgewell/gen-mapping@npm:0.1.1" - dependencies: - "@jridgewell/set-array": ^1.0.0 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: 3bcc21fe786de6ffbf35c399a174faab05eb23ce6a03e8769569de28abbf4facc2db36a9ddb0150545ae23a8d35a7cf7237b2aa9e9356a7c626fb4698287d5cc - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.0": - version: 0.3.3 - resolution: "@jridgewell/gen-mapping@npm:0.3.3" - dependencies: - "@jridgewell/set-array": ^1.0.1 - "@jridgewell/sourcemap-codec": ^1.4.10 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 4a74944bd31f22354fc01c3da32e83c19e519e3bbadafa114f6da4522ea77dd0c2842607e923a591d60a76699d819a2fbb6f3552e277efdb9b58b081390b60ab - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.2": - version: 0.3.2 - resolution: "@jridgewell/gen-mapping@npm:0.3.2" - dependencies: - "@jridgewell/set-array": ^1.0.1 - "@jridgewell/sourcemap-codec": ^1.4.10 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 1832707a1c476afebe4d0fbbd4b9434fdb51a4c3e009ab1e9938648e21b7a97049fa6009393bdf05cab7504108413441df26d8a3c12193996e65493a4efb6882 - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:3.1.0": - version: 3.1.0 - resolution: "@jridgewell/resolve-uri@npm:3.1.0" - checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.0.3": - version: 3.0.8 - resolution: "@jridgewell/resolve-uri@npm:3.0.8" - checksum: 28d739f49b4a52a95843b15669dcb2daaab48f0eaef8f457b9aacd0bdebeb60468d0684f73244f613b786e9d871c25abdbe6f55991bba36814cdadc399dbb3a8 - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.1 - resolution: "@jridgewell/resolve-uri@npm:3.1.1" - checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 +"@jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" + dependencies: + "@jridgewell/sourcemap-codec": ^1.5.0 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: f2105acefc433337145caa3c84bba286de954f61c0bc46279bbd85a9e6a02871089717fa060413cfb6a9d44189fe8313b2d1cabf3a2eb3284d208fd5f75c54ff languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.0.0, @jridgewell/set-array@npm:^1.0.1": - version: 1.1.2 - resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e +"@jridgewell/remapping@npm:^2.3.5": + version: 2.3.5 + resolution: "@jridgewell/remapping@npm:2.3.5" + dependencies: + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: 4a66a7397c3dc9c6b5c14a0024b1f98c5e1d90a0dbc1e5955b5038f2db339904df2a0ee8a66559fafb4fc23ff33700a2639fd40bbdd2e9e82b58b3bdf83738e3 languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10": - version: 1.4.14 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" - checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 +"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 83b85f72c59d1c080b4cbec0fef84528963a1b5db34e4370fa4bd1e3ff64a0d80e0cee7369d11d73c704e0286fb2865b530acac7a871088fbe92b5edf1000870 languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.4.15 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" - checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: c2e36e67971f719a8a3a85ef5a5f580622437cc723c35d03ebd0c9c0b06418700ef006f58af742791f71f6a4fc68fcfaf1f6a74ec2f9a3332860e9373459dae7 languageName: node linkType: hard @@ -2524,40 +2520,20 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18": - version: 0.3.20 - resolution: "@jridgewell/trace-mapping@npm:0.3.20" +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.28": + version: 0.3.31 + resolution: "@jridgewell/trace-mapping@npm:0.3.31" dependencies: "@jridgewell/resolve-uri": ^3.1.0 "@jridgewell/sourcemap-codec": ^1.4.14 - checksum: cd1a7353135f385909468ff0cf20bdd37e59f2ee49a13a966dedf921943e222082c583ade2b579ff6cd0d8faafcb5461f253e1bf2a9f48fec439211fdbe788f5 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.17": - version: 0.3.18 - resolution: "@jridgewell/trace-mapping@npm:0.3.18" - dependencies: - "@jridgewell/resolve-uri": 3.1.0 - "@jridgewell/sourcemap-codec": 1.4.14 - checksum: 0572669f855260808c16fe8f78f5f1b4356463b11d3f2c7c0b5580c8ba1cbf4ae53efe9f627595830856e57dbac2325ac17eb0c3dd0ec42102e6f227cc289c02 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.14 - resolution: "@jridgewell/trace-mapping@npm:0.3.14" - dependencies: - "@jridgewell/resolve-uri": ^3.0.3 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: b9537b9630ffb631aef9651a085fe361881cde1772cd482c257fe3c78c8fd5388d681f504a9c9fe1081b1c05e8f75edf55ee10fdb58d92bbaa8dbf6a7bd6b18c + checksum: af8fda2431348ad507fbddf8e25f5d08c79ecc94594061ce402cf41bc5aba1a7b3e59bf0fd70a619b35f33983a3f488ceeba8faf56bff784f98bb5394a8b7d47 languageName: node linkType: hard "@juggle/resize-observer@npm:^3.2.0": - version: 3.3.1 - resolution: "@juggle/resize-observer@npm:3.3.1" - checksum: ddabc4044276a2cb57d469c4917206c7e39f2463aa8e3430e33e4eda554412afe29c22afa40e6708b49dad5d56768dc83acd68a704b1dcd49a0906bb96b991b2 + version: 3.4.0 + resolution: "@juggle/resize-observer@npm:3.4.0" + checksum: 2505028c05cc2e17639fcad06218b1c4b60f932a4ebb4b41ab546ef8c157031ae377e3f560903801f6d01706dbefd4943b6c4704bf19ed86dfa1c62f1473a570 languageName: node linkType: hard @@ -2613,101 +2589,73 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:12.3.4": - version: 12.3.4 - resolution: "@next/env@npm:12.3.4" - checksum: daa3fc11efd1344c503eab41311a0e503ba7fd08607eeb3dc571036a6211eb37959cc4ed48b71dcc411cc214e7623ffd02411080aad3e09dc6a1192d5b256e60 - languageName: node - linkType: hard - -"@next/swc-android-arm-eabi@npm:12.3.4": - version: 12.3.4 - resolution: "@next/swc-android-arm-eabi@npm:12.3.4" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@next/swc-android-arm64@npm:12.3.4": - version: 12.3.4 - resolution: "@next/swc-android-arm64@npm:12.3.4" - conditions: os=android & cpu=arm64 +"@next/env@npm:15.5.12": + version: 15.5.12 + resolution: "@next/env@npm:15.5.12" + checksum: 54d9e97f29f2ee571d4806a353047149c95d1b3bab003cdd6ebf844edf691363444b980f82961af0b185684320c9c1a628f282e8a1d19da06ade4dc417c7a3e0 languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:12.3.4": - version: 12.3.4 - resolution: "@next/swc-darwin-arm64@npm:12.3.4" +"@next/swc-darwin-arm64@npm:15.5.12": + version: 15.5.12 + resolution: "@next/swc-darwin-arm64@npm:15.5.12" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:12.3.4": - version: 12.3.4 - resolution: "@next/swc-darwin-x64@npm:12.3.4" +"@next/swc-darwin-x64@npm:15.5.12": + version: 15.5.12 + resolution: "@next/swc-darwin-x64@npm:15.5.12" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-freebsd-x64@npm:12.3.4": - version: 12.3.4 - resolution: "@next/swc-freebsd-x64@npm:12.3.4" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@next/swc-linux-arm-gnueabihf@npm:12.3.4": - version: 12.3.4 - resolution: "@next/swc-linux-arm-gnueabihf@npm:12.3.4" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@next/swc-linux-arm64-gnu@npm:12.3.4": - version: 12.3.4 - resolution: "@next/swc-linux-arm64-gnu@npm:12.3.4" +"@next/swc-linux-arm64-gnu@npm:15.5.12": + version: 15.5.12 + resolution: "@next/swc-linux-arm64-gnu@npm:15.5.12" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:12.3.4": - version: 12.3.4 - resolution: "@next/swc-linux-arm64-musl@npm:12.3.4" +"@next/swc-linux-arm64-musl@npm:15.5.12": + version: 15.5.12 + resolution: "@next/swc-linux-arm64-musl@npm:15.5.12" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:12.3.4": - version: 12.3.4 - resolution: "@next/swc-linux-x64-gnu@npm:12.3.4" +"@next/swc-linux-x64-gnu@npm:15.5.12": + version: 15.5.12 + resolution: "@next/swc-linux-x64-gnu@npm:15.5.12" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:12.3.4": - version: 12.3.4 - resolution: "@next/swc-linux-x64-musl@npm:12.3.4" +"@next/swc-linux-x64-musl@npm:15.5.12": + version: 15.5.12 + resolution: "@next/swc-linux-x64-musl@npm:15.5.12" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:12.3.4": - version: 12.3.4 - resolution: "@next/swc-win32-arm64-msvc@npm:12.3.4" +"@next/swc-win32-arm64-msvc@npm:15.5.12": + version: 15.5.12 + resolution: "@next/swc-win32-arm64-msvc@npm:15.5.12" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-ia32-msvc@npm:12.3.4": - version: 12.3.4 - resolution: "@next/swc-win32-ia32-msvc@npm:12.3.4" - conditions: os=win32 & cpu=ia32 +"@next/swc-win32-x64-msvc@npm:15.5.12": + version: 15.5.12 + resolution: "@next/swc-win32-x64-msvc@npm:15.5.12" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:12.3.4": - version: 12.3.4 - resolution: "@next/swc-win32-x64-msvc@npm:12.3.4" - conditions: os=win32 & cpu=x64 +"@noble/hashes@npm:1.8.0": + version: 1.8.0 + resolution: "@noble/hashes@npm:1.8.0" + checksum: c94e98b941963676feaba62475b1ccfa8341e3f572adbb3b684ee38b658df44100187fa0ef4220da580b13f8d27e87d5492623c8a02ecc61f23fb9960c7918f5 languageName: node linkType: hard @@ -2738,30 +2686,45 @@ __metadata: languageName: node linkType: hard +"@npmcli/agent@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/agent@npm:4.0.0" + dependencies: + agent-base: ^7.1.0 + http-proxy-agent: ^7.0.0 + https-proxy-agent: ^7.0.1 + lru-cache: ^11.2.1 + socks-proxy-agent: ^8.0.3 + checksum: 89ae20b44859ff8d4de56ade319d8ceaa267a0742d6f7345fe98aa5cd8614ced7db85ea4dc5bfbd6614dbb200a10b134e087143582534c939e8a02219e8665c8 + languageName: node + linkType: hard + "@npmcli/fs@npm:^2.1.0": - version: 2.1.0 - resolution: "@npmcli/fs@npm:2.1.0" + version: 2.1.2 + resolution: "@npmcli/fs@npm:2.1.2" dependencies: "@gar/promisify": ^1.1.3 semver: ^7.3.5 - checksum: 6ec6d678af6da49f9dac50cd882d7f661934dd278972ffbaacde40d9eaa2871292d634000a0cca9510f6fc29855fbd4af433e1adbff90a524ec3eaf140f1219b + checksum: 405074965e72d4c9d728931b64d2d38e6ea12066d4fad651ac253d175e413c06fe4350970c783db0d749181da8fe49c42d3880bd1cbc12cd68e3a7964d820225 languageName: node linkType: hard -"@npmcli/move-file@npm:^2.0.0": - version: 2.0.0 - resolution: "@npmcli/move-file@npm:2.0.0" +"@npmcli/fs@npm:^5.0.0": + version: 5.0.0 + resolution: "@npmcli/fs@npm:5.0.0" dependencies: - mkdirp: ^1.0.4 - rimraf: ^3.0.2 - checksum: 1388777b507b0c592d53f41b9d182e1a8de7763bc625fc07999b8edbc22325f074e5b3ec90af79c89d6987fdb2325bc66d59f483258543c14a43661621f841b0 + semver: ^7.3.5 + checksum: 897dac32eb37e011800112d406b9ea2ebd96f1dab01bb8fbeb59191b86f6825dffed6a89f3b6c824753d10f8735b76d630927bd7610e9e123b129ef2e5f02cb5 languageName: node linkType: hard -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f +"@npmcli/move-file@npm:^2.0.0": + version: 2.0.1 + resolution: "@npmcli/move-file@npm:2.0.1" + dependencies: + mkdirp: ^1.0.4 + rimraf: ^3.0.2 + checksum: 52dc02259d98da517fae4cb3a0a3850227bdae4939dda1980b788a7670636ca2b4a01b58df03dd5f65c1e3cb70c50fa8ce5762b582b3f499ec30ee5ce1fd9380 languageName: node linkType: hard @@ -2842,6 +2805,13 @@ __metadata: languageName: node linkType: hard +"@rtsao/scc@npm:^1.1.0": + version: 1.1.0 + resolution: "@rtsao/scc@npm:1.1.0" + checksum: 17d04adf404e04c1e61391ed97bca5117d4c2767a76ae3e879390d6dec7b317fcae68afbf9e98badee075d0b64fa60f287729c4942021b4d19cd01db77385c01 + languageName: node + linkType: hard + "@silvenon/remark-smartypants@npm:^1.0.0": version: 1.0.0 resolution: "@silvenon/remark-smartypants@npm:1.0.0" @@ -2854,9 +2824,9 @@ __metadata: linkType: hard "@sinclair/typebox@npm:^0.27.8": - version: 0.27.8 - resolution: "@sinclair/typebox@npm:0.27.8" - checksum: 00bd7362a3439021aa1ea51b0e0d0a0e8ca1351a3d54c606b115fdcc49b51b16db6e5f43b4fe7a28c38688523e22a94d49dd31168868b655f0d4d50f032d07a1 + version: 0.27.10 + resolution: "@sinclair/typebox@npm:0.27.10" + checksum: a5a2265c752c82a8fb3f69a71c18f9673c47605086b0f2c9ce01f49fa819e7c5d7171b38d4a019037ca411417d57e43413ebd46f25a6181a182f89f7f3e42999 languageName: node linkType: hard @@ -2881,11 +2851,11 @@ __metadata: linkType: hard "@sinonjs/commons@npm:^3.0.0": - version: 3.0.0 - resolution: "@sinonjs/commons@npm:3.0.0" + version: 3.0.1 + resolution: "@sinonjs/commons@npm:3.0.1" dependencies: type-detect: 4.0.8 - checksum: b4b5b73d4df4560fb8c0c7b38c7ad4aeabedd362f3373859d804c988c725889cde33550e4bcc7cd316a30f5152a2d1d43db71b6d0c38f5feef71fd8d016763f8 + checksum: a7c3e7cc612352f4004873747d9d8b2d4d90b13a6d483f685598c945a70e734e255f1ca5dc49702515533c403b32725defff148177453b3f3915bcb60e9d4601 languageName: node linkType: hard @@ -3029,12 +2999,12 @@ __metadata: languageName: node linkType: hard -"@swc/helpers@npm:0.4.11": - version: 0.4.11 - resolution: "@swc/helpers@npm:0.4.11" +"@swc/helpers@npm:0.5.15": + version: 0.5.15 + resolution: "@swc/helpers@npm:0.5.15" dependencies: - tslib: ^2.4.0 - checksum: 736857d524b41a8a4db81094e9b027f554004e0fa3e86325d85bdb38f7e6459ce022db079edb6c61ba0f46fe8583b3e663e95f7acbd13e51b8da6c34e45bba2e + tslib: ^2.8.0 + checksum: 1a9e0dbb792b2d1e0c914d69c201dbc96af3a0e6e6e8cf5a7f7d6a5d7b0e8b762915cd4447acb6b040e2ecc1ed49822875a7239f99a2d63c96c3c3407fb6fccf languageName: node linkType: hard @@ -3051,6 +3021,25 @@ __metadata: languageName: node linkType: hard +"@tanstack/react-virtual@npm:^3.0.0-beta.60": + version: 3.13.18 + resolution: "@tanstack/react-virtual@npm:3.13.18" + dependencies: + "@tanstack/virtual-core": 3.13.18 + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 73dcfd5681db1c07834c9d286a7d2194ebded84f09466b37072c630bad1ec9d546c0b58981e8a4cf855b0bd6a5c53c64834c6428022fe12096ff3a905da2a4a4 + languageName: node + linkType: hard + +"@tanstack/virtual-core@npm:3.13.18": + version: 3.13.18 + resolution: "@tanstack/virtual-core@npm:3.13.18" + checksum: 9344c797be9a1b100adb5f1b9fbba2a6292aad56723d39f2d48f976d237f35e8473292949ed680b79338cb0f13823700c4e1ac21318097a5c197e8a706405263 + languageName: node + linkType: hard + "@tootallnate/once@npm:2": version: 2.0.0 resolution: "@tootallnate/once@npm:2.0.0" @@ -3058,10 +3047,21 @@ __metadata: languageName: node linkType: hard +"@ts-morph/common@npm:~0.28.1": + version: 0.28.1 + resolution: "@ts-morph/common@npm:0.28.1" + dependencies: + minimatch: ^10.0.1 + path-browserify: ^1.0.1 + tinyglobby: ^0.2.14 + checksum: bc3e879ff55fe8fe460d49124d10f74aba4ec92c261b7f65d48153a107e1b733676bb89e1c55fa4e5c045fe055c6c5247f7d340aaf1db1a44ffaf32ca2a00ec5 + languageName: node + linkType: hard + "@tsconfig/node10@npm:^1.0.7": - version: 1.0.9 - resolution: "@tsconfig/node10@npm:1.0.9" - checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df + version: 1.0.12 + resolution: "@tsconfig/node10@npm:1.0.12" + checksum: 27e2f989dbb20f773aa121b609a5361a473b7047ff286fce7c851e61f5eec0c74f0bdb38d5bd69c8a06f17e60e9530188f2219b1cbeabeac91f0a5fd348eac2a languageName: node linkType: hard @@ -3100,11 +3100,11 @@ __metadata: linkType: hard "@types/babel__generator@npm:*": - version: 7.6.7 - resolution: "@types/babel__generator@npm:7.6.7" + version: 7.27.0 + resolution: "@types/babel__generator@npm:7.27.0" dependencies: "@babel/types": ^7.0.0 - checksum: 03e96ea327a5238f00c38394a05cc01619b9f5f3ea57371419a1c25cf21676a6d327daf802435819f8cb3b8fa10e938a94bcbaf79a38c132068c813a1807ff93 + checksum: e6739cacfa276c1ad38e1d8a6b4b1f816c2c11564e27f558b68151728489aaf0f4366992107ee4ed7615dfa303f6976dedcdce93df2b247116d1bcd1607ee260 languageName: node linkType: hard @@ -3119,11 +3119,11 @@ __metadata: linkType: hard "@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": - version: 7.20.4 - resolution: "@types/babel__traverse@npm:7.20.4" + version: 7.28.0 + resolution: "@types/babel__traverse@npm:7.28.0" dependencies: - "@babel/types": ^7.20.7 - checksum: f044ba80e00d07e46ee917c44f96cfc268fcf6d3871f7dfb8db8d3c6dab1508302f3e6bc508352a4a3ae627d2522e3fc500fa55907e0410a08e2e0902a8f3576 + "@babel/types": ^7.28.2 + checksum: e3124e6575b2f70de338eab8a9c704d315a86c46a8e395b6ec78a0157ab7b5fd877289556a57dcf28e4ff3543714e359cc1182d4afc4bcb4f3575a0bbafa0dad languageName: node linkType: hard @@ -3167,11 +3167,11 @@ __metadata: linkType: hard "@types/hast@npm:^2.0.0": - version: 2.3.4 - resolution: "@types/hast@npm:2.3.4" + version: 2.3.10 + resolution: "@types/hast@npm:2.3.10" dependencies: - "@types/unist": "*" - checksum: fff47998f4c11e21a7454b58673f70478740ecdafd95aaf50b70a3daa7da9cdc57315545bf9c039613732c40b7b0e9e49d11d03fe9a4304721cdc3b29a88141e + "@types/unist": ^2 + checksum: 41531b7fbf590b02452996fc63272479c20a07269e370bd6514982cbcd1819b4b84d3ea620f2410d1b9541a23d08ce2eeb0a592145d05e00e249c3d56700d460 languageName: node linkType: hard @@ -3201,19 +3201,19 @@ __metadata: linkType: hard "@types/jest@npm:^29.5.4": - version: 29.5.10 - resolution: "@types/jest@npm:29.5.10" + version: 29.5.14 + resolution: "@types/jest@npm:29.5.14" dependencies: expect: ^29.0.0 pretty-format: ^29.0.0 - checksum: ef385905787db528de9b6beb2688865c0bb276e64256ed60b9a1a6ffc0b75737456cb5e27e952a3241c5845b6a1da487470010dd30f3ca59c8581624c564a823 + checksum: 18dba4623f26661641d757c63da2db45e9524c9be96a29ef713c703a9a53792df9ecee9f7365a0858ddbd6440d98fe6b65ca67895ca5884b73cbc7ffc11f3838 languageName: node linkType: hard "@types/json-schema@npm:^7.0.3, @types/json-schema@npm:^7.0.8": - version: 7.0.11 - resolution: "@types/json-schema@npm:7.0.11" - checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 languageName: node linkType: hard @@ -3225,32 +3225,34 @@ __metadata: linkType: hard "@types/md5@npm:^2.3.4": - version: 2.3.5 - resolution: "@types/md5@npm:2.3.5" - checksum: a86baf0521006e3072488bd79089b84831780866102e5e4b4f7afabfab17e0270a3791f3331776b73efb2cc9317efd56a334fd3d2698c7929e9b18593ca3fd39 + version: 2.3.6 + resolution: "@types/md5@npm:2.3.6" + checksum: 88d041abea4d5509ec27ae43a5e9df9caf836f29dc393e1cee0537132f732275c2bb78350d10847c1db06d068c03cb59786502f02bf06d5c1a220c1c2e6d305d languageName: node linkType: hard "@types/mdast@npm:^3.0.0": - version: 3.0.11 - resolution: "@types/mdast@npm:3.0.11" + version: 3.0.15 + resolution: "@types/mdast@npm:3.0.15" dependencies: - "@types/unist": "*" - checksum: 3b04cf465535553b47a1811c247668bd6cfeb54d99a2c9dbb82ccd0f5145d271d10c3169f929701d8cd55fd569f0d2e459a50845813ba3261f1fb0395a288cea + "@types/unist": ^2 + checksum: af85042a4e3af3f879bde4059fa9e76c71cb552dffc896cdcc6cf9dc1fd38e37035c2dbd6245cfa6535b433f1f0478f5549696234ccace47a64055a10c656530 languageName: node linkType: hard "@types/node@npm:*": - version: 18.0.1 - resolution: "@types/node@npm:18.0.1" - checksum: be14b251c54cc2b4ca78ac6eadf2fe5e831e487f2e17848f21d576295945b538271dcc674d0bba582b3f8d95b84f6826e99b6ba4710c76f165a8bdd4d4f0618e + version: 25.2.3 + resolution: "@types/node@npm:25.2.3" + dependencies: + undici-types: ~7.16.0 + checksum: 315b6a7c7f7e5b39b92fffc65fcc0de10543c7ac0dc3754aa072ae9c8a82e6eb90ca1b6156766f07d0ba1e210e39f999f75b4b3a7b88ddab30e3c3ba827e85bf languageName: node linkType: hard "@types/parse-json@npm:^4.0.0": - version: 4.0.0 - resolution: "@types/parse-json@npm:4.0.0" - checksum: fd6bce2b674b6efc3db4c7c3d336bd70c90838e8439de639b909ce22f3720d21344f52427f1d9e57b265fcb7f6c018699b99e5e0c208a1a4823014269a6bf35b + version: 4.0.2 + resolution: "@types/parse-json@npm:4.0.2" + checksum: 5bf62eec37c332ad10059252fc0dab7e7da730764869c980b0714777ad3d065e490627be9f40fc52f238ffa3ac4199b19de4127196910576c2fe34dd47c7a470 languageName: node linkType: hard @@ -3262,36 +3264,44 @@ __metadata: linkType: hard "@types/prop-types@npm:*": - version: 15.7.5 - resolution: "@types/prop-types@npm:15.7.5" - checksum: 5b43b8b15415e1f298243165f1d44390403bb2bd42e662bca3b5b5633fdd39c938e91b7fce3a9483699db0f7a715d08cef220c121f723a634972fdf596aec980 + version: 15.7.15 + resolution: "@types/prop-types@npm:15.7.15" + checksum: 31aa2f59b28f24da6fb4f1d70807dae2aedfce090ec63eaf9ea01727a9533ef6eaf017de5bff99fbccad7d1c9e644f52c6c2ba30869465dd22b1a7221c29f356 languageName: node linkType: hard "@types/q@npm:^1.5.1": - version: 1.5.5 - resolution: "@types/q@npm:1.5.5" - checksum: 3bd386fb97a0e5f1ce1ed7a14e39b60e469b5ca9d920a7f69e0cdb58d22c0f5bdd16637d8c3a5bfeda76663c023564dd47a65389ee9aaabd65aee54803d5ba45 + version: 1.5.8 + resolution: "@types/q@npm:1.5.8" + checksum: ff3b7f09c2746d068dee8d39501f09dbf71728c4facdc9cb0e266ea6615ad97e61267c0606ab3da88d11ef1609ce904cef45a9c56b2b397f742388d7f15bb740 languageName: node linkType: hard -"@types/react-dom@npm:^17.0.26": - version: 17.0.26 - resolution: "@types/react-dom@npm:17.0.26" +"@types/react-dom@npm:^18.3.7": + version: 18.3.7 + resolution: "@types/react-dom@npm:18.3.7" peerDependencies: - "@types/react": ^17.0.0 - checksum: 2b62bf86c22b5e84a99d356bf50f5ea681aa70d11d0669c3ab6d5855751677ffb7e7b8d2cec01fff4d3923d0da3221821f7f55ddaa1cf42bc7a06545fe7cf2f1 + "@types/react": ^18.0.0 + checksum: c8b63ec944d2a68992b4dba474003fe55ee1d949c4b9c8fe97eecb2290de23f76acfb670b2f7ceb46a5fc8e46808d1745369b03edda48a7a0cf730eff4c5d315 + languageName: node + linkType: hard + +"@types/react-test-renderer@npm:18.3.1": + version: 18.3.1 + resolution: "@types/react-test-renderer@npm:18.3.1" + dependencies: + "@types/react": ^18 + checksum: f8cc23cc8decdb6068cdc8f8c306e189eab8e569443ce97b216e757ee42eb20b18d2280ef41e2955668413f14be92765a3ba86cfcfeeae6b20c965acd9674786 languageName: node linkType: hard -"@types/react@npm:^17.0.83": - version: 17.0.83 - resolution: "@types/react@npm:17.0.83" +"@types/react@npm:18.3.28": + version: 18.3.28 + resolution: "@types/react@npm:18.3.28" dependencies: "@types/prop-types": "*" - "@types/scheduler": ^0.16 - csstype: ^3.0.2 - checksum: c237dc47fc19bbe1af14ff89d0e9b749abfb95c0d9c3bca8292539f3d4a4b22c2a359db5e405cd274999a62e1a5fadc8e0eafe62ecc070ff3b2bbba89600b35e + csstype: ^3.2.2 + checksum: 9d59fb3def4e712d4f8fa15998791a07f9799462f8d581d17039a9503017bfce3463d57fc737ce1d28d6aa3f482f4a3a5bae5a662d97560a9359aab111556c97 languageName: node linkType: hard @@ -3302,17 +3312,10 @@ __metadata: languageName: node linkType: hard -"@types/scheduler@npm:^0.16": - version: 0.16.8 - resolution: "@types/scheduler@npm:0.16.8" - checksum: 6c091b096daa490093bf30dd7947cd28e5b2cd612ec93448432b33f724b162587fed9309a0acc104d97b69b1d49a0f3fc755a62282054d62975d53d7fd13472d - languageName: node - linkType: hard - "@types/semver@npm:^7.5.5": - version: 7.5.6 - resolution: "@types/semver@npm:7.5.6" - checksum: 563a0120ec0efcc326567db2ed920d5d98346f3638b6324ea6b50222b96f02a8add3c51a916b6897b51523aad8ac227d21d3dcf8913559f1bfc6c15b14d23037 + version: 7.7.1 + resolution: "@types/semver@npm:7.7.1" + checksum: 76d218e414482a398148d5c28f2bfa017108869f3fc18cda379c9d8d062348f8b9653ae2fa8642d3b5b52e211928fe8be34f22da4e1f08245c84e0e51e040673 languageName: node linkType: hard @@ -3323,24 +3326,17 @@ __metadata: languageName: node linkType: hard -"@types/unist@npm:*": - version: 3.0.0 - resolution: "@types/unist@npm:3.0.0" - checksum: e9d21a8fb5e332be0acef29192d82632875b2ef3e700f1bc64fdfc1520189542de85c3d4f3bcfbc2f4afdb210f4c23f68061f3fbf10744e920d4f18430d19f49 - languageName: node - linkType: hard - -"@types/unist@npm:^2.0.0, @types/unist@npm:^2.0.2, @types/unist@npm:^2.0.3": - version: 2.0.6 - resolution: "@types/unist@npm:2.0.6" - checksum: 25cb860ff10dde48b54622d58b23e66214211a61c84c0f15f88d38b61aa1b53d4d46e42b557924a93178c501c166aa37e28d7f6d994aba13d24685326272d5db +"@types/unist@npm:^2, @types/unist@npm:^2.0.0, @types/unist@npm:^2.0.2, @types/unist@npm:^2.0.3": + version: 2.0.11 + resolution: "@types/unist@npm:2.0.11" + checksum: 6d436e832bc35c6dde9f056ac515ebf2b3384a1d7f63679d12358766f9b313368077402e9c1126a14d827f10370a5485e628bf61aa91117cf4fc882423191a4e languageName: node linkType: hard "@types/warning@npm:^3.0.0": - version: 3.0.0 - resolution: "@types/warning@npm:3.0.0" - checksum: 120dcf90600d583c68a60872200061eab9318ae15ea898581f8e9a6dc71b7941095dd81d8324e36d2a6006e5e12b6fc1cf8eda00cc514ee12bb39a912cc4e040 + version: 3.0.3 + resolution: "@types/warning@npm:3.0.3" + checksum: 862b71c918283d2ace5cab4e9f0167507a15ee9cf4d46035c858bdd4bf1ee83cbfb42bcfd4da6e7e254a2efa32200b6521f3719c729e39e88e336309d53bb4c4 languageName: node linkType: hard @@ -3352,20 +3348,11 @@ __metadata: linkType: hard "@types/yargs@npm:^17.0.8": - version: 17.0.32 - resolution: "@types/yargs@npm:17.0.32" + version: 17.0.35 + resolution: "@types/yargs@npm:17.0.35" dependencies: "@types/yargs-parser": "*" - checksum: 4505bdebe8716ff383640c6e928f855b5d337cb3c68c81f7249fc6b983d0aa48de3eee26062b84f37e0d75a5797bc745e0c6e76f42f81771252a758c638f36ba - languageName: node - linkType: hard - -"@types/yauzl@npm:^2.9.1": - version: 2.10.0 - resolution: "@types/yauzl@npm:2.10.0" - dependencies: - "@types/node": "*" - checksum: 55d27ae5d346ea260e40121675c24e112ef0247649073848e5d4e03182713ae4ec8142b98f61a1c6cbe7d3b72fa99bbadb65d8b01873e5e605cdc30f1ff70ef2 + checksum: ebf1f5373388cfcbf9cfb5e56ce7a77c0ba2450420f26f3701010ca92df48cce7e14e4245ed1f17178a38ff8702467a6f4047742775b8e2fd06dec8f4f3501ce languageName: node linkType: hard @@ -3457,8 +3444,8 @@ __metadata: jsdom: ^20.0.0 load-json-file: ^6.2.0 md5: ^2.3.0 - react: ^17.0.2 - react-dom: ^17.0.2 + react: 18.2.0 + react-dom: 18.2.0 ts-jest: ^29.1.1 ts-node: ^10.5.0 typescript: ^4.7.4 @@ -3468,81 +3455,84 @@ __metadata: languageName: unknown linkType: soft -"@webiny/error@npm:5.38.1": - version: 5.38.1 - resolution: "@webiny/error@npm:5.38.1" - checksum: 9cf969204d64e808b1da3821c50d8ae4424eb26212a13bc3becb2ec231d41ea97a230851f47eb6518f23be7339f3fc7fd55b8a616f150091b1c095136fb13075 +"@webiny/error@npm:5.44.0": + version: 5.44.0 + resolution: "@webiny/error@npm:5.44.0" + checksum: 67d304e09af7aa7bdc9fad7419275426212f8b5000274e6e2f84dd3e13e7acbe48aca0f1badeb41f89d27ca8ad0a46088bf71cc2c66342cdcfda59eb86c5449d languageName: node linkType: hard -"@webiny/react-composition@npm:5.39.6, @webiny/react-composition@npm:^5.39.6": - version: 5.39.6 - resolution: "@webiny/react-composition@npm:5.39.6" +"@webiny/plugins@npm:5.44.0": + version: 5.44.0 + resolution: "@webiny/plugins@npm:5.44.0" dependencies: - "@babel/runtime": 7.22.6 - "@types/react": 17.0.39 - react: 17.0.2 - react-dom: 17.0.2 - checksum: a4b09b2c51d0bfc1ac629b02d1a3f05a0dea203fc9e473828e0297b5c9596d179032bd1e5c0eaeca7a2afa8dc524f97e57e0109aee44dfeea94ad887abcf2d3e + uniqid: 5.4.0 + checksum: 77c2676d81696860dc57c8419b209ed9c2a3c67f0e70ea7a9dedcc65efb03bd8707b0a2aa3907a3848ce4a867e3e2a2fb4a96ca69bbce9bffc46a9be04d2c1c3 languageName: node linkType: hard -"@webiny/react-properties@npm:^5.39.6": - version: 5.39.6 - resolution: "@webiny/react-properties@npm:5.39.6" +"@webiny/react-composition@npm:5.44.0, @webiny/react-composition@npm:^5.44.0": + version: 5.44.0 + resolution: "@webiny/react-composition@npm:5.44.0" dependencies: - "@babel/runtime": 7.22.6 - "@types/react": 17.0.39 - "@webiny/react-composition": 5.39.6 - nanoid: 3.3.4 - react: 17.0.2 - checksum: 30f5cadf533f109e234f4f247ebc5d46a5ccdcb2ed68e2709e195f53e2b1a59c5375b93c67d50217142b9984f05bca98e201c307ca08375e05b40f01173ddb89 + "@types/react": 18.2.79 + react: 18.2.0 + react-dom: 18.2.0 + checksum: e947a452ad9f98fea3295a329f94120d94e1d719b5dbc5dfd7fe0ab930483fe5e90e0c0aa7684e238e88cc2c8891d08740cc1c4bdc5f643a0133563f195c5db1 languageName: node linkType: hard -"@webiny/utils@npm:latest": - version: 5.38.1 - resolution: "@webiny/utils@npm:5.38.1" +"@webiny/react-properties@npm:^5.44.0": + version: 5.44.0 + resolution: "@webiny/react-properties@npm:5.44.0" dependencies: - "@webiny/error": 5.38.1 - mdbid: 1.0.0 - nanoid: 3.3.4 - nanoid-dictionary: 4.3.0 - p-retry: 4.6.2 - peerDependencies: - zod: ^3.21.4 - checksum: 5e8fbfa26a6ef3161064d8c79b57eca18c9144eb5a55d32125eeee23fc98838349a5dd848c7fd40dcfcde182e6347e46f44cd745f095ebd621891878ec7d7ed5 + "@types/react": 18.2.79 + "@webiny/react-composition": 5.44.0 + nanoid: 3.3.11 + react: 18.2.0 + checksum: d4ff02c0fb0f2a33e9c29fea8c931e1ba7a2aabdd96cb86cb635a4caccf82466b0306ca0420728dbddabf8568059ec62002b12637ce06e2309005168733b5851 languageName: node linkType: hard -"@zachleat/spider-pig@npm:^2.0.0": - version: 2.0.0 - resolution: "@zachleat/spider-pig@npm:2.0.0" +"@webiny/utils@npm:^5.44.0": + version: 5.44.0 + resolution: "@webiny/utils@npm:5.44.0" dependencies: - chalk: ^4.1.0 - minimist: ^1.2.5 - normalize-url: ^5.3.0 - puppeteer: ^8.0.0 - bin: - spiderpig: cmd.js - checksum: 46712a7a92cb04b24aaf586c1e59f093d7f39b75223b5c7715f083a1ae774e8c5916aa6ba6bcbbaaa08226597569e44a873c703bf6bb123814f3f2ff55f19b35 + "@noble/hashes": 1.8.0 + "@webiny/error": 5.44.0 + "@webiny/plugins": 5.44.0 + bson-objectid: 2.0.4 + jsonpack: 1.1.5 + nanoid: 3.3.11 + nanoid-dictionary: 4.3.0 + p-retry: 4.6.2 + peerDependencies: + zod: ^3.23.8 + checksum: bd7e8014d39b9e1a2111578c4db7d40f96905636b6b377a63ec9b69db034fac8e0e2918d123fd289149ccd3a79be364c0274ba9238d836fd8e9d92bb9284999f languageName: node linkType: hard -"abab@npm:^2.0.0, abab@npm:^2.0.6": +"abab@npm:^2.0.6": version: 2.0.6 resolution: "abab@npm:2.0.6" checksum: 6ffc1af4ff315066c62600123990d87551ceb0aafa01e6539da77b0f5987ac7019466780bf480f1787576d4385e3690c81ccc37cfda12819bf510b8ab47e5a3e languageName: node linkType: hard -"abbrev@npm:1": +"abbrev@npm:^1.0.0": version: 1.1.1 resolution: "abbrev@npm:1.1.1" checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 languageName: node linkType: hard +"abbrev@npm:^4.0.0": + version: 4.0.0 + resolution: "abbrev@npm:4.0.0" + checksum: d0344b63d28e763f259b4898c41bdc92c08e9d06d0da5617d0bbe4d78244e46daea88c510a2f9472af59b031d9060ec1a999653144e793fd029a59dae2f56dc8 + languageName: node + linkType: hard + "accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" @@ -3553,23 +3543,13 @@ __metadata: languageName: node linkType: hard -"acorn-globals@npm:^4.3.2": - version: 4.3.4 - resolution: "acorn-globals@npm:4.3.4" - dependencies: - acorn: ^6.0.1 - acorn-walk: ^6.0.1 - checksum: c31bfde102d8a104835e9591c31dd037ec771449f9c86a6b1d2ac3c7c336694f828cfabba7687525b094f896a854affbf1afe6e1b12c0d998be6bab5d49c9663 - languageName: node - linkType: hard - -"acorn-globals@npm:^6.0.0": - version: 6.0.0 - resolution: "acorn-globals@npm:6.0.0" +"acorn-globals@npm:^7.0.0": + version: 7.0.1 + resolution: "acorn-globals@npm:7.0.1" dependencies: - acorn: ^7.1.1 - acorn-walk: ^7.1.1 - checksum: 72d95e5b5e585f9acd019b993ab8bbba68bb3cbc9d9b5c1ebb3c2f1fe5981f11deababfb4949f48e6262f9c57878837f5958c0cca396f81023814680ca878042 + acorn: ^8.1.0 + acorn-walk: ^8.0.2 + checksum: 2a2998a547af6d0db5f0cdb90acaa7c3cbca6709010e02121fb8b8617c0fbd8bab0b869579903fde358ac78454356a14fadcc1a672ecb97b04b1c2ccba955ce8 languageName: node linkType: hard @@ -3582,13 +3562,6 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^6.0.1": - version: 6.2.0 - resolution: "acorn-walk@npm:6.2.0" - checksum: ea241a5d96338f1e8030aafae72a91ff0ec4360e2775e44a2fdb2eb618b07fc309e000a5126056631ac7f00fe8bd9bbd23fcb6d018eee4ba11086eb36c1b2e61 - languageName: node - linkType: hard - "acorn-walk@npm:^7.1.1": version: 7.2.0 resolution: "acorn-walk@npm:7.2.0" @@ -3596,23 +3569,16 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.1.1": - version: 8.3.0 - resolution: "acorn-walk@npm:8.3.0" - checksum: 15ea56ab6529135be05e7d018f935ca80a572355dd3f6d3cd717e36df3346e0f635a93ae781b1c7942607693e2e5f3ef81af5c6fc697bbadcc377ebda7b7f5f6 - languageName: node - linkType: hard - -"acorn@npm:^6.0.1": - version: 6.4.2 - resolution: "acorn@npm:6.4.2" - bin: - acorn: bin/acorn - checksum: 44b07053729db7f44d28343eed32247ed56dc4a6ec6dff2b743141ecd6b861406bbc1c20bf9d4f143ea7dd08add5dc8c290582756539bc03a8db605050ce2fb4 +"acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.1.1": + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: ^8.11.0 + checksum: 4ff03f42323e7cf90f1683e08606b0f460e1e6ac263d2730e3df91c7665b6f64e696db6ea27ee4bed18c2599569be61f28a8399fa170c611161a348c402ca19c languageName: node linkType: hard -"acorn@npm:^7.1.0, acorn@npm:^7.1.1, acorn@npm:^7.4.0": +"acorn@npm:^7.1.1, acorn@npm:^7.4.0": version: 7.4.1 resolution: "acorn@npm:7.4.1" bin: @@ -3621,21 +3587,12 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.4.1": - version: 8.11.2 - resolution: "acorn@npm:8.11.2" - bin: - acorn: bin/acorn - checksum: 818450408684da89423e3daae24e4dc9b68692db8ab49ea4569c7c5abb7a3f23669438bf129cc81dfdada95e1c9b944ee1bfca2c57a05a4dc73834a612fbf6a7 - languageName: node - linkType: hard - -"acorn@npm:^8.7.1": - version: 8.7.1 - resolution: "acorn@npm:8.7.1" +"acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.4.1, acorn@npm:^8.8.1": + version: 8.15.0 + resolution: "acorn@npm:8.15.0" bin: acorn: bin/acorn - checksum: aca0aabf98826717920ac2583fdcad0a6fbe4e583fdb6e843af2594e907455aeafe30b1e14f1757cd83ce1776773cf8296ffc3a4acf13f0bd3dfebcf1db6ae80 + checksum: 309c6b49aedf1a2e34aaf266de06de04aab6eb097c02375c66fdeb0f64556a6a823540409914fb364d9a11bc30d79d485a2eba29af47992d3490e9886c4391c3 languageName: node linkType: hard @@ -3648,14 +3605,19 @@ __metadata: languageName: node linkType: hard +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.4 + resolution: "agent-base@npm:7.1.4" + checksum: 86a7f542af277cfbd77dd61e7df8422f90bac512953709003a1c530171a9d019d072e2400eab2b59f84b49ab9dd237be44315ca663ac73e82b3922d10ea5eafa + languageName: node + linkType: hard + "agentkeepalive@npm:^4.2.1": - version: 4.2.1 - resolution: "agentkeepalive@npm:4.2.1" + version: 4.6.0 + resolution: "agentkeepalive@npm:4.6.0" dependencies: - debug: ^4.1.0 - depd: ^1.1.2 humanize-ms: ^1.2.1 - checksum: 39cb49ed8cf217fd6da058a92828a0a84e0b74c35550f82ee0a10e1ee403c4b78ade7948be2279b188b7a7303f5d396ea2738b134731e464bf28de00a4f72a18 + checksum: b3cdd10efca04876defda3c7671163523fcbce20e8ef7a8f9f30919a242e32b846791c0f1a8a0269718a585805a2cdcd031779ff7b9927a1a8dd8586f8c2e8c5 languageName: node linkType: hard @@ -3678,7 +3640,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.10.0, ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:^6.12.5": +"ajv@npm:^6.10.0, ajv@npm:^6.12.4, ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -3691,36 +3653,36 @@ __metadata: linkType: hard "ajv@npm:^8.0.1": - version: 8.11.0 - resolution: "ajv@npm:8.11.0" + version: 8.18.0 + resolution: "ajv@npm:8.18.0" dependencies: - fast-deep-equal: ^3.1.1 + fast-deep-equal: ^3.1.3 + fast-uri: ^3.0.1 json-schema-traverse: ^1.0.0 require-from-string: ^2.0.2 - uri-js: ^4.2.2 - checksum: 5e0ff226806763be73e93dd7805b634f6f5921e3e90ca04acdf8db81eed9d8d3f0d4c5f1213047f45ebbf8047ffe0c840fa1ef2ec42c3a644899f69aa72b5bef + checksum: bcdf6c7b040ca488108e2b4e219b31cf9ed478331007d4dd1ed8acc3946dd6b84295817c0f4724207b8dd8589c9966168b2fd4c7f32109d4b8526cdd3743e936 languageName: node linkType: hard -"algoliasearch@npm:^4.0.0": - version: 4.13.1 - resolution: "algoliasearch@npm:4.13.1" +"algoliasearch@npm:^5.14.2": + version: 5.48.2 + resolution: "algoliasearch@npm:5.48.2" dependencies: - "@algolia/cache-browser-local-storage": 4.13.1 - "@algolia/cache-common": 4.13.1 - "@algolia/cache-in-memory": 4.13.1 - "@algolia/client-account": 4.13.1 - "@algolia/client-analytics": 4.13.1 - "@algolia/client-common": 4.13.1 - "@algolia/client-personalization": 4.13.1 - "@algolia/client-search": 4.13.1 - "@algolia/logger-common": 4.13.1 - "@algolia/logger-console": 4.13.1 - "@algolia/requester-browser-xhr": 4.13.1 - "@algolia/requester-common": 4.13.1 - "@algolia/requester-node-http": 4.13.1 - "@algolia/transporter": 4.13.1 - checksum: c2083e7827a5d0d980716f9cc129d5136f6205f46019917b7b23a63eb13ec665c029299d14752c12429903af59a0b6f73393d152a0eec409a2cac3b708e25c2c + "@algolia/abtesting": 1.14.2 + "@algolia/client-abtesting": 5.48.2 + "@algolia/client-analytics": 5.48.2 + "@algolia/client-common": 5.48.2 + "@algolia/client-insights": 5.48.2 + "@algolia/client-personalization": 5.48.2 + "@algolia/client-query-suggestions": 5.48.2 + "@algolia/client-search": 5.48.2 + "@algolia/ingestion": 1.48.2 + "@algolia/monitoring": 1.48.2 + "@algolia/recommend": 5.48.2 + "@algolia/requester-browser-xhr": 5.48.2 + "@algolia/requester-fetch": 5.48.2 + "@algolia/requester-node-http": 5.48.2 + checksum: efdd98d98bf46e9e87e6702aede5a218be906ffe0f7e9e9c9c40f4792b6674dfaa0ff466e95f964e6aea0e8fc6963cdef616b35de7efad4ed1da7c66321961bb languageName: node linkType: hard @@ -3754,13 +3716,6 @@ __metadata: languageName: node linkType: hard -"ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 - languageName: node - linkType: hard - "ansi-styles@npm:^3.2.1": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" @@ -3786,13 +3741,6 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 - languageName: node - linkType: hard - "any-promise@npm:^1.0.0": version: 1.3.0 resolution: "any-promise@npm:1.3.0" @@ -3800,7 +3748,7 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:^3.0.3": +"anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": version: 3.1.3 resolution: "anymatch@npm:3.1.3" dependencies: @@ -3810,30 +3758,20 @@ __metadata: languageName: node linkType: hard -"anymatch@npm:~3.1.2": - version: 3.1.2 - resolution: "anymatch@npm:3.1.2" - dependencies: - normalize-path: ^3.0.0 - picomatch: ^2.0.4 - checksum: 985163db2292fac9e5a1e072bf99f1b5baccf196e4de25a0b0b81865ebddeb3b3eb4480734ef0a2ac8c002845396b91aa89121f5b84f93981a4658164a9ec6e9 - languageName: node - linkType: hard - "aproba@npm:^1.0.3 || ^2.0.0": - version: 2.0.0 - resolution: "aproba@npm:2.0.0" - checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 + version: 2.1.0 + resolution: "aproba@npm:2.1.0" + checksum: 667c77755e8dd4c67f0a1a903d6879cac8c11e385758893eba518cced0448e2eba9996f2d93fe5187306ba85bce73d709bce4be809e0f51be0d24ff12db547fe languageName: node linkType: hard "are-we-there-yet@npm:^3.0.0": - version: 3.0.0 - resolution: "are-we-there-yet@npm:3.0.0" + version: 3.0.1 + resolution: "are-we-there-yet@npm:3.0.1" dependencies: delegates: ^1.0.0 readable-stream: ^3.6.0 - checksum: 348edfdd931b0b50868b55402c01c3f64df1d4c229ab6f063539a5025fd6c5f5bb8a0cab409bbed8d75d34762d22aa91b7c20b4204eb8177063158d9ba792981 + checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 languageName: node linkType: hard @@ -3860,20 +3798,20 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:^4.2.2": - version: 4.2.2 - resolution: "aria-query@npm:4.2.2" - dependencies: - "@babel/runtime": ^7.10.2 - "@babel/runtime-corejs3": ^7.10.2 - checksum: 38401a9a400f26f3dcc24b84997461a16b32869a9893d323602bed8da40a8bcc0243b8d2880e942249a1496cea7a7de769e93d21c0baa439f01e1ee936fed665 +"aria-query@npm:^5.3.2": + version: 5.3.2 + resolution: "aria-query@npm:5.3.2" + checksum: d971175c85c10df0f6d14adfe6f1292409196114ab3c62f238e208b53103686f46cc70695a4f775b73bc65f6a09b6a092fd963c4f3a5a7d690c8fc5094925717 languageName: node linkType: hard -"array-equal@npm:^1.0.0": - version: 1.0.0 - resolution: "array-equal@npm:1.0.0" - checksum: 3f68045806357db9b2fa1ad583e42a659de030633118a0cd35ee4975cb20db3b9a3d36bbec9b5afe70011cf989eefd215c12fe0ce08c498f770859ca6e70688a +"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "array-buffer-byte-length@npm:1.0.2" + dependencies: + call-bound: ^1.0.3 + is-array-buffer: ^3.0.5 + checksum: 0ae3786195c3211b423e5be8dd93357870e6fb66357d81da968c2c39ef43583ef6eece1f9cb1caccdae4806739c65dea832b44b8593414313cd76a89795fca63 languageName: node linkType: hard @@ -3884,16 +3822,19 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.4, array-includes@npm:^3.1.5": - version: 3.1.5 - resolution: "array-includes@npm:3.1.5" +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8, array-includes@npm:^3.1.9": + version: 3.1.9 + resolution: "array-includes@npm:3.1.9" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.19.5 - get-intrinsic: ^1.1.1 - is-string: ^1.0.7 - checksum: f6f24d834179604656b7bec3e047251d5cc87e9e87fab7c175c61af48e80e75acd296017abcde21fb52292ab6a2a449ab2ee37213ee48c8709f004d75983f9c5 + call-bind: ^1.0.8 + call-bound: ^1.0.4 + define-properties: ^1.2.1 + es-abstract: ^1.24.0 + es-object-atoms: ^1.1.1 + get-intrinsic: ^1.3.0 + is-string: ^1.1.1 + math-intrinsics: ^1.1.0 + checksum: b58dc526fe415252e50319eaf88336e06e75aa673e3b58d252414739a4612dbe56e7b613fdcc7c90561dc9cf9202bbe5ca029ccd8c08362746459475ae5a8f3e languageName: node linkType: hard @@ -3911,63 +3852,107 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.2.5": - version: 1.3.0 - resolution: "array.prototype.flat@npm:1.3.0" +"array.prototype.findlast@npm:^1.2.5": + version: 1.2.5 + resolution: "array.prototype.findlast@npm:1.2.5" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.2 - es-shim-unscopables: ^1.0.0 - checksum: 2a652b3e8dc0bebb6117e42a5ab5738af0203a14c27341d7bb2431467bdb4b348e2c5dc555dfcda8af0a5e4075c400b85311ded73861c87290a71a17c3e0a257 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + es-shim-unscopables: ^1.0.2 + checksum: 83ce4ad95bae07f136d316f5a7c3a5b911ac3296c3476abe60225bc4a17938bf37541972fcc37dd5adbc99cbb9c928c70bbbfc1c1ce549d41a415144030bb446 languageName: node linkType: hard -"array.prototype.flatmap@npm:^1.3.0": - version: 1.3.0 - resolution: "array.prototype.flatmap@npm:1.3.0" +"array.prototype.findlastindex@npm:^1.2.6": + version: 1.2.6 + resolution: "array.prototype.findlastindex@npm:1.2.6" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.2 - es-shim-unscopables: ^1.0.0 - checksum: 818538f39409c4045d874be85df0dbd195e1446b14d22f95bdcfefea44ae77db44e42dcd89a559254ec5a7c8b338cfc986cc6d641e3472f9a5326b21eb2976a2 + call-bind: ^1.0.8 + call-bound: ^1.0.4 + define-properties: ^1.2.1 + es-abstract: ^1.23.9 + es-errors: ^1.3.0 + es-object-atoms: ^1.1.1 + es-shim-unscopables: ^1.1.0 + checksum: bd2665bd51f674d4e1588ce5d5848a8adb255f414070e8e652585598b801480516df2c6cef2c60b6ea1a9189140411c49157a3f112d52e9eabb4e9fc80936ea6 languageName: node linkType: hard -"array.prototype.reduce@npm:^1.0.4": - version: 1.0.4 - resolution: "array.prototype.reduce@npm:1.0.4" +"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.3": + version: 1.3.3 + resolution: "array.prototype.flat@npm:1.3.3" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.2 + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-abstract: ^1.23.5 + es-shim-unscopables: ^1.0.2 + checksum: 5d5a7829ab2bb271a8d30a1c91e6271cef0ec534593c0fe6d2fb9ebf8bb62c1e5326e2fddcbbcbbe5872ca04f5e6b54a1ecf092e0af704fb538da9b2bfd95b40 + languageName: node + linkType: hard + +"array.prototype.flatmap@npm:^1.3.2, array.prototype.flatmap@npm:^1.3.3": + version: 1.3.3 + resolution: "array.prototype.flatmap@npm:1.3.3" + dependencies: + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-abstract: ^1.23.5 + es-shim-unscopables: ^1.0.2 + checksum: 11b4de09b1cf008be6031bb507d997ad6f1892e57dc9153583de6ebca0f74ea403fffe0f203461d359de05048d609f3f480d9b46fed4099652d8b62cc972f284 + languageName: node + linkType: hard + +"array.prototype.reduce@npm:^1.0.8": + version: 1.0.8 + resolution: "array.prototype.reduce@npm:1.0.8" + dependencies: + call-bind: ^1.0.8 + call-bound: ^1.0.4 + define-properties: ^1.2.1 + es-abstract: ^1.23.9 es-array-method-boxes-properly: ^1.0.0 - is-string: ^1.0.7 - checksum: 6a57a1a2d3b77a9543db139cd52211f43a5af8e8271cb3c173be802076e3a6f71204ba8f090f5937ebc0842d5876db282f0f63dffd0e86b153e6e5a45681e4a5 + es-errors: ^1.3.0 + es-object-atoms: ^1.1.1 + is-string: ^1.1.1 + checksum: a2a25e087a75e4caae09414acdfffb6ed69f7dd696d8c612d86dfaa5590bde4d7bc934db8bdd28625703f574aa93731848bfc24a7ba65c558aeb222b2a4fd4c4 languageName: node linkType: hard -"asn1@npm:~0.2.3": - version: 0.2.6 - resolution: "asn1@npm:0.2.6" +"array.prototype.tosorted@npm:^1.1.4": + version: 1.1.4 + resolution: "array.prototype.tosorted@npm:1.1.4" dependencies: - safer-buffer: ~2.1.0 - checksum: 39f2ae343b03c15ad4f238ba561e626602a3de8d94ae536c46a4a93e69578826305366dc09fbb9b56aec39b4982a463682f259c38e59f6fa380cd72cd61e493d + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.3 + es-errors: ^1.3.0 + es-shim-unscopables: ^1.0.2 + checksum: e4142d6f556bcbb4f393c02e7dbaea9af8f620c040450c2be137c9cbbd1a17f216b9c688c5f2c08fbb038ab83f55993fa6efdd9a05881d84693c7bcb5422127a languageName: node linkType: hard -"assert-plus@npm:1.0.0, assert-plus@npm:^1.0.0": - version: 1.0.0 - resolution: "assert-plus@npm:1.0.0" - checksum: 19b4340cb8f0e6a981c07225eacac0e9d52c2644c080198765d63398f0075f83bbc0c8e95474d54224e297555ad0d631c1dcd058adb1ddc2437b41a6b424ac64 +"arraybuffer.prototype.slice@npm:^1.0.4": + version: 1.0.4 + resolution: "arraybuffer.prototype.slice@npm:1.0.4" + dependencies: + array-buffer-byte-length: ^1.0.1 + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-abstract: ^1.23.5 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 + is-array-buffer: ^3.0.4 + checksum: b1d1fd20be4e972a3779b1569226f6740170dca10f07aa4421d42cefeec61391e79c557cda8e771f5baefe47d878178cd4438f60916ce831813c08132bced765 languageName: node linkType: hard -"ast-types-flow@npm:^0.0.7": - version: 0.0.7 - resolution: "ast-types-flow@npm:0.0.7" - checksum: a26dcc2182ffee111cad7c471759b0bda22d3b7ebacf27c348b22c55f16896b18ab0a4d03b85b4020dce7f3e634b8f00b593888f622915096ea1927fa51866c4 +"ast-types-flow@npm:^0.0.8": + version: 0.0.8 + resolution: "ast-types-flow@npm:0.0.8" + checksum: 0a64706609a179233aac23817837abab614f3548c252a2d3d79ea1e10c74aa28a0846e11f466cf72771b6ed8713abc094dcf8c40c3ec4207da163efa525a94a8 languageName: node linkType: hard @@ -3978,6 +3963,20 @@ __metadata: languageName: node linkType: hard +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 9102e246d1ed9b37ac36f57f0a6ca55226876553251a31fc80677e71471f463a54c872dc78d5d7f80740c8ba624395cccbe8b60f7b690c4418f487d8e9fd1106 + languageName: node + linkType: hard + +"async-generator-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-generator-function@npm:1.0.0" + checksum: 74a71a4a2dd7afd06ebb612f6d612c7f4766a351bedffde466023bf6dae629e46b0d2cd38786239e0fbf245de0c7df76035465e16d1213774a0efb22fec0d713 + languageName: node + linkType: hard + "async-limiter@npm:~1.0.0": version: 1.0.1 resolution: "async-limiter@npm:1.0.1" @@ -4000,48 +3999,42 @@ __metadata: linkType: hard "autoprefixer@npm:^10.4.0": - version: 10.4.7 - resolution: "autoprefixer@npm:10.4.7" + version: 10.4.24 + resolution: "autoprefixer@npm:10.4.24" dependencies: - browserslist: ^4.20.3 - caniuse-lite: ^1.0.30001335 - fraction.js: ^4.2.0 - normalize-range: ^0.1.2 - picocolors: ^1.0.0 + browserslist: ^4.28.1 + caniuse-lite: ^1.0.30001766 + fraction.js: ^5.3.4 + picocolors: ^1.1.1 postcss-value-parser: ^4.2.0 peerDependencies: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: 0e55d0d19806c672ec0c79cc23c27cf77e90edf2600670735266ba33ec5294458f404baaa2f7cd4cfe359cf7a97b3c86f01886bdbdc129a4f2f76ca5977a91af - languageName: node - linkType: hard - -"aws-sign2@npm:~0.7.0": - version: 0.7.0 - resolution: "aws-sign2@npm:0.7.0" - checksum: b148b0bb0778098ad8cf7e5fc619768bcb51236707ca1d3e5b49e41b171166d8be9fdc2ea2ae43d7decf02989d0aaa3a9c4caa6f320af95d684de9b548a71525 + checksum: c13d69ab38ee3646b2935a2462df45a48447d393eb8f01d2d8c65311dff40b7ae3b8ea0d868b279cfc13802c8c5d119150f63e5bf20013eb93b09b3314c6424e languageName: node linkType: hard -"aws4@npm:^1.8.0": - version: 1.11.0 - resolution: "aws4@npm:1.11.0" - checksum: 5a00d045fd0385926d20ebebcfba5ec79d4482fe706f63c27b324d489a04c68edb0db99ed991e19eda09cb8c97dc2452059a34d97545cebf591d7a2b5a10999f +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: ^1.0.0 + checksum: 1aa3ffbfe6578276996de660848b6e95669d9a95ad149e3dd0c0cda77db6ee1dbd9d1dd723b65b6d277b882dd0c4b91a654ae9d3cf9e1254b7e93e4908d78fd3 languageName: node linkType: hard -"axe-core@npm:^4.4.2": - version: 4.4.2 - resolution: "axe-core@npm:4.4.2" - checksum: 93fbb36c5ac8ab5e67e49678a6f7be0dc799a9f560edd95cca1f0a8183def8c50205972366b9941a3ea2b20224a1fe230e6d87ef38cb6db70472ed1b694febd1 +"axe-core@npm:^4.10.0": + version: 4.11.1 + resolution: "axe-core@npm:4.11.1" + checksum: 92b3c79af3695bcebac0e7f3f90f4bc11d2b39ccdc670937290e8dacbc943473713cc06b771dea0563c66d57d93d940ed89e082bfdecccf9dd70782d4bb243c0 languageName: node linkType: hard -"axobject-query@npm:^2.2.0": - version: 2.2.0 - resolution: "axobject-query@npm:2.2.0" - checksum: 96b8c7d807ca525f41ad9b286186e2089b561ba63a6d36c3e7d73dc08150714660995c7ad19cda05784458446a0793b45246db45894631e13853f48c1aa3117f +"axobject-query@npm:^4.1.0": + version: 4.1.0 + resolution: "axobject-query@npm:4.1.0" + checksum: 7d1e87bf0aa7ae7a76cd39ab627b7c48fda3dc40181303d9adce4ba1d5b5ce73b5e5403ee6626ec8e91090448c887294d6144e24b6741a976f5be9347e3ae1df languageName: node linkType: hard @@ -4090,15 +4083,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-dynamic-import-node@npm:^2.3.3": - version: 2.3.3 - resolution: "babel-plugin-dynamic-import-node@npm:2.3.3" - dependencies: - object.assign: ^4.1.0 - checksum: c9d24415bcc608d0db7d4c8540d8002ac2f94e2573d2eadced137a29d9eab7e25d2cbb4bc6b9db65cf6ee7430f7dd011d19c911a9a778f0533b4a05ce8292c9b - languageName: node - linkType: hard - "babel-plugin-extract-import-names@npm:1.6.22": version: 1.6.22 resolution: "babel-plugin-extract-import-names@npm:1.6.22" @@ -4146,61 +4130,64 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.3.1": - version: 0.3.1 - resolution: "babel-plugin-polyfill-corejs2@npm:0.3.1" +"babel-plugin-polyfill-corejs2@npm:^0.4.15": + version: 0.4.15 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.15" dependencies: - "@babel/compat-data": ^7.13.11 - "@babel/helper-define-polyfill-provider": ^0.3.1 - semver: ^6.1.1 + "@babel/compat-data": ^7.28.6 + "@babel/helper-define-polyfill-provider": ^0.6.6 + semver: ^6.3.1 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: ca873f14ccd6d2942013345a956de8165d0913556ec29756a748157140f5312f79eed487674e0ca562285880f05829b3712d72e1e4b412c2ce46bd6a50b4b975 + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: cf32e00ee54cdd75a3acec408f3467edc20cff4359c2bc5fb221144a489d6c0d5936031e18d66483613194a7012034b8a9e1237b84e9063f963f352efc1558bc languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.5.2": - version: 0.5.2 - resolution: "babel-plugin-polyfill-corejs3@npm:0.5.2" +"babel-plugin-polyfill-corejs3@npm:^0.14.0": + version: 0.14.0 + resolution: "babel-plugin-polyfill-corejs3@npm:0.14.0" dependencies: - "@babel/helper-define-polyfill-provider": ^0.3.1 - core-js-compat: ^3.21.0 + "@babel/helper-define-polyfill-provider": ^0.6.6 + core-js-compat: ^3.48.0 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 2f3184c73f80f00ac876a5ebcad945fd8d2ae70e5f85b7ab6cc3bc69bc74025f4f7070de7abbb2a7274c78e130bd34fc13f4c85342da28205930364a1ef0aa21 + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: dda87e15dd4e36e989fafe3719d9e67ad1ebcfae3530d1b46f285439ecdd1709b147d7a656b10091b37f6490630836fe454755bc8f829d237ada1ac44603ff81 languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.3.1": - version: 0.3.1 - resolution: "babel-plugin-polyfill-regenerator@npm:0.3.1" +"babel-plugin-polyfill-regenerator@npm:^0.6.6": + version: 0.6.6 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.6" dependencies: - "@babel/helper-define-polyfill-provider": ^0.3.1 + "@babel/helper-define-polyfill-provider": ^0.6.6 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: f1473df7b700d6795ca41301b1e65a0aff15ce6c1463fc0ce2cf0c821114b0330920f59d4cebf52976363ee817ba29ad2758544a4661a724b08191080b9fe1da + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 8de7ea32856e75784601cacf8f4e3cbf04ce1fd05d56614b08b7bbe0674d1e59e37ccaa1c7ed16e3b181a63abe5bd43a1ab0e28b8c95618a9ebf0be5e24d6b25 languageName: node linkType: hard "babel-preset-current-node-syntax@npm:^1.0.0": - version: 1.0.1 - resolution: "babel-preset-current-node-syntax@npm:1.0.1" + version: 1.2.0 + resolution: "babel-preset-current-node-syntax@npm:1.2.0" dependencies: "@babel/plugin-syntax-async-generators": ^7.8.4 "@babel/plugin-syntax-bigint": ^7.8.3 - "@babel/plugin-syntax-class-properties": ^7.8.3 - "@babel/plugin-syntax-import-meta": ^7.8.3 + "@babel/plugin-syntax-class-properties": ^7.12.13 + "@babel/plugin-syntax-class-static-block": ^7.14.5 + "@babel/plugin-syntax-import-attributes": ^7.24.7 + "@babel/plugin-syntax-import-meta": ^7.10.4 "@babel/plugin-syntax-json-strings": ^7.8.3 - "@babel/plugin-syntax-logical-assignment-operators": ^7.8.3 + "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 - "@babel/plugin-syntax-numeric-separator": ^7.8.3 + "@babel/plugin-syntax-numeric-separator": ^7.10.4 "@babel/plugin-syntax-object-rest-spread": ^7.8.3 "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 "@babel/plugin-syntax-optional-chaining": ^7.8.3 - "@babel/plugin-syntax-top-level-await": ^7.8.3 + "@babel/plugin-syntax-private-property-in-object": ^7.14.5 + "@babel/plugin-syntax-top-level-await": ^7.14.5 peerDependencies: - "@babel/core": ^7.0.0 - checksum: d118c2742498c5492c095bc8541f4076b253e705b5f1ad9a2e7d302d81a84866f0070346662355c8e25fc02caa28dc2da8d69bcd67794a0d60c4d6fab6913cc8 + "@babel/core": ^7.0.0 || ^8.0.0-0 + checksum: 3608fa671cfa46364ea6ec704b8fcdd7514b7b70e6ec09b1199e13ae73ed346c51d5ce2cb6d4d5b295f6a3f2cad1fdeec2308aa9e037002dd7c929194cc838ea languageName: node linkType: hard @@ -4230,6 +4217,15 @@ __metadata: languageName: node linkType: hard +"balanced-match@npm:^4.0.2": + version: 4.0.2 + resolution: "balanced-match@npm:4.0.2" + dependencies: + jackspeak: ^4.2.3 + checksum: 862d6e14832a45558bdd2bc4663ba6d8e7ba60670a6cb1ef952a62348d5f086b16ee71a21b369f0fee808432590c724c823a80cb59eddd140b5ffa3f55497b62 + languageName: node + linkType: hard + "base64-js@npm:^1.3.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" @@ -4237,12 +4233,12 @@ __metadata: languageName: node linkType: hard -"bcrypt-pbkdf@npm:^1.0.0": - version: 1.0.2 - resolution: "bcrypt-pbkdf@npm:1.0.2" - dependencies: - tweetnacl: ^0.14.3 - checksum: 4edfc9fe7d07019609ccf797a2af28351736e9d012c8402a07120c4453a3b789a15f2ee1530dc49eee8f7eb9379331a8dd4b3766042b9e502f74a68e7f662291 +"baseline-browser-mapping@npm:^2.9.0": + version: 2.9.19 + resolution: "baseline-browser-mapping@npm:2.9.19" + bin: + baseline-browser-mapping: dist/cli.js + checksum: 5a9979a501f43d06188d6b4c1e5d540b3c5104d03439603af4bda0f1698b60ae2a44180fb7bdaeb9eea5118eb484a34e454211eb8cf0d104809fc668a0b2eb18 languageName: node linkType: hard @@ -4266,13 +4262,13 @@ __metadata: linkType: hard "binary-extensions@npm:^2.0.0": - version: 2.2.0 - resolution: "binary-extensions@npm:2.2.0" - checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 + version: 2.3.0 + resolution: "binary-extensions@npm:2.3.0" + checksum: bcad01494e8a9283abf18c1b967af65ee79b0c6a9e6fcfafebfe91dbe6e0fc7272bafb73389e198b310516ae04f7ad17d79aacf6cb4c0d5d5202a7e2e52c7d98 languageName: node linkType: hard -"bl@npm:^4.0.3, bl@npm:^4.1.0": +"bl@npm:^4.1.0": version: 4.1.0 resolution: "bl@npm:4.1.0" dependencies: @@ -4290,23 +4286,23 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.2": - version: 1.20.2 - resolution: "body-parser@npm:1.20.2" +"body-parser@npm:~1.20.3": + version: 1.20.4 + resolution: "body-parser@npm:1.20.4" dependencies: - bytes: 3.1.2 + bytes: ~3.1.2 content-type: ~1.0.5 debug: 2.6.9 depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 + destroy: ~1.2.0 + http-errors: ~2.0.1 + iconv-lite: ~0.4.24 + on-finished: ~2.4.1 + qs: ~6.14.0 + raw-body: ~2.5.3 type-is: ~1.6.18 - unpipe: 1.0.0 - checksum: 14d37ec638ab5c93f6099ecaed7f28f890d222c650c69306872e00b9efa081ff6c596cd9afb9930656aae4d6c4e1c17537bea12bb73c87a217cb3cfea8896737 + unpipe: ~1.0.0 + checksum: eaa212cff1737d2fbb49fc7aa1d71d9b456adea2dc3de388ff3c6d67b28028d6b1fa7e6cd77e3670b4cbd402ab011f80f6e5bb811480b53a28d11f33678c6298 languageName: node linkType: hard @@ -4318,25 +4314,34 @@ __metadata: linkType: hard "brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" + version: 1.1.12 + resolution: "brace-expansion@npm:1.1.12" + dependencies: + balanced-match: ^1.0.0 + concat-map: 0.0.1 + checksum: 12cb6d6310629e3048cadb003e1aca4d8c9bb5c67c3c321bafdd7e7a50155de081f78ea3e0ed92ecc75a9015e784f301efc8132383132f4f7904ad1ac529c562 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.2 + resolution: "brace-expansion@npm:2.0.2" dependencies: balanced-match: ^1.0.0 - concat-map: 0.0.1 - checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + checksum: 01dff195e3646bc4b0d27b63d9bab84d2ebc06121ff5013ad6e5356daa5a9d6b60fa26cf73c74797f2dc3fbec112af13578d51f75228c1112b26c790a87b0488 languageName: node linkType: hard -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" +"brace-expansion@npm:^5.0.2": + version: 5.0.2 + resolution: "brace-expansion@npm:5.0.2" dependencies: - balanced-match: ^1.0.0 - checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + balanced-match: ^4.0.2 + checksum: df4dcccb04ad168655716e9c2dc7ddc61afb8c0bc368dbfbffcf3d3cae2e4ceb9797484e9dd90d7b5a360066330fc6313afec2eac207110612637dabc5e34ca5 languageName: node linkType: hard -"braces@npm:^3.0.2, braces@npm:^3.0.3, braces@npm:~3.0.2": +"braces@npm:^3.0.3, braces@npm:~3.0.2": version: 3.0.3 resolution: "braces@npm:3.0.3" dependencies: @@ -4354,42 +4359,22 @@ __metadata: languageName: node linkType: hard -"browser-process-hrtime@npm:^1.0.0": - version: 1.0.0 - resolution: "browser-process-hrtime@npm:1.0.0" - checksum: e30f868cdb770b1201afb714ad1575dd86366b6e861900884665fb627109b3cc757c40067d3bfee1ff2a29c835257ea30725a8018a9afd02ac1c24b408b1e45f - languageName: node - linkType: hard - -"browserslist@npm:^4.20.2, browserslist@npm:^4.20.3, browserslist@npm:^4.21.0": - version: 4.21.1 - resolution: "browserslist@npm:4.21.1" - dependencies: - caniuse-lite: ^1.0.30001359 - electron-to-chromium: ^1.4.172 - node-releases: ^2.0.5 - update-browserslist-db: ^1.0.4 - bin: - browserslist: cli.js - checksum: 4904a9ded0702381adc495e003e7f77970abb7f8c8b8edd9e54f026354b5a96b1bddc26e6d9a7df9f043e468ecd2fcff2c8f40fc489909a042880117c2aca8ff - languageName: node - linkType: hard - -"browserslist@npm:^4.21.9": - version: 4.22.1 - resolution: "browserslist@npm:4.22.1" +"browserslist@npm:^4.24.0, browserslist@npm:^4.28.1": + version: 4.28.1 + resolution: "browserslist@npm:4.28.1" dependencies: - caniuse-lite: ^1.0.30001541 - electron-to-chromium: ^1.4.535 - node-releases: ^2.0.13 - update-browserslist-db: ^1.0.13 + baseline-browser-mapping: ^2.9.0 + caniuse-lite: ^1.0.30001759 + electron-to-chromium: ^1.5.263 + node-releases: ^2.0.27 + update-browserslist-db: ^1.2.0 bin: browserslist: cli.js - checksum: 7e6b10c53f7dd5d83fd2b95b00518889096382539fed6403829d447e05df4744088de46a571071afb447046abc3c66ad06fbc790e70234ec2517452e32ffd862 + checksum: 895357d912ae5a88a3fa454d2d280e9869e13432df30ca8918e206c0783b3b59375b178fdaf16d0041a1cf21ac45c8eb0a20f96f73dbd9662abf4cf613177a1e languageName: node linkType: hard -"bs-logger@npm:0.x": +"bs-logger@npm:^0.2.6": version: 0.2.6 resolution: "bs-logger@npm:0.2.6" dependencies: @@ -4407,6 +4392,13 @@ __metadata: languageName: node linkType: hard +"bson-objectid@npm:2.0.4": + version: 2.0.4 + resolution: "bson-objectid@npm:2.0.4" + checksum: 511a442cf8fb3691279911e53cf9476f9ecbe8f50e5c4887bf251160c48c86d4f1b140f1dfe890bbf9a2b7ce39732ed7caedfee1d1058e83741cef2d0e95082e + languageName: node + linkType: hard + "btoa@npm:^1.2.1": version: 1.2.1 resolution: "btoa@npm:1.2.1" @@ -4416,13 +4408,6 @@ __metadata: languageName: node linkType: hard -"buffer-crc32@npm:~0.2.3": - version: 0.2.13 - resolution: "buffer-crc32@npm:0.2.13" - checksum: 06252347ae6daca3453b94e4b2f1d3754a3b146a111d81c68924c22d91889a40623264e95e67955b1cb4a68cbedf317abeabb5140a9766ed248973096db5ce1c - languageName: node - linkType: hard - "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -4430,7 +4415,7 @@ __metadata: languageName: node linkType: hard -"buffer@npm:^5.2.1, buffer@npm:^5.5.0": +"buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" dependencies: @@ -4440,7 +4425,7 @@ __metadata: languageName: node linkType: hard -"bytes@npm:3.1.2": +"bytes@npm:~3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" checksum: e4bcd3948d289c5127591fbedf10c0b639ccbf00243504e4e127374a15c3bc8eed0d28d4aaab08ff6f1cf2abc0cce6ba3085ed32f4f90e82a5683ce0014e1b6e @@ -4448,8 +4433,8 @@ __metadata: linkType: hard "cacache@npm:^16.1.0": - version: 16.1.1 - resolution: "cacache@npm:16.1.1" + version: 16.1.3 + resolution: "cacache@npm:16.1.3" dependencies: "@npmcli/fs": ^2.1.0 "@npmcli/move-file": ^2.0.0 @@ -4468,18 +4453,59 @@ __metadata: rimraf: ^3.0.2 ssri: ^9.0.0 tar: ^6.1.11 - unique-filename: ^1.1.1 - checksum: 488524617008b793f0249b0c4ea2c330c710ca997921376e15650cc2415a8054491ae2dee9f01382c2015602c0641f3f977faf2fa7361aa33d2637dcfb03907a + unique-filename: ^2.0.0 + checksum: d91409e6e57d7d9a3a25e5dcc589c84e75b178ae8ea7de05cbf6b783f77a5fae938f6e8fda6f5257ed70000be27a681e1e44829251bfffe4c10216002f8f14e6 + languageName: node + linkType: hard + +"cacache@npm:^20.0.1": + version: 20.0.3 + resolution: "cacache@npm:20.0.3" + dependencies: + "@npmcli/fs": ^5.0.0 + fs-minipass: ^3.0.0 + glob: ^13.0.0 + lru-cache: ^11.1.0 + minipass: ^7.0.3 + minipass-collect: ^2.0.1 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + p-map: ^7.0.2 + ssri: ^13.0.0 + unique-filename: ^5.0.0 + checksum: 595e6b91d72972d596e1e9ccab8ddbf08b773f27240220b1b5b1b7b3f52173cfbcf095212e5d7acd86c3bd453c28e69b116469889c511615ef3589523d542639 languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": version: 1.0.2 - resolution: "call-bind@npm:1.0.2" + resolution: "call-bind-apply-helpers@npm:1.0.2" + dependencies: + es-errors: ^1.3.0 + function-bind: ^1.1.2 + checksum: b2863d74fcf2a6948221f65d95b91b4b2d90cfe8927650b506141e669f7d5de65cea191bf788838bc40d13846b7886c5bc5c84ab96c3adbcf88ad69a72fcdc6b + languageName: node + linkType: hard + +"call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": + version: 1.0.8 + resolution: "call-bind@npm:1.0.8" + dependencies: + call-bind-apply-helpers: ^1.0.0 + es-define-property: ^1.0.0 + get-intrinsic: ^1.2.4 + set-function-length: ^1.2.2 + checksum: aa2899bce917a5392fd73bd32e71799c37c0b7ab454e0ed13af7f6727549091182aade8bbb7b55f304a5bc436d543241c14090fb8a3137e9875e23f444f4f5a9 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" dependencies: - function-bind: ^1.1.1 - get-intrinsic: ^1.0.2 - checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 + call-bind-apply-helpers: ^1.0.2 + get-intrinsic: ^1.3.0 + checksum: 2f6399488d1c272f56306ca60ff696575e2b7f31daf23bc11574798c84d9f2759dceb0cb1f471a85b77f28962a7ac6411f51d283ea2e45319009a19b6ccab3b2 languageName: node linkType: hard @@ -4511,24 +4537,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001335, caniuse-lite@npm:^1.0.30001359, caniuse-lite@npm:^1.0.30001541": - version: 1.0.30001646 - resolution: "caniuse-lite@npm:1.0.30001646" - checksum: 53d45b990d21036aaab7547e164174a0ac9a117acdd14a6c33822c4983e2671b1df48686d5383002d0ef158b208b0047a7dc404312a6229bf8ee629de3351b44 - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001406": - version: 1.0.30001692 - resolution: "caniuse-lite@npm:1.0.30001692" - checksum: 484113e3fabbe223fff0380c25c861da265a34c3f75bb5af1f254423b43e713a3c7f0c313167df52fb203f42ea68bd0df8a9e73642becfe1e9fa5734b5fc55a5 - languageName: node - linkType: hard - -"caseless@npm:~0.12.0": - version: 0.12.0 - resolution: "caseless@npm:0.12.0" - checksum: b43bd4c440aa1e8ee6baefee8063b4850fd0d7b378f6aabc796c9ec8cb26d27fb30b46885350777d9bd079c5256c0e1329ad0dc7c2817e0bb466810ebb353751 +"caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001759, caniuse-lite@npm:^1.0.30001766": + version: 1.0.30001770 + resolution: "caniuse-lite@npm:1.0.30001770" + checksum: 5937fdfbb274211bffb883afb2bc9ab99bea75ea9923dc96baa4eda87c110c36b036ae3d981dc28b0c52807d7ecc7c1bf6b16b4a68dbd077b26faf37ccd1887b languageName: node linkType: hard @@ -4539,7 +4551,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.0.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": +"chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -4588,17 +4600,10 @@ __metadata: languageName: node linkType: hard -"characterset@npm:^1.3.0": - version: 1.3.0 - resolution: "characterset@npm:1.3.0" - checksum: 9730703cbf9b9a5fe87f65e96483de02d9d264426f44507315998e3f52ca77be7e0be69b31ec96be9f21a0086589b9e712cd4de7a4ed6a41dae5ac8a2ac51428 - languageName: node - linkType: hard - -"chardet@npm:^0.7.0": - version: 0.7.0 - resolution: "chardet@npm:0.7.0" - checksum: 6fd5da1f5d18ff5712c1e0aed41da200d7c51c28f11b36ee3c7b483f3696dabc08927fc6b227735eb8f0e1215c9a8abd8154637f3eff8cada5959df7f58b024d +"chardet@npm:^2.1.1": + version: 2.1.1 + resolution: "chardet@npm:2.1.1" + checksum: 4e3dba2699018b79bb90a9562b5e5be27fcaab55250c12fa72f026b859fb24846396c346968546c14efc69b9f23aca3ef2b9816775012d08a4686ce3c362415c languageName: node linkType: hard @@ -4616,26 +4621,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^3.5.3": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" - dependencies: - anymatch: ~3.1.2 - braces: ~3.0.2 - fsevents: ~2.3.2 - glob-parent: ~5.1.2 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.6.0 - dependenciesMeta: - fsevents: - optional: true - checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c - languageName: node - linkType: hard - -"chokidar@npm:^3.6.0": +"chokidar@npm:^3.5.3, chokidar@npm:^3.6.0": version: 3.6.0 resolution: "chokidar@npm:3.6.0" dependencies: @@ -4654,13 +4640,6 @@ __metadata: languageName: node linkType: hard -"chownr@npm:^1.1.1": - version: 1.1.4 - resolution: "chownr@npm:1.1.4" - checksum: 115648f8eb38bac5e41c3857f3e663f9c39ed6480d1349977c4d96c95a47266fcacc5a5aabf3cb6c481e22d72f41992827db47301851766c4fd77ac21a4f081d - languageName: node - linkType: hard - "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -4668,6 +4647,13 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: fd73a4bab48b79e66903fe1cafbdc208956f41ea4f856df883d0c7277b7ab29fd33ee65f93b2ec9192fc0169238f2f8307b7735d27c155821d886b84aa97aa8d + languageName: node + linkType: hard + "ci-info@npm:^3.2.0": version: 3.9.0 resolution: "ci-info@npm:3.9.0" @@ -4676,16 +4662,16 @@ __metadata: linkType: hard "cjs-module-lexer@npm:^1.0.0": - version: 1.2.3 - resolution: "cjs-module-lexer@npm:1.2.3" - checksum: 5ea3cb867a9bb609b6d476cd86590d105f3cfd6514db38ff71f63992ab40939c2feb68967faa15a6d2b1f90daa6416b79ea2de486e9e2485a6f8b66a21b4fb0a + version: 1.4.3 + resolution: "cjs-module-lexer@npm:1.4.3" + checksum: 221a1661a9ff4944b472c85ac7cd5029b2f2dc7f6c5f4ecf887f261503611110b43a48acb6c07f8f04109c772d1637fdb20b31252bf27058f35aa97bf5ad8b12 languageName: node linkType: hard "classnames@npm:^2.3.1": - version: 2.3.1 - resolution: "classnames@npm:2.3.1" - checksum: 14db8889d56c267a591f08b0834989fe542d47fac659af5a539e110cc4266694e8de86e4e3bbd271157dbd831361310a8293e0167141e80b0f03a0f175c80960 + version: 2.5.1 + resolution: "classnames@npm:2.5.1" + checksum: da424a8a6f3a96a2e87d01a432ba19315503294ac7e025f9fece656db6b6a0f7b5003bb1fbb51cbb0d9624d964f1b9bb35a51c73af9b2434c7b292c42231c1e5 languageName: node linkType: hard @@ -4715,9 +4701,9 @@ __metadata: linkType: hard "cli-spinners@npm:^2.5.0": - version: 2.6.1 - resolution: "cli-spinners@npm:2.6.1" - checksum: 423409baaa7a58e5104b46ca1745fbfc5888bbd0b0c5a626e052ae1387060839c8efd512fb127e25769b3dc9562db1dc1b5add6e0b93b7ef64f477feb6416a45 + version: 2.9.2 + resolution: "cli-spinners@npm:2.9.2" + checksum: 1bd588289b28432e4676cb5d40505cfe3e53f2e4e10fbe05c8a710a154d6fe0ce7836844b00d6858f740f2ffe67cdc36e0fce9c7b6a8430e80e6388d5aa4956c languageName: node linkType: hard @@ -4728,14 +4714,21 @@ __metadata: languageName: node linkType: hard -"cliui@npm:^7.0.2": - version: 7.0.4 - resolution: "cliui@npm:7.0.4" +"client-only@npm:0.0.1, client-only@npm:^0.0.1": + version: 0.0.1 + resolution: "client-only@npm:0.0.1" + checksum: 0c16bf660dadb90610553c1d8946a7fdfb81d624adea073b8440b7d795d5b5b08beb3c950c6a2cf16279365a3265158a236876d92bce16423c485c322d7dfaf8 + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" dependencies: string-width: ^4.2.0 - strip-ansi: ^6.0.0 + strip-ansi: ^6.0.1 wrap-ansi: ^7.0.0 - checksum: ce2e8f578a4813806788ac399b9e866297740eecd4ad1823c27fd344d78b22c5f8597d548adbcc46f0573e43e21e751f39446c5a5e804a12aace402b7a315d7f + checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 languageName: node linkType: hard @@ -4757,10 +4750,17 @@ __metadata: languageName: node linkType: hard -"clsx@npm:^1.1.0, clsx@npm:^1.1.1": - version: 1.2.0 - resolution: "clsx@npm:1.2.0" - checksum: 551a0b4f182270cf9ab26b5f4f93d3b01a663b66adeaff58e4c51bc5170a2bfaed03779513925c63d2d31d748c5bc4f1cbad7d3e76a051f5a9301754563ff43a +"clsx@npm:^1.1.1": + version: 1.2.1 + resolution: "clsx@npm:1.2.1" + checksum: 30befca8019b2eb7dbad38cff6266cf543091dae2825c856a62a8ccf2c3ab9c2907c4d12b288b73101196767f66812365400a227581484a05f968b0307cfaf12 + languageName: node + linkType: hard + +"clsx@npm:^2.0.0": + version: 2.1.1 + resolution: "clsx@npm:2.1.1" + checksum: acd3e1ab9d8a433ecb3cc2f6a05ab95fe50b4a3cfc5ba47abb6cbf3754585fcb87b84e90c822a1f256c4198e3b41c7f6c391577ffc8678ad587fc0976b24fd57 languageName: node linkType: hard @@ -4782,6 +4782,13 @@ __metadata: languageName: node linkType: hard +"code-block-writer@npm:^13.0.3": + version: 13.0.3 + resolution: "code-block-writer@npm:13.0.3" + checksum: 8e234f0ec2db9625d5efb9f05bdae79da6559bb4d9df94a6aa79a89a7b5ae25093b70d309fc5122840c9c07995cb14b4dd3f98a30f8878e3a3372e177df79454 + languageName: node + linkType: hard + "collapse-white-space@npm:^1.0.2": version: 1.0.6 resolution: "collapse-white-space@npm:1.0.6" @@ -4790,9 +4797,9 @@ __metadata: linkType: hard "collect-v8-coverage@npm:^1.0.0": - version: 1.0.2 - resolution: "collect-v8-coverage@npm:1.0.2" - checksum: c10f41c39ab84629d16f9f6137bc8a63d332244383fc368caf2d2052b5e04c20cd1fd70f66fcf4e2422b84c8226598b776d39d5f2d2a51867cc1ed5d1982b4da + version: 1.0.3 + resolution: "collect-v8-coverage@npm:1.0.3" + checksum: ed1d1ebc9c05e7263fffa3ad6440031db6a1fdd9f574435aa689effcdfe9f2b93aba8ec600f9c7b99124cd6ff5d9415c17961d84ae829a72251a4fe668a49b63 languageName: node linkType: hard @@ -4837,7 +4844,7 @@ __metadata: languageName: node linkType: hard -"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8, combined-stream@npm:~1.0.6": +"combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" dependencies: @@ -4882,11 +4889,11 @@ __metadata: linkType: hard "concurrently@npm:^7.2.2": - version: 7.2.2 - resolution: "concurrently@npm:7.2.2" + version: 7.6.0 + resolution: "concurrently@npm:7.6.0" dependencies: chalk: ^4.1.0 - date-fns: ^2.16.1 + date-fns: ^2.29.1 lodash: ^4.17.21 rxjs: ^7.0.0 shell-quote: ^1.7.3 @@ -4895,8 +4902,9 @@ __metadata: tree-kill: ^1.2.2 yargs: ^17.3.1 bin: + conc: dist/bin/concurrently.js concurrently: dist/bin/concurrently.js - checksum: ae9604032d971a49a11c6797ed057380e53bde0ec79d1dcbd23bdbe578961867289089e9729e802520297d8f410e3085333719a3f7a4ce1c2ed167b68c740247 + checksum: f705c9a7960f1b16559ca64958043faeeef6385c0bf30a03d1375e15ab2d96dba4f8166f1bbbb1c85e8da35ca0ce3c353875d71dff2aa132b2357bb533b3332e languageName: node linkType: hard @@ -4907,18 +4915,6 @@ __metadata: languageName: node linkType: hard -"connect@npm:^3.7.0": - version: 3.7.0 - resolution: "connect@npm:3.7.0" - dependencies: - debug: 2.6.9 - finalhandler: 1.1.2 - parseurl: ~1.3.3 - utils-merge: 1.0.1 - checksum: 96e1c4effcf219b065c7823e57351c94366d2e2a6952fa95e8212bffb35c86f1d5a3f9f6c5796d4cd3a5fdda628368b1c3cc44bf19c66cfd68fe9f9cab9177e2 - languageName: node - linkType: hard - "console-control-strings@npm:^1.1.0": version: 1.1.0 resolution: "console-control-strings@npm:1.1.0" @@ -4926,7 +4922,7 @@ __metadata: languageName: node linkType: hard -"content-disposition@npm:0.5.4": +"content-disposition@npm:~0.5.4": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" dependencies: @@ -4943,11 +4939,9 @@ __metadata: linkType: hard "convert-source-map@npm:^1.7.0": - version: 1.8.0 - resolution: "convert-source-map@npm:1.8.0" - dependencies: - safe-buffer: ~5.1.1 - checksum: 985d974a2d33e1a2543ada51c93e1ba2f73eaed608dc39f229afc78f71dcc4c8b7d7c684aa647e3c6a3a204027444d69e53e169ce94e8d1fa8d7dee80c9c8fed + version: 1.9.0 + resolution: "convert-source-map@npm:1.9.0" + checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 languageName: node linkType: hard @@ -4958,54 +4952,39 @@ __metadata: languageName: node linkType: hard -"cookie-signature@npm:1.0.6": - version: 1.0.6 - resolution: "cookie-signature@npm:1.0.6" - checksum: f4e1b0a98a27a0e6e66fd7ea4e4e9d8e038f624058371bf4499cfcd8f3980be9a121486995202ba3fca74fbed93a407d6d54d43a43f96fd28d0bd7a06761591a +"cookie-signature@npm:~1.0.6": + version: 1.0.7 + resolution: "cookie-signature@npm:1.0.7" + checksum: 1a62808cd30d15fb43b70e19829b64d04b0802d8ef00275b57d152de4ae6a3208ca05c197b6668d104c4d9de389e53ccc2d3bc6bcaaffd9602461417d8c40710 languageName: node linkType: hard -"cookie@npm:0.6.0": - version: 0.6.0 - resolution: "cookie@npm:0.6.0" - checksum: f56a7d32a07db5458e79c726b77e3c2eff655c36792f2b6c58d351fb5f61531e5b1ab7f46987150136e366c65213cbe31729e02a3eaed630c3bf7334635fb410 +"cookie@npm:~0.7.1": + version: 0.7.2 + resolution: "cookie@npm:0.7.2" + checksum: 9bf8555e33530affd571ea37b615ccad9b9a34febbf2c950c86787088eb00a8973690833b0f8ebd6b69b753c62669ea60cec89178c1fb007bf0749abed74f93e languageName: node linkType: hard -"core-js-compat@npm:^3.21.0, core-js-compat@npm:^3.22.1": - version: 3.23.3 - resolution: "core-js-compat@npm:3.23.3" +"core-js-compat@npm:^3.48.0": + version: 3.48.0 + resolution: "core-js-compat@npm:3.48.0" dependencies: - browserslist: ^4.21.0 - semver: 7.0.0 - checksum: a5fd680a31b8e667ce0f852238a2fd6769d495ecf0e8a6e04a240e5e259e9a33a77b2839131b640f03c206fff12c51dca7e362ac1897f629bf4c5e39075c83a7 - languageName: node - linkType: hard - -"core-js-pure@npm:^3.20.2": - version: 3.23.3 - resolution: "core-js-pure@npm:3.23.3" - checksum: 09a477a56963ca4409ca383d36429ea3b51b658ff85e94331a510543c77c4d1b44cb6b305b0f185d729eb059c71f1289c62fdec6371ff46ce838a16988cdcb2e - languageName: node - linkType: hard - -"core-util-is@npm:1.0.2": - version: 1.0.2 - resolution: "core-util-is@npm:1.0.2" - checksum: 7a4c925b497a2c91421e25bf76d6d8190f0b2359a9200dbeed136e63b2931d6294d3b1893eda378883ed363cd950f44a12a401384c609839ea616befb7927dab + browserslist: ^4.28.1 + checksum: 2625622bc7c4a43a134f7d01eff48bde93100a4b5c11b6a3972bc22bcd403c6d060f26f4786ca21376fb159771f008738a5b6f283ad67b19f94e342fa8d28288 languageName: node linkType: hard "cosmiconfig@npm:^7.0.0": - version: 7.0.1 - resolution: "cosmiconfig@npm:7.0.1" + version: 7.1.0 + resolution: "cosmiconfig@npm:7.1.0" dependencies: "@types/parse-json": ^4.0.0 import-fresh: ^3.2.1 parse-json: ^5.0.0 path-type: ^4.0.0 yaml: ^1.10.0 - checksum: 4be63e7117955fd88333d7460e4c466a90f556df6ef34efd59034d2463484e339666c41f02b523d574a797ec61f4a91918c5b89a316db2ea2f834e0d2d09465b + checksum: c53bf7befc1591b2651a22414a5e786cd5f2eeaa87f3678a3d49d6069835a9d8d1aef223728e98aa8fec9a95bf831120d245096db12abe019fecb51f5696c96f languageName: node linkType: hard @@ -5033,14 +5012,14 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" +"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" dependencies: path-key: ^3.1.0 shebang-command: ^2.0.0 which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + checksum: 8d306efacaf6f3f60e0224c287664093fa9185680b2d195852ba9a863f85d02dcc737094c6e512175f8ee0161f9b87c73c6826034c2422e39de7d6569cf4503b languageName: node linkType: hard @@ -5115,13 +5094,6 @@ __metadata: languageName: node linkType: hard -"cssom@npm:^0.4.1": - version: 0.4.4 - resolution: "cssom@npm:0.4.4" - checksum: e3bc1076e7ee4213d4fef05e7ae03bfa83dc05f32611d8edc341f4ecc3d9647b89c8245474c7dd2cdcdb797a27c462e99da7ad00a34399694559f763478ff53f - languageName: node - linkType: hard - "cssom@npm:^0.5.0": version: 0.5.0 resolution: "cssom@npm:0.5.0" @@ -5136,7 +5108,7 @@ __metadata: languageName: node linkType: hard -"cssstyle@npm:^2.0.0, cssstyle@npm:^2.3.0": +"cssstyle@npm:^2.3.0": version: 2.3.0 resolution: "cssstyle@npm:2.3.0" dependencies: @@ -5145,10 +5117,10 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.2": - version: 3.1.1 - resolution: "csstype@npm:3.1.1" - checksum: 1f7b4f5fdd955b7444b18ebdddf3f5c699159f13e9cf8ac9027ae4a60ae226aef9bbb14a6e12ca7dba3358b007cee6354b116e720262867c398de6c955ea451d +"csstype@npm:^3.2.2": + version: 3.2.3 + resolution: "csstype@npm:3.2.3" + checksum: cb882521b3398958a1ce6ca98c011aec0bde1c77ecaf8a1dd4db3b112a189939beae3b1308243b2fe50fc27eb3edeb0f73a5a4d91d928765dc6d5ecc7bda92ee languageName: node linkType: hard @@ -5159,41 +5131,56 @@ __metadata: languageName: node linkType: hard -"dashdash@npm:^1.12.0": - version: 1.14.1 - resolution: "dashdash@npm:1.14.1" +"data-urls@npm:^3.0.2": + version: 3.0.2 + resolution: "data-urls@npm:3.0.2" dependencies: - assert-plus: ^1.0.0 - checksum: 3634c249570f7f34e3d34f866c93f866c5b417f0dd616275decae08147dcdf8fccfaa5947380ccfb0473998ea3a8057c0b4cd90c875740ee685d0624b2983598 + abab: ^2.0.6 + whatwg-mimetype: ^3.0.0 + whatwg-url: ^11.0.0 + checksum: 033fc3dd0fba6d24bc9a024ddcf9923691dd24f90a3d26f6545d6a2f71ec6956f93462f2cdf2183cc46f10dc01ed3bcb36731a8208456eb1a08147e571fe2a76 languageName: node linkType: hard -"data-urls@npm:^1.1.0": - version: 1.1.0 - resolution: "data-urls@npm:1.1.0" +"data-view-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-buffer@npm:1.0.2" dependencies: - abab: ^2.0.0 - whatwg-mimetype: ^2.2.0 - whatwg-url: ^7.0.0 - checksum: dc4bd9621df0dff336d7c4c0517c792488ef3cf11cd37e72ab80f3a7f0a0aa14bad677ac97cf22c87c6eb9518e58b98590e1c8c756b56240940f0e470c81612e + call-bound: ^1.0.3 + es-errors: ^1.3.0 + is-data-view: ^1.0.2 + checksum: 1e1cd509c3037ac0f8ba320da3d1f8bf1a9f09b0be09394b5e40781b8cc15ff9834967ba7c9f843a425b34f9fe14ce44cf055af6662c44263424c1eb8d65659b languageName: node linkType: hard -"data-urls@npm:^3.0.2": - version: 3.0.2 - resolution: "data-urls@npm:3.0.2" +"data-view-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-byte-length@npm:1.0.2" dependencies: - abab: ^2.0.6 - whatwg-mimetype: ^3.0.0 - whatwg-url: ^11.0.0 - checksum: 033fc3dd0fba6d24bc9a024ddcf9923691dd24f90a3d26f6545d6a2f71ec6956f93462f2cdf2183cc46f10dc01ed3bcb36731a8208456eb1a08147e571fe2a76 + call-bound: ^1.0.3 + es-errors: ^1.3.0 + is-data-view: ^1.0.2 + checksum: 3600c91ced1cfa935f19ef2abae11029e01738de8d229354d3b2a172bf0d7e4ed08ff8f53294b715569fdf72dfeaa96aa7652f479c0f60570878d88e7e8bddf6 + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-offset@npm:1.0.1" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: 8dd492cd51d19970876626b5b5169fbb67ca31ec1d1d3238ee6a71820ca8b80cafb141c485999db1ee1ef02f2cc3b99424c5eda8d59e852d9ebb79ab290eb5ee languageName: node linkType: hard -"date-fns@npm:^2.16.1": - version: 2.28.0 - resolution: "date-fns@npm:2.28.0" - checksum: a0516b2e4f99b8bffc6cc5193349f185f195398385bdcaf07f17c2c4a24473c99d933eb0018be4142a86a6d46cb0b06be6440ad874f15e795acbedd6fd727a1f +"date-fns@npm:^2.29.1": + version: 2.30.0 + resolution: "date-fns@npm:2.30.0" + dependencies: + "@babel/runtime": ^7.21.0 + checksum: f7be01523282e9bb06c0cd2693d34f245247a29098527d4420628966a2d9aad154bd0e90a6b1cf66d37adcb769cd108cf8a7bd49d76db0fb119af5cdd13644f4 languageName: node linkType: hard @@ -5204,7 +5191,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.6.9": +"debug@npm:2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -5213,15 +5200,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.3": - version: 4.3.4 - resolution: "debug@npm:4.3.4" +"debug@npm:4, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.4.3": + version: 4.4.3 + resolution: "debug@npm:4.4.3" dependencies: - ms: 2.1.2 + ms: ^2.1.3 peerDependenciesMeta: supports-color: optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + checksum: 4805abd570e601acdca85b6aa3757186084a45cff9b2fa6eee1f3b173caa776b45f478b2a71a572d616d2010cea9211d0ac4a02a610e4c18ac4324bde3760834 languageName: node linkType: hard @@ -5234,26 +5221,26 @@ __metadata: languageName: node linkType: hard -"decimal.js@npm:^10.3.1": - version: 10.3.1 - resolution: "decimal.js@npm:10.3.1" - checksum: 0351ac9f05fe050f23227aa6a4573bee2d58fa7378fcf28d969a8c789525032effb488a90320fd3fe86a66e17b4bc507d811b15eada5b7f0e7ec5d2af4c24a59 +"decimal.js@npm:^10.4.2": + version: 10.6.0 + resolution: "decimal.js@npm:10.6.0" + checksum: 9302b990cd6f4da1c7602200002e40e15d15660374432963421d3cd6d81cc6e27e0a488356b030fee64650947e32e78bdbea245d596dadfeeeb02e146d485999 languageName: node linkType: hard "dedent@npm:^1.0.0": - version: 1.5.1 - resolution: "dedent@npm:1.5.1" + version: 1.7.1 + resolution: "dedent@npm:1.7.1" peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: babel-plugin-macros: optional: true - checksum: c3c300a14edf1bdf5a873f9e4b22e839d62490bc5c8d6169c1f15858a1a76733d06a9a56930e963d677a2ceeca4b6b0894cc5ea2f501aa382ca5b92af3413c2a + checksum: 66dc34f61dabc85597a95ce8678c93f0793ec437cc6510e0e6c14da159ce15c6209dee483aa3cccb3238a2f708382c4d26eeb1a47a4c1831a0b7bb56873041cf languageName: node linkType: hard -"deep-is@npm:^0.1.3, deep-is@npm:~0.1.3": +"deep-is@npm:^0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 @@ -5261,28 +5248,40 @@ __metadata: linkType: hard "deepmerge@npm:^4.2.2": - version: 4.2.2 - resolution: "deepmerge@npm:4.2.2" - checksum: a8c43a1ed8d6d1ed2b5bf569fa4c8eb9f0924034baf75d5d406e47e157a451075c4db353efea7b6bcc56ec48116a8ce72fccf867b6e078e7c561904b5897530b + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052 languageName: node linkType: hard "defaults@npm:^1.0.3": - version: 1.0.3 - resolution: "defaults@npm:1.0.3" + version: 1.0.4 + resolution: "defaults@npm:1.0.4" dependencies: clone: ^1.0.2 - checksum: 96e2112da6553d376afd5265ea7cbdb2a3b45535965d71ab8bb1da10c8126d168fdd5268799625324b368356d21ba2a7b3d4ec50961f11a47b7feb9de3d4413e + checksum: 3a88b7a587fc076b84e60affad8b85245c01f60f38fc1d259e7ac1d89eb9ce6abb19e27215de46b98568dd5bc48471730b327637e6f20b0f1bc85cf00440c80a languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4": +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": version: 1.1.4 - resolution: "define-properties@npm:1.1.4" + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + gopd: ^1.0.1 + checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b + languageName: node + linkType: hard + +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" dependencies: + define-data-property: ^1.0.1 has-property-descriptors: ^1.0.0 object-keys: ^1.1.1 - checksum: ce0aef3f9eb193562b5cfb79b2d2c86b6a109dfc9fdcb5f45d680631a1a908c06824ddcdb72b7573b54e26ace07f0a23420aaba0d5c627b34d2c1de8ef527e2b + checksum: b4ccd00597dd46cb2d4a379398f5b19fca84a16f3374e2249201992f36b30f6835949a9429669ee6b41b6e837205a163eadd745e472069e70dfc10f03e5fcc12 languageName: node linkType: hard @@ -5300,21 +5299,14 @@ __metadata: languageName: node linkType: hard -"depd@npm:2.0.0": +"depd@npm:2.0.0, depd@npm:~2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a languageName: node linkType: hard -"depd@npm:^1.1.2": - version: 1.1.2 - resolution: "depd@npm:1.1.2" - checksum: 6b406620d269619852885ce15965272b829df6f409724415e0002c8632ab6a8c0a08ec1f0bd2add05dc7bd7507606f7e2cc034fa24224ab829580040b835ecd9 - languageName: node - linkType: hard - -"destroy@npm:1.2.0": +"destroy@npm:1.2.0, destroy@npm:~1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" checksum: 0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38 @@ -5337,6 +5329,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.1.2": + version: 2.1.2 + resolution: "detect-libc@npm:2.1.2" + checksum: 471740d52365084c4b2ae359e507b863f2b1d79b08a92835ebdf701918e08fc9cfba175b3db28483ca33b155e1311a91d69dc42c6d192b476f41a9e1f094ce6a + languageName: node + linkType: hard + "detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -5344,13 +5343,6 @@ __metadata: languageName: node linkType: hard -"devtools-protocol@npm:0.0.854822": - version: 0.0.854822 - resolution: "devtools-protocol@npm:0.0.854822" - checksum: 6a49e631967da8f29e4e37c5002d2faf913884dd48b989b3e8ea34ab2ee51f441c5a644dc21a8dade5b388879cf073b7379c79a4b700109f51c58ea7c6abc01a - languageName: node - linkType: hard - "didyoumean@npm:^1.2.2": version: 1.2.2 resolution: "didyoumean@npm:1.2.2" @@ -5366,9 +5358,9 @@ __metadata: linkType: hard "diff@npm:^4.0.1": - version: 4.0.2 - resolution: "diff@npm:4.0.2" - checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d + version: 4.0.4 + resolution: "diff@npm:4.0.4" + checksum: e3f1c368778b16f9e7e4fd4199d04913bba9b017c37fbca7642b3613ebefcf3b18a4bd55e5f7074dc023fc95c96bd265f72114044e62cebae7f9a0f53bc36ace languageName: node linkType: hard @@ -5430,15 +5422,6 @@ __metadata: languageName: node linkType: hard -"domexception@npm:^1.0.1": - version: 1.0.1 - resolution: "domexception@npm:1.0.1" - dependencies: - webidl-conversions: ^4.0.2 - checksum: f564a9c0915dcb83ceefea49df14aaed106b1468fbe505119e8bcb0b77e242534f3aba861978537c0fc9dc6f35b176d0ffc77b3e342820fb27a8f215e7ae4d52 - languageName: node - linkType: hard - "domexception@npm:^4.0.0": version: 4.0.0 resolution: "domexception@npm:4.0.0" @@ -5458,6 +5441,17 @@ __metadata: languageName: node linkType: hard +"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: ^1.0.1 + es-errors: ^1.3.0 + gopd: ^1.2.0 + checksum: 149207e36f07bd4941921b0ca929e3a28f1da7bd6b6ff8ff7f4e2f2e460675af4576eeba359c635723dc189b64cdd4787e0255897d5b135ccc5d15cb8685fc90 + languageName: node + linkType: hard + "duplexer@npm:0.1.1": version: 0.1.1 resolution: "duplexer@npm:0.1.1" @@ -5472,23 +5466,6 @@ __metadata: languageName: node linkType: hard -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed - languageName: node - linkType: hard - -"ecc-jsbn@npm:~0.1.1": - version: 0.1.2 - resolution: "ecc-jsbn@npm:0.1.2" - dependencies: - jsbn: ~0.1.0 - safer-buffer: ^2.1.0 - checksum: 22fef4b6203e5f31d425f5b711eb389e4c6c2723402e389af394f8411b76a488fa414d309d866e2b577ce3e8462d344205545c88a8143cc21752a5172818888a - languageName: node - linkType: hard - "ee-first@npm:1.1.1": version: 1.1.1 resolution: "ee-first@npm:1.1.1" @@ -5503,17 +5480,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.172": - version: 1.4.179 - resolution: "electron-to-chromium@npm:1.4.179" - checksum: e31691dd0f40909f9304b2085bba29e30c81d47b5eb049b6223b3ec34c968f6bac427d8cac2889500780a946e453eb1a1e6324d3fc1b1c83778cf95f5c58bcd7 - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.4.535": - version: 1.4.597 - resolution: "electron-to-chromium@npm:1.4.597" - checksum: 3dc5d6a6f1dcdda3251a2d112f418a5e4924fcc2320cff68f82a73be6fcd68895637b04c0086e2ea8d2c83dd126d62112777a0dda9f1cd45d5596ec3a6b2a6f5 +"electron-to-chromium@npm:^1.5.263": + version: 1.5.286 + resolution: "electron-to-chromium@npm:1.5.286" + checksum: e18483f490aaf4cffb6e93e770bd5b6cf45997252ae10a0332ed3a853ac5764eab8681e6f18ca6741500e5ea487a473154d8630ad1543a9bd4dd66cf0f32a8e2 languageName: node linkType: hard @@ -5545,10 +5515,10 @@ __metadata: languageName: node linkType: hard -"encodeurl@npm:~1.0.2": - version: 1.0.2 - resolution: "encodeurl@npm:1.0.2" - checksum: e50e3d508cdd9c4565ba72d2012e65038e5d71bdc9198cb125beb6237b5b1ade6c0d343998da9e170fb2eae52c1bed37d4d6d98a46ea423a0cddbed5ac3f780c +"encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: abf5cd51b78082cf8af7be6785813c33b6df2068ce5191a40ca8b1afe6a86f9230af9a9ce694a5ce4665955e5c1120871826df9c128a642e09c58d592e2807fe languageName: node linkType: hard @@ -5561,21 +5531,13 @@ __metadata: languageName: node linkType: hard -"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" - dependencies: - once: ^1.4.0 - checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b - languageName: node - linkType: hard - "enquirer@npm:^2.3.5": - version: 2.3.6 - resolution: "enquirer@npm:2.3.6" + version: 2.4.1 + resolution: "enquirer@npm:2.4.1" dependencies: ansi-colors: ^4.1.1 - checksum: 1c0911e14a6f8d26721c91e01db06092a5f7675159f0261d69c403396a385afd13dd76825e7678f66daffa930cfaa8d45f506fb35f818a2788463d022af1b884 + strip-ansi: ^6.0.1 + checksum: f080f11a74209647dbf347a7c6a83c8a47ae1ebf1e75073a808bc1088eb780aa54075bfecd1bcdb3e3c724520edb8e6ee05da031529436b421b71066fcc48cb5 languageName: node linkType: hard @@ -5586,10 +5548,10 @@ __metadata: languageName: node linkType: hard -"entities@npm:^4.3.0": - version: 4.3.1 - resolution: "entities@npm:4.3.1" - checksum: e8f6d2bac238494b2355e90551893882d2675142be7e7bdfcb15248ed0652a630678ba0e3a8dc750693e736cb6011f504c27dabeb4cd3330560092e88b105090 +"entities@npm:^6.0.0": + version: 6.0.1 + resolution: "entities@npm:6.0.1" + checksum: 937b952e81aca641660a6a07f70001c6821973dea3ae7f6a5013eadce94620f3ed2e9c745832d503c8811ce6e97704d8a0396159580c0e567d815234de7fdecf languageName: node linkType: hard @@ -5608,42 +5570,73 @@ __metadata: linkType: hard "error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" + version: 1.3.4 + resolution: "error-ex@npm:1.3.4" dependencies: is-arrayish: ^0.2.1 - checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 - languageName: node - linkType: hard - -"es-abstract@npm:^1.17.2, es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1, es-abstract@npm:^1.19.2, es-abstract@npm:^1.19.5, es-abstract@npm:^1.20.1": - version: 1.20.1 - resolution: "es-abstract@npm:1.20.1" - dependencies: - call-bind: ^1.0.2 - es-to-primitive: ^1.2.1 - function-bind: ^1.1.1 - function.prototype.name: ^1.1.5 - get-intrinsic: ^1.1.1 - get-symbol-description: ^1.0.0 - has: ^1.0.3 - has-property-descriptors: ^1.0.0 - has-symbols: ^1.0.3 - internal-slot: ^1.0.3 - is-callable: ^1.2.4 - is-negative-zero: ^2.0.2 - is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.2 - is-string: ^1.0.7 - is-weakref: ^1.0.2 - object-inspect: ^1.12.0 + checksum: 25136c0984569c8d68417036a9a1624804314296f24675199a391e5d20b2e26fe6d9304d40901293fa86900603a229983c9a8921ea7f1d16f814c2db946ff4ef + languageName: node + linkType: hard + +"es-abstract@npm:^1.17.2, es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9, es-abstract@npm:^1.24.0, es-abstract@npm:^1.24.1": + version: 1.24.1 + resolution: "es-abstract@npm:1.24.1" + dependencies: + array-buffer-byte-length: ^1.0.2 + arraybuffer.prototype.slice: ^1.0.4 + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.4 + data-view-buffer: ^1.0.2 + data-view-byte-length: ^1.0.2 + data-view-byte-offset: ^1.0.1 + es-define-property: ^1.0.1 + es-errors: ^1.3.0 + es-object-atoms: ^1.1.1 + es-set-tostringtag: ^2.1.0 + es-to-primitive: ^1.3.0 + function.prototype.name: ^1.1.8 + get-intrinsic: ^1.3.0 + get-proto: ^1.0.1 + get-symbol-description: ^1.1.0 + globalthis: ^1.0.4 + gopd: ^1.2.0 + has-property-descriptors: ^1.0.2 + has-proto: ^1.2.0 + has-symbols: ^1.1.0 + hasown: ^2.0.2 + internal-slot: ^1.1.0 + is-array-buffer: ^3.0.5 + is-callable: ^1.2.7 + is-data-view: ^1.0.2 + is-negative-zero: ^2.0.3 + is-regex: ^1.2.1 + is-set: ^2.0.3 + is-shared-array-buffer: ^1.0.4 + is-string: ^1.1.1 + is-typed-array: ^1.1.15 + is-weakref: ^1.1.1 + math-intrinsics: ^1.1.0 + object-inspect: ^1.13.4 object-keys: ^1.1.1 - object.assign: ^4.1.2 - regexp.prototype.flags: ^1.4.3 - string.prototype.trimend: ^1.0.5 - string.prototype.trimstart: ^1.0.5 - unbox-primitive: ^1.0.2 - checksum: 28da27ae0ed9c76df7ee8ef5c278df79dcfdb554415faf7068bb7c58f8ba8e2a16bfb59e586844be6429ab4c302ca7748979d48442224cb1140b051866d74b7f + object.assign: ^4.1.7 + own-keys: ^1.0.1 + regexp.prototype.flags: ^1.5.4 + safe-array-concat: ^1.1.3 + safe-push-apply: ^1.0.0 + safe-regex-test: ^1.1.0 + set-proto: ^1.0.0 + stop-iteration-iterator: ^1.1.0 + string.prototype.trim: ^1.2.10 + string.prototype.trimend: ^1.0.9 + string.prototype.trimstart: ^1.0.8 + typed-array-buffer: ^1.0.3 + typed-array-byte-length: ^1.0.3 + typed-array-byte-offset: ^1.0.4 + typed-array-length: ^1.0.7 + unbox-primitive: ^1.1.0 + which-typed-array: ^1.1.19 + checksum: 84896f97ac812bd9d884f1e5372ae71dbdbef364d2e178defdb712a0aae8c9df66f447b472ad54e3e1fa5aa9a84f3c11b5f35007d629cf975699c5f885aeb0c5 languageName: node linkType: hard @@ -5654,30 +5647,178 @@ __metadata: languageName: node linkType: hard -"es-shim-unscopables@npm:^1.0.0": - version: 1.0.0 - resolution: "es-shim-unscopables@npm:1.0.0" +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 0512f4e5d564021c9e3a644437b0155af2679d10d80f21adaf868e64d30efdfbd321631956f20f42d655fedb2e3a027da479fad3fa6048f768eb453a80a5f80a + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 + languageName: node + linkType: hard + +"es-iterator-helpers@npm:^1.2.1": + version: 1.2.2 + resolution: "es-iterator-helpers@npm:1.2.2" + dependencies: + call-bind: ^1.0.8 + call-bound: ^1.0.4 + define-properties: ^1.2.1 + es-abstract: ^1.24.1 + es-errors: ^1.3.0 + es-set-tostringtag: ^2.1.0 + function-bind: ^1.1.2 + get-intrinsic: ^1.3.0 + globalthis: ^1.0.4 + gopd: ^1.2.0 + has-property-descriptors: ^1.0.2 + has-proto: ^1.2.0 + has-symbols: ^1.1.0 + internal-slot: ^1.1.0 + iterator.prototype: ^1.1.5 + safe-array-concat: ^1.1.3 + checksum: 33e148b592d41630ea53b20ec8d6f2ca7516871c43bdf1619fdb4c770361c625f134ff4276332d6e08e9f59d1cd75532a74723f56176c4599e0387f51750e286 + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" dependencies: - has: ^1.0.3 - checksum: 83e95cadbb6ee44d3644dfad60dcad7929edbc42c85e66c3e99aefd68a3a5c5665f2686885cddb47dfeabfd77bd5ea5a7060f2092a955a729bbd8834f0d86fa1 + es-errors: ^1.3.0 + checksum: 214d3767287b12f36d3d7267ef342bbbe1e89f899cfd67040309fc65032372a8e60201410a99a1645f2f90c1912c8c49c8668066f6bdd954bcd614dda2e3da97 languageName: node linkType: hard -"es-to-primitive@npm:^1.2.1": - version: 1.2.1 - resolution: "es-to-primitive@npm:1.2.1" +"es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" + dependencies: + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 + has-tostringtag: ^1.0.2 + hasown: ^2.0.2 + checksum: 789f35de4be3dc8d11fdcb91bc26af4ae3e6d602caa93299a8c45cf05d36cc5081454ae2a6d3afa09cceca214b76c046e4f8151e092e6fc7feeb5efb9e794fc6 + languageName: node + linkType: hard + +"es-shim-unscopables@npm:^1.0.2, es-shim-unscopables@npm:^1.1.0": + version: 1.1.0 + resolution: "es-shim-unscopables@npm:1.1.0" dependencies: - is-callable: ^1.1.4 - is-date-object: ^1.0.1 - is-symbol: ^1.0.2 - checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed + hasown: ^2.0.2 + checksum: 33cfb1ebcb2f869f0bf528be1a8660b4fe8b6cec8fc641f330e508db2284b58ee2980fad6d0828882d22858c759c0806076427a3673b6daa60f753e3b558ee15 + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.3.0": + version: 1.3.0 + resolution: "es-to-primitive@npm:1.3.0" + dependencies: + is-callable: ^1.2.7 + is-date-object: ^1.0.5 + is-symbol: ^1.0.4 + checksum: 966965880356486cd4d1fe9a523deda2084c81b3702d951212c098f5f2ee93605d1b7c1840062efb48a07d892641c7ed1bc194db563645c0dd2b919cb6d65b93 + languageName: node + linkType: hard + +"esbuild@npm:~0.27.0": + version: 0.27.3 + resolution: "esbuild@npm:0.27.3" + dependencies: + "@esbuild/aix-ppc64": 0.27.3 + "@esbuild/android-arm": 0.27.3 + "@esbuild/android-arm64": 0.27.3 + "@esbuild/android-x64": 0.27.3 + "@esbuild/darwin-arm64": 0.27.3 + "@esbuild/darwin-x64": 0.27.3 + "@esbuild/freebsd-arm64": 0.27.3 + "@esbuild/freebsd-x64": 0.27.3 + "@esbuild/linux-arm": 0.27.3 + "@esbuild/linux-arm64": 0.27.3 + "@esbuild/linux-ia32": 0.27.3 + "@esbuild/linux-loong64": 0.27.3 + "@esbuild/linux-mips64el": 0.27.3 + "@esbuild/linux-ppc64": 0.27.3 + "@esbuild/linux-riscv64": 0.27.3 + "@esbuild/linux-s390x": 0.27.3 + "@esbuild/linux-x64": 0.27.3 + "@esbuild/netbsd-arm64": 0.27.3 + "@esbuild/netbsd-x64": 0.27.3 + "@esbuild/openbsd-arm64": 0.27.3 + "@esbuild/openbsd-x64": 0.27.3 + "@esbuild/openharmony-arm64": 0.27.3 + "@esbuild/sunos-x64": 0.27.3 + "@esbuild/win32-arm64": 0.27.3 + "@esbuild/win32-ia32": 0.27.3 + "@esbuild/win32-x64": 0.27.3 + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/openharmony-arm64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 3a45334b00ca235ad96843738c4698970aacde92058aee28ab1fa57ad823c29667070af90b6071cc876e492bebdeed79f593a273c39b419097afd2a772296085 languageName: node linkType: hard -"escalade@npm:^3.1.1": - version: 3.1.1 - resolution: "escalade@npm:3.1.1" - checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e languageName: node linkType: hard @@ -5709,33 +5850,13 @@ __metadata: languageName: node linkType: hard -"escodegen@npm:^1.11.1": - version: 1.14.3 - resolution: "escodegen@npm:1.14.3" - dependencies: - esprima: ^4.0.1 - estraverse: ^4.2.0 - esutils: ^2.0.2 - optionator: ^0.8.1 - source-map: ~0.6.1 - dependenciesMeta: - source-map: - optional: true - bin: - escodegen: bin/escodegen.js - esgenerate: bin/esgenerate.js - checksum: 381cdc4767ecdb221206bbbab021b467bbc2a6f5c9a99c9e6353040080bdd3dfe73d7604ad89a47aca6ea7d58bc635f6bd3fbc8da9a1998e9ddfa8372362ccd0 - languageName: node - linkType: hard - "escodegen@npm:^2.0.0": - version: 2.0.0 - resolution: "escodegen@npm:2.0.0" + version: 2.1.0 + resolution: "escodegen@npm:2.1.0" dependencies: esprima: ^4.0.1 estraverse: ^5.2.0 esutils: ^2.0.2 - optionator: ^0.8.1 source-map: ~0.6.1 dependenciesMeta: source-map: @@ -5743,7 +5864,7 @@ __metadata: bin: escodegen: bin/escodegen.js esgenerate: bin/esgenerate.js - checksum: 5aa6b2966fafe0545e4e77936300cc94ad57cfe4dc4ebff9950492eaba83eef634503f12d7e3cbd644ecc1bab388ad0e92b06fd32222c9281a75d1cf02ec6cef + checksum: 096696407e161305cd05aebb95134ad176708bc5cb13d0dcc89a5fcbb959b8ed757e7f2591a5f8036f8f4952d4a724de0df14cd419e29212729fa6df5ce16bf6 languageName: node linkType: hard @@ -5766,23 +5887,26 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-node@npm:^0.3.6": - version: 0.3.6 - resolution: "eslint-import-resolver-node@npm:0.3.6" +"eslint-import-resolver-node@npm:^0.3.9": + version: 0.3.9 + resolution: "eslint-import-resolver-node@npm:0.3.9" dependencies: debug: ^3.2.7 - resolve: ^1.20.0 - checksum: 6266733af1e112970e855a5bcc2d2058fb5ae16ad2a6d400705a86b29552b36131ffc5581b744c23d550de844206fb55e9193691619ee4dbf225c4bde526b1c8 + is-core-module: ^2.13.0 + resolve: ^1.22.4 + checksum: 439b91271236b452d478d0522a44482e8c8540bf9df9bd744062ebb89ab45727a3acd03366a6ba2bdbcde8f9f718bab7fe8db64688aca75acf37e04eafd25e22 languageName: node linkType: hard -"eslint-module-utils@npm:^2.7.3": - version: 2.7.3 - resolution: "eslint-module-utils@npm:2.7.3" +"eslint-module-utils@npm:^2.12.1": + version: 2.12.1 + resolution: "eslint-module-utils@npm:2.12.1" dependencies: debug: ^3.2.7 - find-up: ^2.1.0 - checksum: 77048263f309167a1e6a1e1b896bfb5ddd1d3859b2e2abbd9c32c432aee13d610d46e6820b1ca81b37fba437cf423a404bc6649be64ace9148a3062d1886a678 + peerDependenciesMeta: + eslint: + optional: true + checksum: 2f074670d8c934687820a83140048776b28bbaf35fc37f35623f63cc9c438d496d11f0683b4feabb9a120435435d4a69604b1c6c567f118be2c9a0aba6760fc1 languageName: node linkType: hard @@ -5798,48 +5922,56 @@ __metadata: linkType: hard "eslint-plugin-import@npm:2.x": - version: 2.26.0 - resolution: "eslint-plugin-import@npm:2.26.0" - dependencies: - array-includes: ^3.1.4 - array.prototype.flat: ^1.2.5 - debug: ^2.6.9 + version: 2.32.0 + resolution: "eslint-plugin-import@npm:2.32.0" + dependencies: + "@rtsao/scc": ^1.1.0 + array-includes: ^3.1.9 + array.prototype.findlastindex: ^1.2.6 + array.prototype.flat: ^1.3.3 + array.prototype.flatmap: ^1.3.3 + debug: ^3.2.7 doctrine: ^2.1.0 - eslint-import-resolver-node: ^0.3.6 - eslint-module-utils: ^2.7.3 - has: ^1.0.3 - is-core-module: ^2.8.1 + eslint-import-resolver-node: ^0.3.9 + eslint-module-utils: ^2.12.1 + hasown: ^2.0.2 + is-core-module: ^2.16.1 is-glob: ^4.0.3 minimatch: ^3.1.2 - object.values: ^1.1.5 - resolve: ^1.22.0 - tsconfig-paths: ^3.14.1 + object.fromentries: ^2.0.8 + object.groupby: ^1.0.3 + object.values: ^1.2.1 + semver: ^6.3.1 + string.prototype.trimend: ^1.0.9 + tsconfig-paths: ^3.15.0 peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: 0bf77ad80339554481eafa2b1967449e1f816b94c7a6f9614ce33fb4083c4e6c050f10d241dd50b4975d47922880a34de1e42ea9d8e6fd663ebb768baa67e655 + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + checksum: 8cd40595b5e4346d3698eb577014b4b6d0ba57b7b9edf975be4f052a89330ec202d0cc5c3861d37ebeafa151b6264821410243889b0c31710911a6b625bcf76b languageName: node linkType: hard "eslint-plugin-jsx-a11y@npm:6.x": - version: 6.6.0 - resolution: "eslint-plugin-jsx-a11y@npm:6.6.0" - dependencies: - "@babel/runtime": ^7.18.3 - aria-query: ^4.2.2 - array-includes: ^3.1.5 - ast-types-flow: ^0.0.7 - axe-core: ^4.4.2 - axobject-query: ^2.2.0 + version: 6.10.2 + resolution: "eslint-plugin-jsx-a11y@npm:6.10.2" + dependencies: + aria-query: ^5.3.2 + array-includes: ^3.1.8 + array.prototype.flatmap: ^1.3.2 + ast-types-flow: ^0.0.8 + axe-core: ^4.10.0 + axobject-query: ^4.1.0 damerau-levenshtein: ^1.0.8 emoji-regex: ^9.2.2 - has: ^1.0.3 - jsx-ast-utils: ^3.3.1 - language-tags: ^1.0.5 + hasown: ^2.0.2 + jsx-ast-utils: ^3.3.5 + language-tags: ^1.0.9 minimatch: ^3.1.2 - semver: ^6.3.0 + object.fromentries: ^2.0.8 + safe-regex-test: ^1.0.3 + string.prototype.includes: ^2.0.1 peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: d9da9a3ec71137c12519289c63e71250d5d78d4b7729b84e7e12edf1aad993083f23303d9b62359591b2f8aababb1bbec032cd84f1425e759b11a055e3acd144 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + checksum: 0cc861398fa26ada61ed5703eef5b335495fcb96253263dcd5e399488ff019a2636372021baacc040e3560d1a34bfcd5d5ad9f1754f44cd0509c956f7df94050 languageName: node linkType: hard @@ -5853,26 +5985,30 @@ __metadata: linkType: hard "eslint-plugin-react@npm:7.x": - version: 7.30.1 - resolution: "eslint-plugin-react@npm:7.30.1" + version: 7.37.5 + resolution: "eslint-plugin-react@npm:7.37.5" dependencies: - array-includes: ^3.1.5 - array.prototype.flatmap: ^1.3.0 + array-includes: ^3.1.8 + array.prototype.findlast: ^1.2.5 + array.prototype.flatmap: ^1.3.3 + array.prototype.tosorted: ^1.1.4 doctrine: ^2.1.0 + es-iterator-helpers: ^1.2.1 estraverse: ^5.3.0 + hasown: ^2.0.2 jsx-ast-utils: ^2.4.1 || ^3.0.0 minimatch: ^3.1.2 - object.entries: ^1.1.5 - object.fromentries: ^2.0.5 - object.hasown: ^1.1.1 - object.values: ^1.1.5 + object.entries: ^1.1.9 + object.fromentries: ^2.0.8 + object.values: ^1.2.1 prop-types: ^15.8.1 - resolve: ^2.0.0-next.3 - semver: ^6.3.0 - string.prototype.matchall: ^4.0.7 + resolve: ^2.0.0-next.5 + semver: ^6.3.1 + string.prototype.matchall: ^4.0.12 + string.prototype.repeat: ^1.0.0 peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 553fb9ece6beb7c14cf6f84670c786c8ac978c2918421994dcc4edd2385302022e5d5ac4a39fafdb35954e29cecddefed61758040c3c530cafcf651f674a9d51 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + checksum: 8675e7558e646e3c2fcb04bb60cfe416000b831ef0b363f0117838f5bfc799156113cb06058ad4d4b39fc730903b7360b05038da11093064ca37caf76b7cf2ca languageName: node linkType: hard @@ -5981,11 +6117,11 @@ __metadata: linkType: hard "esquery@npm:^1.4.0": - version: 1.4.0 - resolution: "esquery@npm:1.4.0" + version: 1.7.0 + resolution: "esquery@npm:1.7.0" dependencies: estraverse: ^5.1.0 - checksum: a0807e17abd7fbe5fbd4fab673038d6d8a50675cdae6b04fbaa520c34581be0c5fa24582990e8acd8854f671dd291c78bb2efb9e0ed5b62f33bac4f9cf820210 + checksum: 3239792b68cf39fe18966d0ca01549bb15556734f0144308fd213739b0f153671ae916013fce0bca032044a4dbcda98b43c1c667f20c20a54dec3597ac0d7c27 languageName: node linkType: hard @@ -5998,7 +6134,7 @@ __metadata: languageName: node linkType: hard -"estraverse@npm:^4.1.1, estraverse@npm:^4.2.0": +"estraverse@npm:^4.1.1": version: 4.3.0 resolution: "estraverse@npm:4.3.0" checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 @@ -6070,94 +6206,59 @@ __metadata: languageName: node linkType: hard +"exponential-backoff@npm:^3.1.1": + version: 3.1.3 + resolution: "exponential-backoff@npm:3.1.3" + checksum: 471fdb70fd3d2c08a74a026973bdd4105b7832911f610ca67bbb74e39279411c1eed2f2a110c9d41c2edd89459ba58fdaba1c174beed73e7a42d773882dcff82 + languageName: node + linkType: hard + "express@npm:^4.16.3": - version: 4.19.2 - resolution: "express@npm:4.19.2" + version: 4.22.1 + resolution: "express@npm:4.22.1" dependencies: accepts: ~1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.2 - content-disposition: 0.5.4 + body-parser: ~1.20.3 + content-disposition: ~0.5.4 content-type: ~1.0.4 - cookie: 0.6.0 - cookie-signature: 1.0.6 + cookie: ~0.7.1 + cookie-signature: ~1.0.6 debug: 2.6.9 depd: 2.0.0 - encodeurl: ~1.0.2 + encodeurl: ~2.0.0 escape-html: ~1.0.3 etag: ~1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 + finalhandler: ~1.3.1 + fresh: ~0.5.2 + http-errors: ~2.0.0 + merge-descriptors: 1.0.3 methods: ~1.1.2 - on-finished: 2.4.1 + on-finished: ~2.4.1 parseurl: ~1.3.3 - path-to-regexp: 0.1.7 + path-to-regexp: ~0.1.12 proxy-addr: ~2.0.7 - qs: 6.11.0 + qs: ~6.14.0 range-parser: ~1.2.1 safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 + send: ~0.19.0 + serve-static: ~1.16.2 setprototypeof: 1.2.0 - statuses: 2.0.1 + statuses: ~2.0.1 type-is: ~1.6.18 utils-merge: 1.0.1 vary: ~1.1.2 - checksum: 212dbd6c2c222a96a61bc927639c95970a53b06257080bb9e2838adb3bffdb966856551fdad1ab5dd654a217c35db94f987d0aa88d48fb04d306340f5f34dca5 + checksum: 38fd76585f6a2394e02d499f852fc70c94c9b1527bd5812eb5ee45c23b7f1297baaf13c55162253b14c1e36939b8401429d6594095e63d01ca77447dac72894e languageName: node linkType: hard -"extend@npm:^3.0.0, extend@npm:~3.0.2": +"extend@npm:^3.0.0": version: 3.0.2 resolution: "extend@npm:3.0.2" checksum: a50a8309ca65ea5d426382ff09f33586527882cf532931cb08ca786ea3146c0553310bda688710ff61d7668eba9f96b923fe1420cdf56a2c3eaf30fcab87b515 languageName: node linkType: hard -"external-editor@npm:^3.0.3": - version: 3.1.0 - resolution: "external-editor@npm:3.1.0" - dependencies: - chardet: ^0.7.0 - iconv-lite: ^0.4.24 - tmp: ^0.0.33 - checksum: 1c2a616a73f1b3435ce04030261bed0e22d4737e14b090bb48e58865da92529c9f2b05b893de650738d55e692d071819b45e1669259b2b354bc3154d27a698c7 - languageName: node - linkType: hard - -"extract-zip@npm:^2.0.0": - version: 2.0.1 - resolution: "extract-zip@npm:2.0.1" - dependencies: - "@types/yauzl": ^2.9.1 - debug: ^4.1.1 - get-stream: ^5.1.0 - yauzl: ^2.10.0 - dependenciesMeta: - "@types/yauzl": - optional: true - bin: - extract-zip: cli.js - checksum: 8cbda9debdd6d6980819cc69734d874ddd71051c9fe5bde1ef307ebcedfe949ba57b004894b585f758b7c9eeeea0e3d87f2dda89b7d25320459c2c9643ebb635 - languageName: node - linkType: hard - -"extsprintf@npm:1.3.0": - version: 1.3.0 - resolution: "extsprintf@npm:1.3.0" - checksum: cee7a4a1e34cffeeec18559109de92c27517e5641991ec6bab849aa64e3081022903dd53084f2080d0d2530803aa5ee84f1e9de642c365452f9e67be8f958ce2 - languageName: node - linkType: hard - -"extsprintf@npm:^1.2.0": - version: 1.4.1 - resolution: "extsprintf@npm:1.4.1" - checksum: a2f29b241914a8d2bad64363de684821b6b1609d06ae68d5b539e4de6b28659715b5bea94a7265201603713b7027d35399d10b0548f09071c5513e65e8323d33 - languageName: node - linkType: hard - "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -6165,20 +6266,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.9": - version: 3.2.11 - resolution: "fast-glob@npm:3.2.11" - dependencies: - "@nodelib/fs.stat": ^2.0.2 - "@nodelib/fs.walk": ^1.2.3 - glob-parent: ^5.1.2 - merge2: ^1.3.0 - micromatch: ^4.0.4 - checksum: f473105324a7780a20c06de842e15ddbb41d3cb7e71d1e4fe6e8373204f22245d54f5ab9e2061e6a1c613047345954d29b022e0e76f5c28b1df9858179a0e6d7 - languageName: node - linkType: hard - -"fast-glob@npm:^3.3.2": +"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.2": version: 3.3.3 resolution: "fast-glob@npm:3.3.3" dependencies: @@ -6198,19 +6286,26 @@ __metadata: languageName: node linkType: hard -"fast-levenshtein@npm:^2.0.6, fast-levenshtein@npm:~2.0.6": +"fast-levenshtein@npm:^2.0.6": version: 2.0.6 resolution: "fast-levenshtein@npm:2.0.6" checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c languageName: node linkType: hard +"fast-uri@npm:^3.0.1": + version: 3.1.0 + resolution: "fast-uri@npm:3.1.0" + checksum: daab0efd3548cc53d0db38ecc764d125773f8bd70c34552ff21abdc6530f26fa4cb1771f944222ca5e61a0a1a85d01a104848ff88c61736de445d97bd616ea7e + languageName: node + linkType: hard + "fastq@npm:^1.6.0": - version: 1.13.0 - resolution: "fastq@npm:1.13.0" + version: 1.20.1 + resolution: "fastq@npm:1.20.1" dependencies: reusify: ^1.0.4 - checksum: 32cf15c29afe622af187d12fc9cd93e160a0cb7c31a3bb6ace86b7dea3b28e7b72acde89c882663f307b2184e14782c6c664fa315973c03626c7d4bff070bb0b + checksum: 49128edbf05e682bee3c1db3d2dfc7da195469065ef014d8368c555d829932313ae2ddf584bb03146409b0d5d9fdb387c471075483a7319b52f777ad91128ed8 languageName: node linkType: hard @@ -6223,12 +6318,15 @@ __metadata: languageName: node linkType: hard -"fd-slicer@npm:~1.1.0": - version: 1.1.0 - resolution: "fd-slicer@npm:1.1.0" - dependencies: - pend: ~1.2.0 - checksum: c8585fd5713f4476eb8261150900d2cb7f6ff2d87f8feb306ccc8a1122efd152f1783bdb2b8dc891395744583436bfd8081d8e63ece0ec8687eeefea394d4ff2 +"fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: bd537daa9d3cd53887eed35efa0eab2dbb1ca408790e10e024120e7a36c6e9ae2b33710cb8381e35def01bc9c1d7eaba746f886338413e68ff6ebaee07b9a6e8 languageName: node linkType: hard @@ -6269,13 +6367,6 @@ __metadata: languageName: node linkType: hard -"filesize@npm:^6.1.0": - version: 6.4.0 - resolution: "filesize@npm:6.4.0" - checksum: 83619b0a656225e84ba9a73271b80091629c0e88c2936c1ebd36fff96fb0e2fbae0273c2caccd522c02bc1a32ad9eba869c28c6b2c36e06187d25fd298c3dfe8 - languageName: node - linkType: hard - "fill-range@npm:^7.1.1": version: 7.1.1 resolution: "fill-range@npm:7.1.1" @@ -6285,43 +6376,28 @@ __metadata: languageName: node linkType: hard -"finalhandler@npm:1.1.2": - version: 1.1.2 - resolution: "finalhandler@npm:1.1.2" - dependencies: - debug: 2.6.9 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - on-finished: ~2.3.0 - parseurl: ~1.3.3 - statuses: ~1.5.0 - unpipe: ~1.0.0 - checksum: 617880460c5138dd7ccfd555cb5dde4d8f170f4b31b8bd51e4b646bb2946c30f7db716428a1f2882d730d2b72afb47d1f67cc487b874cb15426f95753a88965e - languageName: node - linkType: hard - -"finalhandler@npm:1.2.0": - version: 1.2.0 - resolution: "finalhandler@npm:1.2.0" +"finalhandler@npm:~1.3.1": + version: 1.3.2 + resolution: "finalhandler@npm:1.3.2" dependencies: debug: 2.6.9 - encodeurl: ~1.0.2 + encodeurl: ~2.0.0 escape-html: ~1.0.3 - on-finished: 2.4.1 + on-finished: ~2.4.1 parseurl: ~1.3.3 - statuses: 2.0.1 + statuses: ~2.0.2 unpipe: ~1.0.0 - checksum: 92effbfd32e22a7dff2994acedbd9bcc3aa646a3e919ea6a53238090e87097f8ef07cced90aa2cc421abdf993aefbdd5b00104d55c7c5479a8d00ed105b45716 + checksum: 4bce6b3e1f6998497a8ef8418bc307ef09daee05acc5a69a36da665565cbeb86218de1932e42dbf2eebf18f580053d2061eddbdeff9e312de45d46fbf4dd36ec languageName: node linkType: hard "find-babel-config@npm:^1.2.0": - version: 1.2.0 - resolution: "find-babel-config@npm:1.2.0" + version: 1.2.2 + resolution: "find-babel-config@npm:1.2.2" dependencies: - json5: ^0.5.1 + json5: ^1.0.2 path-exists: ^3.0.0 - checksum: 0a1785d3da9f38637885d9d65f183aaa072f51a834f733035e9694e4d0f6983ae8c8e75cd4e08b92af6f595b3b490ee813a1c5a9b14740685aa836fa1e878583 + checksum: 9dd8ef0f47c5d83f6bf4106c1e21c6e62dd8b11d32ce0df3700b141ca119c63bd849cc3ade7e54c39c8a235b9c2a6ac598acda801f82582514b7b9c64027771d languageName: node linkType: hard @@ -6336,15 +6412,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^2.1.0": - version: 2.1.0 - resolution: "find-up@npm:2.1.0" - dependencies: - locate-path: ^2.0.0 - checksum: 43284fe4da09f89011f08e3c32cd38401e786b19226ea440b75386c1b12a4cb738c94969808d53a84f564ede22f732c8409e3cfc3f7fb5b5c32378ad0bbf28bd - languageName: node - linkType: hard - "find-up@npm:^3.0.0": version: 3.0.0 resolution: "find-up@npm:3.0.0" @@ -6365,72 +6432,56 @@ __metadata: linkType: hard "flat-cache@npm:^3.0.4": - version: 3.0.4 - resolution: "flat-cache@npm:3.0.4" + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" dependencies: - flatted: ^3.1.0 + flatted: ^3.2.9 + keyv: ^4.5.3 rimraf: ^3.0.2 - checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 + checksum: e7e0f59801e288b54bee5cb9681e9ee21ee28ef309f886b312c9d08415b79fc0f24ac842f84356ce80f47d6a53de62197ce0e6e148dc42d5db005992e2a756ec languageName: node linkType: hard -"flatted@npm:^3.1.0": - version: 3.2.6 - resolution: "flatted@npm:3.2.6" - checksum: 33b87aa88dfa40ca6ee31d7df61712bbbad3d3c05c132c23e59b9b61d34631b337a18ff2b8dc5553acdc871ec72b741e485f78969cf006124a3f57174de29a0e +"flatted@npm:^3.2.9": + version: 3.3.3 + resolution: "flatted@npm:3.3.3" + checksum: 8c96c02fbeadcf4e8ffd0fa24983241e27698b0781295622591fc13585e2f226609d95e422bcf2ef044146ffacb6b68b1f20871454eddf75ab3caa6ee5f4a1fe languageName: node linkType: hard "focus-visible@npm:^5.1.0": - version: 5.2.0 - resolution: "focus-visible@npm:5.2.0" - checksum: 876f646ef453680d3d34e9f9b23961527ffd5ccaed8690f423d4fbfa37ff023d98a490972bc1387850e37ec2e44958c81f6096ef95b67462e5c4b5404cf1dbb9 - languageName: node - linkType: hard - -"foreachasync@npm:^3.0.0": - version: 3.0.0 - resolution: "foreachasync@npm:3.0.0" - checksum: 4791f64b539b06c751b14adb2881173c780d41ce37d881715a5e5787fa4a08961f2c6a6cf3bccdfa48e56fb91d8676d867fdc63c008cdb576bd33261716e8381 + version: 5.2.1 + resolution: "focus-visible@npm:5.2.1" + checksum: 9da7388e703315a8f933bb4fec4e2be5f1d655dfc91c388d1802ad53a99e1fa31a5be90866b7db83d48d8f7f771dd2df7d51445a37f48f7069823eceb5f34e64 languageName: node linkType: hard -"foreground-child@npm:^3.1.0": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" +"for-each@npm:^0.3.3, for-each@npm:^0.3.5": + version: 0.3.5 + resolution: "for-each@npm:0.3.5" dependencies: - cross-spawn: ^7.0.0 - signal-exit: ^4.0.1 - checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 + is-callable: ^1.2.7 + checksum: 3c986d7e11f4381237cc98baa0a2f87eabe74719eee65ed7bed275163082b940ede19268c61d04c6260e0215983b12f8d885e3c8f9aa8c2113bf07c37051745c languageName: node linkType: hard -"forever-agent@npm:~0.6.1": - version: 0.6.1 - resolution: "forever-agent@npm:0.6.1" - checksum: 766ae6e220f5fe23676bb4c6a99387cec5b7b62ceb99e10923376e27bfea72f3c3aeec2ba5f45f3f7ba65d6616965aa7c20b15002b6860833bb6e394dea546a8 +"foreachasync@npm:^3.0.0": + version: 3.0.0 + resolution: "foreachasync@npm:3.0.0" + checksum: 4791f64b539b06c751b14adb2881173c780d41ce37d881715a5e5787fa4a08961f2c6a6cf3bccdfa48e56fb91d8676d867fdc63c008cdb576bd33261716e8381 languageName: node linkType: hard "form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" + version: 4.0.5 + resolution: "form-data@npm:4.0.5" dependencies: asynckit: ^0.4.0 combined-stream: ^1.0.8 + es-set-tostringtag: ^2.1.0 + hasown: ^2.0.2 mime-types: ^2.1.12 - checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c - languageName: node - linkType: hard - -"form-data@npm:~2.3.2": - version: 2.3.3 - resolution: "form-data@npm:2.3.3" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.6 - mime-types: ^2.1.12 - checksum: 10c1780fa13dbe1ff3100114c2ce1f9307f8be10b14bf16e103815356ff567b6be39d70fc4a40f8990b9660012dc24b0f5e1dde1b6426166eb23a445ba068ca3 + checksum: af8328413c16d0cded5fccc975a44d227c5120fd46a9e81de8acf619d43ed838414cc6d7792195b30b248f76a65246949a129a4dadd148721948f90cd6d4fb69 languageName: node linkType: hard @@ -6441,14 +6492,14 @@ __metadata: languageName: node linkType: hard -"fraction.js@npm:^4.2.0": - version: 4.2.0 - resolution: "fraction.js@npm:4.2.0" - checksum: 8c76a6e21dedea87109d6171a0ac77afa14205794a565d71cb10d2925f629a3922da61bf45ea52dbc30bce4d8636dc0a27213a88cbd600eab047d82f9a3a94c5 +"fraction.js@npm:^5.3.4": + version: 5.3.4 + resolution: "fraction.js@npm:5.3.4" + checksum: 6ac88ecfdb5fabe3566ae30f79828d448288efbb852cd43ad83afc961fb6923e1d77bc65fbcba8ccda10894114edd419581a050c73d61e368fdd4c3ff416a65a languageName: node linkType: hard -"fresh@npm:0.5.2": +"fresh@npm:~0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" checksum: 13ea8b08f91e669a64e3ba3a20eb79d7ca5379a81f1ff7f4310d54e2320645503cc0c78daedc93dfb6191287295f6479544a649c64d8e41a1c0fb0c221552346 @@ -6464,13 +6515,6 @@ __metadata: languageName: node linkType: hard -"fs-constants@npm:^1.0.0": - version: 1.0.0 - resolution: "fs-constants@npm:1.0.0" - checksum: 18f5b718371816155849475ac36c7d0b24d39a11d91348cfcb308b4494824413e03572c403c86d3a260e049465518c4f0d5bd00f0371cdfcad6d4f30a85b350d - languageName: node - linkType: hard - "fs-extra@npm:^9.1.0": version: 9.1.0 resolution: "fs-extra@npm:9.1.0" @@ -6492,6 +6536,15 @@ __metadata: languageName: node linkType: hard +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: ^7.0.3 + checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802 + languageName: node + linkType: hard + "fs.realpath@npm:^1.0.0": version: 1.0.0 resolution: "fs.realpath@npm:1.0.0" @@ -6499,7 +6552,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:^2.3.2": +"fsevents@npm:^2.3.2, fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -6509,17 +6562,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:~2.3.2": - version: 2.3.2 - resolution: "fsevents@npm:2.3.2" - dependencies: - node-gyp: latest - checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@^2.3.2#~builtin<compat/fsevents>": +"fsevents@patch:fsevents@^2.3.2#~builtin<compat/fsevents>, fsevents@patch:fsevents@~2.3.2#~builtin<compat/fsevents>, fsevents@patch:fsevents@~2.3.3#~builtin<compat/fsevents>": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin<compat/fsevents>::version=2.3.3&hash=18f3a7" dependencies: @@ -6528,22 +6571,6 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@~2.3.2#~builtin<compat/fsevents>": - version: 2.3.2 - resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin<compat/fsevents>::version=2.3.2&hash=18f3a7" - dependencies: - node-gyp: latest - conditions: os=darwin - languageName: node - linkType: hard - -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a - languageName: node - linkType: hard - "function-bind@npm:^1.1.2": version: 1.1.2 resolution: "function-bind@npm:1.1.2" @@ -6551,15 +6578,17 @@ __metadata: languageName: node linkType: hard -"function.prototype.name@npm:^1.1.5": - version: 1.1.5 - resolution: "function.prototype.name@npm:1.1.5" +"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": + version: 1.1.8 + resolution: "function.prototype.name@npm:1.1.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.0 - functions-have-names: ^1.2.2 - checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 + call-bind: ^1.0.8 + call-bound: ^1.0.3 + define-properties: ^1.2.1 + functions-have-names: ^1.2.3 + hasown: ^2.0.2 + is-callable: ^1.2.7 + checksum: 3a366535dc08b25f40a322efefa83b2da3cd0f6da41db7775f2339679120ef63b6c7e967266182609e655b8f0a8f65596ed21c7fd72ad8bd5621c2340edd4010 languageName: node linkType: hard @@ -6570,7 +6599,7 @@ __metadata: languageName: node linkType: hard -"functions-have-names@npm:^1.2.2": +"functions-have-names@npm:^1.2.3": version: 1.2.3 resolution: "functions-have-names@npm:1.2.3" checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 @@ -6593,6 +6622,13 @@ __metadata: languageName: node linkType: hard +"generator-function@npm:^2.0.0": + version: 2.0.1 + resolution: "generator-function@npm:2.0.1" + checksum: 3bf87f7b0230de5d74529677e6c3ceb3b7b5d9618b5a22d92b45ce3876defbaf5a77791b25a61b0fa7d13f95675b5ff67a7769f3b9af33f096e34653519e873d + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.1, gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -6607,14 +6643,24 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1": - version: 1.1.2 - resolution: "get-intrinsic@npm:1.1.2" - dependencies: - function-bind: ^1.1.1 - has: ^1.0.3 - has-symbols: ^1.0.3 - checksum: 252f45491f2ba88ebf5b38018020c7cc3279de54b1d67ffb70c0cdf1dfa8ab31cd56467b5d117a8b4275b7a4dde91f86766b163a17a850f036528a7b2faafb2b +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": + version: 1.3.1 + resolution: "get-intrinsic@npm:1.3.1" + dependencies: + async-function: ^1.0.0 + async-generator-function: ^1.0.0 + call-bind-apply-helpers: ^1.0.2 + es-define-property: ^1.0.1 + es-errors: ^1.3.0 + es-object-atoms: ^1.1.1 + function-bind: ^1.1.2 + generator-function: ^2.0.0 + get-proto: ^1.0.1 + gopd: ^1.2.0 + has-symbols: ^1.1.0 + hasown: ^2.0.2 + math-intrinsics: ^1.1.0 + checksum: c02b3b6a445f9cd53e14896303794ac60f9751f58a69099127248abdb0251957174c6524245fc68579dc8e6a35161d3d94c93e665f808274716f4248b269436a languageName: node linkType: hard @@ -6625,19 +6671,13 @@ __metadata: languageName: node linkType: hard -"get-stdin@npm:^8.0.0": - version: 8.0.0 - resolution: "get-stdin@npm:8.0.0" - checksum: 40128b6cd25781ddbd233344f1a1e4006d4284906191ed0a7d55ec2c1a3e44d650f280b2c9eeab79c03ac3037da80257476c0e4e5af38ddfb902d6ff06282d77 - languageName: node - linkType: hard - -"get-stream@npm:^5.1.0": - version: 5.2.0 - resolution: "get-stream@npm:5.2.0" +"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" dependencies: - pump: ^3.0.0 - checksum: 8bc1a23174a06b2b4ce600df38d6c98d2ef6d84e020c1ddad632ad75bac4e092eeb40e4c09e0761c35fc2dbc5e7fff5dab5e763a383582c4a167dd69a905bd12 + dunder-proto: ^1.0.1 + es-object-atoms: ^1.0.0 + checksum: 4fc96afdb58ced9a67558698b91433e6b037aaa6f1493af77498d7c85b141382cf223c0e5946f334fb328ee85dfe6edd06d218eaf09556f4bc4ec6005d7f5f7b languageName: node linkType: hard @@ -6648,22 +6688,23 @@ __metadata: languageName: node linkType: hard -"get-symbol-description@npm:^1.0.0": - version: 1.0.0 - resolution: "get-symbol-description@npm:1.0.0" +"get-symbol-description@npm:^1.1.0": + version: 1.1.0 + resolution: "get-symbol-description@npm:1.1.0" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.1 - checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 + call-bound: ^1.0.3 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 + checksum: 655ed04db48ee65ef2ddbe096540d4405e79ba0a7f54225775fef43a7e2afcb93a77d141c5f05fdef0afce2eb93bcbfb3597142189d562ac167ff183582683cd languageName: node linkType: hard -"getpass@npm:^0.1.1": - version: 0.1.7 - resolution: "getpass@npm:0.1.7" +"get-tsconfig@npm:^4.7.5": + version: 4.13.6 + resolution: "get-tsconfig@npm:4.13.6" dependencies: - assert-plus: ^1.0.0 - checksum: ab18d55661db264e3eac6012c2d3daeafaab7a501c035ae0ccb193c3c23e9849c6e29b6ac762b9c2adae460266f925d55a3a2a3a3c8b94be2f222df94d70c046 + resolve-pkg-maps: ^1.0.0 + checksum: 946575897a75b3de39905a8e95fe761b1ae9a595c8608c3982fa3a5748ed0d6441c799197a99fee27876cd8c5a2158418ad6e88d8008ec1244639c0f5ee2a2d8 languageName: node linkType: hard @@ -6685,22 +6726,18 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.3.10": - version: 10.3.15 - resolution: "glob@npm:10.3.15" +"glob@npm:^13.0.0": + version: 13.0.5 + resolution: "glob@npm:13.0.5" dependencies: - foreground-child: ^3.1.0 - jackspeak: ^2.3.6 - minimatch: ^9.0.1 - minipass: ^7.0.4 - path-scurry: ^1.11.0 - bin: - glob: dist/esm/bin.mjs - checksum: c7aeae0b4eea0dfedc6682b71a8ad4d1ea9dfec0f2440571f916e1918c046824c8d441bbe1965c06fede025a0726c6daab5ae8019afe667364f43776eaaf9044 + minimatch: ^10.2.1 + minipass: ^7.1.2 + path-scurry: ^2.0.0 + checksum: 9bb731eec1aeda05aac54798468771146ed9bc0ab8fe6114e94ebc74d458946b8c4ccd6eb673ac0b161deba9f2617eb12bca7648e974acbcd5a023bcab5e4565 languageName: node linkType: hard -"glob@npm:^7.0.0, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": +"glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: @@ -6715,31 +6752,34 @@ __metadata: linkType: hard "glob@npm:^8.0.1": - version: 8.0.3 - resolution: "glob@npm:8.0.3" + version: 8.1.0 + resolution: "glob@npm:8.1.0" dependencies: fs.realpath: ^1.0.0 inflight: ^1.0.4 inherits: 2 minimatch: ^5.0.1 once: ^1.3.0 - checksum: 50bcdea19d8e79d8de5f460b1939ffc2b3299eac28deb502093fdca22a78efebc03e66bf54f0abc3d3d07d8134d19a32850288b7440d77e072aa55f9d33b18c5 + checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 languageName: node linkType: hard -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e +"globals@npm:^13.6.0, globals@npm:^13.9.0": + version: 13.24.0 + resolution: "globals@npm:13.24.0" + dependencies: + type-fest: ^0.20.2 + checksum: 56066ef058f6867c04ff203b8a44c15b038346a62efbc3060052a1016be9f56f4cf0b2cd45b74b22b81e521a889fc7786c73691b0549c2f3a6e825b3d394f43c languageName: node linkType: hard -"globals@npm:^13.6.0, globals@npm:^13.9.0": - version: 13.16.0 - resolution: "globals@npm:13.16.0" +"globalthis@npm:^1.0.4": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" dependencies: - type-fest: ^0.20.2 - checksum: e571b28462b8922a29ac78c8df89848cfd5dc9bdd5d8077440c022864f512a4aae82e7561a2f366337daa86fd4b366aec16fd3f08686de387e4089b01be6cb14 + define-properties: ^1.2.1 + gopd: ^1.0.1 + checksum: 39ad667ad9f01476474633a1834a70842041f70a55571e8dcef5fb957980a92da5022db5430fca8aecc5d47704ae30618c0bc877a579c70710c904e9ef06108a languageName: node linkType: hard @@ -6757,38 +6797,14 @@ __metadata: languageName: node linkType: hard -"glyphhanger@npm:^4.0.1": - version: 4.0.1 - resolution: "glyphhanger@npm:4.0.1" - dependencies: - "@zachleat/spider-pig": ^2.0.0 - chalk: ^4.1.0 - characterset: ^1.3.0 - connect: ^3.7.0 - debug: ^4.3.1 - filesize: ^6.1.0 - fs-extra: ^9.1.0 - get-stdin: ^8.0.0 - glob: ^7.1.6 - jsdom: ^15.2.1 - minimist: ^1.2.5 - parse-filepath: ^1.0.2 - serve-static: ^1.14.1 - shelljs: ^0.8.4 - bin: - glyphhanger: cmd.js - checksum: 5007450ecab027b8f224ac153b202e99384ee744a61aac29d63e13767cedbf9f6190458d5583ed51e54042bd5a53deeb4dc1eaae231bc451fde753b9d3eb039e - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": - version: 4.2.10 - resolution: "graceful-fs@npm:4.2.10" - checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: cc6d8e655e360955bdccaca51a12a474268f95bb793fc3e1f2bdadb075f28bfd1fd988dab872daf77a61d78cbaf13744bc8727a17cfb1d150d76047d805375f3 languageName: node linkType: hard -"graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 @@ -6805,27 +6821,28 @@ __metadata: languageName: node linkType: hard -"har-schema@npm:^2.0.0": - version: 2.0.0 - resolution: "har-schema@npm:2.0.0" - checksum: d8946348f333fb09e2bf24cc4c67eabb47c8e1d1aa1c14184c7ffec1140a49ec8aa78aa93677ae452d71d5fc0fdeec20f0c8c1237291fc2bcb3f502a5d204f9b - languageName: node - linkType: hard - -"har-validator@npm:~5.1.3": - version: 5.1.5 - resolution: "har-validator@npm:5.1.5" +"handlebars@npm:^4.7.8": + version: 4.7.8 + resolution: "handlebars@npm:4.7.8" dependencies: - ajv: ^6.12.3 - har-schema: ^2.0.0 - checksum: b998a7269ca560d7f219eedc53e2c664cd87d487e428ae854a6af4573fc94f182fe9d2e3b92ab968249baec7ebaf9ead69cf975c931dc2ab282ec182ee988280 + minimist: ^1.2.5 + neo-async: ^2.6.2 + source-map: ^0.6.1 + uglify-js: ^3.1.4 + wordwrap: ^1.0.0 + dependenciesMeta: + uglify-js: + optional: true + bin: + handlebars: bin/handlebars + checksum: 00e68bb5c183fd7b8b63322e6234b5ac8fbb960d712cb3f25587d559c2951d9642df83c04a1172c918c41bcfc81bfbd7a7718bbce93b893e0135fc99edea93ff languageName: node linkType: hard -"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": - version: 1.0.2 - resolution: "has-bigints@npm:1.0.2" - checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b +"has-bigints@npm:^1.0.2": + version: 1.1.0 + resolution: "has-bigints@npm:1.1.0" + checksum: 79730518ae02c77e4af6a1d1a0b6a2c3e1509785532771f9baf0241e83e36329542c3d7a0e723df8cbc85f74eff4f177828a2265a01ba576adbdc2d40d86538b languageName: node linkType: hard @@ -6843,28 +6860,37 @@ __metadata: languageName: node linkType: hard -"has-property-descriptors@npm:^1.0.0": - version: 1.0.0 - resolution: "has-property-descriptors@npm:1.0.0" +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" dependencies: - get-intrinsic: ^1.1.1 - checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb + es-define-property: ^1.0.0 + checksum: fcbb246ea2838058be39887935231c6d5788babed499d0e9d0cc5737494c48aba4fe17ba1449e0d0fbbb1e36175442faa37f9c427ae357d6ccb1d895fbcd3de3 languageName: node linkType: hard -"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 +"has-proto@npm:^1.2.0": + version: 1.2.0 + resolution: "has-proto@npm:1.2.0" + dependencies: + dunder-proto: ^1.0.0 + checksum: f55010cb94caa56308041d77967c72a02ffd71386b23f9afa8447e58bc92d49d15c19bf75173713468e92fe3fb1680b03b115da39c21c32c74886d1d50d3e7ff languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0": - version: 1.0.0 - resolution: "has-tostringtag@npm:1.0.0" +"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: b2316c7302a0e8ba3aaba215f834e96c22c86f192e7310bdf689dd0e6999510c89b00fbc5742571507cebf25764d68c988b3a0da217369a73596191ac0ce694b + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" dependencies: - has-symbols: ^1.0.2 - checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c + has-symbols: ^1.0.3 + checksum: 999d60bb753ad714356b2c6c87b7fb74f32463b8426e159397da4bde5bca7e598ab1073f4d8d4deafac297f2eb311484cd177af242776bf05f0d11565680468d languageName: node linkType: hard @@ -6875,15 +6901,6 @@ __metadata: languageName: node linkType: hard -"has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" - dependencies: - function-bind: ^1.1.1 - checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 - languageName: node - linkType: hard - "hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" @@ -6980,15 +6997,6 @@ __metadata: languageName: node linkType: hard -"html-encoding-sniffer@npm:^1.0.2": - version: 1.0.2 - resolution: "html-encoding-sniffer@npm:1.0.2" - dependencies: - whatwg-encoding: ^1.0.1 - checksum: b874df6750451b7642fbe8e998c6bdd2911b0f42ad2927814b717bf1f4b082b0904b6178a1bfbc40117bf5799777993b0825e7713ca0fca49844e5aec03aa0e2 - languageName: node - linkType: hard - "html-encoding-sniffer@npm:^3.0.0": version: 3.0.0 resolution: "html-encoding-sniffer@npm:3.0.0" @@ -7012,23 +7020,23 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.0": - version: 4.1.0 - resolution: "http-cache-semantics@npm:4.1.0" - checksum: 974de94a81c5474be07f269f9fd8383e92ebb5a448208223bfb39e172a9dbc26feff250192ecc23b9593b3f92098e010406b0f24bd4d588d631f80214648ed42 +"http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": + version: 4.2.0 + resolution: "http-cache-semantics@npm:4.2.0" + checksum: 7a7246ddfce629f96832791176fd643589d954e6f3b49548dadb4290451961237fab8fcea41cd2008fe819d95b41c1e8b97f47d088afc0a1c81705287b4ddbcc languageName: node linkType: hard -"http-errors@npm:2.0.0": - version: 2.0.0 - resolution: "http-errors@npm:2.0.0" +"http-errors@npm:~2.0.0, http-errors@npm:~2.0.1": + version: 2.0.1 + resolution: "http-errors@npm:2.0.1" dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - checksum: 9b0a3782665c52ce9dc658a0d1560bcb0214ba5699e4ea15aefb2a496e2ca83db03ebc42e1cce4ac1f413e4e0d2d736a3fd755772c556a9a06853ba2a0b7d920 + depd: ~2.0.0 + inherits: ~2.0.4 + setprototypeof: ~1.2.0 + statuses: ~2.0.2 + toidentifier: ~1.0.1 + checksum: 155d1a100a06e4964597013109590b97540a177b69c3600bbc93efc746465a99a2b718f43cdf76b3791af994bbe3a5711002046bf668cdc007ea44cea6df7ccd languageName: node linkType: hard @@ -7043,14 +7051,13 @@ __metadata: languageName: node linkType: hard -"http-signature@npm:~1.2.0": - version: 1.2.0 - resolution: "http-signature@npm:1.2.0" +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" dependencies: - assert-plus: ^1.0.0 - jsprim: ^1.2.2 - sshpk: ^1.7.0 - checksum: 3324598712266a9683585bb84a75dec4fd550567d5e0dd4a0fff6ff3f74348793404d3eeac4918fa0902c810eeee1a86419e4a2e92a164132dfe6b26743fb47c + agent-base: ^7.1.0 + debug: ^4.3.4 + checksum: 670858c8f8f3146db5889e1fa117630910101db601fff7d5a8aa637da0abedf68c899f03d3451cac2f83bcc4c3d2dabf339b3aa00ff8080571cceb02c3ce02f3 languageName: node linkType: hard @@ -7058,9 +7065,19 @@ __metadata: version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" dependencies: - agent-base: 6 + agent-base: 6 + debug: 4 + checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" + dependencies: + agent-base: ^7.1.2 debug: 4 - checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 + checksum: b882377a120aa0544846172e5db021fa8afbf83fea2a897d397bd2ddd8095ab268c24bc462f40a15f2a8c600bf4aa05ce52927f70038d4014e68aefecfa94e8d languageName: node linkType: hard @@ -7080,15 +7097,6 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.4.24, iconv-lite@npm:^0.4.24": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" - dependencies: - safer-buffer: ">= 2.1.2 < 3" - checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6 - languageName: node - linkType: hard - "iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" @@ -7098,6 +7106,24 @@ __metadata: languageName: node linkType: hard +"iconv-lite@npm:^0.7.0": + version: 0.7.2 + resolution: "iconv-lite@npm:0.7.2" + dependencies: + safer-buffer: ">= 2.1.2 < 3.0.0" + checksum: faf884c1f631a5d676e3e64054bed891c7c5f616b790082d99ccfbfd017c661a39db8009160268fd65fae57c9154d4d491ebc9c301f3446a078460ef114dc4b8 + languageName: node + linkType: hard + +"iconv-lite@npm:~0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: ">= 2.1.2 < 3" + checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6 + languageName: node + linkType: hard + "ieee754@npm:^1.1.13": version: 1.2.1 resolution: "ieee754@npm:1.2.1" @@ -7113,31 +7139,31 @@ __metadata: linkType: hard "ignore@npm:^5.2.0": - version: 5.2.0 - resolution: "ignore@npm:5.2.0" - checksum: 6b1f926792d614f64c6c83da3a1f9c83f6196c2839aa41e1e32dd7b8d174cef2e329d75caabb62cb61ce9dc432f75e67d07d122a037312db7caa73166a1bdb77 + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 2acfd32a573260ea522ea0bfeff880af426d68f6831f973129e2ba7363f422923cf53aab62f8369cbf4667c7b25b6f8a3761b34ecdb284ea18e87a5262a865be languageName: node linkType: hard "import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" dependencies: parent-module: ^1.0.0 resolve-from: ^4.0.0 - checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + checksum: a06b19461b4879cc654d46f8a6244eb55eb053437afd4cbb6613cad6be203811849ed3e4ea038783092879487299fda24af932b86bdfff67c9055ba3612b8c87 languageName: node linkType: hard "import-local@npm:^3.0.2": - version: 3.1.0 - resolution: "import-local@npm:3.1.0" + version: 3.2.0 + resolution: "import-local@npm:3.2.0" dependencies: pkg-dir: ^4.2.0 resolve-cwd: ^3.0.0 bin: import-local-fixture: fixtures/cli.js - checksum: bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd + checksum: 0b0b0b412b2521739fbb85eeed834a3c34de9bc67e670b3d0b86248fc460d990a7b116ad056c084b87a693ef73d1f17268d6a5be626bb43c998a8b1c8a230004 languageName: node linkType: hard @@ -7172,7 +7198,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.0, inherits@npm:^2.0.3, inherits@npm:^2.0.4": +"inherits@npm:2, inherits@npm:^2.0.0, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 @@ -7187,14 +7213,14 @@ __metadata: linkType: hard "inquirer@npm:^8.2.4": - version: 8.2.4 - resolution: "inquirer@npm:8.2.4" + version: 8.2.7 + resolution: "inquirer@npm:8.2.7" dependencies: + "@inquirer/external-editor": ^1.0.0 ansi-escapes: ^4.2.1 chalk: ^4.1.1 cli-cursor: ^3.1.0 cli-width: ^3.0.0 - external-editor: ^3.0.3 figures: ^3.0.0 lodash: ^4.17.21 mute-stream: 0.0.8 @@ -7204,40 +7230,26 @@ __metadata: string-width: ^4.1.0 strip-ansi: ^6.0.0 through: ^2.3.6 - wrap-ansi: ^7.0.0 - checksum: dfcb6529d3af443dfea2241cb471508091b51f5121a088fdb8728b23ec9b349ef0a5e13a0ef2c8e19457b0bed22f7cbbcd561f7a4529d084c562a58c605e2655 + wrap-ansi: ^6.0.1 + checksum: b7e39a04da31207826f675e2ff491bd35bb28efbe336e8fb49641d8353d4a312943514452fb0a23702e64f70c7e44188586880c902d67541aae579cd6564c3fb languageName: node linkType: hard -"internal-slot@npm:^1.0.3": - version: 1.0.3 - resolution: "internal-slot@npm:1.0.3" +"internal-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "internal-slot@npm:1.1.0" dependencies: - get-intrinsic: ^1.1.0 - has: ^1.0.3 - side-channel: ^1.0.4 - checksum: 1944f92e981e47aebc98a88ff0db579fd90543d937806104d0b96557b10c1f170c51fb777b97740a8b6ddeec585fca8c39ae99fd08a8e058dfc8ab70937238bf - languageName: node - linkType: hard - -"interpret@npm:^1.0.0": - version: 1.4.0 - resolution: "interpret@npm:1.4.0" - checksum: 2e5f51268b5941e4a17e4ef0575bc91ed0ab5f8515e3cf77486f7c14d13f3010df9c0959f37063dcc96e78d12dc6b0bb1b9e111cdfe69771f4656d2993d36155 - languageName: node - linkType: hard - -"ip-regex@npm:^2.1.0": - version: 2.1.0 - resolution: "ip-regex@npm:2.1.0" - checksum: 331d95052aa53ce245745ea0fc3a6a1e2e3c8d6da65fa8ea52bf73768c1b22a9ac50629d1d2b08c04e7b3ac4c21b536693c149ce2c2615ee4796030e5b3e3cba + es-errors: ^1.3.0 + hasown: ^2.0.2 + side-channel: ^1.1.0 + checksum: 8e0991c2d048cc08dab0a91f573c99f6a4215075887517ea4fa32203ce8aea60fa03f95b177977fa27eb502e5168366d0f3e02c762b799691411d49900611861 languageName: node linkType: hard -"ip@npm:^1.1.5": - version: 1.1.9 - resolution: "ip@npm:1.1.9" - checksum: b6d91fd45a856e3bd6d4f601ea0619d90f3517638f6918ebd079f959a8a6308568d8db5ef4fdf037e0d9cfdcf264f46833dfeea81ca31309cf0a7eb4b1307b84 +"ip-address@npm:^10.0.1": + version: 10.1.0 + resolution: "ip-address@npm:10.1.0" + checksum: 76b1abcdf52a32e2e05ca1f202f3a8ab8547e5651a9233781b330271bd7f1a741067748d71c4cbb9d9906d9f1fa69e7ddc8b4a11130db4534fdab0e908c84e0d languageName: node linkType: hard @@ -7248,16 +7260,6 @@ __metadata: languageName: node linkType: hard -"is-absolute@npm:^1.0.0": - version: 1.0.0 - resolution: "is-absolute@npm:1.0.0" - dependencies: - is-relative: ^1.0.0 - is-windows: ^1.0.1 - checksum: 9d16b2605eda3f3ce755410f1d423e327ad3a898bcb86c9354cf63970ed3f91ba85e9828aa56f5d6a952b9fae43d0477770f78d37409ae8ecc31e59ebc279b27 - languageName: node - linkType: hard - "is-alphabetical@npm:1.0.4, is-alphabetical@npm:^1.0.0": version: 1.0.4 resolution: "is-alphabetical@npm:1.0.4" @@ -7275,6 +7277,17 @@ __metadata: languageName: node linkType: hard +"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": + version: 3.0.5 + resolution: "is-array-buffer@npm:3.0.5" + dependencies: + call-bind: ^1.0.8 + call-bound: ^1.0.3 + get-intrinsic: ^1.2.6 + checksum: f137a2a6e77af682cdbffef1e633c140cf596f72321baf8bba0f4ef22685eb4339dde23dfe9e9ca430b5f961dee4d46577dcf12b792b68518c8449b134fb9156 + languageName: node + linkType: hard + "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" @@ -7282,12 +7295,25 @@ __metadata: languageName: node linkType: hard -"is-bigint@npm:^1.0.1": - version: 1.0.4 - resolution: "is-bigint@npm:1.0.4" +"is-async-function@npm:^2.0.0": + version: 2.1.1 + resolution: "is-async-function@npm:2.1.1" dependencies: - has-bigints: ^1.0.1 - checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 + async-function: ^1.0.0 + call-bound: ^1.0.3 + get-proto: ^1.0.1 + has-tostringtag: ^1.0.2 + safe-regex-test: ^1.1.0 + checksum: 9bece45133da26636488ca127d7686b85ad3ca18927e2850cff1937a650059e90be1c71a48623f8791646bb7a241b0cabf602a0b9252dcfa5ab273f2399000e6 + languageName: node + linkType: hard + +"is-bigint@npm:^1.1.0": + version: 1.1.0 + resolution: "is-bigint@npm:1.1.0" + dependencies: + has-bigints: ^1.0.2 + checksum: ee1544f0e664f253306786ed1dce494b8cf242ef415d6375d8545b4d8816b0f054bd9f948a8988ae2c6325d1c28260dd02978236b2f7b8fb70dfc4838a6c9fa7 languageName: node linkType: hard @@ -7300,13 +7326,13 @@ __metadata: languageName: node linkType: hard -"is-boolean-object@npm:^1.1.0": - version: 1.1.2 - resolution: "is-boolean-object@npm:1.1.2" +"is-boolean-object@npm:^1.2.1": + version: 1.2.2 + resolution: "is-boolean-object@npm:1.2.2" dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 + call-bound: ^1.0.3 + has-tostringtag: ^1.0.2 + checksum: 0415b181e8f1bfd5d3f8a20f8108e64d372a72131674eea9c2923f39d065b6ad08d654765553bdbffbd92c3746f1007986c34087db1bd89a31f71be8359ccdaa languageName: node linkType: hard @@ -7324,23 +7350,14 @@ __metadata: languageName: node linkType: hard -"is-callable@npm:^1.1.4, is-callable@npm:^1.2.4": - version: 1.2.4 - resolution: "is-callable@npm:1.2.4" - checksum: 1a28d57dc435797dae04b173b65d6d1e77d4f16276e9eff973f994eadcfdc30a017e6a597f092752a083c1103cceb56c91e3dadc6692fedb9898dfaba701575f - languageName: node - linkType: hard - -"is-core-module@npm:^2.12.0": - version: 2.12.1 - resolution: "is-core-module@npm:2.12.1" - dependencies: - has: ^1.0.3 - checksum: f04ea30533b5e62764e7b2e049d3157dc0abd95ef44275b32489ea2081176ac9746ffb1cdb107445cf1ff0e0dfcad522726ca27c27ece64dadf3795428b8e468 +"is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac languageName: node linkType: hard -"is-core-module@npm:^2.16.0": +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.16.1": version: 2.16.1 resolution: "is-core-module@npm:2.16.1" dependencies: @@ -7349,21 +7366,24 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.8.1, is-core-module@npm:^2.9.0": - version: 2.9.0 - resolution: "is-core-module@npm:2.9.0" +"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": + version: 1.0.2 + resolution: "is-data-view@npm:1.0.2" dependencies: - has: ^1.0.3 - checksum: b27034318b4b462f1c8f1dfb1b32baecd651d891a4e2d1922135daeff4141dfced2b82b07aef83ef54275c4a3526aa38da859223664d0868ca24182badb784ce + call-bound: ^1.0.2 + get-intrinsic: ^1.2.6 + is-typed-array: ^1.1.13 + checksum: 31600dd19932eae7fd304567e465709ffbfa17fa236427c9c864148e1b54eb2146357fcf3aed9b686dee13c217e1bb5a649cb3b9c479e1004c0648e9febde1b2 languageName: node linkType: hard -"is-date-object@npm:^1.0.1": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" +"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": + version: 1.1.0 + resolution: "is-date-object@npm:1.1.0" dependencies: - has-tostringtag: ^1.0.0 - checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc + call-bound: ^1.0.2 + has-tostringtag: ^1.0.2 + checksum: d6c36ab9d20971d65f3fc64cef940d57a4900a2ac85fb488a46d164c2072a33da1cb51eefcc039e3e5c208acbce343d3480b84ab5ff0983f617512da2742562a languageName: node linkType: hard @@ -7381,6 +7401,15 @@ __metadata: languageName: node linkType: hard +"is-finalizationregistry@npm:^1.1.0": + version: 1.1.1 + resolution: "is-finalizationregistry@npm:1.1.1" + dependencies: + call-bound: ^1.0.3 + checksum: 38c646c506e64ead41a36c182d91639833311970b6b6c6268634f109eef0a1a9d2f1f2e499ef4cb43c744a13443c4cdd2f0812d5afdcee5e9b65b72b28c48557 + languageName: node + linkType: hard + "is-fullwidth-code-point@npm:^3.0.0": version: 3.0.0 resolution: "is-fullwidth-code-point@npm:3.0.0" @@ -7395,6 +7424,19 @@ __metadata: languageName: node linkType: hard +"is-generator-function@npm:^1.0.10": + version: 1.1.2 + resolution: "is-generator-function@npm:1.1.2" + dependencies: + call-bound: ^1.0.4 + generator-function: ^2.0.0 + get-proto: ^1.0.1 + has-tostringtag: ^1.0.2 + safe-regex-test: ^1.1.0 + checksum: 0b81c613752a5e534939e5b3835ff722446837a5b94c3a3934af5ded36a651d9aa31c3f11f8a3453884b9658bf26dbfb7eb855e744d920b07f084bd890a43414 + languageName: node + linkType: hard + "is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" @@ -7425,19 +7467,27 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.2": - version: 2.0.2 - resolution: "is-negative-zero@npm:2.0.2" - checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a +"is-map@npm:^2.0.3": + version: 2.0.3 + resolution: "is-map@npm:2.0.3" + checksum: e6ce5f6380f32b141b3153e6ba9074892bbbbd655e92e7ba5ff195239777e767a976dcd4e22f864accaf30e53ebf961ab1995424aef91af68788f0591b7396cc languageName: node linkType: hard -"is-number-object@npm:^1.0.4": - version: 1.0.7 - resolution: "is-number-object@npm:1.0.7" +"is-negative-zero@npm:^2.0.3": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: c1e6b23d2070c0539d7b36022d5a94407132411d01aba39ec549af824231f3804b1aea90b5e4e58e807a65d23ceb538ed6e355ce76b267bdd86edb757ffcbdcd + languageName: node + linkType: hard + +"is-number-object@npm:^1.1.1": + version: 1.1.1 + resolution: "is-number-object@npm:1.1.1" dependencies: - has-tostringtag: ^1.0.0 - checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 + call-bound: ^1.0.3 + has-tostringtag: ^1.0.2 + checksum: 6517f0a0e8c4b197a21afb45cd3053dc711e79d45d8878aa3565de38d0102b130ca8732485122c7b336e98c27dacd5236854e3e6526e0eb30cae64956535662f languageName: node linkType: hard @@ -7471,31 +7521,31 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.1.4": - version: 1.1.4 - resolution: "is-regex@npm:1.1.4" +"is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 + call-bound: ^1.0.2 + gopd: ^1.2.0 + has-tostringtag: ^1.0.2 + hasown: ^2.0.2 + checksum: 99ee0b6d30ef1bb61fa4b22fae7056c6c9b3c693803c0c284ff7a8570f83075a7d38cda53b06b7996d441215c27895ea5d1af62124562e13d91b3dbec41a5e13 languageName: node linkType: hard -"is-relative@npm:^1.0.0": - version: 1.0.0 - resolution: "is-relative@npm:1.0.0" - dependencies: - is-unc-path: ^1.0.0 - checksum: 3271a0df109302ef5e14a29dcd5d23d9788e15ade91a40b942b035827ffbb59f7ce9ff82d036ea798541a52913cbf9d2d0b66456340887b51f3542d57b5a4c05 +"is-set@npm:^2.0.3": + version: 2.0.3 + resolution: "is-set@npm:2.0.3" + checksum: 36e3f8c44bdbe9496c9689762cc4110f6a6a12b767c5d74c0398176aa2678d4467e3bf07595556f2dba897751bde1422480212b97d973c7b08a343100b0c0dfe languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "is-shared-array-buffer@npm:1.0.2" +"is-shared-array-buffer@npm:^1.0.4": + version: 1.0.4 + resolution: "is-shared-array-buffer@npm:1.0.4" dependencies: - call-bind: ^1.0.2 - checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a + call-bound: ^1.0.3 + checksum: 1611fedc175796eebb88f4dfc393dd969a4a8e6c69cadaff424ee9d4464f9f026399a5f84a90f7c62d6d7ee04e3626a912149726de102b0bd6c1ee6a9868fa5a languageName: node linkType: hard @@ -7506,37 +7556,40 @@ __metadata: languageName: node linkType: hard -"is-string@npm:^1.0.5, is-string@npm:^1.0.7": - version: 1.0.7 - resolution: "is-string@npm:1.0.7" +"is-string@npm:^1.1.1": + version: 1.1.1 + resolution: "is-string@npm:1.1.1" dependencies: - has-tostringtag: ^1.0.0 - checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 + call-bound: ^1.0.3 + has-tostringtag: ^1.0.2 + checksum: 2eeaaff605250f5e836ea3500d33d1a5d3aa98d008641d9d42fb941e929ffd25972326c2ef912987e54c95b6f10416281aaf1b35cdf81992cfb7524c5de8e193 languageName: node linkType: hard -"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": - version: 1.0.4 - resolution: "is-symbol@npm:1.0.4" +"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": + version: 1.1.1 + resolution: "is-symbol@npm:1.1.1" dependencies: - has-symbols: ^1.0.2 - checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 + call-bound: ^1.0.2 + has-symbols: ^1.1.0 + safe-regex-test: ^1.1.0 + checksum: bfafacf037af6f3c9d68820b74be4ae8a736a658a3344072df9642a090016e281797ba8edbeb1c83425879aae55d1cb1f30b38bf132d703692b2570367358032 languageName: node linkType: hard -"is-typedarray@npm:^1.0.0, is-typedarray@npm:~1.0.0": - version: 1.0.0 - resolution: "is-typedarray@npm:1.0.0" - checksum: 3508c6cd0a9ee2e0df2fa2e9baabcdc89e911c7bd5cf64604586697212feec525aa21050e48affb5ffc3df20f0f5d2e2cf79b08caa64e1ccc9578e251763aef7 +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "is-typed-array@npm:1.1.15" + dependencies: + which-typed-array: ^1.1.16 + checksum: ea7cfc46c282f805d19a9ab2084fd4542fed99219ee9dbfbc26284728bd713a51eac66daa74eca00ae0a43b61322920ba334793607dc39907465913e921e0892 languageName: node linkType: hard -"is-unc-path@npm:^1.0.0": +"is-typedarray@npm:^1.0.0": version: 1.0.0 - resolution: "is-unc-path@npm:1.0.0" - dependencies: - unc-path-regex: ^0.1.2 - checksum: e8abfde203f7409f5b03a5f1f8636e3a41e78b983702ef49d9343eb608cdfe691429398e8815157519b987b739bcfbc73ae7cf4c8582b0ab66add5171088eab6 + resolution: "is-typedarray@npm:1.0.0" + checksum: 3508c6cd0a9ee2e0df2fa2e9baabcdc89e911c7bd5cf64604586697212feec525aa21050e48affb5ffc3df20f0f5d2e2cf79b08caa64e1ccc9578e251763aef7 languageName: node linkType: hard @@ -7547,12 +7600,29 @@ __metadata: languageName: node linkType: hard -"is-weakref@npm:^1.0.2": - version: 1.0.2 - resolution: "is-weakref@npm:1.0.2" +"is-weakmap@npm:^2.0.2": + version: 2.0.2 + resolution: "is-weakmap@npm:2.0.2" + checksum: f36aef758b46990e0d3c37269619c0a08c5b29428c0bb11ecba7f75203442d6c7801239c2f31314bc79199217ef08263787f3837d9e22610ad1da62970d6616d + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.1": + version: 1.1.1 + resolution: "is-weakref@npm:1.1.1" + dependencies: + call-bound: ^1.0.3 + checksum: 1769b9aed5d435a3a989ffc18fc4ad1947d2acdaf530eb2bd6af844861b545047ea51102f75901f89043bed0267ed61d914ee21e6e8b9aa734ec201cdfc0726f + languageName: node + linkType: hard + +"is-weakset@npm:^2.0.3": + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" dependencies: - call-bind: ^1.0.2 - checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de + call-bound: ^1.0.3 + get-intrinsic: ^1.2.6 + checksum: 5c6c8415a06065d78bdd5e3a771483aa1cd928df19138aa73c4c51333226f203f22117b4325df55cc8b3085a6716870a320c2d757efee92d7a7091a039082041 languageName: node linkType: hard @@ -7563,13 +7633,6 @@ __metadata: languageName: node linkType: hard -"is-windows@npm:^1.0.1": - version: 1.0.2 - resolution: "is-windows@npm:1.0.2" - checksum: 438b7e52656fe3b9b293b180defb4e448088e7023a523ec21a91a80b9ff8cdb3377ddb5b6e60f7c7de4fa8b63ab56e121b6705fe081b3cf1b828b0a380009ad7 - languageName: node - linkType: hard - "is-word-character@npm:^1.0.0": version: 1.0.4 resolution: "is-word-character@npm:1.0.4" @@ -7577,6 +7640,13 @@ __metadata: languageName: node linkType: hard +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a + languageName: node + linkType: hard + "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -7584,6 +7654,13 @@ __metadata: languageName: node linkType: hard +"isexe@npm:^4.0.0": + version: 4.0.0 + resolution: "isexe@npm:4.0.0" + checksum: 2ead327ef596042ef9c9ec5f236b316acfaedb87f4bb61b3c3d574fb2e9c8a04b67305e04733bde52c24d9622fdebd3270aadb632adfbf9cadef88fe30f479e5 + languageName: node + linkType: hard + "isobject@npm:^3.0.1": version: 3.0.1 resolution: "isobject@npm:3.0.1" @@ -7591,13 +7668,6 @@ __metadata: languageName: node linkType: hard -"isstream@npm:~0.1.2": - version: 0.1.2 - resolution: "isstream@npm:0.1.2" - checksum: 1eb2fe63a729f7bdd8a559ab552c69055f4f48eb5c2f03724430587c6f450783c8f1cd936c1c952d0a927925180fcc892ebd5b174236cf1065d4bd5bdb37e963 - languageName: node - linkType: hard - "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" @@ -7619,15 +7689,15 @@ __metadata: linkType: hard "istanbul-lib-instrument@npm:^6.0.0": - version: 6.0.1 - resolution: "istanbul-lib-instrument@npm:6.0.1" + version: 6.0.3 + resolution: "istanbul-lib-instrument@npm:6.0.3" dependencies: - "@babel/core": ^7.12.3 - "@babel/parser": ^7.14.7 - "@istanbuljs/schema": ^0.1.2 + "@babel/core": ^7.23.9 + "@babel/parser": ^7.23.9 + "@istanbuljs/schema": ^0.1.3 istanbul-lib-coverage: ^3.2.0 semver: ^7.5.4 - checksum: fb23472e739cfc9b027cefcd7d551d5e7ca7ff2817ae5150fab99fe42786a7f7b56a29a2aa8309c37092e18297b8003f9c274f50ca4360949094d17fbac81472 + checksum: 74104c60c65c4fa0e97cc76f039226c356123893929f067bfad5f86fe839e08f5d680354a68fead3bc9c1e2f3fa6f3f53cded70778e821d911e851d349f3545a languageName: node linkType: hard @@ -7654,25 +7724,35 @@ __metadata: linkType: hard "istanbul-reports@npm:^3.1.3": - version: 3.1.6 - resolution: "istanbul-reports@npm:3.1.6" + version: 3.2.0 + resolution: "istanbul-reports@npm:3.2.0" dependencies: html-escaper: ^2.0.0 istanbul-lib-report: ^3.0.0 - checksum: 44c4c0582f287f02341e9720997f9e82c071627e1e862895745d5f52ec72c9b9f38e1d12370015d2a71dcead794f34c7732aaef3fab80a24bc617a21c3d911d6 + checksum: 72b4c8525276147908d28b0917bc675b1019836b638e50875521ca3b8ec63672681aa98dbab88a6f49ef798c08fe041d428abdcf84f4f3fcff5844eee54af65a languageName: node linkType: hard -"jackspeak@npm:^2.3.6": - version: 2.3.6 - resolution: "jackspeak@npm:2.3.6" +"iterator.prototype@npm:^1.1.5": + version: 1.1.5 + resolution: "iterator.prototype@npm:1.1.5" dependencies: - "@isaacs/cliui": ^8.0.2 - "@pkgjs/parseargs": ^0.11.0 - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 57d43ad11eadc98cdfe7496612f6bbb5255ea69fe51ea431162db302c2a11011642f50cfad57288bd0aea78384a0612b16e131944ad8ecd09d619041c8531b54 + define-data-property: ^1.1.4 + es-object-atoms: ^1.0.0 + get-intrinsic: ^1.2.6 + get-proto: ^1.0.0 + has-symbols: ^1.1.0 + set-function-name: ^2.0.2 + checksum: 7db23c42629ba4790e6e15f78b555f41dbd08818c85af306988364bd19d86716a1187cb333444f3a0036bfc078a0e9cb7ec67fef3a61662736d16410d7f77869 + languageName: node + linkType: hard + +"jackspeak@npm:^4.2.3": + version: 4.2.3 + resolution: "jackspeak@npm:4.2.3" + dependencies: + "@isaacs/cliui": ^9.0.0 + checksum: 256c2a35b781b61a368b29cff30c901163f2726c768920d160a743429ea7ff4a02f254fa5a27ebbf6444c1a544ec45b0f46d5c6a44f6cc23b0bcd2b6b919ccb0 languageName: node linkType: hard @@ -8040,7 +8120,7 @@ __metadata: languageName: node linkType: hard -"jest-util@npm:^29.0.0, jest-util@npm:^29.7.0": +"jest-util@npm:^29.7.0": version: 29.7.0 resolution: "jest-util@npm:29.7.0" dependencies: @@ -8115,7 +8195,7 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^1.21.6": +"jiti@npm:^1.21.7": version: 1.21.7 resolution: "jiti@npm:1.21.7" bin: @@ -8139,74 +8219,28 @@ __metadata: linkType: hard "js-yaml@npm:^3.13.1": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" + version: 3.14.2 + resolution: "js-yaml@npm:3.14.2" dependencies: argparse: ^1.0.7 esprima: ^4.0.0 bin: js-yaml: bin/js-yaml.js - checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c - languageName: node - linkType: hard - -"jsbn@npm:~0.1.0": - version: 0.1.1 - resolution: "jsbn@npm:0.1.1" - checksum: e5ff29c1b8d965017ef3f9c219dacd6e40ad355c664e277d31246c90545a02e6047018c16c60a00f36d561b3647215c41894f5d869ada6908a2e0ce4200c88f2 - languageName: node - linkType: hard - -"jsdom@npm:^15.2.1": - version: 15.2.1 - resolution: "jsdom@npm:15.2.1" - dependencies: - abab: ^2.0.0 - acorn: ^7.1.0 - acorn-globals: ^4.3.2 - array-equal: ^1.0.0 - cssom: ^0.4.1 - cssstyle: ^2.0.0 - data-urls: ^1.1.0 - domexception: ^1.0.1 - escodegen: ^1.11.1 - html-encoding-sniffer: ^1.0.2 - nwsapi: ^2.2.0 - parse5: 5.1.0 - pn: ^1.1.0 - request: ^2.88.0 - request-promise-native: ^1.0.7 - saxes: ^3.1.9 - symbol-tree: ^3.2.2 - tough-cookie: ^3.0.1 - w3c-hr-time: ^1.0.1 - w3c-xmlserializer: ^1.1.2 - webidl-conversions: ^4.0.2 - whatwg-encoding: ^1.0.5 - whatwg-mimetype: ^2.3.0 - whatwg-url: ^7.0.0 - ws: ^7.0.0 - xml-name-validator: ^3.0.0 - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - checksum: eff437b977330b1e63cd3ee2c2fe7c799c876799cae35525e1e6864d939dd41631ebd65f847adaeb83c2160c828d027d0f1d0dbe88366d1da22c875a5165a78c + checksum: 626fc207734a3452d6ba84e1c8c226240e6d431426ed94d0ab043c50926d97c509629c08b1d636f5d27815833b7cfd225865631da9fb33cb957374490bf3e90b languageName: node linkType: hard "jsdom@npm:^20.0.0": - version: 20.0.0 - resolution: "jsdom@npm:20.0.0" + version: 20.0.3 + resolution: "jsdom@npm:20.0.3" dependencies: abab: ^2.0.6 - acorn: ^8.7.1 - acorn-globals: ^6.0.0 + acorn: ^8.8.1 + acorn-globals: ^7.0.0 cssom: ^0.5.0 cssstyle: ^2.3.0 data-urls: ^3.0.2 - decimal.js: ^10.3.1 + decimal.js: ^10.4.2 domexception: ^4.0.0 escodegen: ^2.0.0 form-data: ^4.0.0 @@ -8214,43 +8248,40 @@ __metadata: http-proxy-agent: ^5.0.0 https-proxy-agent: ^5.0.1 is-potential-custom-element-name: ^1.0.1 - nwsapi: ^2.2.0 - parse5: ^7.0.0 + nwsapi: ^2.2.2 + parse5: ^7.1.1 saxes: ^6.0.0 symbol-tree: ^3.2.4 - tough-cookie: ^4.0.0 - w3c-hr-time: ^1.0.2 - w3c-xmlserializer: ^3.0.0 + tough-cookie: ^4.1.2 + w3c-xmlserializer: ^4.0.0 webidl-conversions: ^7.0.0 whatwg-encoding: ^2.0.0 whatwg-mimetype: ^3.0.0 whatwg-url: ^11.0.0 - ws: ^8.8.0 + ws: ^8.11.0 xml-name-validator: ^4.0.0 peerDependencies: canvas: ^2.5.0 peerDependenciesMeta: canvas: optional: true - checksum: f69b40679d8cfaee2353615445aaff08b823c53dc7778ede6592d02ed12b3e9fb4e8db2b6d033551b67e08424a3adb2b79d231caa7dcda2d16019c20c705c11f + checksum: 6e2ae21db397133a061b270c26d2dbc0b9051733ea3b896a7ece78d79f475ff0974f766a413c1198a79c793159119169f2335ddb23150348fbfdcfa6f3105536 languageName: node linkType: hard -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" +"jsesc@npm:^3.0.2, jsesc@npm:~3.1.0": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" bin: jsesc: bin/jsesc - checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d + checksum: 19c94095ea026725540c0d29da33ab03144f6bcf2d4159e4833d534976e99e0c09c38cefa9a575279a51fc36b31166f8d6d05c9fe2645d5f15851d690b41f17f languageName: node linkType: hard -"jsesc@npm:~0.5.0": - version: 0.5.0 - resolution: "jsesc@npm:0.5.0" - bin: - jsesc: bin/jsesc - checksum: b8b44cbfc92f198ad972fba706ee6a1dfa7485321ee8c0b25f5cedd538dcb20cde3197de16a7265430fce8277a12db066219369e3d51055038946039f6e20e17 +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 languageName: node linkType: hard @@ -8275,13 +8306,6 @@ __metadata: languageName: node linkType: hard -"json-schema@npm:0.4.0": - version: 0.4.0 - resolution: "json-schema@npm:0.4.0" - checksum: 66389434c3469e698da0df2e7ac5a3281bcff75e797a5c127db7c5b56270e01ae13d9afa3c03344f76e32e81678337a8c912bdbb75101c62e487dc3778461d72 - languageName: node - linkType: hard - "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" @@ -8289,43 +8313,18 @@ __metadata: languageName: node linkType: hard -"json-stringify-safe@npm:~5.0.1": - version: 5.0.1 - resolution: "json-stringify-safe@npm:5.0.1" - checksum: 48ec0adad5280b8a96bb93f4563aa1667fd7a36334f79149abd42446d0989f2ddc58274b479f4819f1f00617957e6344c886c55d05a4e15ebb4ab931e4a6a8ee - languageName: node - linkType: hard - -"json5@npm:^0.5.1": - version: 0.5.1 - resolution: "json5@npm:0.5.1" - bin: - json5: lib/cli.js - checksum: 9b85bf06955b23eaa4b7328aa8892e3887e81ca731dd27af04a5f5f1458fbc5e1de57a24442e3272f8a888dd1abe1cb68eb693324035f6b3aeba4fcab7667d62 - languageName: node - linkType: hard - -"json5@npm:^1.0.1": - version: 1.0.1 - resolution: "json5@npm:1.0.1" +"json5@npm:^1.0.2": + version: 1.0.2 + resolution: "json5@npm:1.0.2" dependencies: minimist: ^1.2.0 bin: json5: lib/cli.js - checksum: e76ea23dbb8fc1348c143da628134a98adf4c5a4e8ea2adaa74a80c455fc2cdf0e2e13e6398ef819bfe92306b610ebb2002668ed9fc1af386d593691ef346fc3 - languageName: node - linkType: hard - -"json5@npm:^2.1.2, json5@npm:^2.2.1": - version: 2.2.1 - resolution: "json5@npm:2.2.1" - bin: - json5: lib/cli.js - checksum: 74b8a23b102a6f2bf2d224797ae553a75488b5adbaee9c9b6e5ab8b510a2fc6e38f876d4c77dea672d4014a44b2399e15f2051ac2b37b87f74c0c7602003543b + checksum: 866458a8c58a95a49bef3adba929c625e82532bcff1fe93f01d29cb02cac7c3fe1f4b79951b7792c2da9de0b32871a8401a6e3c5b36778ad852bf5b8a61165d7 languageName: node linkType: hard -"json5@npm:^2.2.3": +"json5@npm:^2.1.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -8335,37 +8334,43 @@ __metadata: linkType: hard "jsonfile@npm:^6.0.1": - version: 6.1.0 - resolution: "jsonfile@npm:6.1.0" + version: 6.2.0 + resolution: "jsonfile@npm:6.2.0" dependencies: graceful-fs: ^4.1.6 universalify: ^2.0.0 dependenciesMeta: graceful-fs: optional: true - checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 + checksum: c3028ec5c770bb41290c9bb9ca04bdd0a1b698ddbdf6517c9453d3f90fc9e000c9675959fb46891d317690a93c62de03ff1735d8dbe02be83e51168ce85815d3 languageName: node linkType: hard -"jsprim@npm:^1.2.2": - version: 1.4.2 - resolution: "jsprim@npm:1.4.2" +"jsonpack@npm:1.1.5": + version: 1.1.5 + resolution: "jsonpack@npm:1.1.5" + checksum: 60ae0a52343a6bc254ff6677e87c55f4d71347b4a0c981b53cd3fdc184e139e0bf1b6bc127d42c1ab41b3c99d98e1e81559a94ba74a1c91c9143f70c8d751bf6 + languageName: node + linkType: hard + +"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5": + version: 3.3.5 + resolution: "jsx-ast-utils@npm:3.3.5" dependencies: - assert-plus: 1.0.0 - extsprintf: 1.3.0 - json-schema: 0.4.0 - verror: 1.10.0 - checksum: 2ad1b9fdcccae8b3d580fa6ced25de930eaa1ad154db21bbf8478a4d30bbbec7925b5f5ff29b933fba9412b16a17bd484a8da4fdb3663b5e27af95dd693bab2a + array-includes: ^3.1.6 + array.prototype.flat: ^1.3.1 + object.assign: ^4.1.4 + object.values: ^1.1.6 + checksum: f4b05fa4d7b5234230c905cfa88d36dc8a58a6666975a3891429b1a8cdc8a140bca76c297225cb7a499fad25a2c052ac93934449a2c31a44fc9edd06c773780a languageName: node linkType: hard -"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.1": - version: 3.3.1 - resolution: "jsx-ast-utils@npm:3.3.1" +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" dependencies: - array-includes: ^3.1.5 - object.assign: ^4.1.2 - checksum: 1d4b32fd24bbba561d5ca5c8d6ea095be646f83fc357d6f0cd2752f97f3ba0e0ffabc2f54b37a9d98258fc8ec0e1286cb7723cc1c9dc7af402d74fff72ae0a2b + json-buffer: 3.0.1 + checksum: 74a24395b1c34bd44ad5cb2b49140d087553e170625240b86755a6604cd65aa16efdbdeae5cdb17ba1284a0fbb25ad06263755dbc71b8d8b06f74232ce3cdd72 languageName: node linkType: hard @@ -8383,19 +8388,19 @@ __metadata: languageName: node linkType: hard -"language-subtag-registry@npm:~0.3.2": - version: 0.3.22 - resolution: "language-subtag-registry@npm:0.3.22" - checksum: 8ab70a7e0e055fe977ac16ea4c261faec7205ac43db5e806f72e5b59606939a3b972c4bd1e10e323b35d6ffa97c3e1c4c99f6553069dad2dfdd22020fa3eb56a +"language-subtag-registry@npm:^0.3.20": + version: 0.3.23 + resolution: "language-subtag-registry@npm:0.3.23" + checksum: 0b64c1a6c5431c8df648a6d25594ff280613c886f4a1a542d9b864e5472fb93e5c7856b9c41595c38fac31370328fc79fcc521712e89ea6d6866cbb8e0995d81 languageName: node linkType: hard -"language-tags@npm:^1.0.5": - version: 1.0.5 - resolution: "language-tags@npm:1.0.5" +"language-tags@npm:^1.0.9": + version: 1.0.9 + resolution: "language-tags@npm:1.0.9" dependencies: - language-subtag-registry: ~0.3.2 - checksum: c81b5d8b9f5f9cfd06ee71ada6ddfe1cf83044dd5eeefcd1e420ad491944da8957688db4a0a9bc562df4afdc2783425cbbdfd152c01d93179cf86888903123cf + language-subtag-registry: ^0.3.20 + checksum: 57c530796dc7179914dee71bc94f3747fd694612480241d0453a063777265dfe3a951037f7acb48f456bf167d6eb419d4c00263745326b3ba1cdcf4657070e78 languageName: node linkType: hard @@ -8416,24 +8421,7 @@ __metadata: languageName: node linkType: hard -"levn@npm:~0.3.0": - version: 0.3.0 - resolution: "levn@npm:0.3.0" - dependencies: - prelude-ls: ~1.1.2 - type-check: ~0.3.2 - checksum: 0d084a524231a8246bb10fec48cdbb35282099f6954838604f3c7fc66f2e16fa66fd9cc2f3f20a541a113c4dafdf181e822c887c8a319c9195444e6c64ac395e - languageName: node - linkType: hard - -"lilconfig@npm:^3.0.0": - version: 3.1.1 - resolution: "lilconfig@npm:3.1.1" - checksum: dc8a4f4afde3f0fac6bd36163cc4777a577a90759b8ef1d0d766b19ccf121f723aa79924f32af5b954f3965268215e046d0f237c41c76e5ef01d4e6d1208a15e - languageName: node - linkType: hard - -"lilconfig@npm:^3.1.3": +"lilconfig@npm:^3.1.1, lilconfig@npm:^3.1.3": version: 3.1.3 resolution: "lilconfig@npm:3.1.3" checksum: 644eb10830350f9cdc88610f71a921f510574ed02424b57b0b3abb66ea725d7a082559552524a842f4e0272c196b88dfe1ff7d35ffcc6f45736777185cd67c9a @@ -8470,16 +8458,6 @@ __metadata: languageName: node linkType: hard -"locate-path@npm:^2.0.0": - version: 2.0.0 - resolution: "locate-path@npm:2.0.0" - dependencies: - p-locate: ^2.0.0 - path-exists: ^3.0.0 - checksum: 02d581edbbbb0fa292e28d96b7de36b5b62c2fa8b5a7e82638ebb33afa74284acf022d3b1e9ae10e3ffb7658fbc49163fcd5e76e7d1baaa7801c3e05a81da755 - languageName: node - linkType: hard - "locate-path@npm:^3.0.0": version: 3.0.0 resolution: "locate-path@npm:3.0.0" @@ -8527,7 +8505,7 @@ __metadata: languageName: node linkType: hard -"lodash.memoize@npm:4.x, lodash.memoize@npm:^4.1.2": +"lodash.memoize@npm:^4.1.2": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" checksum: 9ff3942feeccffa4f1fafa88d32f0d24fdc62fd15ded5a74a5f950ff5f0c6f61916157246744c620173dddf38d37095a92327d5fd3861e2063e736a5c207d089 @@ -8541,13 +8519,6 @@ __metadata: languageName: node linkType: hard -"lodash.sortby@npm:^4.7.0": - version: 4.7.0 - resolution: "lodash.sortby@npm:4.7.0" - checksum: db170c9396d29d11fe9a9f25668c4993e0c1331bcb941ddbd48fb76f492e732add7f2a47cfdf8e9d740fa59ac41bbfaf931d268bc72aab3ab49e9f89354d718c - languageName: node - linkType: hard - "lodash.truncate@npm:^4.4.2": version: 4.4.2 resolution: "lodash.truncate@npm:4.4.2" @@ -8563,9 +8534,9 @@ __metadata: linkType: hard "lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.21": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + version: 4.17.23 + resolution: "lodash@npm:4.17.23" + checksum: 7daad39758a72872e94651630fbb54ba76868f904211089721a64516ce865506a759d9ad3d8ff22a2a49a50a09db5d27c36f22762d21766e47e3ba918d6d7bab languageName: node linkType: hard @@ -8590,10 +8561,10 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.2.0": - version: 10.2.2 - resolution: "lru-cache@npm:10.2.2" - checksum: 98e8fc93691c546f719a76103ef2bee5a3ac823955c755a47641ec41f8c7fafa1baeaba466937cc1cbfa9cfd47e03536d10e2db3158a64ad91ff3a58a32c893e +"lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1": + version: 11.2.6 + resolution: "lru-cache@npm:11.2.6" + checksum: 26fe602c92a0cb7a8da9a85db162ddd810d84507d9c4ef8d95a785a805648f9579e1148aaeac260f6b6315197bcf27c1b7e60a0a066621d6e95b3587699a0c70 languageName: node linkType: hard @@ -8606,19 +8577,10 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: ^4.0.0 - checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 - languageName: node - linkType: hard - "lru-cache@npm:^7.7.1": - version: 7.12.0 - resolution: "lru-cache@npm:7.12.0" - checksum: fdb62262978393df7a4bd46a072bc5c3808c50ca5a347a82bb9459410efd841b7bae50655c3cf9004c70d12c756cf6d018f6bff155a16cdde9eba9a82899b5eb + version: 7.18.3 + resolution: "lru-cache@npm:7.18.3" + checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 languageName: node linkType: hard @@ -8650,7 +8612,7 @@ __metadata: languageName: node linkType: hard -"make-error@npm:1.x, make-error@npm:^1.1.1": +"make-error@npm:^1.1.1, make-error@npm:^1.3.6": version: 1.3.6 resolution: "make-error@npm:1.3.6" checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 @@ -8658,8 +8620,8 @@ __metadata: linkType: hard "make-fetch-happen@npm:^10.0.3": - version: 10.1.8 - resolution: "make-fetch-happen@npm:10.1.8" + version: 10.2.1 + resolution: "make-fetch-happen@npm:10.2.1" dependencies: agentkeepalive: ^4.2.1 cacache: ^16.1.0 @@ -8677,7 +8639,26 @@ __metadata: promise-retry: ^2.0.1 socks-proxy-agent: ^7.0.0 ssri: ^9.0.0 - checksum: 5fe9fd9da5368a8a4fe9a3ea5b9aa15f1e91c9ab703cd9027a6b33840ecc8a57c182fbe1c767c139330a88c46a448b1f00da5e32065cec373aff2450b3da54ee + checksum: 2332eb9a8ec96f1ffeeea56ccefabcb4193693597b132cd110734d50f2928842e22b84cfa1508e921b8385cdfd06dda9ad68645fed62b50fff629a580f5fb72c + languageName: node + linkType: hard + +"make-fetch-happen@npm:^15.0.0": + version: 15.0.3 + resolution: "make-fetch-happen@npm:15.0.3" + dependencies: + "@npmcli/agent": ^4.0.0 + cacache: ^20.0.1 + http-cache-semantics: ^4.1.1 + minipass: ^7.0.2 + minipass-fetch: ^5.0.0 + minipass-flush: ^1.0.5 + minipass-pipeline: ^1.2.4 + negotiator: ^1.0.0 + proc-log: ^6.0.0 + promise-retry: ^2.0.1 + ssri: ^13.0.0 + checksum: 4fb9dbb739b33565c85dacdcff7eb9388d8f36f326a59dc13375f01af809c42c48aa5d1f4840ee36623b2461a15476e1e79e4548ca1af30b42e1e324705ac8b3 languageName: node linkType: hard @@ -8690,13 +8671,6 @@ __metadata: languageName: node linkType: hard -"map-cache@npm:^0.2.0": - version: 0.2.2 - resolution: "map-cache@npm:0.2.2" - checksum: 3067cea54285c43848bb4539f978a15dedc63c03022abeec6ef05c8cb6829f920f13b94bcaf04142fc6a088318e564c4785704072910d120d55dbc2e0c421969 - languageName: node - linkType: hard - "markdown-escapes@npm:^1.0.0": version: 1.0.4 resolution: "markdown-escapes@npm:1.0.4" @@ -8704,6 +8678,13 @@ __metadata: languageName: node linkType: hard +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 0e513b29d120f478c85a70f49da0b8b19bc638975eca466f2eeae0071f3ad00454c621bf66e16dd435896c208e719fc91ad79bbfba4e400fe0b372e7c1c9c9a2 + languageName: node + linkType: hard + "md5@npm:^2.3.0": version: 2.3.0 resolution: "md5@npm:2.3.0" @@ -8749,15 +8730,6 @@ __metadata: languageName: node linkType: hard -"mdbid@npm:1.0.0": - version: 1.0.0 - resolution: "mdbid@npm:1.0.0" - dependencies: - zerop: ^1.0.1 - checksum: abbf947ba222c1ebc242c151c2ff9e77388a7d399e4e5a23edda8810897767836e5eb45cc3f1e0689b5120df14496a81f87c7d3bec11a329e50777659ddef325 - languageName: node - linkType: hard - "mdn-data@npm:2.0.14": version: 2.0.14 resolution: "mdn-data@npm:2.0.14" @@ -8786,10 +8758,10 @@ __metadata: languageName: node linkType: hard -"merge-descriptors@npm:1.0.1": - version: 1.0.1 - resolution: "merge-descriptors@npm:1.0.1" - checksum: 5abc259d2ae25bb06d19ce2b94a21632583c74e2a9109ee1ba7fd147aa7362b380d971e0251069f8b3eb7d48c21ac839e21fa177b335e82c76ec172e30c31a26 +"merge-descriptors@npm:1.0.3": + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 52117adbe0313d5defa771c9993fe081e2d2df9b840597e966aadafde04ae8d0e3da46bac7ca4efc37d4d2b839436582659cd49c6a43eacb3fe3050896a105d1 languageName: node linkType: hard @@ -8806,25 +8778,15 @@ __metadata: checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 languageName: node linkType: hard - -"methods@npm:~1.1.2": - version: 1.1.2 - resolution: "methods@npm:1.1.2" - checksum: 0917ff4041fa8e2f2fda5425a955fe16ca411591fbd123c0d722fcf02b73971ed6f764d85f0a6f547ce49ee0221ce2c19a5fa692157931cecb422984f1dcd13a - languageName: node - linkType: hard - -"micromatch@npm:^4.0.4": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" - dependencies: - braces: ^3.0.2 - picomatch: ^2.3.1 - checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + +"methods@npm:~1.1.2": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: 0917ff4041fa8e2f2fda5425a955fe16ca411591fbd123c0d722fcf02b73971ed6f764d85f0a6f547ce49ee0221ce2c19a5fa692157931cecb422984f1dcd13a languageName: node linkType: hard -"micromatch@npm:^4.0.8": +"micromatch@npm:^4.0.4, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -8841,7 +8803,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -8873,6 +8835,24 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^10.0.1": + version: 10.2.4 + resolution: "minimatch@npm:10.2.4" + dependencies: + brace-expansion: ^5.0.2 + checksum: 56dce6b04c6b30b500d81d7a29822c108b7d58c46696ec7332d04a2bd104a5cb69e5c7ce93e1783dc66d61400d831e6e226ca101ac23665aff32ca303619dc3d + languageName: node + linkType: hard + +"minimatch@npm:^10.2.1": + version: 10.2.1 + resolution: "minimatch@npm:10.2.1" + dependencies: + brace-expansion: ^5.0.2 + checksum: 0b65a87895816dac4408ad077b025223bc14f38f367330f9846fa602964a896739d6e346997acbb867e2a7d5b444a75db9557bdd7f9500871b6817c3d53db9b1 + languageName: node + linkType: hard + "minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -8883,27 +8863,18 @@ __metadata: linkType: hard "minimatch@npm:^5.0.1": - version: 5.1.0 - resolution: "minimatch@npm:5.1.0" - dependencies: - brace-expansion: ^2.0.1 - checksum: 15ce53d31a06361e8b7a629501b5c75491bc2b59712d53e802b1987121d91b433d73fcc5be92974fde66b2b51d8fb28d75a9ae900d249feb792bb1ba2a4f0a90 - languageName: node - linkType: hard - -"minimatch@npm:^9.0.1": - version: 9.0.4 - resolution: "minimatch@npm:9.0.4" + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" dependencies: brace-expansion: ^2.0.1 - checksum: cf717f597ec3eed7dabc33153482a2e8d49f4fd3c26e58fd9c71a94c5029a0838728841b93f46bf1263b65a8010e2ee800d0dc9b004ab8ba8b6d1ec07cc115b5 + checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 languageName: node linkType: hard "minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": - version: 1.2.6 - resolution: "minimist@npm:1.2.6" - checksum: d15428cd1e11eb14e1233bcfb88ae07ed7a147de251441d61158619dfb32c4d7e9061d09cab4825fdee18ecd6fce323228c8c47b5ba7cd20af378ca4048fb3fb + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 languageName: node linkType: hard @@ -8916,9 +8887,18 @@ __metadata: languageName: node linkType: hard +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" + dependencies: + minipass: ^7.0.3 + checksum: b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 + languageName: node + linkType: hard + "minipass-fetch@npm:^2.0.3": - version: 2.1.0 - resolution: "minipass-fetch@npm:2.1.0" + version: 2.1.2 + resolution: "minipass-fetch@npm:2.1.2" dependencies: encoding: ^0.1.13 minipass: ^3.1.6 @@ -8927,7 +8907,22 @@ __metadata: dependenciesMeta: encoding: optional: true - checksum: 1334732859a3f7959ed22589bafd9c40384b885aebb5932328071c33f86b3eb181d54c86919675d1825ab5f1c8e4f328878c863873258d113c29d79a4b0c9c9f + checksum: 3f216be79164e915fc91210cea1850e488793c740534985da017a4cbc7a5ff50506956d0f73bb0cb60e4fe91be08b6b61ef35101706d3ef5da2c8709b5f08f91 + languageName: node + linkType: hard + +"minipass-fetch@npm:^5.0.0": + version: 5.0.1 + resolution: "minipass-fetch@npm:5.0.1" + dependencies: + encoding: ^0.1.13 + minipass: ^7.0.3 + minipass-sized: ^2.0.0 + minizlib: ^3.0.1 + dependenciesMeta: + encoding: + optional: true + checksum: afce548b0d2654b581b7a9eb6ae0dc70b556fa89aaa3e3cbc5c3df4cca837b041fd2393737b671148098dc7cb3a133b53aa826c2a00e631495d74987a3f03284 languageName: node linkType: hard @@ -8958,12 +8953,21 @@ __metadata: languageName: node linkType: hard +"minipass-sized@npm:^2.0.0": + version: 2.0.0 + resolution: "minipass-sized@npm:2.0.0" + dependencies: + minipass: ^7.1.2 + checksum: 1a1fd251aef4e24050a04ea03fdc0514960f7304a374fd01f352bfdb72c0a2c084ad05d63e76011c181cadfb38dbf487f8782e1e778337f6a099ac2da26b6d5d + languageName: node + linkType: hard + "minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": - version: 3.3.4 - resolution: "minipass@npm:3.3.4" + version: 3.3.6 + resolution: "minipass@npm:3.3.6" dependencies: yallist: ^4.0.0 - checksum: 5d95a7738c54852ba78d484141e850c792e062666a2d0c681a5ac1021275beb7e1acb077e59f9523ff1defb80901aea4e30fac10ded9a20a25d819a42916ef1b + checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 languageName: node linkType: hard @@ -8974,10 +8978,10 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.4": - version: 7.1.1 - resolution: "minipass@npm:7.1.1" - checksum: d2c461947a7530f93de4162aa3ca0a1bed1f121626906f6ec63a5ba05fd7b1d9bee4fe89a37a43db7241c2416be98a799c1796abae583c7180be37be5c392ef6 +"minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 2bfd325b95c555f2b4d2814d49325691c7bee937d753814861b0b49d5edcda55cbbf22b6b6a60bb91eddac8668771f03c5ff647dcd9d0f798e9548b9cdc46ee3 languageName: node linkType: hard @@ -8991,10 +8995,12 @@ __metadata: languageName: node linkType: hard -"mkdirp-classic@npm:^0.5.2": - version: 0.5.3 - resolution: "mkdirp-classic@npm:0.5.3" - checksum: 3f4e088208270bbcc148d53b73e9a5bd9eef05ad2cbf3b3d0ff8795278d50dd1d11a8ef1875ff5aea3fa888931f95bfcb2ad5b7c1061cfefd6284d199e6776ac +"minizlib@npm:^3.0.1, minizlib@npm:^3.1.0": + version: 3.1.0 + resolution: "minizlib@npm:3.1.0" + dependencies: + minipass: ^7.1.2 + checksum: a15e6f0128f514b7d41a1c68ce531155447f4669e32d279bba1c1c071ef6c2abd7e4d4579bb59ccc2ed1531346749665968fdd7be8d83eb6b6ae2fe1f3d370a7 languageName: node linkType: hard @@ -9025,14 +9031,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1": +"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -9064,30 +9063,12 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:3.3.4": - version: 3.3.4 - resolution: "nanoid@npm:3.3.4" +"nanoid@npm:3.3.11, nanoid@npm:^3.3.11, nanoid@npm:^3.3.6": + version: 3.3.11 + resolution: "nanoid@npm:3.3.11" bin: nanoid: bin/nanoid.cjs - checksum: 2fddd6dee994b7676f008d3ffa4ab16035a754f4bb586c61df5a22cf8c8c94017aadd360368f47d653829e0569a92b129979152ff97af23a558331e47e37cd9c - languageName: node - linkType: hard - -"nanoid@npm:^3.3.4, nanoid@npm:^3.3.8": - version: 3.3.8 - resolution: "nanoid@npm:3.3.8" - bin: - nanoid: bin/nanoid.cjs - checksum: dfe0adbc0c77e9655b550c333075f51bb28cfc7568afbf3237249904f9c86c9aaaed1f113f0fddddba75673ee31c758c30c43d4414f014a52a7a626efc5958c9 - languageName: node - linkType: hard - -"nanoid@npm:^3.3.6": - version: 3.3.7 - resolution: "nanoid@npm:3.3.7" - bin: - nanoid: bin/nanoid.cjs - checksum: d36c427e530713e4ac6567d488b489a36582ef89da1d6d4e3b87eded11eb10d7042a877958c6f104929809b2ab0bafa17652b076cdf84324aa75b30b722204f2 + checksum: 3be20d8866a57a6b6d218e82549711c8352ed969f9ab3c45379da28f405363ad4c9aeb0b39e9abc101a529ca65a72ff9502b00bf74a912c4b64a9d62dfd26c29 languageName: node linkType: hard @@ -9107,55 +9088,64 @@ __metadata: languageName: node linkType: hard -"negotiator@npm:0.6.3, negotiator@npm:^0.6.3": +"negotiator@npm:0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 languageName: node linkType: hard -"next@npm:12.3.4": - version: 12.3.4 - resolution: "next@npm:12.3.4" - dependencies: - "@next/env": 12.3.4 - "@next/swc-android-arm-eabi": 12.3.4 - "@next/swc-android-arm64": 12.3.4 - "@next/swc-darwin-arm64": 12.3.4 - "@next/swc-darwin-x64": 12.3.4 - "@next/swc-freebsd-x64": 12.3.4 - "@next/swc-linux-arm-gnueabihf": 12.3.4 - "@next/swc-linux-arm64-gnu": 12.3.4 - "@next/swc-linux-arm64-musl": 12.3.4 - "@next/swc-linux-x64-gnu": 12.3.4 - "@next/swc-linux-x64-musl": 12.3.4 - "@next/swc-win32-arm64-msvc": 12.3.4 - "@next/swc-win32-ia32-msvc": 12.3.4 - "@next/swc-win32-x64-msvc": 12.3.4 - "@swc/helpers": 0.4.11 - caniuse-lite: ^1.0.30001406 - postcss: 8.4.14 - styled-jsx: 5.0.7 - use-sync-external-store: 1.2.0 - peerDependencies: - fibers: ">= 3.1.0" - node-sass: ^6.0.0 || ^7.0.0 - react: ^17.0.2 || ^18.0.0-0 - react-dom: ^17.0.2 || ^18.0.0-0 +"negotiator@npm:^0.6.3": + version: 0.6.4 + resolution: "negotiator@npm:0.6.4" + checksum: 7ded10aa02a0707d1d12a9973fdb5954f98547ca7beb60e31cb3a403cc6e8f11138db7a3b0128425cf836fc85d145ec4ce983b2bdf83dca436af879c2d683510 + languageName: node + linkType: hard + +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 20ebfe79b2d2e7cf9cbc8239a72662b584f71164096e6e8896c8325055497c96f6b80cd22c258e8a2f2aa382a787795ec3ee8b37b422a302c7d4381b0d5ecfbb + languageName: node + linkType: hard + +"neo-async@npm:^2.6.2": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 + languageName: node + linkType: hard + +"next@npm:^15.5.12": + version: 15.5.12 + resolution: "next@npm:15.5.12" + dependencies: + "@next/env": 15.5.12 + "@next/swc-darwin-arm64": 15.5.12 + "@next/swc-darwin-x64": 15.5.12 + "@next/swc-linux-arm64-gnu": 15.5.12 + "@next/swc-linux-arm64-musl": 15.5.12 + "@next/swc-linux-x64-gnu": 15.5.12 + "@next/swc-linux-x64-musl": 15.5.12 + "@next/swc-win32-arm64-msvc": 15.5.12 + "@next/swc-win32-x64-msvc": 15.5.12 + "@swc/helpers": 0.5.15 + caniuse-lite: ^1.0.30001579 + postcss: 8.4.31 + sharp: ^0.34.3 + styled-jsx: 5.1.6 + peerDependencies: + "@opentelemetry/api": ^1.1.0 + "@playwright/test": ^1.51.1 + babel-plugin-react-compiler: "*" + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 sass: ^1.3.0 dependenciesMeta: - "@next/swc-android-arm-eabi": - optional: true - "@next/swc-android-arm64": - optional: true "@next/swc-darwin-arm64": optional: true "@next/swc-darwin-x64": optional: true - "@next/swc-freebsd-x64": - optional: true - "@next/swc-linux-arm-gnueabihf": - optional: true "@next/swc-linux-arm64-gnu": optional: true "@next/swc-linux-arm64-musl": @@ -9166,20 +9156,22 @@ __metadata: optional: true "@next/swc-win32-arm64-msvc": optional: true - "@next/swc-win32-ia32-msvc": - optional: true "@next/swc-win32-x64-msvc": optional: true + sharp: + optional: true peerDependenciesMeta: - fibers: + "@opentelemetry/api": optional: true - node-sass: + "@playwright/test": + optional: true + babel-plugin-react-compiler: optional: true sass: optional: true bin: next: dist/bin/next - checksum: d96fc4f5bcd5a630d74111519f4820dcbd75dddf16c6d00d2167bd3cb8d74965d46d83c8e5ec301bf999013c7d96f1bfff9424f0221317d68b594c4d01f5825e + checksum: 9deec1039e169ca994874a7ae089fff42f22b9561ade0ca5335ad3fa29d0876c92f1d754b779c067d2db2ccadf1bb77466d928fbee71421c660f0dcb5796bdbd languageName: node linkType: hard @@ -9190,9 +9182,21 @@ __metadata: languageName: node linkType: hard +"node-exports-info@npm:^1.6.0": + version: 1.6.0 + resolution: "node-exports-info@npm:1.6.0" + dependencies: + array.prototype.flatmap: ^1.3.3 + es-errors: ^1.3.0 + object.entries: ^1.1.9 + semver: ^6.3.1 + checksum: 6bb93ec7ae95717aa2a2c315a5df1f7efa9f0592ee6fcde83256e112db33b59f0942d4188e154e84ec03f9de2d5ea62aa278e2d57b8624f6434168e8d7701e44 + languageName: node + linkType: hard + "node-fetch@npm:^2.6.1": - version: 2.6.7 - resolution: "node-fetch@npm:2.6.7" + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" dependencies: whatwg-url: ^5.0.0 peerDependencies: @@ -9200,19 +9204,20 @@ __metadata: peerDependenciesMeta: encoding: optional: true - checksum: 8d816ffd1ee22cab8301c7756ef04f3437f18dace86a1dae22cf81db8ef29c0bf6655f3215cb0cdb22b420b6fe141e64b26905e7f33f9377a7fa59135ea3e10b + checksum: d76d2f5edb451a3f05b15115ec89fc6be39de37c6089f1b6368df03b91e1633fd379a7e01b7ab05089a25034b2023d959b47e59759cb38d88341b2459e89d6e5 languageName: node linkType: hard -"node-gyp@npm:^9.0.0, node-gyp@npm:latest": - version: 9.0.0 - resolution: "node-gyp@npm:9.0.0" +"node-gyp@npm:^9.0.0": + version: 9.4.1 + resolution: "node-gyp@npm:9.4.1" dependencies: env-paths: ^2.2.0 + exponential-backoff: ^3.1.1 glob: ^7.1.4 graceful-fs: ^4.2.6 make-fetch-happen: ^10.0.3 - nopt: ^5.0.0 + nopt: ^6.0.0 npmlog: ^6.0.0 rimraf: ^3.0.2 semver: ^7.3.5 @@ -9220,7 +9225,27 @@ __metadata: which: ^2.0.2 bin: node-gyp: bin/node-gyp.js - checksum: 4d8ef8860f7e4f4d86c91db3f519d26ed5cc23b48fe54543e2afd86162b4acbd14f21de42a5db344525efb69a991e021b96a68c70c6e2d5f4a5cb770793da6d3 + checksum: 8576c439e9e925ab50679f87b7dfa7aa6739e42822e2ad4e26c36341c0ba7163fdf5a946f0a67a476d2f24662bc40d6c97bd9e79ced4321506738e6b760a1577 + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 12.2.0 + resolution: "node-gyp@npm:12.2.0" + dependencies: + env-paths: ^2.2.0 + exponential-backoff: ^3.1.1 + graceful-fs: ^4.2.6 + make-fetch-happen: ^15.0.0 + nopt: ^9.0.0 + proc-log: ^6.0.0 + semver: ^7.3.5 + tar: ^7.5.4 + tinyglobby: ^0.2.12 + which: ^6.0.0 + bin: + node-gyp: bin/node-gyp.js + checksum: d4ce0acd08bd41004f45e10cef468f4bd15eaafb3acc388a0c567416e1746dc005cc080b8a3495e4e2ae2eed170a2123ff622c2d6614062f4a839837dcf1dd9d languageName: node linkType: hard @@ -9231,28 +9256,32 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.13": - version: 2.0.13 - resolution: "node-releases@npm:2.0.13" - checksum: 17ec8f315dba62710cae71a8dad3cd0288ba943d2ece43504b3b1aa8625bf138637798ab470b1d9035b0545996f63000a8a926e0f6d35d0996424f8b6d36dda3 +"node-releases@npm:^2.0.27": + version: 2.0.27 + resolution: "node-releases@npm:2.0.27" + checksum: a9a54079d894704c2ec728a690b41fbc779a710f5d47b46fa3e460acff08a3e7dfa7108e5599b2db390aa31dac062c47c5118317201f12784188dc5b415f692d languageName: node linkType: hard -"node-releases@npm:^2.0.5": - version: 2.0.5 - resolution: "node-releases@npm:2.0.5" - checksum: e85d949addd19f8827f32569d2be5751e7812ccf6cc47879d49f79b5234ff4982225e39a3929315f96370823b070640fb04d79fc0ddec8b515a969a03493a42f +"nopt@npm:^6.0.0": + version: 6.0.0 + resolution: "nopt@npm:6.0.0" + dependencies: + abbrev: ^1.0.0 + bin: + nopt: bin/nopt.js + checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac languageName: node linkType: hard -"nopt@npm:^5.0.0": - version: 5.0.0 - resolution: "nopt@npm:5.0.0" +"nopt@npm:^9.0.0": + version: 9.0.0 + resolution: "nopt@npm:9.0.0" dependencies: - abbrev: 1 + abbrev: ^4.0.0 bin: nopt: bin/nopt.js - checksum: d35fdec187269503843924e0114c0c6533fb54bbf1620d0f28b4b60ba01712d6687f62565c55cc20a504eff0fbe5c63e22340c3fad549ad40469ffb611b04f2f + checksum: 7a5d9ab0629eaec1944a95438cc4efa6418ed2834aa8eb21a1bea579a7d8ac3e30120131855376a96ef59ab0e23ad8e0bc94d3349770a95e5cb7119339f7c7fb languageName: node linkType: hard @@ -9263,20 +9292,6 @@ __metadata: languageName: node linkType: hard -"normalize-range@npm:^0.1.2": - version: 0.1.2 - resolution: "normalize-range@npm:0.1.2" - checksum: 9b2f14f093593f367a7a0834267c24f3cb3e887a2d9809c77d8a7e5fd08738bcd15af46f0ab01cc3a3d660386f015816b5c922cea8bf2ee79777f40874063184 - languageName: node - linkType: hard - -"normalize-url@npm:^5.3.0": - version: 5.3.1 - resolution: "normalize-url@npm:5.3.1" - checksum: 99dde2f8cbf65f121428fea0768e03f2c30ce14f1f30343fe2bb21f1ce7503ff853380ee48ae7901da31ba205c047e65004c2960207a43555b36cbee4dd7f74f - languageName: node - linkType: hard - "npm-run-path@npm:^4.0.1": version: 4.0.1 resolution: "npm-run-path@npm:4.0.1" @@ -9307,17 +9322,10 @@ __metadata: languageName: node linkType: hard -"nwsapi@npm:^2.2.0": - version: 2.2.1 - resolution: "nwsapi@npm:2.2.1" - checksum: 6c21fcb6950538012516b39137ed9b53ed56843e521362e977282c781169f229e7bca8ec6e207165b19912550f360806b222f77b6c9202bb8d66818456875c3d - languageName: node - linkType: hard - -"oauth-sign@npm:~0.9.0": - version: 0.9.0 - resolution: "oauth-sign@npm:0.9.0" - checksum: 8f5497a127967866a3c67094c21efd295e46013a94e6e828573c62220e9af568cc1d2d04b16865ba583e430510fa168baf821ea78f355146d8ed7e350fc44c64 +"nwsapi@npm:^2.2.2": + version: 2.2.23 + resolution: "nwsapi@npm:2.2.23" + checksum: 7af519de08381df9dc0c913d817255cb21e33671641603f6cdabe8cb04b18b32aca1477fdc5dfe08b2039125afa3216d3ef01a3c2603a97d114e842d9414e0c3 languageName: node linkType: hard @@ -9335,10 +9343,10 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.12.0, object-inspect@npm:^1.9.0": - version: 1.12.2 - resolution: "object-inspect@npm:1.12.2" - checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2 +"object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 582810c6a8d2ef988ea0a39e69e115a138dad8f42dd445383b394877e5816eb4268489f316a6f74ee9c4e0a984b3eab1028e3e79d62b1ed67c726661d55c7a8b languageName: node linkType: hard @@ -9349,74 +9357,83 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.0, object.assign@npm:^4.1.2": - version: 4.1.2 - resolution: "object.assign@npm:4.1.2" +"object.assign@npm:^4.1.4, object.assign@npm:^4.1.7": + version: 4.1.7 + resolution: "object.assign@npm:4.1.7" dependencies: - call-bind: ^1.0.0 - define-properties: ^1.1.3 - has-symbols: ^1.0.1 + call-bind: ^1.0.8 + call-bound: ^1.0.3 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + has-symbols: ^1.1.0 object-keys: ^1.1.1 - checksum: d621d832ed7b16ac74027adb87196804a500d80d9aca536fccb7ba48d33a7e9306a75f94c1d29cbfa324bc091bfc530bc24789568efdaee6a47fcfa298993814 + checksum: 60e07d2651cf4f5528c485f1aa4dbded9b384c47d80e8187cefd11320abb1aebebf78df5483451dfa549059f8281c21f7b4bf7d19e9e5e97d8d617df0df298de languageName: node linkType: hard -"object.entries@npm:^1.1.5": - version: 1.1.5 - resolution: "object.entries@npm:1.1.5" +"object.entries@npm:^1.1.9": + version: 1.1.9 + resolution: "object.entries@npm:1.1.9" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.1 - checksum: d658696f74fd222060d8428d2a9fda2ce736b700cb06f6bdf4a16a1892d145afb746f453502b2fa55d1dca8ead6f14ddbcf66c545df45adadea757a6c4cd86c7 + call-bind: ^1.0.8 + call-bound: ^1.0.4 + define-properties: ^1.2.1 + es-object-atoms: ^1.1.1 + checksum: 0ab2ef331c4d6a53ff600a5d69182948d453107c3a1f7fd91bc29d387538c2aba21d04949a74f57c21907208b1f6fb175567fd1f39f1a7a4046ba1bca762fb41 languageName: node linkType: hard -"object.fromentries@npm:^2.0.5": - version: 2.0.5 - resolution: "object.fromentries@npm:2.0.5" +"object.fromentries@npm:^2.0.8": + version: 2.0.8 + resolution: "object.fromentries@npm:2.0.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.1 - checksum: 61a0b565ded97b76df9e30b569729866e1824cce902f98e90bb106e84f378aea20163366f66dc75c9000e2aad2ed0caf65c6f530cb2abc4c0c0f6c982102db4b + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-object-atoms: ^1.0.0 + checksum: 29b2207a2db2782d7ced83f93b3ff5d425f901945f3665ffda1821e30a7253cd1fd6b891a64279976098137ddfa883d748787a6fea53ecdb51f8df8b8cec0ae1 languageName: node linkType: hard "object.getownpropertydescriptors@npm:^2.1.0": - version: 2.1.4 - resolution: "object.getownpropertydescriptors@npm:2.1.4" + version: 2.1.9 + resolution: "object.getownpropertydescriptors@npm:2.1.9" dependencies: - array.prototype.reduce: ^1.0.4 - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.1 - checksum: 988c466fe49fc4f19a28d2d1d894c95c6abfe33c94674ec0b14d96eed71f453c7ad16873d430dc2acbb1760de6d3d2affac4b81237a306012cc4dc49f7539e7f + array.prototype.reduce: ^1.0.8 + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-abstract: ^1.24.0 + es-object-atoms: ^1.1.1 + gopd: ^1.2.0 + safe-array-concat: ^1.1.3 + checksum: 6fc6419b7cd403019a0c5f039d428d4578e64267f4159499911b772da43a69da5fd16c74fe3f82290deff11e0cf1a8630ac8a7e778a0d753f196d48e468b0cf8 languageName: node linkType: hard -"object.hasown@npm:^1.1.1": - version: 1.1.1 - resolution: "object.hasown@npm:1.1.1" +"object.groupby@npm:^1.0.3": + version: 1.0.3 + resolution: "object.groupby@npm:1.0.3" dependencies: - define-properties: ^1.1.4 - es-abstract: ^1.19.5 - checksum: d8ed4907ce57f48b93e3b53c418fd6787bf226a51e8d698c91e39b78e80fe5b124cb6282f6a9d5be21cf9e2c7829ab10206dcc6112b7748860eefe641880c793 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + checksum: 0d30693ca3ace29720bffd20b3130451dca7a56c612e1926c0a1a15e4306061d84410bdb1456be2656c5aca53c81b7a3661eceaa362db1bba6669c2c9b6d1982 languageName: node linkType: hard -"object.values@npm:^1.1.0, object.values@npm:^1.1.5": - version: 1.1.5 - resolution: "object.values@npm:1.1.5" +"object.values@npm:^1.1.0, object.values@npm:^1.1.6, object.values@npm:^1.2.1": + version: 1.2.1 + resolution: "object.values@npm:1.2.1" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.1 - checksum: 0f17e99741ebfbd0fa55ce942f6184743d3070c61bd39221afc929c8422c4907618c8da694c6915bc04a83ab3224260c779ba37fc07bb668bdc5f33b66a902a4 + call-bind: ^1.0.8 + call-bound: ^1.0.3 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: f9b9a2a125ccf8ded29414d7c056ae0d187b833ee74919821fc60d7e216626db220d9cb3cf33f965c84aaaa96133626ca13b80f3c158b673976dc8cfcfcd26bb languageName: node linkType: hard -"on-finished@npm:2.4.1": +"on-finished@npm:~2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" dependencies: @@ -9425,16 +9442,7 @@ __metadata: languageName: node linkType: hard -"on-finished@npm:~2.3.0": - version: 2.3.0 - resolution: "on-finished@npm:2.3.0" - dependencies: - ee-first: 1.1.1 - checksum: 1db595bd963b0124d6fa261d18320422407b8f01dc65863840f3ddaaf7bcad5b28ff6847286703ca53f4ec19595bd67a2f1253db79fc4094911ec6aa8df1671b - languageName: node - linkType: hard - -"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": +"once@npm:^1.3.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -9461,31 +9469,17 @@ __metadata: languageName: node linkType: hard -"optionator@npm:^0.8.1": - version: 0.8.3 - resolution: "optionator@npm:0.8.3" - dependencies: - deep-is: ~0.1.3 - fast-levenshtein: ~2.0.6 - levn: ~0.3.0 - prelude-ls: ~1.1.2 - type-check: ~0.3.2 - word-wrap: ~1.2.3 - checksum: b8695ddf3d593203e25ab0900e265d860038486c943ff8b774f596a310f8ceebdb30c6832407a8198ba3ec9debe1abe1f51d4aad94843612db3b76d690c61d34 - languageName: node - linkType: hard - "optionator@npm:^0.9.1": - version: 0.9.1 - resolution: "optionator@npm:0.9.1" + version: 0.9.4 + resolution: "optionator@npm:0.9.4" dependencies: deep-is: ^0.1.3 fast-levenshtein: ^2.0.6 levn: ^0.4.1 prelude-ls: ^1.2.1 type-check: ^0.4.0 - word-wrap: ^1.2.3 - checksum: dbc6fa065604b24ea57d734261914e697bd73b69eff7f18e967e8912aa2a40a19a9f599a507fa805be6c13c24c4eae8c71306c239d517d42d4c041c942f508a0 + word-wrap: ^1.2.5 + checksum: ecbd010e3dc73e05d239976422d9ef54a82a13f37c11ca5911dff41c98a6c7f0f163b27f922c37e7f8340af9d36febd3b6e9cef508f3339d4c393d7276d716bb languageName: node linkType: hard @@ -9506,19 +9500,14 @@ __metadata: languageName: node linkType: hard -"os-tmpdir@npm:~1.0.2": - version: 1.0.2 - resolution: "os-tmpdir@npm:1.0.2" - checksum: 5666560f7b9f10182548bf7013883265be33620b1c1b4a4d405c25be2636f970c5488ff3e6c48de75b55d02bde037249fe5dbfbb4c0fb7714953d56aed062e6d - languageName: node - linkType: hard - -"p-limit@npm:^1.1.0": - version: 1.3.0 - resolution: "p-limit@npm:1.3.0" +"own-keys@npm:^1.0.1": + version: 1.0.1 + resolution: "own-keys@npm:1.0.1" dependencies: - p-try: ^1.0.0 - checksum: 281c1c0b8c82e1ac9f81acd72a2e35d402bf572e09721ce5520164e9de07d8274451378a3470707179ad13240535558f4b277f02405ad752e08c7d5b0d54fbfd + get-intrinsic: ^1.2.6 + object-keys: ^1.1.1 + safe-push-apply: ^1.0.0 + checksum: cc9dd7d85c4ccfbe8109fce307d581ac7ede7b26de892b537873fbce2dc6a206d89aea0630dbb98e47ce0873517cefeaa7be15fcf94aaf4764a3b34b474a5b61 languageName: node linkType: hard @@ -9540,15 +9529,6 @@ __metadata: languageName: node linkType: hard -"p-locate@npm:^2.0.0": - version: 2.0.0 - resolution: "p-locate@npm:2.0.0" - dependencies: - p-limit: ^1.1.0 - checksum: e2dceb9b49b96d5513d90f715780f6f4972f46987dc32a0e18bc6c3fc74a1a5d73ec5f81b1398af5e58b99ea1ad03fd41e9181c01fa81b4af2833958696e3081 - languageName: node - linkType: hard - "p-locate@npm:^3.0.0": version: 3.0.0 resolution: "p-locate@npm:3.0.0" @@ -9576,6 +9556,13 @@ __metadata: languageName: node linkType: hard +"p-map@npm:^7.0.2": + version: 7.0.4 + resolution: "p-map@npm:7.0.4" + checksum: 4be2097e942f2fd3a4f4b0c6585c721f23851de8ad6484d20c472b3ea4937d5cd9a59914c832b1bceac7bf9d149001938036b82a52de0bc381f61ff2d35d26a5 + languageName: node + linkType: hard + "p-retry@npm:4.6.2, p-retry@npm:^4.6.2": version: 4.6.2 resolution: "p-retry@npm:4.6.2" @@ -9586,13 +9573,6 @@ __metadata: languageName: node linkType: hard -"p-try@npm:^1.0.0": - version: 1.0.0 - resolution: "p-try@npm:1.0.0" - checksum: 3b5303f77eb7722144154288bfd96f799f8ff3e2b2b39330efe38db5dd359e4fb27012464cd85cb0a76e9b7edd1b443568cb3192c22e7cffc34989df0bafd605 - languageName: node - linkType: hard - "p-try@npm:^2.0.0": version: 2.2.0 resolution: "p-try@npm:2.2.0" @@ -9623,17 +9603,6 @@ __metadata: languageName: node linkType: hard -"parse-filepath@npm:^1.0.2": - version: 1.0.2 - resolution: "parse-filepath@npm:1.0.2" - dependencies: - is-absolute: ^1.0.0 - map-cache: ^0.2.0 - path-root: ^0.1.1 - checksum: 6794c3f38d3921f0f7cc63fb1fb0c4d04cd463356ad389c8ce6726d3c50793b9005971f4138975a6d7025526058d5e65e9bfe634d0765e84c4e2571152665a69 - languageName: node - linkType: hard - "parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" @@ -9657,13 +9626,6 @@ __metadata: languageName: node linkType: hard -"parse5@npm:5.1.0": - version: 5.1.0 - resolution: "parse5@npm:5.1.0" - checksum: 13c44c6d47035a3cc75303655ae5630dc264f9b9ab8344feb3f79ca195d8b57a2a246af902abef1d780ad1eee92eb9b88cd03098a7ee7dd111f032152ebaf0a6 - languageName: node - linkType: hard - "parse5@npm:^6.0.0": version: 6.0.1 resolution: "parse5@npm:6.0.1" @@ -9671,12 +9633,12 @@ __metadata: languageName: node linkType: hard -"parse5@npm:^7.0.0": - version: 7.0.0 - resolution: "parse5@npm:7.0.0" +"parse5@npm:^7.1.1": + version: 7.3.0 + resolution: "parse5@npm:7.3.0" dependencies: - entities: ^4.3.0 - checksum: 7da5d61cc18eb36ffa71fc861e65cbfd1f23d96483a6631254e627be667dbc9c93ac0b0e6cb17a13a2e4033dab19bfb2f76f38e5936cfb57240ed49036a83fcc + entities: ^6.0.0 + checksum: ffd040c4695d93f0bc370e3d6d75c1b352178514af41be7afa212475ea5cead1d6e377cd9d4cec6a5e2bcf497ca50daf9e0088eadaa37dbc271f60def08fdfcd languageName: node linkType: hard @@ -9687,6 +9649,13 @@ __metadata: languageName: node linkType: hard +"path-browserify@npm:^1.0.1": + version: 1.0.1 + resolution: "path-browserify@npm:1.0.1" + checksum: c6d7fa376423fe35b95b2d67990060c3ee304fc815ff0a2dc1c6c3cfaff2bd0d572ee67e18f19d0ea3bbe32e8add2a05021132ac40509416459fffee35200699 + languageName: node + linkType: hard + "path-exists@npm:^3.0.0": version: 3.0.0 resolution: "path-exists@npm:3.0.0" @@ -9722,36 +9691,20 @@ __metadata: languageName: node linkType: hard -"path-root-regex@npm:^0.1.0": - version: 0.1.2 - resolution: "path-root-regex@npm:0.1.2" - checksum: dcd75d1f8e93faabe35a58e875b0f636839b3658ff2ad8c289463c40bc1a844debe0dab73c3398ef9dc8f6ec6c319720aff390cf4633763ddcf3cf4b1bbf7e8b - languageName: node - linkType: hard - -"path-root@npm:^0.1.1": - version: 0.1.1 - resolution: "path-root@npm:0.1.1" - dependencies: - path-root-regex: ^0.1.0 - checksum: ff88aebfc1c59ace510cc06703d67692a11530989920427625e52b66a303ca9b3d4059b0b7d0b2a73248d1ad29bcb342b8b786ec00592f3101d38a45fd3b2e08 - languageName: node - linkType: hard - -"path-scurry@npm:^1.11.0": - version: 1.11.1 - resolution: "path-scurry@npm:1.11.1" +"path-scurry@npm:^2.0.0": + version: 2.0.1 + resolution: "path-scurry@npm:2.0.1" dependencies: - lru-cache: ^10.2.0 - minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - checksum: 890d5abcd593a7912dcce7cf7c6bf7a0b5648e3dee6caf0712c126ca0a65c7f3d7b9d769072a4d1baf370f61ce493ab5b038d59988688e0c5f3f646ee3c69023 + lru-cache: ^11.0.0 + minipass: ^7.1.2 + checksum: a022c6c38fed836079d03f96540eafd4cd989acf287b99613c82300107f366e889513ad8b671a2039a9d251122621f9c6fa649f0bd4d50acf95a6943a6692dbf languageName: node linkType: hard -"path-to-regexp@npm:0.1.7": - version: 0.1.7 - resolution: "path-to-regexp@npm:0.1.7" - checksum: 69a14ea24db543e8b0f4353305c5eac6907917031340e5a8b37df688e52accd09e3cebfe1660b70d76b6bd89152f52183f28c74813dbf454ba1a01c82a38abce +"path-to-regexp@npm:~0.1.12": + version: 0.1.12 + resolution: "path-to-regexp@npm:0.1.12" + checksum: ab237858bee7b25ecd885189f175ab5b5161e7b712b360d44f5c4516b8d271da3e4bf7bf0a7b9153ecb04c7d90ce8ff5158614e1208819cf62bac2b08452722e languageName: node linkType: hard @@ -9762,20 +9715,6 @@ __metadata: languageName: node linkType: hard -"pend@npm:~1.2.0": - version: 1.2.0 - resolution: "pend@npm:1.2.0" - checksum: 6c72f5243303d9c60bd98e6446ba7d30ae29e3d56fdb6fae8767e8ba6386f33ee284c97efe3230a0d0217e2b1723b8ab490b1bbf34fcbb2180dbc8a9de47850d - languageName: node - linkType: hard - -"performance-now@npm:^2.1.0": - version: 2.1.0 - resolution: "performance-now@npm:2.1.0" - checksum: 534e641aa8f7cba160f0afec0599b6cecefbb516a2e837b512be0adbe6c1da5550e89c78059c7fabc5c9ffdf6627edabe23eb7c518c4500067a898fa65c2b550 - languageName: node - linkType: hard - "picocolors@npm:^0.2.1": version: 0.2.1 resolution: "picocolors@npm:0.2.1" @@ -9783,14 +9722,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 - languageName: node - linkType: hard - -"picocolors@npm:^1.1.1": +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 @@ -9804,6 +9736,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.3": + version: 4.0.3 + resolution: "picomatch@npm:4.0.3" + checksum: 6817fb74eb745a71445debe1029768de55fd59a42b75606f478ee1d0dc1aa6e78b711d041a7c9d5550e042642029b7f373dc1a43b224c4b7f12d23436735dba0 + languageName: node + linkType: hard + "pify@npm:^2.3.0": version: 2.3.0 resolution: "pify@npm:2.3.0" @@ -9818,17 +9757,10 @@ __metadata: languageName: node linkType: hard -"pirates@npm:^4.0.1, pirates@npm:^4.0.4": - version: 4.0.6 - resolution: "pirates@npm:4.0.6" - checksum: 46a65fefaf19c6f57460388a5af9ab81e3d7fd0e7bc44ca59d753cb5c4d0df97c6c6e583674869762101836d68675f027d60f841c105d72734df9dfca97cbcc6 - languageName: node - linkType: hard - -"pirates@npm:^4.0.5": - version: 4.0.5 - resolution: "pirates@npm:4.0.5" - checksum: c9994e61b85260bec6c4fc0307016340d9b0c4f4b6550a957afaaff0c9b1ad58fbbea5cfcf083860a25cb27a375442e2b0edf52e2e1e40e69934e08dcc52d227 +"pirates@npm:^4.0.1, pirates@npm:^4.0.4, pirates@npm:^4.0.6": + version: 4.0.7 + resolution: "pirates@npm:4.0.7" + checksum: 3dcbaff13c8b5bc158416feb6dc9e49e3c6be5fddc1ea078a05a73ef6b85d79324bbb1ef59b954cdeff000dbf000c1d39f32dc69310c7b78fbada5171b583e40 languageName: node linkType: hard @@ -9859,10 +9791,10 @@ __metadata: languageName: node linkType: hard -"pn@npm:^1.1.0": +"possible-typed-array-names@npm:^1.0.0": version: 1.1.0 - resolution: "pn@npm:1.1.0" - checksum: e4654186dc92a187c8c7fe4ccda902f4d39dd9c10f98d1c5a08ce5fad5507ef1e33ddb091240c3950bee81bd201b4c55098604c433a33b5e8bdd97f38b732fa0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: cfcd4f05264eee8fd184cd4897a17890561d1d473434b43ab66ad3673d9c9128981ec01e0cb1d65a52cd6b1eebfb2eae1e53e39b2e0eca86afc823ede7a4f41b languageName: node linkType: hard @@ -9902,31 +9834,36 @@ __metadata: linkType: hard "postcss-js@npm:^4.0.1": - version: 4.0.1 - resolution: "postcss-js@npm:4.0.1" + version: 4.1.0 + resolution: "postcss-js@npm:4.1.0" dependencies: camelcase-css: ^2.0.1 peerDependencies: postcss: ^8.4.21 - checksum: 5c1e83efeabeb5a42676193f4357aa9c88f4dc1b3c4a0332c132fe88932b33ea58848186db117cf473049fc233a980356f67db490bd0a7832ccba9d0b3fd3491 + checksum: 1fe3d51770f66d301e63103c15830d26875b1ae9bbe3ba6bf61256860edde3d9c0de5aa0c3e34d34b80c099f5d95b589cfcc92dac718253c8351aa8e05a8d80a languageName: node linkType: hard -"postcss-load-config@npm:^4.0.2": - version: 4.0.2 - resolution: "postcss-load-config@npm:4.0.2" +"postcss-load-config@npm:^4.0.2 || ^5.0 || ^6.0": + version: 6.0.1 + resolution: "postcss-load-config@npm:6.0.1" dependencies: - lilconfig: ^3.0.0 - yaml: ^2.3.4 + lilconfig: ^3.1.1 peerDependencies: + jiti: ">=1.21.0" postcss: ">=8.0.9" - ts-node: ">=9.0.0" + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: + jiti: + optional: true postcss: optional: true - ts-node: + tsx: optional: true - checksum: 7c27dd3801db4eae207a5116fed2db6b1ebb780b40c3dd62a3e57e087093a8e6a14ee17ada729fee903152d6ef4826c6339eb135bee6208e0f3140d7e8090185 + yaml: + optional: true + checksum: 701061264cce7646e53e4cecd14aa95432a9bd508f30520a31dfa4c86fe9252d5d8d0204fdbfbddc1559c9b8791556e9c4b92c56070f5fca0a6c60e5ee9ad0fd languageName: node linkType: hard @@ -9958,14 +9895,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.4.14": - version: 8.4.14 - resolution: "postcss@npm:8.4.14" +"postcss@npm:8.4.31": + version: 8.4.31 + resolution: "postcss@npm:8.4.31" dependencies: - nanoid: ^3.3.4 + nanoid: ^3.3.6 picocolors: ^1.0.0 source-map-js: ^1.0.2 - checksum: fe58766ff32e4becf65a7d57678995cfd239df6deed2fe0557f038b47c94e4132e7e5f68b5aa820c13adfec32e523b693efaeb65798efb995ce49ccd83953816 + checksum: 1d8611341b073143ad90486fcdfeab49edd243377b1f51834dc4f6d028e82ce5190e4f11bb2633276864503654fb7cab28e67abdc0fbf9d1f88cad4a0ff0beea languageName: node linkType: hard @@ -9979,25 +9916,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.47": - version: 8.5.1 - resolution: "postcss@npm:8.5.1" +"postcss@npm:^8.4.47, postcss@npm:^8.4.5": + version: 8.5.6 + resolution: "postcss@npm:8.5.6" dependencies: - nanoid: ^3.3.8 + nanoid: ^3.3.11 picocolors: ^1.1.1 source-map-js: ^1.2.1 - checksum: cfdcfcd019fca78160341080ba8986cf80cd6e9ca327ba61b86c03e95043e9bce56ad2e018851858039fd7264781797360bfba718dd216b17b3cd803a5134f2f - languageName: node - linkType: hard - -"postcss@npm:^8.4.5": - version: 8.4.31 - resolution: "postcss@npm:8.4.31" - dependencies: - nanoid: ^3.3.6 - picocolors: ^1.0.0 - source-map-js: ^1.0.2 - checksum: 1d8611341b073143ad90486fcdfeab49edd243377b1f51834dc4f6d028e82ce5190e4f11bb2633276864503654fb7cab28e67abdc0fbf9d1f88cad4a0ff0beea + checksum: 20f3b5d673ffeec2b28d65436756d31ee33f65b0a8bedb3d32f556fbd5973be38c3a7fb5b959a5236c60a5db7b91b0a6b14ffaac0d717dce1b903b964ee1c1bb languageName: node linkType: hard @@ -10008,19 +9934,12 @@ __metadata: languageName: node linkType: hard -"prelude-ls@npm:~1.1.2": - version: 1.1.2 - resolution: "prelude-ls@npm:1.1.2" - checksum: c4867c87488e4a0c233e158e4d0d5565b609b105d75e4c05dc760840475f06b731332eb93cc8c9cecb840aa8ec323ca3c9a56ad7820ad2e63f0261dadcb154e4 - languageName: node - linkType: hard - "prettier@npm:^2.5.0": - version: 2.7.1 - resolution: "prettier@npm:2.7.1" + version: 2.8.8 + resolution: "prettier@npm:2.8.8" bin: prettier: bin-prettier.js - checksum: 55a4409182260866ab31284d929b3cb961e5fdb91fe0d2e099dac92eaecec890f36e524b4c19e6ceae839c99c6d7195817579cdffc8e2c80da0cb794463a748b + checksum: b49e409431bf129dd89238d64299ba80717b57ff5a6d1c1a8b1a28b590d998a34e083fa13573bc732bb8d2305becb4c9a4407f8486c81fa7d55100eb08263cf8 languageName: node linkType: hard @@ -10036,13 +9955,20 @@ __metadata: linkType: hard "prismjs@npm:^1.25.0": - version: 1.28.0 - resolution: "prismjs@npm:1.28.0" - checksum: bde93fb2beb45b7243219fc53855f59ee54b3fa179f315e8f9d66244d756ef984462e10561bbdc6713d3d7e051852472d7c284f5794a8791eeaefea2fb910b16 + version: 1.30.0 + resolution: "prismjs@npm:1.30.0" + checksum: a68eddd4c5f1c506badb5434b0b28a7cc2479ed1df91bc4218e6833c7971ef40c50ec481ea49749ac964256acb78d8b66a6bd11554938e8998e46c18b5f9a580 + languageName: node + linkType: hard + +"proc-log@npm:^6.0.0": + version: 6.1.0 + resolution: "proc-log@npm:6.1.0" + checksum: ac450ff8244e95b0c9935b52d629fef92ae69b7e39aea19972a8234259614d644402dd62ce9cb094f4a637d8a4514cba90c1456ad785a40ad5b64d502875a817 languageName: node linkType: hard -"progress@npm:^2.0.0, progress@npm:^2.0.1": +"progress@npm:^2.0.0": version: 2.0.3 resolution: "progress@npm:2.0.3" checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7 @@ -10115,61 +10041,26 @@ __metadata: languageName: node linkType: hard -"proxy-from-env@npm:^1.1.0": - version: 1.1.0 - resolution: "proxy-from-env@npm:1.1.0" - checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 - languageName: node - linkType: hard - -"psl@npm:^1.1.28, psl@npm:^1.1.33": - version: 1.9.0 - resolution: "psl@npm:1.9.0" - checksum: 20c4277f640c93d393130673f392618e9a8044c6c7bf61c53917a0fddb4952790f5f362c6c730a9c32b124813e173733f9895add8d26f566ed0ea0654b2e711d - languageName: node - linkType: hard - -"pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" +"psl@npm:^1.1.33": + version: 1.15.0 + resolution: "psl@npm:1.15.0" dependencies: - end-of-stream: ^1.1.0 - once: ^1.3.1 - checksum: e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 - languageName: node - linkType: hard - -"punycode@npm:^2.1.0, punycode@npm:^2.1.1": - version: 2.1.1 - resolution: "punycode@npm:2.1.1" - checksum: 823bf443c6dd14f669984dea25757b37993f67e8d94698996064035edd43bed8a5a17a9f12e439c2b35df1078c6bec05a6c86e336209eb1061e8025c481168e8 + punycode: ^2.3.1 + checksum: 6f777d82eecfe1c2406dadbc15e77467b186fec13202ec887a45d0209a2c6fca530af94a462a477c3c4a767ad892ec9ede7c482d98f61f653dd838b50e89dc15 languageName: node linkType: hard -"puppeteer@npm:^8.0.0": - version: 8.0.0 - resolution: "puppeteer@npm:8.0.0" - dependencies: - debug: ^4.1.0 - devtools-protocol: 0.0.854822 - extract-zip: ^2.0.0 - https-proxy-agent: ^5.0.0 - node-fetch: ^2.6.1 - pkg-dir: ^4.2.0 - progress: ^2.0.1 - proxy-from-env: ^1.1.0 - rimraf: ^3.0.2 - tar-fs: ^2.0.0 - unbzip2-stream: ^1.3.3 - ws: ^7.2.3 - checksum: ee5fb8269dab61abc4f7cccd5d1eb283534f279be27c12825678170aa2effcb93263b11f8432ad08c034d29424ca0b71af3d6cf60ebce3b38b110ab722f11ecb +"punycode@npm:^2.1.0, punycode@npm:^2.1.1, punycode@npm:^2.3.1": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: bb0a0ceedca4c3c57a9b981b90601579058903c62be23c5e8e843d2c2d4148a3ecf029d5133486fb0e1822b098ba8bba09e89d6b21742d02fa26bda6441a6fb2 languageName: node linkType: hard "pure-rand@npm:^6.0.0": - version: 6.0.4 - resolution: "pure-rand@npm:6.0.4" - checksum: e1c4e69f8bf7303e5252756d67c3c7551385cd34d94a1f511fe099727ccbab74c898c03a06d4c4a24a89b51858781057b83ebbfe740d984240cdc04fead36068 + version: 6.1.0 + resolution: "pure-rand@npm:6.1.0" + checksum: 8d53bc02bed99eca0b65b505090152ee7e9bd67dd74f8ff32ba1c883b87234067c5bf68d2614759fb217d82594d7a92919e6df80f97885e7b12b42af4bd3316a languageName: node linkType: hard @@ -10180,19 +10071,19 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.11.0": - version: 6.11.0 - resolution: "qs@npm:6.11.0" +"qs@npm:~6.14.0": + version: 6.14.2 + resolution: "qs@npm:6.14.2" dependencies: - side-channel: ^1.0.4 - checksum: 6e1f29dd5385f7488ec74ac7b6c92f4d09a90408882d0c208414a34dd33badc1a621019d4c799a3df15ab9b1d0292f97c1dd71dc7c045e69f81a8064e5af7297 + side-channel: ^1.1.0 + checksum: e613d0b8d02cec33c20d1a6015ec2a5db614bf3dd2ffd9bde08bc34a76419213f291c91fb00519a3d8a74e4727f565b350f8394f9d381bc64e6da663d9e031d4 languageName: node linkType: hard -"qs@npm:~6.5.2": - version: 6.5.3 - resolution: "qs@npm:6.5.3" - checksum: 6f20bf08cabd90c458e50855559539a28d00b2f2e7dddcb66082b16a43188418cb3cb77cbd09268bcef6022935650f0534357b8af9eeb29bf0f27ccb17655692 +"querystringify@npm:^2.1.1": + version: 2.2.0 + resolution: "querystringify@npm:2.2.0" + checksum: 5641ea231bad7ef6d64d9998faca95611ed4b11c2591a8cae741e178a974f6a8e0ebde008475259abe1621cb15e692404e6b6626e927f7b849d5c09392604b15 languageName: node linkType: hard @@ -10210,28 +10101,27 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:2.5.2": - version: 2.5.2 - resolution: "raw-body@npm:2.5.2" +"raw-body@npm:~2.5.3": + version: 2.5.3 + resolution: "raw-body@npm:2.5.3" dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - checksum: ba1583c8d8a48e8fbb7a873fdbb2df66ea4ff83775421bfe21ee120140949ab048200668c47d9ae3880012f6e217052690628cf679ddfbd82c9fc9358d574676 + bytes: ~3.1.2 + http-errors: ~2.0.1 + iconv-lite: ~0.4.24 + unpipe: ~1.0.0 + checksum: 16aa51e504318ebeef7f84a4d884c0f273cb0b7f3f14ea88788f92f5f488870617c97d4f886e84f119f21a2d6cdda3c4554821f8b18ed6be0d731ecb5a063d2a languageName: node linkType: hard -"react-dom@npm:^17.0.2": - version: 17.0.2 - resolution: "react-dom@npm:17.0.2" +"react-dom@npm:18.2.0": + version: 18.2.0 + resolution: "react-dom@npm:18.2.0" dependencies: loose-envify: ^1.1.0 - object-assign: ^4.1.1 - scheduler: ^0.20.2 + scheduler: ^0.23.0 peerDependencies: - react: 17.0.2 - checksum: 1c1eaa3bca7c7228d24b70932e3d7c99e70d1d04e13bb0843bbf321582bc25d7961d6b8a6978a58a598af2af496d1cedcfb1bf65f6b0960a0a8161cb8dab743c + react: ^18.2.0 + checksum: 7d323310bea3a91be2965f9468d552f201b1c27891e45ddc2d6b8f717680c95a75ae0bc1e3f5cf41472446a2589a75aed4483aee8169287909fcd59ad149e8cc languageName: node linkType: hard @@ -10248,6 +10138,13 @@ __metadata: languageName: node linkType: hard +"react-is@npm:^16.12.0 || ^17.0.0 || ^18.0.0, react-is@npm:^18.0.0, react-is@npm:^18.2.0": + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: e20fe84c86ff172fc8d898251b7cc2c43645d108bf96d0b8edf39b98f9a2cae97b40520ee7ed8ee0085ccc94736c4886294456033304151c3f94978cec03df21 + languageName: node + linkType: hard + "react-is@npm:^16.13.1": version: 16.13.1 resolution: "react-is@npm:16.13.1" @@ -10255,13 +10152,6 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^18.0.0": - version: 18.2.0 - resolution: "react-is@npm:18.2.0" - checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e - languageName: node - linkType: hard - "react-lifecycles-compat@npm:^3.0.0": version: 3.0.4 resolution: "react-lifecycles-compat@npm:3.0.4" @@ -10270,39 +10160,63 @@ __metadata: linkType: hard "react-modal@npm:^3.11.1": - version: 3.15.1 - resolution: "react-modal@npm:3.15.1" + version: 3.16.3 + resolution: "react-modal@npm:3.16.3" dependencies: exenv: ^1.2.0 prop-types: ^15.7.2 react-lifecycles-compat: ^3.0.0 warning: ^4.0.3 peerDependencies: - react: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 - react-dom: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 - checksum: ee99ca312c35bcec9ef0868babf970ce03c52801731e29be336bb6bdc867a1ecf00a73e1fb5bc3b1b1ef66ceb0c9b4a0199fadb85b1b9829f731409951b018f0 + react: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19 + react-dom: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19 + checksum: e7863e7058c469cd6da82cbc9627d39b305259554f6999cc007ad0988bc1fdb225aa8a7bd756d83da0475b381a3fe2a6e1e045c4ee2eaa64dc30d588d6d8028f languageName: node linkType: hard -"react-tabs@npm:^3.2.3": - version: 3.2.3 - resolution: "react-tabs@npm:3.2.3" +"react-shallow-renderer@npm:^16.15.0": + version: 16.15.0 + resolution: "react-shallow-renderer@npm:16.15.0" + dependencies: + object-assign: ^4.1.1 + react-is: ^16.12.0 || ^17.0.0 || ^18.0.0 + peerDependencies: + react: ^16.0.0 || ^17.0.0 || ^18.0.0 + checksum: 6052c7e3e9627485120ebd8257f128aad8f56386fe8d42374b7743eac1be457c33506d153c7886b4e32923c0c352d402ab805ef9ca02dbcd8393b2bdeb6e5af8 + languageName: node + linkType: hard + +"react-tabs@npm:^6.1.0": + version: 6.1.0 + resolution: "react-tabs@npm:6.1.0" dependencies: - clsx: ^1.1.0 + clsx: ^2.0.0 prop-types: ^15.5.0 peerDependencies: - react: ^16.3.0 || ^17.0.0-0 - checksum: 9fd8a577f2705f3c8049606b9a3dfd01a0d589fa2ac741b3f6b365e454bcb52b9dfb2088417ea369693202496a960ce0e2655d4c050b6a98cf98cbec9c2f77bd + react: ^18.0.0 || ^19.0.0 + checksum: 6b0379002106feeba4456d38948135b60a7c880a1dfbd67dc2c9660cf7e2c1d355c1a3050418eba65f74fb3e6ead34967aa7f216356537e6c8f3265793028341 + languageName: node + linkType: hard + +"react-test-renderer@npm:18.2.0": + version: 18.2.0 + resolution: "react-test-renderer@npm:18.2.0" + dependencies: + react-is: ^18.2.0 + react-shallow-renderer: ^16.15.0 + scheduler: ^0.23.0 + peerDependencies: + react: ^18.2.0 + checksum: 6b6980ced93fa2b72662d5e4ab3b4896833586940047ce52ca9aca801e5432adf05fcbe28289b0af3ce6a2a7c590974e25dcc8aa43d0de658bfe8bbcd686f958 languageName: node linkType: hard -"react@npm:^17.0.2": - version: 17.0.2 - resolution: "react@npm:17.0.2" +"react@npm:18.2.0": + version: 18.2.0 + resolution: "react@npm:18.2.0" dependencies: loose-envify: ^1.1.0 - object-assign: ^4.1.1 - checksum: b254cc17ce3011788330f7bbf383ab653c6848902d7936a87b09d835d091e3f295f7e9dd1597c6daac5dc80f90e778c8230218ba8ad599f74adcc11e33b9d61b + checksum: 88e38092da8839b830cda6feef2e8505dec8ace60579e46aa5490fc3dc9bba0bd50336507dc166f43e3afc1c42939c09fe33b25fae889d6f402721dcd78fca1b languageName: node linkType: hard @@ -10315,14 +10229,14 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": - version: 3.6.0 - resolution: "readable-stream@npm:3.6.0" +"readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" dependencies: inherits: ^2.0.3 string_decoder: ^1.1.1 util-deprecate: ^1.0.1 - checksum: d4ea81502d3799439bb955a3a5d1d808592cf3133350ed352aeaa499647858b27b1c4013984900238b0873ec8d0d8defce72469fb7a83e61d53f5ad61cb80dc8 + checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d languageName: node linkType: hard @@ -10335,15 +10249,6 @@ __metadata: languageName: node linkType: hard -"rechoir@npm:^0.6.2": - version: 0.6.2 - resolution: "rechoir@npm:0.6.2" - dependencies: - resolve: ^1.1.6 - checksum: fe76bf9c21875ac16e235defedd7cbd34f333c02a92546142b7911a0f7c7059d2e16f441fe6fb9ae203f459c05a31b2bcf26202896d89e390eda7514d5d2702b - languageName: node - linkType: hard - "redent@npm:^3.0.0": version: 3.0.0 resolution: "redent@npm:3.0.0" @@ -10354,12 +10259,28 @@ __metadata: languageName: node linkType: hard -"regenerate-unicode-properties@npm:^10.0.1": - version: 10.0.1 - resolution: "regenerate-unicode-properties@npm:10.0.1" +"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": + version: 1.0.10 + resolution: "reflect.getprototypeof@npm:1.0.10" + dependencies: + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-abstract: ^1.23.9 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + get-intrinsic: ^1.2.7 + get-proto: ^1.0.1 + which-builtin-type: ^1.2.1 + checksum: ccc5debeb66125e276ae73909cecb27e47c35d9bb79d9cc8d8d055f008c58010ab8cb401299786e505e4aab733a64cba9daf5f312a58e96a43df66adad221870 + languageName: node + linkType: hard + +"regenerate-unicode-properties@npm:^10.2.2": + version: 10.2.2 + resolution: "regenerate-unicode-properties@npm:10.2.2" dependencies: regenerate: ^1.4.2 - checksum: 1b638b7087d8143e5be3e20e2cda197ea0440fa0bc2cc49646b2f50c5a2b1acdc54b21e4215805a5a2dd487c686b2291accd5ad00619534098d2667e76247754 + checksum: 7ae4c1c32460c4360e3118c45eec0621424908f430fdd6f162c9172067786bf2b1682fbc885a33b26bc85e76e06f4d3f398b52425e801b0bb0cbae147dafb0b2 languageName: node linkType: hard @@ -10370,37 +10291,17 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:^0.13.11": - version: 0.13.11 - resolution: "regenerator-runtime@npm:0.13.11" - checksum: 27481628d22a1c4e3ff551096a683b424242a216fee44685467307f14d58020af1e19660bf2e26064de946bad7eff28950eae9f8209d55723e2d9351e632bbb4 - languageName: node - linkType: hard - -"regenerator-runtime@npm:^0.13.4": - version: 0.13.9 - resolution: "regenerator-runtime@npm:0.13.9" - checksum: 65ed455fe5afd799e2897baf691ca21c2772e1a969d19bb0c4695757c2d96249eb74ee3553ea34a91062b2a676beedf630b4c1551cc6299afb937be1426ec55e - languageName: node - linkType: hard - -"regenerator-transform@npm:^0.15.0": - version: 0.15.0 - resolution: "regenerator-transform@npm:0.15.0" - dependencies: - "@babel/runtime": ^7.8.4 - checksum: 86e54849ab1167618d28bb56d214c52a983daf29b0d115c976d79840511420049b6b42c9ebdf187defa8e7129bdd74b6dd266420d0d3868c9fa7f793b5d15d49 - languageName: node - linkType: hard - -"regexp.prototype.flags@npm:^1.4.1, regexp.prototype.flags@npm:^1.4.3": - version: 1.4.3 - resolution: "regexp.prototype.flags@npm:1.4.3" +"regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": + version: 1.5.4 + resolution: "regexp.prototype.flags@npm:1.5.4" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - functions-have-names: ^1.2.2 - checksum: 51228bae732592adb3ededd5e15426be25f289e9c4ef15212f4da73f4ec3919b6140806374b8894036a86020d054a8d2657d3fee6bb9b4d35d8939c20030b7a6 + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-errors: ^1.3.0 + get-proto: ^1.0.1 + gopd: ^1.2.0 + set-function-name: ^2.0.2 + checksum: 18cb667e56cb328d2dda569d7f04e3ea78f2683135b866d606538cf7b1d4271f7f749f09608c877527799e6cf350e531368f3c7a20ccd1bb41048a48926bdeeb languageName: node linkType: hard @@ -10411,35 +10312,35 @@ __metadata: languageName: node linkType: hard -"regexpu-core@npm:^5.1.0": - version: 5.1.0 - resolution: "regexpu-core@npm:5.1.0" +"regexpu-core@npm:^6.3.1": + version: 6.4.0 + resolution: "regexpu-core@npm:6.4.0" dependencies: regenerate: ^1.4.2 - regenerate-unicode-properties: ^10.0.1 - regjsgen: ^0.6.0 - regjsparser: ^0.8.2 + regenerate-unicode-properties: ^10.2.2 + regjsgen: ^0.8.0 + regjsparser: ^0.13.0 unicode-match-property-ecmascript: ^2.0.0 - unicode-match-property-value-ecmascript: ^2.0.0 - checksum: 7b4eb8d182d9d10537a220a93138df5bc7eaf4ed53e36b95e8427d33ed8a2b081468f1a15d3e5fcee66517e1df7f5ca180b999e046d060badd97150f2ffe87b2 + unicode-match-property-value-ecmascript: ^2.2.1 + checksum: a316eb988599b7fb9d77f4adb937c41c022504dc91ddd18175c11771addc7f1d9dce550f34e36038395e459a2cf9ffc0d663bfe8d3c6c186317ca000ba79a8cf languageName: node linkType: hard -"regjsgen@npm:^0.6.0": - version: 0.6.0 - resolution: "regjsgen@npm:0.6.0" - checksum: c5158ebd735e75074e41292ade1ff05d85566d205426cc61501e360c450a63baced8512ee3ae238e5c0a0e42969563c7875b08fa69d6f0402daf36bcb3e4d348 +"regjsgen@npm:^0.8.0": + version: 0.8.0 + resolution: "regjsgen@npm:0.8.0" + checksum: a1d925ff14a4b2be774e45775ee6b33b256f89c42d480e6d85152d2133f18bd3d6af662161b226fa57466f7efec367eaf7ccd2a58c0ec2a1306667ba2ad07b0d languageName: node linkType: hard -"regjsparser@npm:^0.8.2": - version: 0.8.4 - resolution: "regjsparser@npm:0.8.4" +"regjsparser@npm:^0.13.0": + version: 0.13.0 + resolution: "regjsparser@npm:0.13.0" dependencies: - jsesc: ~0.5.0 + jsesc: ~3.1.0 bin: regjsparser: bin/parser - checksum: d069b932491761cda127ce11f6bd2729c3b1b394a35200ec33f1199e937423db28ceb86cf33f0a97c76ecd7c0f8db996476579eaf0d80a1f74c1934f4ca8b27a + checksum: 1cf09f6afde2b2d1c1e89e1ce3034e3ee8d9433912728dbaa48e123f5f43ce34e263b2a8ab228817dce85d676ee0c801a512101b015ac9ab80ed449cf7329d3a languageName: node linkType: hard @@ -10517,58 +10418,6 @@ __metadata: languageName: node linkType: hard -"request-promise-core@npm:1.1.4": - version: 1.1.4 - resolution: "request-promise-core@npm:1.1.4" - dependencies: - lodash: ^4.17.19 - peerDependencies: - request: ^2.34 - checksum: c798bafd552961e36fbf5023b1d081e81c3995ab390f1bc8ef38a711ba3fe4312eb94dbd61887073d7356c3499b9380947d7f62faa805797c0dc50f039425699 - languageName: node - linkType: hard - -"request-promise-native@npm:^1.0.7": - version: 1.0.9 - resolution: "request-promise-native@npm:1.0.9" - dependencies: - request-promise-core: 1.1.4 - stealthy-require: ^1.1.1 - tough-cookie: ^2.3.3 - peerDependencies: - request: ^2.34 - checksum: 3e2c694eefac88cb20beef8911ad57a275ab3ccbae0c4ca6c679fffb09d5fd502458aab08791f0814ca914b157adab2d4e472597c97a73be702918e41725ed69 - languageName: node - linkType: hard - -"request@npm:^2.88.0": - version: 2.88.2 - resolution: "request@npm:2.88.2" - dependencies: - aws-sign2: ~0.7.0 - aws4: ^1.8.0 - caseless: ~0.12.0 - combined-stream: ~1.0.6 - extend: ~3.0.2 - forever-agent: ~0.6.1 - form-data: ~2.3.2 - har-validator: ~5.1.3 - http-signature: ~1.2.0 - is-typedarray: ~1.0.0 - isstream: ~0.1.2 - json-stringify-safe: ~5.0.1 - mime-types: ~2.1.19 - oauth-sign: ~0.9.0 - performance-now: ^2.1.0 - qs: ~6.5.2 - safe-buffer: ^5.1.2 - tough-cookie: ~2.5.0 - tunnel-agent: ^0.6.0 - uuid: ^3.3.2 - checksum: 4e112c087f6eabe7327869da2417e9d28fcd0910419edd2eb17b6acfc4bfa1dad61954525949c228705805882d8a98a86a0ea12d7f739c01ee92af7062996983 - languageName: node - linkType: hard - "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" @@ -10583,10 +10432,17 @@ __metadata: languageName: node linkType: hard +"requires-port@npm:^1.0.0": + version: 1.0.0 + resolution: "requires-port@npm:1.0.0" + checksum: eee0e303adffb69be55d1a214e415cf42b7441ae858c76dfc5353148644f6fd6e698926fc4643f510d5c126d12a705e7c8ed7e38061113bdf37547ab356797ff + languageName: node + linkType: hard + "reselect@npm:^4.0.0": - version: 4.1.6 - resolution: "reselect@npm:4.1.6" - checksum: 3ea1058422904063ec93c8f4693fe33dcb2178bbf417ace8db5b2c797a5875cf357d9308d11ed3942ee22507dd34ecfbf1f3a21340a4f31c206cab1d36ceef31 + version: 4.1.8 + resolution: "reselect@npm:4.1.8" + checksum: a4ac87cedab198769a29be92bc221c32da76cfdad6911eda67b4d3e7136dca86208c3b210e31632eae31ebd2cded18596f0dd230d3ccc9e978df22f233b5583e languageName: node linkType: hard @@ -10613,114 +10469,75 @@ __metadata: languageName: node linkType: hard -"resolve.exports@npm:^2.0.0": - version: 2.0.2 - resolution: "resolve.exports@npm:2.0.2" - checksum: 1c7778ca1b86a94f8ab4055d196c7d87d1874b96df4d7c3e67bbf793140f0717fd506dcafd62785b079cd6086b9264424ad634fb904409764c3509c3df1653f2 - languageName: node - linkType: hard - -"resolve@npm:^1.1.6, resolve@npm:^1.1.7, resolve@npm:^1.12.0, resolve@npm:^1.13.1, resolve@npm:^1.14.2, resolve@npm:^1.20.0, resolve@npm:^1.22.0": - version: 1.22.1 - resolution: "resolve@npm:1.22.1" - dependencies: - is-core-module: ^2.9.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e - languageName: node - linkType: hard - -"resolve@npm:^1.22.8": - version: 1.22.10 - resolution: "resolve@npm:1.22.10" - dependencies: - is-core-module: ^2.16.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: ab7a32ff4046fcd7c6fdd525b24a7527847d03c3650c733b909b01b757f92eb23510afa9cc3e9bf3f26a3e073b48c88c706dfd4c1d2fb4a16a96b73b6328ddcf - languageName: node - linkType: hard - -"resolve@npm:^1.3.2": - version: 1.22.3 - resolution: "resolve@npm:1.22.3" - dependencies: - is-core-module: ^2.12.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: fb834b81348428cb545ff1b828a72ea28feb5a97c026a1cf40aa1008352c72811ff4d4e71f2035273dc536dcfcae20c13604ba6283c612d70fa0b6e44519c374 +"resolve-pkg-maps@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-pkg-maps@npm:1.0.0" + checksum: 1012afc566b3fdb190a6309cc37ef3b2dcc35dff5fa6683a9d00cd25c3247edfbc4691b91078c97adc82a29b77a2660c30d791d65dab4fc78bfc473f60289977 languageName: node linkType: hard -"resolve@npm:^2.0.0-next.3": - version: 2.0.0-next.4 - resolution: "resolve@npm:2.0.0-next.4" - dependencies: - is-core-module: ^2.9.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: c438ac9a650f2030fd074219d7f12ceb983b475da2d89ad3d6dd05fbf6b7a0a8cd37d4d10b43cb1f632bc19f22246ab7f36ebda54d84a29bfb2910a0680906d3 +"resolve.exports@npm:^2.0.0": + version: 2.0.3 + resolution: "resolve.exports@npm:2.0.3" + checksum: abfb9f98278dcd0c19b8a49bb486abfafa23df4636d49128ea270dc982053c3ef230a530aecda1fae1322873fdfa6c97674fc539651ddfdb375ac58e0b8ef6df languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#~builtin<compat/resolve>, resolve@patch:resolve@^1.1.7#~builtin<compat/resolve>, resolve@patch:resolve@^1.12.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.13.1#~builtin<compat/resolve>, resolve@patch:resolve@^1.14.2#~builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.0#~builtin<compat/resolve>": - version: 1.22.1 - resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin<compat/resolve>::version=1.22.1&hash=07638b" +"resolve@npm:^1.1.7, resolve@npm:^1.12.0, resolve@npm:^1.13.1, resolve@npm:^1.20.0, resolve@npm:^1.22.11, resolve@npm:^1.22.4, resolve@npm:^1.22.8, resolve@npm:^1.3.2": + version: 1.22.11 + resolution: "resolve@npm:1.22.11" dependencies: - is-core-module: ^2.9.0 + is-core-module: ^2.16.1 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b + checksum: 6d5baa2156b95a65ac431e7642e21106584e9f4194da50871cae8bc1bbd2b53bb7cee573c92543d83bb999620b224a087f62379d800ed1ccb189da6df5d78d50 languageName: node linkType: hard -"resolve@patch:resolve@^1.22.8#~builtin<compat/resolve>": - version: 1.22.10 - resolution: "resolve@patch:resolve@npm%3A1.22.10#~builtin<compat/resolve>::version=1.22.10&hash=07638b" +"resolve@npm:^2.0.0-next.5": + version: 2.0.0-next.6 + resolution: "resolve@npm:2.0.0-next.6" dependencies: - is-core-module: ^2.16.0 + es-errors: ^1.3.0 + is-core-module: ^2.16.1 + node-exports-info: ^1.6.0 + object-keys: ^1.1.1 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: 8aac1e4e4628bd00bf4b94b23de137dd3fe44097a8d528fd66db74484be929936e20c696e1a3edf4488f37e14180b73df6f600992baea3e089e8674291f16c9d + checksum: bc5a4f8f4dd7e1a3d2d8cdd2818b7cc3334283d2ef067f462d2ab3a4ab8f969d69438d7553268f59a2b5b4c1b42d18fabb3241a6d0279276ab578ba74455822e languageName: node linkType: hard -"resolve@patch:resolve@^1.3.2#~builtin<compat/resolve>": - version: 1.22.3 - resolution: "resolve@patch:resolve@npm%3A1.22.3#~builtin<compat/resolve>::version=1.22.3&hash=07638b" +"resolve@patch:resolve@^1.1.7#~builtin<compat/resolve>, resolve@patch:resolve@^1.12.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.13.1#~builtin<compat/resolve>, resolve@patch:resolve@^1.20.0#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.11#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.4#~builtin<compat/resolve>, resolve@patch:resolve@^1.22.8#~builtin<compat/resolve>, resolve@patch:resolve@^1.3.2#~builtin<compat/resolve>": + version: 1.22.11 + resolution: "resolve@patch:resolve@npm%3A1.22.11#~builtin<compat/resolve>::version=1.22.11&hash=07638b" dependencies: - is-core-module: ^2.12.0 + is-core-module: ^2.16.1 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: ad59734723b596d0891321c951592ed9015a77ce84907f89c9d9307dd0c06e11a67906a3e628c4cae143d3e44898603478af0ddeb2bba3f229a9373efe342665 + checksum: 1462da84ac3410d7c2e12e4f5f25c1423d8a174c3b4245c43eafea85e7bbe6af3eb7ec10a4850b5e518e8531608604742b8cbd761e1acd7ad1035108b7c98013 languageName: node linkType: hard -"resolve@patch:resolve@^2.0.0-next.3#~builtin<compat/resolve>": - version: 2.0.0-next.4 - resolution: "resolve@patch:resolve@npm%3A2.0.0-next.4#~builtin<compat/resolve>::version=2.0.0-next.4&hash=07638b" +"resolve@patch:resolve@^2.0.0-next.5#~builtin<compat/resolve>": + version: 2.0.0-next.6 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.6#~builtin<compat/resolve>::version=2.0.0-next.6&hash=07638b" dependencies: - is-core-module: ^2.9.0 + es-errors: ^1.3.0 + is-core-module: ^2.16.1 + node-exports-info: ^1.6.0 + object-keys: ^1.1.1 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: 4bf9f4f8a458607af90518ff73c67a4bc1a38b5a23fef2bb0ccbd45e8be89820a1639b637b0ba377eb2be9eedfb1739a84cde24fe4cd670c8207d8fea922b011 + checksum: 514c6d4e5e7249f8a93e776724b22c72090ecedb3cb6846ba14c591e918716bb41b2f857e4ce47c8bd88e068aca85f6a8f70f1c5abecc16d345bf00f3a587fb9 languageName: node linkType: hard @@ -10789,9 +10606,9 @@ __metadata: linkType: hard "reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + version: 1.1.0 + resolution: "reusify@npm:1.1.0" + checksum: 64cb3142ac5e9ad689aca289585cb41d22521f4571f73e9488af39f6b1bd62f0cbb3d65e2ecc768ec6494052523f473f1eb4b55c3e9014b3590c17fc6a03e22a languageName: node linkType: hard @@ -10828,14 +10645,15 @@ __metadata: "@svgr/webpack": ^5.5.0 "@tailwindcss/typography": 0.5.2 "@types/jest": ^29.5.4 - "@types/react": ^17.0.83 - "@types/react-dom": ^17.0.26 + "@types/react": ^18.3.28 + "@types/react-dom": ^18.3.7 + "@types/react-test-renderer": 18.3.1 "@types/semver": ^7.5.5 "@typescript-eslint/eslint-plugin": 2.x "@typescript-eslint/parser": 2.x - "@webiny/react-composition": ^5.39.6 - "@webiny/react-properties": ^5.39.6 - "@webiny/utils": latest + "@webiny/react-composition": ^5.44.0 + "@webiny/react-properties": ^5.44.0 + "@webiny/utils": ^5.44.0 autoprefixer: ^10.4.0 babel-eslint: 10.x babel-plugin-module-resolver: ^4.1.0 @@ -10861,15 +10679,13 @@ __metadata: front-matter: ^4.0.2 fs-extra: ^9.1.0 globby: ^11.1.0 - glyphhanger: ^4.0.1 inquirer: ^8.2.4 jest: ^29.6.4 - jsdom: ^20.0.0 load-json-file: ^6.2.0 lodash.memoize: ^4.1.2 minimatch: ^3.0.4 ncp: ^2.0.0 - next: 12.3.4 + next: ^15.5.12 node-gyp: ^9.0.0 p-map: 4.0.0 p-retry: ^4.6.2 @@ -10879,10 +10695,11 @@ __metadata: prettier: ^2.5.0 prismjs: ^1.25.0 prompt-sync: ^4.2.0 - react: ^17.0.2 - react-dom: ^17.0.2 + react: 18.2.0 + react-dom: 18.2.0 react-image-lightbox: ^5.1.4 - react-tabs: ^3.2.3 + react-tabs: ^6.1.0 + react-test-renderer: 18.2.0 redent: ^3.0.0 replace-in-path: ^1.1.0 rimraf: ^3.0.2 @@ -10892,6 +10709,8 @@ __metadata: tinytime: ^0.2.6 titlecase: ^1.1.3 ts-jest: ^29.1.1 + ts-morph: ^27.0.2 + tsx: ^4.21.0 walk: ^2.3.15 write-json-file: ^4.3.0 wts: "https://github.com/webiny/wts#ae82e59470d79dc448a74239bf9d2328f4b93499" @@ -10915,29 +10734,56 @@ __metadata: linkType: hard "rxjs@npm:^7.0.0, rxjs@npm:^7.5.5": - version: 7.5.5 - resolution: "rxjs@npm:7.5.5" + version: 7.8.2 + resolution: "rxjs@npm:7.8.2" dependencies: tslib: ^2.1.0 - checksum: e034f60805210cce756dd2f49664a8108780b117cf5d0e2281506e9e6387f7b4f1532d974a8c8b09314fa7a16dd2f6cff3462072a5789672b5dcb45c4173f3c6 + checksum: 2f233d7c832a6c255dabe0759014d7d9b1c9f1cb2f2f0d59690fd11c883c9826ea35a51740c06ab45b6ade0d9087bde9192f165cba20b6730d344b831ef80744 + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.1.3": + version: 1.1.3 + resolution: "safe-array-concat@npm:1.1.3" + dependencies: + call-bind: ^1.0.8 + call-bound: ^1.0.2 + get-intrinsic: ^1.2.6 + has-symbols: ^1.1.0 + isarray: ^2.0.5 + checksum: 00f6a68140e67e813f3ad5e73e6dedcf3e42a9fa01f04d44b0d3f7b1f4b257af876832a9bfc82ac76f307e8a6cc652e3cf95876048a26cbec451847cf6ae3707 languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:5.2.1, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 languageName: node linkType: hard -"safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c +"safe-push-apply@npm:^1.0.0": + version: 1.0.0 + resolution: "safe-push-apply@npm:1.0.0" + dependencies: + es-errors: ^1.3.0 + isarray: ^2.0.5 + checksum: 8c11cbee6dc8ff5cc0f3d95eef7052e43494591384015902e4292aef4ae9e539908288520ed97179cee17d6ffb450fe5f05a46ce7a1749685f7524fd568ab5db + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.0.3, safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + is-regex: ^1.2.1 + checksum: 3c809abeb81977c9ed6c869c83aca6873ea0f3ab0f806b8edbba5582d51713f8a6e9757d24d2b4b088f563801475ea946c8e77e7713e8c65cdd02305b6caedab languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 @@ -10951,15 +10797,6 @@ __metadata: languageName: node linkType: hard -"saxes@npm:^3.1.9": - version: 3.1.11 - resolution: "saxes@npm:3.1.11" - dependencies: - xmlchars: ^2.1.1 - checksum: 3b69918c013fffae51c561f629a0f620c02dba70f762dab38f3cd92676dfe5edf1f0a523ca567882838f1a80e26e4671a8c2c689afa05c68f45a78261445aba0 - languageName: node - linkType: hard - "saxes@npm:^6.0.0": version: 6.0.0 resolution: "saxes@npm:6.0.0" @@ -10969,55 +10806,36 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.20.2": - version: 0.20.2 - resolution: "scheduler@npm:0.20.2" +"scheduler@npm:^0.23.0": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" dependencies: loose-envify: ^1.1.0 - object-assign: ^4.1.1 - checksum: c4b35cf967c8f0d3e65753252d0f260271f81a81e427241295c5a7b783abf4ea9e905f22f815ab66676f5313be0a25f47be582254db8f9241b259213e999b8fc + checksum: 3e82d1f419e240ef6219d794ff29c7ee415fbdc19e038f680a10c067108e06284f1847450a210b29bbaf97b9d8a97ced5f624c31c681248ac84c80d56ad5a2c4 languageName: node linkType: hard "schema-utils@npm:^3.0.0": - version: 3.1.1 - resolution: "schema-utils@npm:3.1.1" + version: 3.3.0 + resolution: "schema-utils@npm:3.3.0" dependencies: "@types/json-schema": ^7.0.8 ajv: ^6.12.5 ajv-keywords: ^3.5.2 - checksum: fb73f3d759d43ba033c877628fe9751620a26879f6301d3dbeeb48cf2a65baec5cdf99da65d1bf3b4ff5444b2e59cbe4f81c2456b5e0d2ba7d7fd4aed5da29ce - languageName: node - linkType: hard - -"semver@npm:7.0.0": - version: 7.0.0 - resolution: "semver@npm:7.0.0" - bin: - semver: bin/semver.js - checksum: 272c11bf8d083274ef79fe40a81c55c184dff84dd58e3c325299d0927ba48cece1f020793d138382b85f89bab5002a35a5ba59a3a68a7eebbb597eb733838778 + checksum: ea56971926fac2487f0757da939a871388891bc87c6a82220d125d587b388f1704788f3706e7f63a7b70e49fc2db974c41343528caea60444afd5ce0fe4b85c0 languageName: node linkType: hard "semver@npm:^5.4.1, semver@npm:^5.6.0": - version: 5.7.1 - resolution: "semver@npm:5.7.1" - bin: - semver: ./bin/semver - checksum: 57fd0acfd0bac382ee87cd52cd0aaa5af086a7dc8d60379dfe65fea491fb2489b6016400813930ecd61fd0952dae75c115287a1b16c234b1550887117744dfaf - languageName: node - linkType: hard - -"semver@npm:^6.0.0, semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.3.0": - version: 6.3.0 - resolution: "semver@npm:6.3.0" + version: 5.7.2 + resolution: "semver@npm:5.7.2" bin: - semver: ./bin/semver.js - checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 + semver: bin/semver + checksum: fb4ab5e0dd1c22ce0c937ea390b4a822147a9c53dbd2a9a0132f12fe382902beef4fbf12cf51bb955248d8d15874ce8cd89532569756384f994309825f10b686 languageName: node linkType: hard -"semver@npm:^6.3.1": +"semver@npm:^6.0.0, semver@npm:^6.3.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" bin: @@ -11026,58 +10844,45 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.5": - version: 7.3.7 - resolution: "semver@npm:7.3.7" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 2fa3e877568cd6ce769c75c211beaed1f9fce80b28338cadd9d0b6c40f2e2862bafd62c19a6cff42f3d54292b7c623277bcab8816a2b5521cf15210d43e75232 - languageName: node - linkType: hard - -"semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: ^6.0.0 +"semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.7.3": + version: 7.7.4 + resolution: "semver@npm:7.7.4" bin: semver: bin/semver.js - checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 + checksum: 9b4a6a58e98b9723fafcafa393c9d4e8edefaa60b8dfbe39e30892a3604cf1f45f52df9cfb1ae1a22b44c8b3d57fec8a9bb7b3e1645431587cb272399ede152e languageName: node linkType: hard -"send@npm:0.18.0": - version: 0.18.0 - resolution: "send@npm:0.18.0" +"send@npm:~0.19.0, send@npm:~0.19.1": + version: 0.19.2 + resolution: "send@npm:0.19.2" dependencies: debug: 2.6.9 depd: 2.0.0 destroy: 1.2.0 - encodeurl: ~1.0.2 + encodeurl: ~2.0.0 escape-html: ~1.0.3 etag: ~1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 + fresh: ~0.5.2 + http-errors: ~2.0.1 mime: 1.6.0 ms: 2.1.3 - on-finished: 2.4.1 + on-finished: ~2.4.1 range-parser: ~1.2.1 - statuses: 2.0.1 - checksum: 74fc07ebb58566b87b078ec63e5a3e41ecd987e4272ba67b7467e86c6ad51bc6b0b0154133b6d8b08a2ddda360464f71382f7ef864700f34844a76c8027817a8 + statuses: ~2.0.2 + checksum: f9e11b718b48dbea72daa6a80e36e5a00fb6d01b1a6cfda8b3135c9ca9db84257738283da23371f437148ccd8f400e6171cd2a3642fb43fda462da407d9d30c0 languageName: node linkType: hard -"serve-static@npm:1.15.0, serve-static@npm:^1.14.1": - version: 1.15.0 - resolution: "serve-static@npm:1.15.0" +"serve-static@npm:~1.16.2": + version: 1.16.3 + resolution: "serve-static@npm:1.16.3" dependencies: - encodeurl: ~1.0.2 + encodeurl: ~2.0.0 escape-html: ~1.0.3 parseurl: ~1.3.3 - send: 0.18.0 - checksum: af57fc13be40d90a12562e98c0b7855cf6e8bd4c107fe9a45c212bf023058d54a1871b1c89511c3958f70626fff47faeb795f5d83f8cf88514dbaeb2b724464d + send: ~0.19.1 + checksum: ec7599540215e6676b223ea768bf7c256819180bf14f89d0b5d249a61bbb8f10b05b2a53048a153cb2cc7f3b367f1227d2fb715fe4b09d07299a9233eda1a453 languageName: node linkType: hard @@ -11088,7 +10893,44 @@ __metadata: languageName: node linkType: hard -"setprototypeof@npm:1.2.0": +"set-function-length@npm:^1.2.2": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: ^1.1.4 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.4 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.2 + checksum: a8248bdacdf84cb0fab4637774d9fb3c7a8e6089866d04c817583ff48e14149c87044ce683d7f50759a8c50fb87c7a7e173535b06169c87ef76f5fb276dfff72 + languageName: node + linkType: hard + +"set-function-name@npm:^2.0.2": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" + dependencies: + define-data-property: ^1.1.4 + es-errors: ^1.3.0 + functions-have-names: ^1.2.3 + has-property-descriptors: ^1.0.2 + checksum: d6229a71527fd0404399fc6227e0ff0652800362510822a291925c9d7b48a1ca1a468b11b281471c34cd5a2da0db4f5d7ff315a61d26655e77f6e971e6d0c80f + languageName: node + linkType: hard + +"set-proto@npm:^1.0.0": + version: 1.0.0 + resolution: "set-proto@npm:1.0.0" + dependencies: + dunder-proto: ^1.0.1 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + checksum: ec27cbbe334598547e99024403e96da32aca3e530583e4dba7f5db1c43cbc4affa9adfbd77c7b2c210b9b8b2e7b2e600bad2a6c44fd62e804d8233f96bbb62f4 + languageName: node + linkType: hard + +"setprototypeof@npm:1.2.0, setprototypeof@npm:~1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" checksum: be18cbbf70e7d8097c97f713a2e76edf84e87299b40d085c6bf8b65314e994cc15e2e317727342fa6996e38e1f52c59720b53fe621e2eb593a6847bf0356db89 @@ -11104,6 +10946,90 @@ __metadata: languageName: node linkType: hard +"sharp@npm:^0.34.3": + version: 0.34.5 + resolution: "sharp@npm:0.34.5" + dependencies: + "@img/colour": ^1.0.0 + "@img/sharp-darwin-arm64": 0.34.5 + "@img/sharp-darwin-x64": 0.34.5 + "@img/sharp-libvips-darwin-arm64": 1.2.4 + "@img/sharp-libvips-darwin-x64": 1.2.4 + "@img/sharp-libvips-linux-arm": 1.2.4 + "@img/sharp-libvips-linux-arm64": 1.2.4 + "@img/sharp-libvips-linux-ppc64": 1.2.4 + "@img/sharp-libvips-linux-riscv64": 1.2.4 + "@img/sharp-libvips-linux-s390x": 1.2.4 + "@img/sharp-libvips-linux-x64": 1.2.4 + "@img/sharp-libvips-linuxmusl-arm64": 1.2.4 + "@img/sharp-libvips-linuxmusl-x64": 1.2.4 + "@img/sharp-linux-arm": 0.34.5 + "@img/sharp-linux-arm64": 0.34.5 + "@img/sharp-linux-ppc64": 0.34.5 + "@img/sharp-linux-riscv64": 0.34.5 + "@img/sharp-linux-s390x": 0.34.5 + "@img/sharp-linux-x64": 0.34.5 + "@img/sharp-linuxmusl-arm64": 0.34.5 + "@img/sharp-linuxmusl-x64": 0.34.5 + "@img/sharp-wasm32": 0.34.5 + "@img/sharp-win32-arm64": 0.34.5 + "@img/sharp-win32-ia32": 0.34.5 + "@img/sharp-win32-x64": 0.34.5 + detect-libc: ^2.1.2 + semver: ^7.7.3 + dependenciesMeta: + "@img/sharp-darwin-arm64": + optional: true + "@img/sharp-darwin-x64": + optional: true + "@img/sharp-libvips-darwin-arm64": + optional: true + "@img/sharp-libvips-darwin-x64": + optional: true + "@img/sharp-libvips-linux-arm": + optional: true + "@img/sharp-libvips-linux-arm64": + optional: true + "@img/sharp-libvips-linux-ppc64": + optional: true + "@img/sharp-libvips-linux-riscv64": + optional: true + "@img/sharp-libvips-linux-s390x": + optional: true + "@img/sharp-libvips-linux-x64": + optional: true + "@img/sharp-libvips-linuxmusl-arm64": + optional: true + "@img/sharp-libvips-linuxmusl-x64": + optional: true + "@img/sharp-linux-arm": + optional: true + "@img/sharp-linux-arm64": + optional: true + "@img/sharp-linux-ppc64": + optional: true + "@img/sharp-linux-riscv64": + optional: true + "@img/sharp-linux-s390x": + optional: true + "@img/sharp-linux-x64": + optional: true + "@img/sharp-linuxmusl-arm64": + optional: true + "@img/sharp-linuxmusl-x64": + optional: true + "@img/sharp-wasm32": + optional: true + "@img/sharp-win32-arm64": + optional: true + "@img/sharp-win32-ia32": + optional: true + "@img/sharp-win32-x64": + optional: true + checksum: b86972729697af7e37c96714cd9c5c2470c6b503a79d5b38f6fd3eb4d5a46b20d7c15dae1a73db3d0e0aa605d517f2f66d4f52de7496bfb037dd7feb930c1899 + languageName: node + linkType: hard + "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -11121,33 +11047,57 @@ __metadata: linkType: hard "shell-quote@npm:^1.7.3": - version: 1.7.3 - resolution: "shell-quote@npm:1.7.3" - checksum: aca58e73a3a5d933d02e0bdddedc53ee14f7c2ec264f97ac915b9d4482d077a38e422aa664631d60a672cd3cdb4054eb2e6c0303f54882453dacb6483e482d34 + version: 1.8.3 + resolution: "shell-quote@npm:1.8.3" + checksum: 550dd84e677f8915eb013d43689c80bb114860649ec5298eb978f40b8f3d4bc4ccb072b82c094eb3548dc587144bb3965a8676f0d685c1cf4c40b5dc27166242 languageName: node linkType: hard -"shelljs@npm:^0.8.4": - version: 0.8.5 - resolution: "shelljs@npm:0.8.5" +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" dependencies: - glob: ^7.0.0 - interpret: ^1.0.0 - rechoir: ^0.6.2 - bin: - shjs: bin/shjs - checksum: 7babc46f732a98f4c054ec1f048b55b9149b98aa2da32f6cf9844c434b43c6251efebd6eec120937bd0999e13811ebd45efe17410edb3ca938f82f9381302748 + es-errors: ^1.3.0 + object-inspect: ^1.13.3 + checksum: 603b928997abd21c5a5f02ae6b9cc36b72e3176ad6827fab0417ead74580cc4fb4d5c7d0a8a2ff4ead34d0f9e35701ed7a41853dac8a6d1a664fcce1a044f86f languageName: node linkType: hard -"side-channel@npm:^1.0.4": - version: 1.0.4 - resolution: "side-channel@npm:1.0.4" +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.5 + object-inspect: ^1.13.3 + checksum: 42501371cdf71f4ccbbc9c9e2eb00aaaab80a4c1c429d5e8da713fd4d39ef3b8d4a4b37ed4f275798a65260a551a7131fd87fe67e922dba4ac18586d6aab8b06 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.5 + object-inspect: ^1.13.3 + side-channel-map: ^1.0.1 + checksum: a815c89bc78c5723c714ea1a77c938377ea710af20d4fb886d362b0d1f8ac73a17816a5f6640f354017d7e292a43da9c5e876c22145bac00b76cfb3468001736 + languageName: node + linkType: hard + +"side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" dependencies: - call-bind: ^1.0.0 - get-intrinsic: ^1.0.2 - object-inspect: ^1.9.0 - checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 + es-errors: ^1.3.0 + object-inspect: ^1.13.3 + side-channel-list: ^1.0.0 + side-channel-map: ^1.0.1 + side-channel-weakmap: ^1.0.2 + checksum: bf73d6d6682034603eb8e99c63b50155017ed78a522d27c2acec0388a792c3ede3238b878b953a08157093b85d05797217d270b7666ba1f111345fbe933380ff languageName: node linkType: hard @@ -11158,13 +11108,6 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^4.0.1": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 - languageName: node - linkType: hard - "simple-functional-loader@npm:^1.2.1": version: 1.2.1 resolution: "simple-functional-loader@npm:1.2.1" @@ -11217,13 +11160,24 @@ __metadata: languageName: node linkType: hard -"socks@npm:^2.6.2": - version: 2.6.2 - resolution: "socks@npm:2.6.2" +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" + dependencies: + agent-base: ^7.1.2 + debug: ^4.3.4 + socks: ^2.8.3 + checksum: b4fbcdb7ad2d6eec445926e255a1fb95c975db0020543fbac8dfa6c47aecc6b3b619b7fb9c60a3f82c9b2969912a5e7e174a056ae4d98cb5322f3524d6036e1d + languageName: node + linkType: hard + +"socks@npm:^2.6.2, socks@npm:^2.8.3": + version: 2.8.7 + resolution: "socks@npm:2.8.7" dependencies: - ip: ^1.1.5 + ip-address: ^10.0.1 smart-buffer: ^4.2.0 - checksum: dd9194293059d737759d5c69273850ad4149f448426249325c4bea0e340d1cf3d266c3b022694b0dcf5d31f759de23657244c481fc1e8322add80b7985c36b5e + checksum: 4bbe2c88cf0eeaf49f94b7f11564a99b2571bde6fd1e714ff95b38f89e1f97858c19e0ab0e6d39eb7f6a984fa67366825895383ed563fe59962a1d57a1d55318 languageName: node linkType: hard @@ -11236,14 +11190,7 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:^1.0.2": - version: 1.0.2 - resolution: "source-map-js@npm:1.0.2" - checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c - languageName: node - linkType: hard - -"source-map-js@npm:^1.2.1": +"source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.1": version: 1.2.1 resolution: "source-map-js@npm:1.2.1" checksum: 4eb0cd997cdf228bc253bcaff9340afeb706176e64868ecd20efbe6efea931465f43955612346d6b7318789e5265bdc419bc7669c1cebe3db0eb255f57efa76b @@ -11305,24 +11252,12 @@ __metadata: languageName: node linkType: hard -"sshpk@npm:^1.7.0": - version: 1.17.0 - resolution: "sshpk@npm:1.17.0" +"ssri@npm:^13.0.0": + version: 13.0.1 + resolution: "ssri@npm:13.0.1" dependencies: - asn1: ~0.2.3 - assert-plus: ^1.0.0 - bcrypt-pbkdf: ^1.0.0 - dashdash: ^1.12.0 - ecc-jsbn: ~0.1.1 - getpass: ^0.1.1 - jsbn: ~0.1.0 - safer-buffer: ^2.0.2 - tweetnacl: ~0.14.0 - bin: - sshpk-conv: bin/sshpk-conv - sshpk-sign: bin/sshpk-sign - sshpk-verify: bin/sshpk-verify - checksum: ba109f65c8e6c35133b8e6ed5576abeff8aa8d614824b7275ec3ca308f081fef483607c28d97780c1e235818b0f93ed8c8b56d0a5968d5a23fd6af57718c7597 + minipass: ^7.0.3 + checksum: 42acbdbd485e9a5a198de2198b6fd474d1e84bff6bea5d95aa0a8aa26ea78ce44f2097ac481e767f0406de7ceccfa4669584116d4fcf2d4e2dba7034d7c34930 languageName: node linkType: hard @@ -11358,24 +11293,20 @@ __metadata: languageName: node linkType: hard -"statuses@npm:2.0.1": - version: 2.0.1 - resolution: "statuses@npm:2.0.1" - checksum: 18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb - languageName: node - linkType: hard - -"statuses@npm:~1.5.0": - version: 1.5.0 - resolution: "statuses@npm:1.5.0" - checksum: c469b9519de16a4bb19600205cffb39ee471a5f17b82589757ca7bd40a8d92ebb6ed9f98b5a540c5d302ccbc78f15dc03cc0280dd6e00df1335568a5d5758a5c +"statuses@npm:~2.0.1, statuses@npm:~2.0.2": + version: 2.0.2 + resolution: "statuses@npm:2.0.2" + checksum: 6927feb50c2a75b2a4caab2c565491f7a93ad3d8dbad7b1398d52359e9243a20e2ebe35e33726dee945125ef7a515e9097d8a1b910ba2bbd818265a2f6c39879 languageName: node linkType: hard -"stealthy-require@npm:^1.1.1": - version: 1.1.1 - resolution: "stealthy-require@npm:1.1.1" - checksum: 6805b857a9f3a6a1079fc6652278038b81011f2a5b22cbd559f71a6c02087e6f1df941eb10163e3fdc5391ab5807aa46758d4258547c1f5ede31e6d9bfda8dd3 +"stop-iteration-iterator@npm:^1.1.0": + version: 1.1.0 + resolution: "stop-iteration-iterator@npm:1.1.0" + dependencies: + es-errors: ^1.3.0 + internal-slot: ^1.1.0 + checksum: be944489d8829fb3bdec1a1cc4a2142c6b6eb317305eeace1ece978d286d6997778afa1ae8cb3bd70e2b274b9aa8c69f93febb1e15b94b1359b11058f9d3c3a1 languageName: node linkType: hard @@ -11389,7 +11320,7 @@ __metadata: languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": +"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -11400,52 +11331,83 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" +"string.prototype.includes@npm:^2.0.1": + version: 2.0.1 + resolution: "string.prototype.includes@npm:2.0.1" dependencies: - eastasianwidth: ^0.2.0 - emoji-regex: ^9.2.2 - strip-ansi: ^7.0.1 - checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.3 + checksum: ed4b7058b092f30d41c4df1e3e805eeea92479d2c7a886aa30f42ae32fde8924a10cc99cccc99c29b8e18c48216608a0fe6bf887f8b4aadf9559096a758f313a languageName: node linkType: hard -"string.prototype.matchall@npm:^4.0.7": - version: 4.0.7 - resolution: "string.prototype.matchall@npm:4.0.7" +"string.prototype.matchall@npm:^4.0.12": + version: 4.0.12 + resolution: "string.prototype.matchall@npm:4.0.12" + dependencies: + call-bind: ^1.0.8 + call-bound: ^1.0.3 + define-properties: ^1.2.1 + es-abstract: ^1.23.6 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + get-intrinsic: ^1.2.6 + gopd: ^1.2.0 + has-symbols: ^1.1.0 + internal-slot: ^1.1.0 + regexp.prototype.flags: ^1.5.3 + set-function-name: ^2.0.2 + side-channel: ^1.1.0 + checksum: 98a09d6af91bfc6ee25556f3d7cd6646d02f5f08bda55d45528ed273d266d55a71af7291fe3fc76854deffb9168cc1a917d0b07a7d5a178c7e9537c99e6d2b57 + languageName: node + linkType: hard + +"string.prototype.repeat@npm:^1.0.0": + version: 1.0.0 + resolution: "string.prototype.repeat@npm:1.0.0" dependencies: - call-bind: ^1.0.2 define-properties: ^1.1.3 - es-abstract: ^1.19.1 - get-intrinsic: ^1.1.1 - has-symbols: ^1.0.3 - internal-slot: ^1.0.3 - regexp.prototype.flags: ^1.4.1 - side-channel: ^1.0.4 - checksum: fc09f3ccbfb325de0472bcc87a6be0598a7499e0b4a31db5789676155b15754a4cc4bb83924f15fc9ed48934dac7366ee52c8b9bd160bed6fd072c93b489e75c + es-abstract: ^1.17.5 + checksum: 95dfc514ed7f328d80a066dabbfbbb1615c3e51490351085409db2eb7cbfed7ea29fdadaf277647fbf9f4a1e10e6dd9e95e78c0fd2c4e6bb6723ea6e59401004 languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.5": - version: 1.0.5 - resolution: "string.prototype.trimend@npm:1.0.5" +"string.prototype.trim@npm:^1.2.10": + version: 1.2.10 + resolution: "string.prototype.trim@npm:1.2.10" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.19.5 - checksum: d44f543833112f57224e79182debadc9f4f3bf9d48a0414d6f0cbd2a86f2b3e8c0ca1f95c3f8e5b32ae83e91554d79d932fc746b411895f03f93d89ed3dfb6bc + call-bind: ^1.0.8 + call-bound: ^1.0.2 + define-data-property: ^1.1.4 + define-properties: ^1.2.1 + es-abstract: ^1.23.5 + es-object-atoms: ^1.0.0 + has-property-descriptors: ^1.0.2 + checksum: 87659cd8561237b6c69f5376328fda934693aedde17bb7a2c57008e9d9ff992d0c253a391c7d8d50114e0e49ff7daf86a362f7961cf92f7564cd01342ca2e385 languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.5": - version: 1.0.5 - resolution: "string.prototype.trimstart@npm:1.0.5" +"string.prototype.trimend@npm:^1.0.9": + version: 1.0.9 + resolution: "string.prototype.trimend@npm:1.0.9" + dependencies: + call-bind: ^1.0.8 + call-bound: ^1.0.2 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: cb86f639f41d791a43627784be2175daa9ca3259c7cb83e7a207a729909b74f2ea0ec5d85de5761e6835e5f443e9420c6ff3f63a845378e4a61dd793177bc287 + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.19.5 - checksum: a4857c5399ad709d159a77371eeaa8f9cc284469a0b5e1bfe405de16f1fd4166a8ea6f4180e55032f348d1b679b1599fd4301fbc7a8b72bdb3e795e43f7b1048 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: df1007a7f580a49d692375d996521dc14fd103acda7f3034b3c558a60b82beeed3a64fa91e494e164581793a8ab0ae2f59578a49896a7af6583c1f20472bce96 languageName: node linkType: hard @@ -11458,15 +11420,6 @@ __metadata: languageName: node linkType: hard -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: ^5.0.1 - checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c - languageName: node - linkType: hard - "strip-ansi@npm:^5.0.0": version: 5.2.0 resolution: "strip-ansi@npm:5.2.0" @@ -11476,12 +11429,12 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" +"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" dependencies: - ansi-regex: ^6.0.1 - checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d + ansi-regex: ^5.0.1 + checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c languageName: node linkType: hard @@ -11531,35 +11484,37 @@ __metadata: languageName: node linkType: hard -"styled-jsx@npm:5.0.7": - version: 5.0.7 - resolution: "styled-jsx@npm:5.0.7" +"styled-jsx@npm:5.1.6": + version: 5.1.6 + resolution: "styled-jsx@npm:5.1.6" + dependencies: + client-only: 0.0.1 peerDependencies: - react: ">= 16.8.0 || 17.x.x || ^18.0.0-0" + react: ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" peerDependenciesMeta: "@babel/core": optional: true babel-plugin-macros: optional: true - checksum: 61959993915f4b1662a682dbbefb3512de9399cf6901969bcadd26ba5441d2b5ca5c1021b233bbd573da2541b41efb45d56c6f618dbc8d88a381ebc62461fefe + checksum: 879ad68e3e81adcf4373038aaafe55f968294955593660e173fbf679204aff158c59966716a60b29af72dc88795cfb2c479b6d2c3c87b2b2d282f3e27cc66461 languageName: node linkType: hard "sucrase@npm:^3.35.0": - version: 3.35.0 - resolution: "sucrase@npm:3.35.0" + version: 3.35.1 + resolution: "sucrase@npm:3.35.1" dependencies: "@jridgewell/gen-mapping": ^0.3.2 commander: ^4.0.0 - glob: ^10.3.10 lines-and-columns: ^1.1.6 mz: ^2.7.0 pirates: ^4.0.1 + tinyglobby: ^0.2.11 ts-interface-checker: ^0.1.9 bin: sucrase: bin/sucrase sucrase-node: bin/sucrase-node - checksum: 9fc5792a9ab8a14dcf9c47dcb704431d35c1cdff1d17d55d382a31c2e8e3063870ad32ce120a80915498486246d612e30cda44f1624d9d9a10423e1a43487ad1 + checksum: 9a3ae3900f85ede60468bdaebc07a32691d5e44c80bb008734088dcde49cd0e05ead854786d90fbb6e63ed1c50592146cb50536321212773f6d72d1c85b2a51b languageName: node linkType: hard @@ -11627,7 +11582,7 @@ __metadata: languageName: node linkType: hard -"symbol-tree@npm:^3.2.2, symbol-tree@npm:^3.2.4": +"symbol-tree@npm:^3.2.4": version: 3.2.4 resolution: "symbol-tree@npm:3.2.4" checksum: 6e8fc7e1486b8b54bea91199d9535bb72f10842e40c79e882fc94fb7b14b89866adf2fd79efa5ebb5b658bc07fb459ccce5ac0e99ef3d72f474e74aaf284029d @@ -11635,21 +11590,21 @@ __metadata: linkType: hard "table@npm:^6.0.9": - version: 6.8.0 - resolution: "table@npm:6.8.0" + version: 6.9.0 + resolution: "table@npm:6.9.0" dependencies: ajv: ^8.0.1 lodash.truncate: ^4.4.2 slice-ansi: ^4.0.0 string-width: ^4.2.3 strip-ansi: ^6.0.1 - checksum: 5b07fe462ee03d2e1fac02cbb578efd2e0b55ac07e3d3db2e950aa9570ade5a4a2b8d3c15e9f25c89e4e50b646bc4269934601ee1eef4ca7968ad31960977690 + checksum: f54a7d1c11cda8c676e1e9aff5e723646905ed4579cca14b3ce12d2b12eac3e18f5dbe2549fe0b79697164858e18961145db4dd0660bbeb0fb4032af0aaf32b4 languageName: node linkType: hard "tailwindcss@npm:^3.4.17": - version: 3.4.17 - resolution: "tailwindcss@npm:3.4.17" + version: 3.4.19 + resolution: "tailwindcss@npm:3.4.19" dependencies: "@alloc/quick-lru": ^5.2.0 arg: ^5.0.2 @@ -11659,7 +11614,7 @@ __metadata: fast-glob: ^3.3.2 glob-parent: ^6.0.2 is-glob: ^4.0.3 - jiti: ^1.21.6 + jiti: ^1.21.7 lilconfig: ^3.1.3 micromatch: ^4.0.8 normalize-path: ^3.0.0 @@ -11668,7 +11623,7 @@ __metadata: postcss: ^8.4.47 postcss-import: ^15.1.0 postcss-js: ^4.0.1 - postcss-load-config: ^4.0.2 + postcss-load-config: ^4.0.2 || ^5.0 || ^6.0 postcss-nested: ^6.2.0 postcss-selector-parser: ^6.1.2 resolve: ^1.22.8 @@ -11676,32 +11631,7 @@ __metadata: bin: tailwind: lib/cli.js tailwindcss: lib/cli.js - checksum: bda962f30e9a2f0567e2ee936ec863d5178958078e577ced13da60b3af779062a53a7e95f2f32b5c558f12a7477dea3ce071441a7362c6d7bf50bc9e166728a4 - languageName: node - linkType: hard - -"tar-fs@npm:^2.0.0": - version: 2.1.1 - resolution: "tar-fs@npm:2.1.1" - dependencies: - chownr: ^1.1.1 - mkdirp-classic: ^0.5.2 - pump: ^3.0.0 - tar-stream: ^2.1.4 - checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d - languageName: node - linkType: hard - -"tar-stream@npm:^2.1.4": - version: 2.2.0 - resolution: "tar-stream@npm:2.2.0" - dependencies: - bl: ^4.0.3 - end-of-stream: ^1.4.1 - fs-constants: ^1.0.0 - inherits: ^2.0.3 - readable-stream: ^3.1.1 - checksum: 699831a8b97666ef50021c767f84924cfee21c142c2eb0e79c63254e140e6408d6d55a065a2992548e72b06de39237ef2b802b99e3ece93ca3904a37622a66f3 + checksum: 10cd7872288fe0db85d3af402f16b0703ee74a3dd9d438a5c4838268a3ee194b60f1a8291e7abfedb878308664ddbfbc9de59e6be4b51c9c32319c7bafc287d4 languageName: node linkType: hard @@ -11719,6 +11649,19 @@ __metadata: languageName: node linkType: hard +"tar@npm:^7.5.4": + version: 7.5.9 + resolution: "tar@npm:7.5.9" + dependencies: + "@isaacs/fs-minipass": ^4.0.0 + chownr: ^3.0.0 + minipass: ^7.1.2 + minizlib: ^3.1.0 + yallist: ^5.0.0 + checksum: 26fbbdf536895814167d03e4883f80febb6520729169c54d0f29ee8a163557283862752493f0e5b60800a6f3608aac3250c41fac8e20a4f056ba4fa63f3dbad7 + languageName: node + linkType: hard + "test-exclude@npm:^6.0.0": version: 6.0.0 resolution: "test-exclude@npm:6.0.0" @@ -11755,7 +11698,7 @@ __metadata: languageName: node linkType: hard -"through@npm:^2.3.6, through@npm:^2.3.8": +"through@npm:^2.3.6": version: 2.3.8 resolution: "through@npm:2.3.8" checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd @@ -11769,6 +11712,16 @@ __metadata: languageName: node linkType: hard +"tinyglobby@npm:^0.2.11, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.14": + version: 0.2.15 + resolution: "tinyglobby@npm:0.2.15" + dependencies: + fdir: ^6.5.0 + picomatch: ^4.0.3 + checksum: 0e33b8babff966c6ab86e9b825a350a6a98a63700fa0bb7ae6cf36a7770a508892383adc272f7f9d17aaf46a9d622b455e775b9949a3f951eaaf5dfb26331d44 + languageName: node + linkType: hard + "tinytime@npm:^0.2.6": version: 0.2.6 resolution: "tinytime@npm:0.2.6" @@ -11785,15 +11738,6 @@ __metadata: languageName: node linkType: hard -"tmp@npm:^0.0.33": - version: 0.0.33 - resolution: "tmp@npm:0.0.33" - dependencies: - os-tmpdir: ~1.0.2 - checksum: 902d7aceb74453ea02abbf58c203f4a8fc1cead89b60b31e354f74ed5b3fb09ea817f94fb310f884a5d16987dd9fa5a735412a7c2dd088dd3d415aa819ae3a28 - languageName: node - linkType: hard - "tmpl@npm:1.0.5": version: 1.0.5 resolution: "tmpl@npm:1.0.5" @@ -11801,13 +11745,6 @@ __metadata: languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 - languageName: node - linkType: hard - "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -11817,51 +11754,22 @@ __metadata: languageName: node linkType: hard -"toidentifier@npm:1.0.1": +"toidentifier@npm:~1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" checksum: 952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45 languageName: node linkType: hard -"tough-cookie@npm:^2.3.3, tough-cookie@npm:~2.5.0": - version: 2.5.0 - resolution: "tough-cookie@npm:2.5.0" - dependencies: - psl: ^1.1.28 - punycode: ^2.1.1 - checksum: 16a8cd090224dd176eee23837cbe7573ca0fa297d7e468ab5e1c02d49a4e9a97bb05fef11320605eac516f91d54c57838a25864e8680e27b069a5231d8264977 - languageName: node - linkType: hard - -"tough-cookie@npm:^3.0.1": - version: 3.0.1 - resolution: "tough-cookie@npm:3.0.1" - dependencies: - ip-regex: ^2.1.0 - psl: ^1.1.28 - punycode: ^2.1.1 - checksum: 796f6239bce5674a1267b19f41972a2602a2a23715817237b5922b0dc2343512512eea7d41d29210a4ec545f8ef32173bbbf01277dd8ec3ae3841b19cbe69f67 - languageName: node - linkType: hard - -"tough-cookie@npm:^4.0.0": - version: 4.0.0 - resolution: "tough-cookie@npm:4.0.0" +"tough-cookie@npm:^4.1.2": + version: 4.1.4 + resolution: "tough-cookie@npm:4.1.4" dependencies: psl: ^1.1.33 punycode: ^2.1.1 - universalify: ^0.1.2 - checksum: 0891b37eb7d17faa3479d47f0dce2e3007f2583094ad272f2670d120fbcc3df3b0b0a631ba96ecad49f9e2297d93ff8995ce0d3292d08dd7eabe162f5b224d69 - languageName: node - linkType: hard - -"tr46@npm:^1.0.1": - version: 1.0.1 - resolution: "tr46@npm:1.0.1" - dependencies: - punycode: ^2.1.0 - checksum: 96d4ed46bc161db75dbf9247a236ea0bfcaf5758baae6749e92afab0bc5a09cb59af21788ede7e55080f2bf02dce3e4a8f2a484cc45164e29f4b5e68f7cbcc1a + universalify: ^0.2.0 + url-parse: ^1.5.3 + checksum: 5815059f014c31179a303c673f753f7899a6fce94ac93712c88ea5f3c26e0c042b5f0c7a599a00f8e0feeca4615dba75c3dffc54f3c1a489978aa8205e09307c languageName: node linkType: hard @@ -11926,41 +11834,58 @@ __metadata: linkType: hard "ts-jest@npm:^29.1.1": - version: 29.1.1 - resolution: "ts-jest@npm:29.1.1" + version: 29.4.6 + resolution: "ts-jest@npm:29.4.6" dependencies: - bs-logger: 0.x - fast-json-stable-stringify: 2.x - jest-util: ^29.0.0 + bs-logger: ^0.2.6 + fast-json-stable-stringify: ^2.1.0 + handlebars: ^4.7.8 json5: ^2.2.3 - lodash.memoize: 4.x - make-error: 1.x - semver: ^7.5.3 - yargs-parser: ^21.0.1 + lodash.memoize: ^4.1.2 + make-error: ^1.3.6 + semver: ^7.7.3 + type-fest: ^4.41.0 + yargs-parser: ^21.1.1 peerDependencies: "@babel/core": ">=7.0.0-beta.0 <8" - "@jest/types": ^29.0.0 - babel-jest: ^29.0.0 - jest: ^29.0.0 + "@jest/transform": ^29.0.0 || ^30.0.0 + "@jest/types": ^29.0.0 || ^30.0.0 + babel-jest: ^29.0.0 || ^30.0.0 + jest: ^29.0.0 || ^30.0.0 + jest-util: ^29.0.0 || ^30.0.0 typescript: ">=4.3 <6" peerDependenciesMeta: "@babel/core": optional: true + "@jest/transform": + optional: true "@jest/types": optional: true babel-jest: optional: true esbuild: optional: true + jest-util: + optional: true bin: ts-jest: cli.js - checksum: a8c9e284ed4f819526749f6e4dc6421ec666f20ab44d31b0f02b4ed979975f7580b18aea4813172d43e39b29464a71899f8893dd29b06b4a351a3af8ba47b402 + checksum: 07ae4102569565ab57036f095152ea75c85032edf15379043ffc8da2dd0e6e93e84d0c50a24e10a5cddacb5ab773df0f3170f02db6c178edd22a5e485bc57dc7 + languageName: node + linkType: hard + +"ts-morph@npm:^27.0.2": + version: 27.0.2 + resolution: "ts-morph@npm:27.0.2" + dependencies: + "@ts-morph/common": ~0.28.1 + code-block-writer: ^13.0.3 + checksum: 1ed2e89257d6f48fdce49bf51e1767787579220197efaa31ac25971c656c9a8a5a6bdd123042d16f83674eec119e4462a06f716187aec0b5e4740888ab5b73b7 languageName: node linkType: hard "ts-node@npm:^10.5.0": - version: 10.9.1 - resolution: "ts-node@npm:10.9.1" + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" dependencies: "@cspotcode/source-map-support": ^0.8.0 "@tsconfig/node10": ^1.0.7 @@ -11992,19 +11917,19 @@ __metadata: ts-node-script: dist/bin-script.js ts-node-transpile-only: dist/bin-transpile.js ts-script: dist/bin-script-deprecated.js - checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 + checksum: fde256c9073969e234526e2cfead42591b9a2aec5222bac154b0de2fa9e4ceb30efcd717ee8bc785a56f3a119bdd5aa27b333d9dbec94ed254bd26f8944c67ac languageName: node linkType: hard -"tsconfig-paths@npm:^3.14.1": - version: 3.14.1 - resolution: "tsconfig-paths@npm:3.14.1" +"tsconfig-paths@npm:^3.15.0": + version: 3.15.0 + resolution: "tsconfig-paths@npm:3.15.0" dependencies: "@types/json5": ^0.0.29 - json5: ^1.0.1 + json5: ^1.0.2 minimist: ^1.2.6 strip-bom: ^3.0.0 - checksum: 8afa01c673ebb4782ba53d3a12df97fa837ce524f8ad38ee4e2b2fd57f5ac79abc21c574e9e9eb014d93efe7fe8214001b96233b5c6ea75bd1ea82afe17a4c6d + checksum: 59f35407a390d9482b320451f52a411a256a130ff0e7543d18c6f20afab29ac19fbe55c360a93d6476213cc335a4d76ce90f67df54c4e9037f7d240920832201 languageName: node linkType: hard @@ -12015,14 +11940,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.3.0": - version: 2.4.0 - resolution: "tslib@npm:2.4.0" - checksum: 8c4aa6a3c5a754bf76aefc38026134180c053b7bd2f81338cb5e5ebf96fefa0f417bff221592bf801077f5bf990562f6264fecbc42cd3309b33872cb6fc3b113 - languageName: node - linkType: hard - -"tslib@npm:^2.4.0": +"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.4.0, tslib@npm:^2.8.0": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a @@ -12040,19 +11958,19 @@ __metadata: languageName: node linkType: hard -"tunnel-agent@npm:^0.6.0": - version: 0.6.0 - resolution: "tunnel-agent@npm:0.6.0" +"tsx@npm:^4.21.0": + version: 4.21.0 + resolution: "tsx@npm:4.21.0" dependencies: - safe-buffer: ^5.0.1 - checksum: 05f6510358f8afc62a057b8b692f05d70c1782b70db86d6a1e0d5e28a32389e52fa6e7707b6c5ecccacc031462e4bc35af85ecfe4bbc341767917b7cf6965711 - languageName: node - linkType: hard - -"tweetnacl@npm:^0.14.3, tweetnacl@npm:~0.14.0": - version: 0.14.5 - resolution: "tweetnacl@npm:0.14.5" - checksum: 6061daba1724f59473d99a7bb82e13f211cdf6e31315510ae9656fefd4779851cb927adad90f3b488c8ed77c106adc0421ea8055f6f976ff21b27c5c4e918487 + esbuild: ~0.27.0 + fsevents: ~2.3.3 + get-tsconfig: ^4.7.5 + dependenciesMeta: + fsevents: + optional: true + bin: + tsx: dist/cli.mjs + checksum: 50c98e4b6e66d1c30f72925c8e5e7be1a02377574de7cd367d7e7a6d4af43ca8ff659f91c654e7628b25a5498015e32f090529b92c679b0342811e1cf682e8cf languageName: node linkType: hard @@ -12065,15 +11983,6 @@ __metadata: languageName: node linkType: hard -"type-check@npm:~0.3.2": - version: 0.3.2 - resolution: "type-check@npm:0.3.2" - dependencies: - prelude-ls: ~1.1.2 - checksum: dd3b1495642731bc0e1fc40abe5e977e0263005551ac83342ecb6f4f89551d106b368ec32ad3fb2da19b3bd7b2d1f64330da2ea9176d8ddbfe389fb286eb5124 - languageName: node - linkType: hard - "type-detect@npm:4.0.8": version: 4.0.8 resolution: "type-detect@npm:4.0.8" @@ -12102,6 +12011,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^4.41.0": + version: 4.41.0 + resolution: "type-fest@npm:4.41.0" + checksum: 7055c0e3eb188425d07403f1d5dc175ca4c4f093556f26871fe22041bc93d137d54bef5851afa320638ca1379106c594f5aa153caa654ac1a7f22c71588a4e80 + languageName: node + linkType: hard + "type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" @@ -12112,6 +12028,59 @@ __metadata: languageName: node linkType: hard +"typed-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-buffer@npm:1.0.3" + dependencies: + call-bound: ^1.0.3 + es-errors: ^1.3.0 + is-typed-array: ^1.1.14 + checksum: 3fb91f0735fb413b2bbaaca9fabe7b8fc14a3fa5a5a7546bab8a57e755be0e3788d893195ad9c2b842620592de0e68d4c077d4c2c41f04ec25b8b5bb82fa9a80 + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-byte-length@npm:1.0.3" + dependencies: + call-bind: ^1.0.8 + for-each: ^0.3.3 + gopd: ^1.2.0 + has-proto: ^1.2.0 + is-typed-array: ^1.1.14 + checksum: cda9352178ebeab073ad6499b03e938ebc30c4efaea63a26839d89c4b1da9d2640b0d937fc2bd1f049eb0a38def6fbe8a061b601292ae62fe079a410ce56e3a6 + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.4": + version: 1.0.4 + resolution: "typed-array-byte-offset@npm:1.0.4" + dependencies: + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.8 + for-each: ^0.3.3 + gopd: ^1.2.0 + has-proto: ^1.2.0 + is-typed-array: ^1.1.15 + reflect.getprototypeof: ^1.0.9 + checksum: 670b7e6bb1d3c2cf6160f27f9f529e60c3f6f9611c67e47ca70ca5cfa24ad95415694c49d1dbfeda016d3372cab7dfc9e38c7b3e1bb8d692cae13a63d3c144d7 + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.7": + version: 1.0.7 + resolution: "typed-array-length@npm:1.0.7" + dependencies: + call-bind: ^1.0.7 + for-each: ^0.3.3 + gopd: ^1.0.1 + is-typed-array: ^1.1.13 + possible-typed-array-names: ^1.0.0 + reflect.getprototypeof: ^1.0.6 + checksum: deb1a4ffdb27cd930b02c7030cb3e8e0993084c643208e52696e18ea6dd3953dfc37b939df06ff78170423d353dc8b10d5bae5796f3711c1b3abe52872b3774c + languageName: node + linkType: hard + "typedarray-to-buffer@npm:^3.1.5": version: 3.1.5 resolution: "typedarray-to-buffer@npm:3.1.5" @@ -12141,32 +12110,31 @@ __metadata: languageName: node linkType: hard -"unbox-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "unbox-primitive@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - has-bigints: ^1.0.2 - has-symbols: ^1.0.3 - which-boxed-primitive: ^1.0.2 - checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 +"uglify-js@npm:^3.1.4": + version: 3.19.3 + resolution: "uglify-js@npm:3.19.3" + bin: + uglifyjs: bin/uglifyjs + checksum: 7ed6272fba562eb6a3149cfd13cda662f115847865c03099e3995a0e7a910eba37b82d4fccf9e88271bb2bcbe505bb374967450f433c17fa27aa36d94a8d0553 languageName: node linkType: hard -"unbzip2-stream@npm:^1.3.3": - version: 1.4.3 - resolution: "unbzip2-stream@npm:1.4.3" +"unbox-primitive@npm:^1.1.0": + version: 1.1.0 + resolution: "unbox-primitive@npm:1.1.0" dependencies: - buffer: ^5.2.1 - through: ^2.3.8 - checksum: 0e67c4a91f4fa0fc7b4045f8b914d3498c2fc2e8c39c359977708ec85ac6d6029840e97f508675fdbdf21fcb8d276ca502043406f3682b70f075e69aae626d1d + call-bound: ^1.0.3 + has-bigints: ^1.0.2 + has-symbols: ^1.1.0 + which-boxed-primitive: ^1.1.1 + checksum: 729f13b84a5bfa3fead1d8139cee5c38514e63a8d6a437819a473e241ba87eeb593646568621c7fc7f133db300ef18d65d1a5a60dc9c7beb9000364d93c581df languageName: node linkType: hard -"unc-path-regex@npm:^0.1.2": - version: 0.1.2 - resolution: "unc-path-regex@npm:0.1.2" - checksum: a05fa2006bf4606051c10fc7968f08ce7b28fa646befafa282813aeb1ac1a56f65cb1b577ca7851af2726198d59475bb49b11776036257b843eaacee2860a4ec +"undici-types@npm:~7.16.0": + version: 7.16.0 + resolution: "undici-types@npm:7.16.0" + checksum: 1ef68fc6c5bad200c8b6f17de8e5bc5cfdcadc164ba8d7208cd087cfa8583d922d8316a7fd76c9a658c22b4123d3ff847429185094484fbc65377d695c905857 languageName: node linkType: hard @@ -12181,9 +12149,9 @@ __metadata: linkType: hard "unicode-canonical-property-names-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" - checksum: 39be078afd014c14dcd957a7a46a60061bc37c4508ba146517f85f60361acf4c7539552645ece25de840e17e293baa5556268d091ca6762747fdd0c705001a45 + version: 2.0.1 + resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.1" + checksum: 3c3dabdb1d22aef4904399f9e810d0b71c0b12b3815169d96fac97e56d5642840c6071cf709adcace2252bc6bb80242396c2ec74b37224eb015c5f7aca40bad7 languageName: node linkType: hard @@ -12197,17 +12165,17 @@ __metadata: languageName: node linkType: hard -"unicode-match-property-value-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-match-property-value-ecmascript@npm:2.0.0" - checksum: 8fe6a09d9085a625cabcead5d95bdbc1a2d5d481712856092ce0347231e81a60b93a68f1b69e82b3076a07e415a72c708044efa2aa40ae23e2e7b5c99ed4a9ea +"unicode-match-property-value-ecmascript@npm:^2.2.1": + version: 2.2.1 + resolution: "unicode-match-property-value-ecmascript@npm:2.2.1" + checksum: e6c73e07bb4dc4aa399797a14b170e84a30ed290bcf97cc4305cf67dde8744119721ce17cef03f4f9d4ff48654bfa26eadc7fe1e8dd4b71b8f3b2e9a9742f013 languageName: node linkType: hard "unicode-property-aliases-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-property-aliases-ecmascript@npm:2.0.0" - checksum: dda4d39128cbbede2ac60fbb85493d979ec65913b8a486bf7cb7a375a2346fa48cbf9dc6f1ae23376e7e8e684c2b411434891e151e865a661b40a85407db51d0 + version: 2.2.0 + resolution: "unicode-property-aliases-ecmascript@npm:2.2.0" + checksum: 0dd0f6e70130c59b4a841bac206758f70227b113145e4afe238161e3e8540e8eb79963e7a228cd90ad13d499e96f7ef4ee8940835404b2181ad9bf9c174818e3 languageName: node linkType: hard @@ -12238,21 +12206,46 @@ __metadata: languageName: node linkType: hard -"unique-filename@npm:^1.1.1": - version: 1.1.1 - resolution: "unique-filename@npm:1.1.1" +"uniqid@npm:5.4.0": + version: 5.4.0 + resolution: "uniqid@npm:5.4.0" + checksum: 69fc28e7b2b5b24227b4295e51aa7c1d4085a60655ad071db8fc350876cc9044d68ee0781c0d27c2c98691380aa418970e0d1b02a1e4564480f9d19b0dc1707b + languageName: node + linkType: hard + +"unique-filename@npm:^2.0.0": + version: 2.0.1 + resolution: "unique-filename@npm:2.0.1" dependencies: - unique-slug: ^2.0.0 - checksum: cf4998c9228cc7647ba7814e255dec51be43673903897b1786eff2ac2d670f54d4d733357eb08dea969aa5e6875d0e1bd391d668fbdb5a179744e7c7551a6f80 + unique-slug: ^3.0.0 + checksum: 807acf3381aff319086b64dc7125a9a37c09c44af7620bd4f7f3247fcd5565660ac12d8b80534dcbfd067e6fe88a67e621386dd796a8af828d1337a8420a255f languageName: node linkType: hard -"unique-slug@npm:^2.0.0": - version: 2.0.2 - resolution: "unique-slug@npm:2.0.2" +"unique-filename@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-filename@npm:5.0.0" + dependencies: + unique-slug: ^6.0.0 + checksum: a5f67085caef74bdd2a6869a200ed5d68d171f5cc38435a836b5fd12cce4e4eb55e6a190298035c325053a5687ed7a3c96f0a91e82215fd14729769d9ac57d9b + languageName: node + linkType: hard + +"unique-slug@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-slug@npm:3.0.0" + dependencies: + imurmurhash: ^0.1.4 + checksum: 49f8d915ba7f0101801b922062ee46b7953256c93ceca74303bd8e6413ae10aa7e8216556b54dc5382895e8221d04f1efaf75f945c2e4a515b4139f77aa6640c + languageName: node + linkType: hard + +"unique-slug@npm:^6.0.0": + version: 6.0.0 + resolution: "unique-slug@npm:6.0.0" dependencies: imurmurhash: ^0.1.4 - checksum: 5b6876a645da08d505dedb970d1571f6cebdf87044cb6b740c8dbb24f0d6e1dc8bdbf46825fd09f994d7cf50760e6f6e063cfa197d51c5902c00a861702eb75a + checksum: ad6cf238b10292d944521714d31bc9f3ca79fa80cb7a154aad183056493f98e85de669412c6bbfe527ffa9bdeff36d3dd4d5bccaf562c794f2580ab11932b691 languageName: node linkType: hard @@ -12348,21 +12341,21 @@ __metadata: languageName: node linkType: hard -"universalify@npm:^0.1.2": - version: 0.1.2 - resolution: "universalify@npm:0.1.2" - checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff +"universalify@npm:^0.2.0": + version: 0.2.0 + resolution: "universalify@npm:0.2.0" + checksum: e86134cb12919d177c2353196a4cc09981524ee87abf621f7bc8d249dbbbebaec5e7d1314b96061497981350df786e4c5128dbf442eba104d6e765bc260678b5 languageName: node linkType: hard "universalify@npm:^2.0.0": - version: 2.0.0 - resolution: "universalify@npm:2.0.0" - checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: ecd8469fe0db28e7de9e5289d32bd1b6ba8f7183db34f3bfc4ca53c49891c2d6aa05f3fb3936a81285a905cc509fb641a0c3fc131ec786167eff41236ae32e60 languageName: node linkType: hard -"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": +"unpipe@npm:~1.0.0": version: 1.0.0 resolution: "unpipe@npm:1.0.0" checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 @@ -12376,31 +12369,17 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.13": - version: 1.0.13 - resolution: "update-browserslist-db@npm:1.0.13" +"update-browserslist-db@npm:^1.2.0": + version: 1.2.3 + resolution: "update-browserslist-db@npm:1.2.3" dependencies: - escalade: ^3.1.1 - picocolors: ^1.0.0 + escalade: ^3.2.0 + picocolors: ^1.1.1 peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 1e47d80182ab6e4ad35396ad8b61008ae2a1330221175d0abd37689658bdb61af9b705bfc41057fd16682474d79944fb2d86767c5ed5ae34b6276b9bed353322 - languageName: node - linkType: hard - -"update-browserslist-db@npm:^1.0.4": - version: 1.0.4 - resolution: "update-browserslist-db@npm:1.0.4" - dependencies: - escalade: ^3.1.1 - picocolors: ^1.0.0 - peerDependencies: - browserslist: ">= 4.21.0" - bin: - browserslist-lint: cli.js - checksum: 7c7da28d0fc733b17e01c8fa9385ab909eadce64b8ea644e9603867dc368c2e2a6611af8247e72612b23f9e7cb87ac7c7585a05ff94e1759e9d646cbe9bf49a7 + checksum: 6f209a97ae8eacdd3a1ef2eb365adf49d1e2a757e5b2dd4ac87dc8c99236cbe3e572d3e605a87dd7b538a11751b71d9f93edc47c7405262a293a493d155316cd languageName: node linkType: hard @@ -12413,12 +12392,13 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:1.2.0": - version: 1.2.0 - resolution: "use-sync-external-store@npm:1.2.0" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 5c639e0f8da3521d605f59ce5be9e094ca772bd44a4ce7322b055a6f58eeed8dda3c94cabd90c7a41fb6fa852210092008afe48f7038792fd47501f33299116a +"url-parse@npm:^1.5.3": + version: 1.5.10 + resolution: "url-parse@npm:1.5.10" + dependencies: + querystringify: ^2.1.1 + requires-port: ^1.0.0 + checksum: fbdba6b1d83336aca2216bbdc38ba658d9cfb8fc7f665eb8b17852de638ff7d1a162c198a8e4ed66001ddbf6c9888d41e4798912c62b4fd777a31657989f7bdf languageName: node linkType: hard @@ -12448,15 +12428,6 @@ __metadata: languageName: node linkType: hard -"uuid@npm:^3.3.2": - version: 3.4.0 - resolution: "uuid@npm:3.4.0" - bin: - uuid: ./bin/uuid - checksum: 58de2feed61c59060b40f8203c0e4ed7fd6f99d42534a499f1741218a1dd0c129f4aa1de797bcf822c8ea5da7e4137aa3673431a96dae729047f7aca7b27866f - languageName: node - linkType: hard - "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" @@ -12465,20 +12436,20 @@ __metadata: linkType: hard "v8-compile-cache@npm:^2.0.3": - version: 2.3.0 - resolution: "v8-compile-cache@npm:2.3.0" - checksum: adb0a271eaa2297f2f4c536acbfee872d0dd26ec2d76f66921aa7fc437319132773483344207bdbeee169225f4739016d8d2dbf0553913a52bb34da6d0334f8e + version: 2.4.0 + resolution: "v8-compile-cache@npm:2.4.0" + checksum: 8eb6ddb59d86f24566503f1e6ca98f3e6f43599f05359bd3ab737eaaf1585b338091478a4d3d5c2646632cf8030288d7888684ea62238cdce15a65ae2416718f languageName: node linkType: hard "v8-to-istanbul@npm:^9.0.1": - version: 9.2.0 - resolution: "v8-to-istanbul@npm:9.2.0" + version: 9.3.0 + resolution: "v8-to-istanbul@npm:9.3.0" dependencies: "@jridgewell/trace-mapping": ^0.3.12 "@types/istanbul-lib-coverage": ^2.0.1 convert-source-map: ^2.0.0 - checksum: 31ef98c6a31b1dab6be024cf914f235408cd4c0dc56a5c744a5eea1a9e019ba279e1b6f90d695b78c3186feed391ed492380ccf095009e2eb91f3d058f0b4491 + checksum: ded42cd535d92b7fd09a71c4c67fb067487ef5551cc227bfbf2a1f159a842e4e4acddaef20b955789b8d3b455b9779d036853f4a27ce15007f6364a4d30317ae languageName: node linkType: hard @@ -12489,17 +12460,6 @@ __metadata: languageName: node linkType: hard -"verror@npm:1.10.0": - version: 1.10.0 - resolution: "verror@npm:1.10.0" - dependencies: - assert-plus: ^1.0.0 - core-util-is: 1.0.2 - extsprintf: ^1.2.0 - checksum: c431df0bedf2088b227a4e051e0ff4ca54df2c114096b0c01e1cbaadb021c30a04d7dd5b41ab277bcd51246ca135bf931d4c4c796ecae7a4fef6d744ecef36ea - languageName: node - linkType: hard - "vfile-location@npm:^3.0.0, vfile-location@npm:^3.2.0": version: 3.2.0 resolution: "vfile-location@npm:3.2.0" @@ -12529,32 +12489,12 @@ __metadata: languageName: node linkType: hard -"w3c-hr-time@npm:^1.0.1, w3c-hr-time@npm:^1.0.2": - version: 1.0.2 - resolution: "w3c-hr-time@npm:1.0.2" - dependencies: - browser-process-hrtime: ^1.0.0 - checksum: ec3c2dacbf8050d917bbf89537a101a08c2e333b4c19155f7d3bedde43529d4339db6b3d049d9610789cb915f9515f8be037e0c54c079e9d4735c50b37ed52b9 - languageName: node - linkType: hard - -"w3c-xmlserializer@npm:^1.1.2": - version: 1.1.2 - resolution: "w3c-xmlserializer@npm:1.1.2" - dependencies: - domexception: ^1.0.1 - webidl-conversions: ^4.0.2 - xml-name-validator: ^3.0.0 - checksum: 1683e083d0dfc1529988f8956510a3a26e90738b41c4df0c7eb95283bfbeabeb492308117dcd32afef2a141e2a959ddf10ce562983d91b9f474a530b9dcdd337 - languageName: node - linkType: hard - -"w3c-xmlserializer@npm:^3.0.0": - version: 3.0.0 - resolution: "w3c-xmlserializer@npm:3.0.0" +"w3c-xmlserializer@npm:^4.0.0": + version: 4.0.0 + resolution: "w3c-xmlserializer@npm:4.0.0" dependencies: xml-name-validator: ^4.0.0 - checksum: 0af8589942eeb11c9fe29eb31a1a09f3d5dd136aea53a9848dfbabff79ac0dd26fe13eb54d330d5555fe27bb50b28dca0715e09f9cc2bfa7670ccc8b7f919ca2 + checksum: eba070e78deb408ae8defa4d36b429f084b2b47a4741c4a9be3f27a0a3d1845e277e3072b04391a138f7e43776842627d1334e448ff13ff90ad9fb1214ee7091 languageName: node linkType: hard @@ -12608,13 +12548,6 @@ __metadata: languageName: node linkType: hard -"webidl-conversions@npm:^4.0.2": - version: 4.0.2 - resolution: "webidl-conversions@npm:4.0.2" - checksum: c93d8dfe908a0140a4ae9c0ebc87a33805b416a33ee638a605b551523eec94a9632165e54632f6d57a39c5f948c4bab10e0e066525e9a4b87a79f0d04fbca374 - languageName: node - linkType: hard - "webidl-conversions@npm:^7.0.0": version: 7.0.0 resolution: "webidl-conversions@npm:7.0.0" @@ -12645,15 +12578,6 @@ __metadata: languageName: node linkType: hard -"whatwg-encoding@npm:^1.0.1, whatwg-encoding@npm:^1.0.5": - version: 1.0.5 - resolution: "whatwg-encoding@npm:1.0.5" - dependencies: - iconv-lite: 0.4.24 - checksum: 5be4efe111dce29ddee3448d3915477fcc3b28f991d9cf1300b4e50d6d189010d47bca2f51140a844cf9b726e8f066f4aee72a04d687bfe4f2ee2767b2f5b1e6 - languageName: node - linkType: hard - "whatwg-encoding@npm:^2.0.0": version: 2.0.0 resolution: "whatwg-encoding@npm:2.0.0" @@ -12663,13 +12587,6 @@ __metadata: languageName: node linkType: hard -"whatwg-mimetype@npm:^2.2.0, whatwg-mimetype@npm:^2.3.0": - version: 2.3.0 - resolution: "whatwg-mimetype@npm:2.3.0" - checksum: 23eb885940bcbcca4ff841c40a78e9cbb893ec42743993a42bf7aed16085b048b44b06f3402018931687153550f9a32d259dfa524e4f03577ab898b6965e5383 - languageName: node - linkType: hard - "whatwg-mimetype@npm:^3.0.0": version: 3.0.0 resolution: "whatwg-mimetype@npm:3.0.0" @@ -12697,27 +12614,64 @@ __metadata: languageName: node linkType: hard -"whatwg-url@npm:^7.0.0": - version: 7.1.0 - resolution: "whatwg-url@npm:7.1.0" +"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": + version: 1.1.1 + resolution: "which-boxed-primitive@npm:1.1.1" dependencies: - lodash.sortby: ^4.7.0 - tr46: ^1.0.1 - webidl-conversions: ^4.0.2 - checksum: fecb07c87290b47d2ec2fb6d6ca26daad3c9e211e0e531dd7566e7ff95b5b3525a57d4f32640ad4adf057717e0c215731db842ad761e61d947e81010e05cf5fd + is-bigint: ^1.1.0 + is-boolean-object: ^1.2.1 + is-number-object: ^1.1.1 + is-string: ^1.1.1 + is-symbol: ^1.1.1 + checksum: ee41d0260e4fd39551ad77700c7047d3d281ec03d356f5e5c8393fe160ba0db53ef446ff547d05f76ffabfd8ad9df7c9a827e12d4cccdbc8fccf9239ff8ac21e languageName: node linkType: hard -"which-boxed-primitive@npm:^1.0.2": +"which-builtin-type@npm:^1.2.1": + version: 1.2.1 + resolution: "which-builtin-type@npm:1.2.1" + dependencies: + call-bound: ^1.0.2 + function.prototype.name: ^1.1.6 + has-tostringtag: ^1.0.2 + is-async-function: ^2.0.0 + is-date-object: ^1.1.0 + is-finalizationregistry: ^1.1.0 + is-generator-function: ^1.0.10 + is-regex: ^1.2.1 + is-weakref: ^1.0.2 + isarray: ^2.0.5 + which-boxed-primitive: ^1.1.0 + which-collection: ^1.0.2 + which-typed-array: ^1.1.16 + checksum: 7a3617ba0e7cafb795f74db418df889867d12bce39a477f3ee29c6092aa64d396955bf2a64eae3726d8578440e26777695544057b373c45a8bcf5fbe920bf633 + languageName: node + linkType: hard + +"which-collection@npm:^1.0.2": version: 1.0.2 - resolution: "which-boxed-primitive@npm:1.0.2" + resolution: "which-collection@npm:1.0.2" + dependencies: + is-map: ^2.0.3 + is-set: ^2.0.3 + is-weakmap: ^2.0.2 + is-weakset: ^2.0.3 + checksum: c51821a331624c8197916598a738fc5aeb9a857f1e00d89f5e4c03dc7c60b4032822b8ec5696d28268bb83326456a8b8216344fb84270d18ff1d7628051879d9 + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19": + version: 1.1.20 + resolution: "which-typed-array@npm:1.1.20" dependencies: - is-bigint: ^1.0.1 - is-boolean-object: ^1.1.0 - is-number-object: ^1.0.4 - is-string: ^1.0.5 - is-symbol: ^1.0.3 - checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.4 + for-each: ^0.3.5 + get-proto: ^1.0.1 + gopd: ^1.2.0 + has-tostringtag: ^1.0.2 + checksum: 82527027127c3a6f7b278b5c0059605b968bec780d1ddd7c0ce3c2172ae4b9d2217486123107e31d229ff57ed8cc2bc76d751f290f392ee6d3aa27b26d2ffc12 languageName: node linkType: hard @@ -12732,6 +12686,17 @@ __metadata: languageName: node linkType: hard +"which@npm:^6.0.0": + version: 6.0.1 + resolution: "which@npm:6.0.1" + dependencies: + isexe: ^4.0.0 + bin: + node-which: bin/which.js + checksum: dbea77c7d3058bf6c78bf9659d2dce4d2b57d39a15b826b2af6ac2e5a219b99dc8a831b79fdbc453c0598adb4f3f84cf9c2491fd52beb9f5d2dececcad117f68 + languageName: node + linkType: hard + "wide-align@npm:^1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" @@ -12741,32 +12706,39 @@ __metadata: languageName: node linkType: hard -"word-wrap@npm:^1.2.3, word-wrap@npm:~1.2.3": +"word-wrap@npm:^1.2.5": version: 1.2.5 resolution: "word-wrap@npm:1.2.5" checksum: f93ba3586fc181f94afdaff3a6fef27920b4b6d9eaefed0f428f8e07adea2a7f54a5f2830ce59406c8416f033f86902b91eb824072354645eea687dff3691ccb languageName: node linkType: hard -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" +"wordwrap@npm:^1.0.0": + version: 1.0.0 + resolution: "wordwrap@npm:1.0.0" + checksum: 2a44b2788165d0a3de71fd517d4880a8e20ea3a82c080ce46e294f0b68b69a2e49cff5f99c600e275c698a90d12c5ea32aff06c311f0db2eb3f1201f3e7b2a04 + languageName: node + linkType: hard + +"wrap-ansi@npm:^6.0.1": + version: 6.2.0 + resolution: "wrap-ansi@npm:6.2.0" dependencies: ansi-styles: ^4.0.0 string-width: ^4.1.0 strip-ansi: ^6.0.0 - checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b + checksum: 6cd96a410161ff617b63581a08376f0cb9162375adeb7956e10c8cd397821f7eb2a6de24eb22a0b28401300bf228c86e50617cd568209b5f6775b93c97d2fe3a languageName: node linkType: hard -"wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" +"wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" dependencies: - ansi-styles: ^6.1.0 - string-width: ^5.0.1 - strip-ansi: ^7.0.1 - checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 + ansi-styles: ^4.0.0 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b languageName: node linkType: hard @@ -12822,33 +12794,18 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7.0.0, ws@npm:^7.2.3": - version: 7.5.8 - resolution: "ws@npm:7.5.8" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 49479ccf3ddab6500c5906fbcc316e9c8cd44b0ffb3903a6c1caf9b38cb9e06691685722a4c642cfa7d4c6eb390424fc3142cd4f8b940cfc7a9ce9761b1cd65b - languageName: node - linkType: hard - -"ws@npm:^8.8.0": - version: 8.8.0 - resolution: "ws@npm:8.8.0" +"ws@npm:^8.11.0": + version: 8.19.0 + resolution: "ws@npm:8.19.0" peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: ">=5.0.2" peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - checksum: 6ceed1ca1cb800ef60c7fc8346c7d5d73d73be754228eb958765abf5d714519338efa20ffe674167039486eb3a813aae5a497f8d319e16b4d96216a31df5bd95 + checksum: 7a426122c373e053a65a2affbcdcdbf8f643ba0265577afd4e08595397ca244c05de81570300711e2363a9dab5aea3ae644b445bc7468b1ebbb51bfe2efb20e1 languageName: node linkType: hard @@ -12863,13 +12820,6 @@ __metadata: languageName: node linkType: hard -"xml-name-validator@npm:^3.0.0": - version: 3.0.0 - resolution: "xml-name-validator@npm:3.0.0" - checksum: b3ac459afed783c285bb98e4960bd1f3ba12754fd4f2320efa0f9181ca28928c53cc75ca660d15d205e81f92304419afe94c531c7cfb3e0649aa6d140d53ecb0 - languageName: node - linkType: hard - "xml-name-validator@npm:^4.0.0": version: 4.0.0 resolution: "xml-name-validator@npm:4.0.0" @@ -12877,7 +12827,7 @@ __metadata: languageName: node linkType: hard -"xmlchars@npm:^2.1.1, xmlchars@npm:^2.2.0": +"xmlchars@npm:^2.2.0": version: 2.2.0 resolution: "xmlchars@npm:2.2.0" checksum: 8c70ac94070ccca03f47a81fcce3b271bd1f37a591bf5424e787ae313fcb9c212f5f6786e1fa82076a2c632c0141552babcd85698c437506dfa6ae2d58723062 @@ -12912,6 +12862,13 @@ __metadata: languageName: node linkType: hard +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: eba51182400b9f35b017daa7f419f434424410691bbc5de4f4240cc830fdef906b504424992700dc047f16b4d99100a6f8b8b11175c193f38008e9c96322b6a5 + languageName: node + linkType: hard + "yaml@npm:^1.10.0": version: 1.10.2 resolution: "yaml@npm:1.10.2" @@ -12919,23 +12876,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.3.4": - version: 2.4.2 - resolution: "yaml@npm:2.4.2" - bin: - yaml: bin.mjs - checksum: 90dda4485de04367251face9abb5c36927c94e44078f4e958e6468a07e74e7e92f89be20fc49860b6268c51ee5a5fc79ef89197d3f874bf24ef8921cc4ba9013 - languageName: node - linkType: hard - -"yargs-parser@npm:^21.0.0": - version: 21.0.1 - resolution: "yargs-parser@npm:21.0.1" - checksum: c3ea2ed12cad0377ce3096b3f138df8267edf7b1aa7d710cd502fe16af417bafe4443dd71b28158c22fcd1be5dfd0e86319597e47badf42ff83815485887323a - languageName: node - linkType: hard - -"yargs-parser@npm:^21.0.1": +"yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c @@ -12943,27 +12884,17 @@ __metadata: linkType: hard "yargs@npm:^17.3.1": - version: 17.5.1 - resolution: "yargs@npm:17.5.1" + version: 17.7.2 + resolution: "yargs@npm:17.7.2" dependencies: - cliui: ^7.0.2 + cliui: ^8.0.1 escalade: ^3.1.1 get-caller-file: ^2.0.5 require-directory: ^2.1.1 string-width: ^4.2.3 y18n: ^5.0.5 - yargs-parser: ^21.0.0 - checksum: 00d58a2c052937fa044834313f07910fd0a115dec5ee35919e857eeee3736b21a4eafa8264535800ba8bac312991ce785ecb8a51f4d2cc8c4676d865af1cfbde - languageName: node - linkType: hard - -"yauzl@npm:^2.10.0": - version: 2.10.0 - resolution: "yauzl@npm:2.10.0" - dependencies: - buffer-crc32: ~0.2.3 - fd-slicer: ~1.1.0 - checksum: 7f21fe0bbad6e2cb130044a5d1d0d5a0e5bf3d8d4f8c4e6ee12163ce798fee3de7388d22a7a0907f563ac5f9d40f8699a223d3d5c1718da90b0156da6904022b + yargs-parser: ^21.1.1 + checksum: 73b572e863aa4a8cbef323dd911d79d193b772defd5a51aab0aca2d446655216f5002c42c5306033968193bdbf892a7a4c110b0d77954a7fdf563e653967b56a languageName: node linkType: hard @@ -12981,13 +12912,6 @@ __metadata: languageName: node linkType: hard -"zerop@npm:^1.0.1": - version: 1.0.1 - resolution: "zerop@npm:1.0.1" - checksum: af87d05df68a78a0f9c1c5f49cf2da326d720e552b752642200d84a84271f055ea4cc7fae4cd03e344df1596bc7b6e5460e0224e685d0a23dd7019338864385b - languageName: node - linkType: hard - "zwitch@npm:^1.0.0": version: 1.0.5 resolution: "zwitch@npm:1.0.5"