1
0
Эх сурвалжийг харах

docs: Add docs on custom fields & strategies etc

Michael Bromley 2 жил өмнө
parent
commit
a92d95bb05
100 өөрчлөгдсөн 2634 нэмэгдсэн , 1289 устгасан
  1. 0 0
      docs/docs/guides/concepts/custom-fields/custom-fields-data-table.webp
  2. 0 0
      docs/docs/guides/concepts/custom-fields/custom-fields-ui.webp
  3. 1095 0
      docs/docs/guides/concepts/custom-fields/index.md
  4. 373 0
      docs/docs/guides/concepts/strategies-configurable-operations/index.mdx
  5. BIN
      docs/docs/guides/concepts/the-api-layer/Vendure_docs-api_request.webp
  6. 123 0
      docs/docs/guides/concepts/the-api-layer/index.mdx
  7. 196 0
      docs/docs/guides/concepts/the-service-layer/index.mdx
  8. 0 487
      docs/docs/guides/developer-guide/customizing-models/index.md
  9. 0 9
      docs/docs/guides/getting-started/installation.md
  10. BIN
      docs/docs/guides/getting-started/key-concepts/vendure_architecture.png
  11. BIN
      docs/docs/guides/getting-started/overview/Vendure_docs-architecture.webp
  12. 12 9
      docs/docs/guides/getting-started/overview/index.md
  13. 0 0
      docs/docs/guides/how-to/writing-a-vendure-plugin.md
  14. 11 11
      docs/docs/reference/admin-ui-api/action-bar/action-bar-item.md
  15. 1 1
      docs/docs/reference/admin-ui-api/action-bar/action-bar-location-id.md
  16. 2 2
      docs/docs/reference/admin-ui-api/action-bar/add-action-bar-item.md
  17. 4 4
      docs/docs/reference/admin-ui-api/action-bar/on-click-context.md
  18. 1 1
      docs/docs/reference/admin-ui-api/action-bar/page-location-id.md
  19. 55 55
      docs/docs/reference/admin-ui-api/bulk-actions/bulk-action.md
  20. 2 2
      docs/docs/reference/admin-ui-api/bulk-actions/register-bulk-action.md
  21. 20 20
      docs/docs/reference/admin-ui-api/components/asset-picker-dialog-component.md
  22. 6 6
      docs/docs/reference/admin-ui-api/components/chip-component.md
  23. 22 22
      docs/docs/reference/admin-ui-api/components/currency-input-component.md
  24. 27 27
      docs/docs/reference/admin-ui-api/components/data-table-component.md
  25. 38 38
      docs/docs/reference/admin-ui-api/components/data-table2component.md
  26. 39 39
      docs/docs/reference/admin-ui-api/components/datetime-picker-component.md
  27. 8 8
      docs/docs/reference/admin-ui-api/components/dropdown-component.md
  28. 21 21
      docs/docs/reference/admin-ui-api/components/facet-value-selector-component.md
  29. 10 10
      docs/docs/reference/admin-ui-api/components/object-tree-component.md
  30. 3 3
      docs/docs/reference/admin-ui-api/components/order-state-label-component.md
  31. 8 8
      docs/docs/reference/admin-ui-api/components/product-variant-selector-component.md
  32. 13 13
      docs/docs/reference/admin-ui-api/components/rich-text-editor-component.md
  33. 17 17
      docs/docs/reference/admin-ui-api/components/zone-selector-component.md
  34. 3 3
      docs/docs/reference/admin-ui-api/custom-detail-components/custom-detail-component-config.md
  35. 2 1
      docs/docs/reference/admin-ui-api/custom-detail-components/custom-detail-component-location-id.md
  36. 3 3
      docs/docs/reference/admin-ui-api/custom-detail-components/custom-detail-component.md
  37. 2 2
      docs/docs/reference/admin-ui-api/custom-detail-components/register-custom-detail-component.md
  38. 2 2
      docs/docs/reference/admin-ui-api/custom-history-entry-components/customer-history-entry-component.md
  39. 6 6
      docs/docs/reference/admin-ui-api/custom-history-entry-components/history-entry-component.md
  40. 3 3
      docs/docs/reference/admin-ui-api/custom-history-entry-components/history-entry-config.md
  41. 2 2
      docs/docs/reference/admin-ui-api/custom-history-entry-components/order-history-entry-component.md
  42. 2 2
      docs/docs/reference/admin-ui-api/custom-history-entry-components/register-history-entry-component.md
  43. 99 99
      docs/docs/reference/admin-ui-api/custom-input-components/default-inputs.md
  44. 5 5
      docs/docs/reference/admin-ui-api/custom-input-components/form-input-component.md
  45. 3 3
      docs/docs/reference/admin-ui-api/custom-input-components/register-form-input-component.md
  46. 2 2
      docs/docs/reference/admin-ui-api/directives/if-multichannel-directive.md
  47. 2 2
      docs/docs/reference/admin-ui-api/directives/if-permissions-directive.md
  48. 19 19
      docs/docs/reference/admin-ui-api/list-detail-views/base-detail-component.md
  49. 2 2
      docs/docs/reference/admin-ui-api/list-detail-views/base-entity-resolver.md
  50. 19 19
      docs/docs/reference/admin-ui-api/list-detail-views/base-list-component.md
  51. 10 10
      docs/docs/reference/admin-ui-api/list-detail-views/detail-component-with-resolver.md
  52. 5 5
      docs/docs/reference/admin-ui-api/list-detail-views/typed-base-detail-component.md
  53. 13 13
      docs/docs/reference/admin-ui-api/list-detail-views/typed-base-list-component.md
  54. 4 4
      docs/docs/reference/admin-ui-api/nav-menu/add-nav-menu-item.md
  55. 3 3
      docs/docs/reference/admin-ui-api/nav-menu/add-nav-menu-section.md
  56. 8 8
      docs/docs/reference/admin-ui-api/nav-menu/nav-menu-item.md
  57. 9 9
      docs/docs/reference/admin-ui-api/nav-menu/nav-menu-section.md
  58. 3 3
      docs/docs/reference/admin-ui-api/nav-menu/navigation-types.md
  59. 2 2
      docs/docs/reference/admin-ui-api/pipes/asset-preview-pipe.md
  60. 3 3
      docs/docs/reference/admin-ui-api/pipes/duration-pipe.md
  61. 2 2
      docs/docs/reference/admin-ui-api/pipes/file-size-pipe.md
  62. 4 4
      docs/docs/reference/admin-ui-api/pipes/has-permission-pipe.md
  63. 3 3
      docs/docs/reference/admin-ui-api/pipes/locale-currency-name-pipe.md
  64. 3 3
      docs/docs/reference/admin-ui-api/pipes/locale-currency-pipe.md
  65. 3 3
      docs/docs/reference/admin-ui-api/pipes/locale-date-pipe.md
  66. 3 3
      docs/docs/reference/admin-ui-api/pipes/locale-language-name-pipe.md
  67. 3 3
      docs/docs/reference/admin-ui-api/pipes/locale-region-name-pipe.md
  68. 3 3
      docs/docs/reference/admin-ui-api/pipes/time-ago-pipe.md
  69. 11 11
      docs/docs/reference/admin-ui-api/providers/data-service.md
  70. 14 14
      docs/docs/reference/admin-ui-api/providers/modal-service.md
  71. 11 11
      docs/docs/reference/admin-ui-api/providers/notification-service.md
  72. 8 8
      docs/docs/reference/admin-ui-api/tabs/page-tab-config.md
  73. 2 2
      docs/docs/reference/admin-ui-api/tabs/register-page-tab.md
  74. 17 17
      docs/docs/reference/admin-ui-api/ui-devkit/admin-ui-extension.md
  75. 2 2
      docs/docs/reference/admin-ui-api/ui-devkit/compile-ui-extensions.md
  76. 2 2
      docs/docs/reference/admin-ui-api/ui-devkit/helpers.md
  77. 8 8
      docs/docs/reference/admin-ui-api/ui-devkit/ui-devkit-client.md
  78. 8 8
      docs/docs/reference/admin-ui-api/ui-devkit/ui-extension-compiler-options.md
  79. 1 1
      docs/docs/reference/admin-ui-api/ui-devkit/ui-extension-compiler-process-argument.md
  80. 11 4
      docs/docs/reference/typescript-api/assets/asset-naming-strategy.md
  81. 6 6
      docs/docs/reference/typescript-api/assets/asset-options.md
  82. 11 3
      docs/docs/reference/typescript-api/assets/asset-preview-strategy.md
  83. 16 9
      docs/docs/reference/typescript-api/assets/asset-storage-strategy.md
  84. 3 3
      docs/docs/reference/typescript-api/assets/default-asset-naming-strategy.md
  85. 16 16
      docs/docs/reference/typescript-api/auth/auth-options.md
  86. 13 6
      docs/docs/reference/typescript-api/auth/authentication-strategy.md
  87. 3 3
      docs/docs/reference/typescript-api/auth/bcrypt-password-hashing-strategy.md
  88. 11 11
      docs/docs/reference/typescript-api/auth/cookie-options.md
  89. 3 3
      docs/docs/reference/typescript-api/auth/default-password-validation-strategy.md
  90. 7 7
      docs/docs/reference/typescript-api/auth/external-authentication-service.md
  91. 6 6
      docs/docs/reference/typescript-api/auth/in-memory-session-cache-strategy.md
  92. 6 6
      docs/docs/reference/typescript-api/auth/native-authentication-strategy.md
  93. 5 5
      docs/docs/reference/typescript-api/auth/noop-session-cache-strategy.md
  94. 11 4
      docs/docs/reference/typescript-api/auth/password-hashing-strategy.md
  95. 10 3
      docs/docs/reference/typescript-api/auth/password-validation-strategy.md
  96. 12 12
      docs/docs/reference/typescript-api/auth/permission-definition.md
  97. 25 18
      docs/docs/reference/typescript-api/auth/session-cache-strategy.md
  98. 3 3
      docs/docs/reference/typescript-api/auth/superadmin-credentials.md
  99. 3 3
      docs/docs/reference/typescript-api/common/async-queue.md
  100. 2 2
      docs/docs/reference/typescript-api/common/bootstrap.md

+ 0 - 0
docs/docs/guides/developer-guide/customizing-models/custom-fields-data-table.webp → docs/docs/guides/concepts/custom-fields/custom-fields-data-table.webp


+ 0 - 0
docs/docs/guides/developer-guide/customizing-models/custom-fields-ui.webp → docs/docs/guides/concepts/custom-fields/custom-fields-ui.webp


+ 1095 - 0
docs/docs/guides/concepts/custom-fields/index.md

@@ -0,0 +1,1095 @@
+---
+title: 'Custom Fields'
+sidebar_position: 3
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+Custom fields allow you to add your own custom data properties almost every Vendure entity. The entities which may have custom fields defined are listed in the [CustomFields interface documentation](/reference/typescript-api/custom-fields/).
+
+Some use-cases for custom fields include:
+
+* Storing the weight, dimensions or other product-specific data on the `ProductVariant` entity.
+* Storing additional product codes on the `ProductVariant` entity such as ISBN or GTIN.
+* Adding a `downloadable` flag to the `Product` entity to indicate whether the product is a digital download.
+* Storing an external identifier (e.g. from a payment provider) on the `Customer` entity.
+* Adding a longitude and latitude to the `StockLocation` for use in selecting the closest location to a customer.
+
+## Defining custom fields
+
+Custom fields are specified in the VendureConfig:
+
+```ts
+const config = {
+    // ...
+    customFields: {
+        Product: [
+            { name: 'infoUrl', type: 'string' },
+            { name: 'downloadable', type: 'boolean' },
+            { name: 'shortName', type: 'localeString' },
+        ],
+        User: [
+            { name: 'socialLoginToken', type: 'string', unique: true },
+        ],
+    },
+};
+```
+
+With the example config above, the following will occur:
+
+1. The database schema will be altered, and a column will be added for each custom field. **Note: changes to custom fields require a database migration**. See the [Migrations guide](TODO).
+2. The GraphQL APIs will be modified to add the custom fields to the `Product` and `User` types respectively.
+3. If you are using the [AdminUiPlugin](/reference/typescript-api/core-plugins/admin-ui-plugin/), the Admin UI detail pages will now contain form inputs to allow the custom field data to be added or edited, and the list view data tables will allow custom field columns to be added, sorted and filtered.
+
+![custom-fields-data-table.webp](custom-fields-data-table.webp)
+
+The values of the custom fields can then be set and queried via the GraphQL APIs:
+
+
+<Tabs>
+<TabItem value="Request" label="Request" default>
+
+```graphql
+mutation {
+    updateProduct(input: {
+        id: 1
+        // highlight-start
+        customFields: {
+            infoUrl: "https://some-url.com",
+            downloadable: true,
+        }
+        // highlight-end
+        translations: [
+            // highlight-next-line
+            { languageCode: en, customFields: { shortName: "foo" } }
+        ]
+    }) {
+        id
+        name
+        // highlight-start
+        customFields {
+            infoUrl
+            downloadable
+            shortName
+        }
+        // highlight-end
+    }
+}
+```
+
+</TabItem>
+<TabItem value="Response" label="Response">
+
+```json
+{
+  "data": {
+    "product": {
+      "id": "1",
+      "name": "Laptop",
+      "customFields": {
+          "infoUrl": "https://some-url.com",
+          "downloadable": true,
+          "shortName": "foo"
+      }
+    }
+  }
+}
+```
+
+</TabItem>
+</Tabs>
+
+The custom fields will also extend the filter and sort options available to the `products` list query:
+
+```graphql
+mutation {
+    products(options: {
+        // highlight-start
+        filter: {
+            infoUrl: { contains: "new" },
+            downloadable: { eq: true }
+        },
+        sort: {
+            infoUrl: ASC
+        }
+        // highlight-end
+    }) {
+        items {
+            id
+            name
+            // highlight-start
+            customFields {
+                infoUrl
+                downloadable
+                shortName
+            }
+            // highlight-end
+        }
+    }
+}
+```
+
+
+## Available custom field types
+
+The following types are available for custom fields:
+
+| Type           | Description                  | Example                                                  |
+|----------------|------------------------------|----------------------------------------------------------|
+| `string`       | Short string data            | url, label                                               |
+| `localeString` | Localized short strings      | localized url                                            |
+| `text`         | Long text data               | extended product info, json config object                |
+| `localText`    | Localized long text          | localized extended product info                          |
+| `int`          | Integer                      | product weight, customer loyalty points, monetary values |
+| `float`        | Floating point number        | product review rating                                    |
+| `boolean`      | Boolean                      | isDownloadable flag on product                           |
+| `datetime`     | A datetime                   | date that variant is back in stock                       |
+| `relation`     | A relation to another entity | Asset used as a customer avatar, related Products        |
+
+To see the underlying DB data type and GraphQL type used for each, see the [CustomFieldType doc](/reference/typescript-api/custom-fields/custom-field-type).
+
+#### Relations
+
+It is possible to set up custom fields that hold references to other entities using the `'relation'` type:
+
+```ts
+const config = {
+    // ...
+    customFields: {
+        Customer: [
+            {
+                name: 'avatar',
+                // highlight-start
+                type: 'relation',
+                entity: Asset,
+                // highlight-end
+            },
+        ],
+    },
+};
+```
+
+In this example, we set up a many-to-one relationship from Customer to Asset, allowing us to specify an avatar image for each Customer. Relation custom fields are unique in that the input and output names are not the same - the input will expect an ID and will be named `'<field name>Id'` or `'<field name>Ids'` for list types.
+
+```graphql
+mutation {
+    updateCustomer(input: {
+        id: 1
+        customFields: {
+            avatarId: 42,
+        }
+    }) {
+        id
+        customFields {
+            avatar {
+                id
+                name
+                preview
+            }
+        }
+    }
+}
+```
+
+## Custom field config properties
+
+### Common properties
+
+All custom fields share some common properties:
+
+#### name
+
+<span class="badge badge--primary">Required</span>
+
+`string`
+
+The name of the field. This is used as the column name in the database, and as the GraphQL field name. The name should not contain spaces and by convention should be camelCased.
+
+```ts title="src/vendure-config.ts"
+const config = {
+    // ...
+    customFields: {
+        Product: [
+            {
+                // highlight-next-line
+                name: 'infoUrl',
+                type: 'string'
+            },
+        ]
+    }
+};
+```
+
+#### type
+
+<span class="badge badge--primary">Required</span>
+
+[`CustomFieldType`](/reference/typescript-api/custom-fields/custom-field-type)
+
+The type of data that will be stored in the field.
+
+#### list
+
+<span class="badge badge--secondary">Optional</span>
+
+`boolean`
+
+If set to `true`, then the field will be an array of the specified type. Defaults to `false`.
+
+```ts title="src/vendure-config.ts"
+const config = {
+    // ...
+    customFields: {
+        Product: [
+            {
+                name: 'infoUrls',
+                type: 'string',
+                // highlight-next-line
+                list: true,
+            },
+        ]
+    }
+};
+```
+
+Setting a custom field to be a list has the following effects:
+
+* The GraphQL type will be an array of the specified type.
+* The Admin UI will display a list of inputs for the field.
+* For lists of primitive types (anything except `relation`), the database type will be set to `simple-json` which serializes the data into a JSON string. For lists of `relation` types, a separate many-to-many table will be created.
+
+#### label
+
+<span class="badge badge--secondary">Optional</span>
+
+[`LocalizedStringArray`](/reference/typescript-api/configurable-operation-def/localized-string-array)
+
+An array of localized labels for the field. These are used in the Admin UI to label the field.
+
+```ts title="src/vendure-config.ts"
+import { LanguageCode } from '@vendure/core';
+
+const config = {
+    // ...
+    customFields: {
+        Product: [
+            {
+                name: 'infoUrl',
+                type: 'string',
+                // highlight-start
+                label: [
+                    {languageCode: LanguageCode.en, value: 'Info URL'},
+                    {languageCode: LanguageCode.de, value: 'Info-URL'},
+                    {languageCode: LanguageCode.es, value: 'URL de información'},
+                ],
+                // highlight-end
+            },
+        ]
+    }
+};
+```
+
+#### description
+
+<span class="badge badge--secondary">Optional</span>
+
+[`LocalizedStringArray`](/reference/typescript-api/configurable-operation-def/localized-string-array)
+
+An array of localized descriptions for the field. These are used in the Admin UI to describe the field.
+
+```ts title="src/vendure-config.ts"
+import { LanguageCode } from '@vendure/core';
+
+const config = {
+    // ...
+    customFields: {
+        Product: [
+            {
+                name: 'infoUrl',
+                type: 'string',
+                // highlight-start
+                description: [
+                    {languageCode: LanguageCode.en, value: 'A URL to more information about the product'},
+                    {languageCode: LanguageCode.de, value: 'Eine URL zu weiteren Informationen über das Produkt'},
+                    {languageCode: LanguageCode.es, value: 'Una URL con más información sobre el producto'},
+                ],
+                // highlight-end
+            },
+        ]
+    }
+};
+```
+
+#### public
+
+<span class="badge badge--secondary">Optional</span>
+
+`boolean`
+
+Whether the custom field is available via the Shop API. Defaults to `true`.
+
+```ts title="src/vendure-config.ts"
+const config = {
+    // ...
+    customFields: {
+        Product: [
+            {
+                name: 'profitMargin',
+                type: 'int',
+                // highlight-next-line
+                public: false,
+            },
+        ]
+    }
+};
+```
+
+#### readonly
+
+<span class="badge badge--secondary">Optional</span>
+
+`boolean`
+
+Whether the custom field can be updated via the GraphQL APIs. Defaults to `false`. If set to `true`, then the field
+can only be updated via direct manipulation via TypeScript code in a plugin.
+
+```ts title="src/vendure-config.ts"
+const config = {
+    // ...
+    customFields: {
+        Product: [
+            {
+                name: 'profitMargin',
+                type: 'int',
+                // highlight-next-line
+                readonly: true,
+            },
+        ]
+    }
+};
+```
+
+#### internal
+
+<span class="badge badge--secondary">Optional</span>
+
+`boolean`
+
+Whether the custom field is exposed at all via the GraphQL APIs. Defaults to `false`. If set to `true`, then the field will not be available
+via the GraphQL API, but can still be used in TypeScript code in a plugin. Internal fields are useful for storing data which is not intended
+to be exposed to the outside world, but which can be used in plugin logic.
+
+```ts title="src/vendure-config.ts"
+const config = {
+    // ...
+    customFields: {
+        OrderLine: [
+            {
+                name: 'referralId',
+                type: 'string',
+                // highlight-next-line
+                internal: true,
+            },
+        ]
+    }
+};
+```
+
+#### defaultValue
+
+<span class="badge badge--secondary">Optional</span>
+
+`any`
+
+The default value when an Entity is created with this field. If not provided, then the default value will be `null`. Note that if you set `nullable: false`, then
+you should also provide a `defaultValue` to avoid database errors when creating new entities.
+
+```ts title="src/vendure-config.ts"
+const config = {
+    // ...
+    customFields: {
+        Product: [
+            {
+                name: 'reviewRating',
+                type: 'float',
+                // highlight-next-line
+                defaultValue: 0,
+            },
+        ]
+    }
+};
+```
+
+#### nullable
+
+<span class="badge badge--secondary">Optional</span>
+
+`boolean`
+
+Whether the field is nullable in the database. If set to `false`, then a `defaultValue` should be provided.
+
+```ts title="src/vendure-config.ts"
+const config = {
+    // ...
+    customFields: {
+        Product: [
+            {
+                name: 'reviewRating',
+                type: 'float',
+                // highlight-start
+                nullable: false,
+                defaultValue: 0,
+                // highlight-end
+            },
+        ]
+    }
+};
+```
+
+#### unique
+
+<span class="badge badge--secondary">Optional</span>
+
+`boolean`
+
+Whether the value of the field should be unique. When set to `true`, a UNIQUE constraint is added to the column. Defaults
+to `false`.
+
+```ts title="src/vendure-config.ts"
+const config = {
+    // ...
+    customFields: {
+        Customer: [
+            {
+                name: 'externalId',
+                type: 'string',
+                // highlight-next-line
+                unique: true,
+            },
+        ]
+    }
+};
+```
+
+#### validate
+
+<span class="badge badge--secondary">Optional</span>
+
+`(value: any) => string | LocalizedString[] | void`
+
+A custom validation function. If the value is valid, then the function should not return a value. If a string or LocalizedString array is returned, this is interpreted as an error message.
+
+Note that string, number and date fields also have some built-in validation options such as `min`, `max`, `pattern` which you can read about in the following sections.
+
+```ts title="src/vendure-config.ts"
+import { LanguageCode } from '@vendure/core';
+
+const config = {
+    // ...
+    customFields: {
+        Product: [
+            {
+                name: 'infoUrl',
+                type: 'string',
+                // highlight-start
+                validate: (value: any) => {
+                    if (!value.startsWith('http')) {
+                        // If a localized error message is not required, a simple string can be returned.
+                        // return 'The URL must start with "http"';
+
+                        // If a localized error message is required, return an array of LocalizedString objects.
+                        return [
+                            {languageCode: LanguageCode.en, value: 'The URL must start with "http"'},
+                            {languageCode: LanguageCode.de, value: 'Die URL muss mit "http" beginnen'},
+                            {languageCode: LanguageCode.es, value: 'La URL debe comenzar con "http"'},
+                        ];
+                    }
+                },
+                // highlight-end
+            },
+        ]
+    }
+};
+```
+
+This function can even be asynchronous and may use the [Injector](/reference/typescript-api/common/injector/) to access providers.
+
+```ts title="src/vendure-config.ts"
+const config = {
+    // ...
+    customFields: {
+        ProductVariant: [
+            {
+                name: 'partCode',
+                type: 'string',
+                // highlight-start
+                validate: async (value, injector) => {
+                    const partCodeService = injector.get(PartCodeService);
+                    const isValid = await partCodeService.validateCode(value);
+                    if (!isValid) {
+                        return `Part code ${value} is not valid`;
+                    }
+                },
+                // highlight-end
+            },
+        ]
+    }
+};
+```
+
+### Properties for `string` fields
+
+In addition to the common properties, the `string` custom fields have some type-specific properties:
+
+#### pattern
+
+<span class="badge badge--secondary">Optional</span>
+
+`string`
+
+A regex pattern which the field value must match. If the value does not match the pattern, then the validation will fail.
+
+```ts title="src/vendure-config.ts"
+const config = {
+    // ...
+    customFields: {
+        ProductVariant: [
+            {
+                name: 'gtin',
+                type: 'string',
+                // highlight-next-line
+                pattern: '^\d{8}(?:\d{4,6})?$',
+            },
+        ]
+    }
+};
+```
+
+#### options
+
+<span class="badge badge--secondary">Optional</span>
+
+`{ value: string; label?: LocalizedString[]; }[]`
+
+An array of pre-defined options for the field. This is useful for fields which should only have a limited set of values. The `value` property is the value which will be stored in the database, and the `label` property is an optional array of localized strings which will be displayed in the admin UI.
+
+```ts title="src/vendure-config.ts"
+import { LanguageCode } from '@vendure/core';
+
+const config = {
+    // ...
+    customFields: {
+        ProductVariant: [
+            {
+                name: 'condition',
+                type: 'string',
+                // highlight-start
+                options: [
+                    {value: 'new', label: [{languageCode: LanguageCode.en, value: 'New'}]},
+                    {value: 'used', label: [{languageCode: LanguageCode.en, value: 'Used'}]},
+                ],
+                // highlight-end
+            },
+        ]
+    }
+};
+```
+
+Attempting to set the value of the field to a value which is not in the `options` array will cause the validation to fail.
+
+#### length
+
+<span class="badge badge--secondary">Optional</span>
+
+`number`
+
+The max length of the varchar created in the database. Defaults to 255. Maximum is 65,535.
+
+```ts title="src/vendure-config.ts"
+const config = {
+    // ...
+    customFields: {
+        ProductVariant: [
+            {
+                name: 'partCode',
+                type: 'string',
+                // highlight-next-line
+                length: 20,
+            },
+        ]
+    }
+};
+```
+
+### Properties for `localeString` fields
+
+In addition to the common properties, the `localeString` custom fields have some type-specific properties:
+
+#### pattern
+
+<span class="badge badge--secondary">Optional</span>
+
+`string`
+
+Same as the `pattern` property for `string` fields.
+
+#### length
+
+<span class="badge badge--secondary">Optional</span>
+
+`number`
+
+Same as the `length` property for `string` fields.
+
+### Properties for `int` & `float` fields
+
+In addition to the common properties, the `int` & `float` custom fields have some type-specific properties:
+
+#### min
+
+<span class="badge badge--secondary">Optional</span>
+
+`number`
+
+The minimum permitted value. If the value is less than this, then the validation will fail.
+
+```ts title="src/vendure-config.ts"
+const config = {
+    // ...
+    customFields: {
+        ProductVariant: [
+            {
+                name: 'reviewRating',
+                type: 'int',
+                // highlight-next-line
+                min: 0,
+            },
+        ]
+    }
+};
+```
+
+#### max
+
+<span class="badge badge--secondary">Optional</span>
+
+`number`
+
+The maximum permitted value. If the value is greater than this, then the validation will fail.
+
+```ts title="src/vendure-config.ts"
+const config = {
+    // ...
+    customFields: {
+        ProductVariant: [
+            {
+                name: 'reviewRating',
+                type: 'int',
+                // highlight-next-line
+                max: 5,
+            },
+        ]
+    }
+};
+```
+
+#### step
+
+<span class="badge badge--secondary">Optional</span>
+
+`number`
+
+The step value. This is used in the Admin UI to determine the increment/decrement value of the input field.
+
+```ts title="src/vendure-config.ts"
+const config = {
+    // ...
+    customFields: {
+        ProductVariant: [
+            {
+                name: 'reviewRating',
+                type: 'int',
+                // highlight-next-line
+                step: 0.5,
+            },
+        ]
+    }
+};
+```
+
+### Properties for `datetime` fields
+
+In addition to the common properties, the `datetime` custom fields have some type-specific properties.
+The min, max & step properties for datetime fields are intended to be used as described in
+[the MDN datetime-local docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local#Additional_attributes)
+
+#### min
+
+<span class="badge badge--secondary">Optional</span>
+
+`string`
+
+The earliest permitted date. If the value is earlier than this, then the validation will fail.
+
+```ts title="src/vendure-config.ts"
+const config = {
+    // ...
+    customFields: {
+        ProductVariant: [
+            {
+                name: 'releaseDate',
+                type: 'datetime',
+                // highlight-next-line
+                min: '2019-01-01T00:00:00.000Z',
+            },
+        ]
+    }
+};
+```
+
+#### max
+
+<span class="badge badge--secondary">Optional</span>
+
+`string`
+
+The latest permitted date. If the value is later than this, then the validation will fail.
+
+```ts title="src/vendure-config.ts"
+const config = {
+    // ...
+    customFields: {
+        ProductVariant: [
+            {
+                name: 'releaseDate',
+                type: 'datetime',
+                // highlight-next-line
+                max: '2019-12-31T23:59:59.999Z',
+            },
+        ]
+    }
+};
+```
+
+#### step
+
+<span class="badge badge--secondary">Optional</span>
+
+`string`
+
+The step value. See [the MDN datetime-local docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local#step) to understand how this is used.
+
+### Properties for `relation` fields
+
+In addition to the common properties, the `relation` custom fields have some type-specific properties:
+
+#### entity
+
+<span class="badge badge--primary">Required</span>
+
+`VendureEntity`
+
+The entity which this custom field is referencing. This can be one of the built-in entities, or a custom entity. If the entity is a custom entity, it must extend the `VendureEntity` class.
+
+```ts title="src/vendure-config.ts"
+import { Product } from '\@vendure/core';
+
+const config = {
+    // ...
+    customFields: {
+        Product: [
+            {
+                name: 'relatedProducts',
+                list: true,
+                // highlight-next-line
+                type: 'relation',
+                // highlight-next-line
+                entity: Product,
+            },
+        ]
+    }
+};
+```
+
+#### eager
+
+<span class="badge badge--secondary">Optional</span>
+
+`boolean`
+
+Whether to [eagerly load](https://typeorm.io/#/eager-and-lazy-relations) the relation. Defaults to false. Note that eager loading has performance implications, so should only be used when necessary.
+
+```ts title="src/vendure-config.ts"
+import { Product } from '\@vendure/core';
+
+const config = {
+    // ...
+    customFields: {
+        Product: [
+            {
+                name: 'relatedProducts',
+                list: true,
+                type: 'relation',
+                entity: Product,
+                // highlight-next-line
+                eager: true,
+            },
+        ]
+    }
+};
+```
+
+#### graphQLType
+
+<span class="badge badge--secondary">Optional</span>
+
+`string`
+
+The name of the GraphQL type that corresponds to the entity. Can be omitted if the GraphQL type name is the same as the entity name, which is the case for all of the built-in entities.
+
+```ts title="src/vendure-config.ts"
+import { CmsArticle } from './entities/cms-article.entity';
+
+const config = {
+    // ...
+    customFields: {
+        Product: [
+            {
+                name: 'blogPosts',
+                list: true,
+                type: 'relation',
+                entity: CmsArticle,
+                // highlight-next-line
+                graphQLType: 'BlogPost',
+            },
+        ]
+    }
+};
+```
+
+In the above example, the `CmsArticle` entity is being used as a related entity. Howeer, the GraphQL type name is `BlogPost`, so we must specify this in the `graphQLType` property, otherwise Vendure will try to extend the GraphQL schema with reference to a non-existent "CmsArticle" type.
+
+## Custom Field UI
+
+In the Admin UI, an appropriate default form input component is used for each custom field type. The Admin UI comes with a set of ready-made form input components, but it is also possible to create custom form input components. The ready-made components are:
+
+- `text-form-input`: A single-line text input
+- `password-form-input`: A single-line password input
+- `select-form-input`: A select input
+- `textarea-form-input`: A multi-line textarea input
+- `rich-text-form-input`: A rich text editor input that saves the content as HTML
+- `json-editor-form-input`: A simple JSON editor input
+- `html-editor-form-input`: A simple HTML text editor input
+- `number-form-input`: A number input
+- `currency-form-input`: A number input with currency formatting
+- `boolean-form-input`: A checkbox input
+- `date-form-input`: A date input
+- `relation-form-input`: A generic entity relation input which allows an ID to be manually specified
+- `customer-group-form-input`: A select input for selecting a CustomerGroup
+- `facet-value-form-input`: A select input for selecting a FacetValue
+- `product-selector-form-input`: A select input for selecting a Product from an autocomplete list
+- `product-multi-form-input`: A modal dialog for selecting multiple Products or ProductVariants
+
+#### Default form inputs
+
+This table shows the default form input component used for each custom field type:
+
+| Type                     | Form input component                                                                         |
+|--------------------------|----------------------------------------------------------------------------------------------|
+| `string`, `localeString` | `text-form-input` or, if options are defined, `select-form-input`                            |
+| `text`, `localeText`     | `textarea-form-input`                                                                        |
+| `int`, `float`           | `number-form-input`                                                                          |
+| `boolean`                | `boolean-form-input`                                                                         |
+| `datetime`               | `date-form-input`                                                                            |
+| `relation`               | Depends on related entity, defaults to `relation-form-input` if no specific component exists |
+
+:::info
+**UI for relation type**
+
+The Admin UI app has built-in selection components for "relation" custom fields that reference certain common entity types, such as Asset, Product, ProductVariant and Customer. If you are relating to an entity not covered by the built-in selection components, you will see a generic relation component which allows you to manually enter the ID of the entity you wish to select.
+
+If the generic selector is not suitable, or is you wish to replace one of the built-in selector components, you can create a UI extension that defines a custom field control for that custom field. You can read more about this in the [custom form input guide](TODO)
+:::
+
+### Specifying the input component
+
+The defaults listed above can be overridden by using the `ui` property of the custom field config object. For example, if we want a number to be displayed as a currency input:
+
+```ts title="src/vendure-config.ts"
+const config = {
+    // ...
+    customFields: {
+        ProductVariant: [
+            {
+                name: 'rrp',
+                type: 'int',
+                // highlight-next-line
+                ui: { component: 'currency-form-input' },
+            },
+        ]
+    }
+}
+```
+
+Here's an example config demonstrating several ways to customize the UI controls for custom fields:
+
+```ts
+import { LanguageCode, VendureConfig } from '@vendure/core';
+
+const config: VendureConfig = {
+    // ...
+    customFields: {
+        Product: [
+            // Rich text editor
+            {name: 'additionalInfo', type: 'text', ui: {component: 'rich-text-form-input'}},
+            // JSON editor
+            {name: 'specs', type: 'text', ui: {component: 'json-editor-form-input'}},
+            // Numeric with suffix
+            {
+                name: 'weight',
+                type: 'int',
+                ui: {component: 'number-form-input', suffix: 'g'},
+            },
+            // Currency input
+            {
+                name: 'RRP',
+                type: 'int',
+                ui: {component: 'currency-form-input'},
+            },
+            // Select with options
+            {
+                name: 'pageType',
+                type: 'string',
+                ui: {
+                    component: 'select-form-input',
+                    options: [
+                        {value: 'static', label: [{languageCode: LanguageCode.en, value: 'Static'}]},
+                        {value: 'dynamic', label: [{languageCode: LanguageCode.en, value: 'Dynamic'}]},
+                    ],
+                },
+            },
+            // Text with prefix
+            {
+                name: 'link',
+                type: 'string',
+                ui: {
+                    component: 'text-form-input',
+                    prefix: 'https://',
+                },
+            },
+        ],
+    },
+};
+```
+
+and the resulting UI:
+
+![custom-fields-ui.webp](custom-fields-ui.webp)
+
+:::info
+
+The various configuration options for each of the built-in form input  (e.g. `suffix`) is documented in the [`DefaultFormConfigHash` object](/reference/typescript-api/configurable-operation-def/default-form-config-hash/).
+
+:::
+
+### Custom form input components
+
+If none of the built-in form input components are suitable, you can create your own. This is a more advanced topic which is covered in detail in the [Custom Form Input Components](TODO) guide.
+
+
+## Tabbed custom fields
+
+With a large, complex project, it's common for lots of custom fields to be required. This can get visually noisy in the UI, so Vendure supports tabbed custom fields. Just specify the tab name in the `ui` object, and those fields with the same tab name will be grouped in the UI! The tab name can also be a translation token if you need to support multiple languages.
+
+:::note
+
+Tabs will only be displayed if there is more than one tab name used in the custom fields. A lack of a `tab` property is counted as a tab (the "general" tab).
+
+:::
+
+```ts title="src/vendure-config.ts"
+const config = {
+    // ...
+    customFields: {
+        Product: [
+            { name: 'additionalInfo', type: 'text', ui: {component: 'rich-text-form-input'} },
+            { name: 'specs', type: 'text', ui: {component: 'json-editor-form-input'} },
+            { name: 'width', type: 'int', ui: {tab: 'Shipping'} },
+            { name: 'height', type: 'int', ui: {tab: 'Shipping'} },
+            { name: 'depth', type: 'int', ui: {tab: 'Shipping'} },
+            { name: 'weight', type: 'int', ui: {tab: 'Shipping'} },
+        ],
+    },
+}
+```
+
+
+
+## TypeScript Typings
+
+Because custom fields are generated at run-time, TypeScript has no way of knowing about them based on your
+VendureConfig. Consider the example above - let's say we have a [plugin]({{< relref "/guides/plugins" >}}) which needs to
+access the custom field values on a Product entity.
+
+Attempting to access the custom field will result in a TS compiler error:
+
+```ts {hl_lines=[12,13]}
+import { RequestContext, TransactionalConnection, ID, Product } from '@vendure/core';
+
+export class MyService {
+    constructor(private connection: TransactionalConnection) {
+    }
+
+    async getInfoUrl(ctx: RequestContext, productId: ID) {
+        const product = await this.connection
+            .getRepository(ctx, Product)
+            .findOne(productId);
+
+        return product.customFields.infoUrl;
+    }                           // ^ TS2339: Property 'infoUrl'
+}                             // does not exist on type 'CustomProductFields'.
+```
+
+The "easy" way to solve this is to assert the `customFields` object as `any`:
+
+```ts
+return (product.customFields as any).infoUrl;
+```
+
+However, this sacrifices type safety. To make our custom fields type-safe we can take advantage of a couple of more advanced TypeScript features - [declaration merging](https://www.typescriptlang.org/docs/handbook/declaration-merging.html#merging-interfaces) and [ambient modules](https://www.typescriptlang.org/docs/handbook/modules.html#ambient-modules). This allows us to extend the built-in `CustomProductFields` interface to add our custom fields to it:
+
+```ts
+// types.ts
+
+// Note: we are using deep a import here, rather than importing from `@vendure/core` due to
+// a possible bug in TypeScript (https://github.com/microsoft/TypeScript/issues/46617) which
+// causes issues when multiple plugins extend the same custom fields interface.
+import { CustomProductFields } from '@vendure/core/dist/entity/custom-entity-fields';
+
+declare module '@vendure/core/dist/entity/custom-entity-fields' {
+    interface CustomProductFields {
+        infoUrl: string;
+        downloadable: boolean;
+        shortName: string;
+    }
+}
+```
+
+When this file is then imported into our service file (either directly or indirectly), TypeScript will know about our custom fields, and we do not need to do any type assertions.
+
+```ts
+return product.customFields.infoUrl;
+// no error, plus TS autocomplete works.
+```
+
+:::caution
+Note that for the typings to work correctly, **order of imports matters**.
+
+One way to ensure that your custom field typings always get imported first is to include them as the first item in the tsconfig "include" array.
+:::
+
+:::tip
+For a working example of this setup, see the [real-world-vendure repo](https://github.com/vendure-ecommerce/real-world-vendure/blob/master/src/plugins/reviews/types.ts)
+:::
+

+ 373 - 0
docs/docs/guides/concepts/strategies-configurable-operations/index.mdx

@@ -0,0 +1,373 @@
+---
+title: 'Strategies & Configurable Operations'
+sidebar_position: 4
+---
+
+Vendure is built to be highly configurable and extensible. Two methods of providing this extensibility are **strategies** and **configurable operations**.
+
+## Strategies
+
+A strategy is named after the [Strategy Pattern](https://en.wikipedia.org/wiki/Strategy_pattern), and is a way of providing
+a pluggable implementation of a particular feature. Vendure makes heavy use of this pattern to delegate the implementation
+of key points of extensibility to the developer.
+
+Examples of strategies include:
+
+- [`OrderCodeStrategy`](/reference/typescript-api/orders/order-code-strategy/) - determines how order codes are generated
+- [`StockLocationStrategy`](/reference/typescript-api/products-stock/stock-location-strategy/) - determines which stock locations are used to fulfill an order
+- [`ActiveOrderStrategy`](/reference/typescript-api/orders/active-order-strategy/) - determines how the active order in the Shop API is selected
+- [`AssetStorageStrategy`](/reference/typescript-api/assets/asset-storage-strategy/) - determines where uploaded assets are stored
+- [`GuestCheckoutStrategy`](/reference/typescript-api/orders/guest-checkout-strategy/) - defines rules relating to guest checkouts
+- [`OrderItemPriceCalculationStrategy`](/reference/typescript-api/orders/order-item-price-calculation-strategy/) - determines how items are priced when added to the order
+- [`TaxLineCalculationStrategy`](/reference/typescript-api/tax/tax-line-calculation-strategy/) - determines how tax is calculated for an order line
+
+As an example, let's take the [`OrderCodeStrategy`](/reference/typescript-api/orders/order-code-strategy/). This strategy
+determines how codes are generated when new orders are created. By default, Vendure will use the built-in `DefaultOrderCodeStrategy`
+which generates a random 16-character string.
+
+What if you need to change this behavior? For instance, you might have an existing back-office system that is responsible
+for generating order codes, which you need to integrate with. Here's how you would do this:
+
+```ts title="src/config/my-order-code-strategy.ts"
+import { OrderCodeStrategy, RequestContext } from '@vendure/core';
+import { OrderCodeService } from '../services/order-code.service';
+
+export class MyOrderCodeStrategy implements OrderCodeStrategy {
+
+    private orderCodeService: OrderCodeService;
+
+    init(injector) {
+        this.orderCodeService = injector.get(OrderCodeService);
+    }
+
+    async generate(ctx: RequestContext): string {
+        return this.orderCodeService.getNewOrderCode();
+    }
+}
+```
+
+:::info
+
+All strategies can be make use of existing services by using the `init()` method. This is because all strategies
+extend the underlying [`InjectableStrategy` interface](/reference/typescript-api/common/injectable-strategy). In
+this example we are assuming that we already created an `OrderCodeService` which contains all the specific logic for
+connecting to our backend service which generates the order codes.
+
+:::
+
+We then need to pass this custom strategy to our config:
+
+```ts title="src/vendure-config.ts"
+import { VendureConfig } from '@vendure/core';
+import { MyOrderCodeStrategy } from '../config/my-order-code-strategy';
+
+export const config: VendureConfig = {
+    // ...
+    orderOptions: {
+        // highlight-next-line
+        orderCodeStrategy: new MyOrderCodeStrategy(),
+    },
+}
+```
+
+### Strategy lifecycle
+
+Strategies can use two optional lifecycle methods:
+
+- `init(injector: Injector)` - called during the bootstrap phase when the server or worker is starting up.
+This is where you can inject any services which you need to use in the strategy. You can also perform any other setup logic
+needed, such as instantiating a connection to an external service.
+- `destroy()` - called during the shutdown of the server or worker. This is where you can perform any cleanup logic, such as
+closing connections to external services.
+
+### Passing options to a strategy
+
+Sometimes you might want to pass some configuration options to a strategy.
+For example, imagine you want to create a custom [`StockLocationStrategy`](/reference/typescript-api/products-stock/stock-location-strategy/) which
+selects a location within a given proximity to the customer's address. You might want to pass the maximum distance to the strategy
+in your config:
+
+```ts title="src/vendure-config.ts"
+import { VendureConfig } from '@vendure/core';
+import { MyStockLocationStrategy } from '../config/my-stock-location-strategy';
+
+export const config: VendureConfig = {
+    // ...
+    catalogOptions: {
+        // highlight-next-line
+        stockLocationStrategy: new MyStockLocationStrategy({ maxDistance: 100 }),
+    },
+}
+```
+
+This config will be passed to the strategy's constructor:
+
+```ts title="src/config/my-stock-location-strategy.ts"
+import  { ID, ProductVariant, RequestContext, StockLevel, StockLocationStrategy } from '@vendure/core';
+
+export class MyStockLocationStrategy implements StockLocationStrategy {
+
+    constructor(private options: { maxDistance: number }) {}
+
+    getAvailableStock(
+        ctx: RequestContext,
+        productVariantId: ID,
+        stockLevels: StockLevel[]
+    ): ProductVariant[] {
+        const maxDistance = this.options.maxDistance;
+        // ... implementation omitted
+    }
+}
+```
+
+## Configurable Operations
+
+Configurable operations are similar to strategies in that they allow certain aspects of the system to be customized. However,
+the main difference is that they can also be _configured_ via the Admin UI. This allows the store owner to make changes to the
+behavior of the system without having to restart the server.
+
+So they are typically used to supply some custom logic that needs to accept configurable arguments which can change
+at runtime.
+
+Vendure uses the following configurable operations:
+
+- [`CollectionFilter`](/reference/typescript-api/configuration/collection-filter/) - determines which products are included in a collection
+- [`PaymentMethodHandler`](/reference/typescript-api/payment/payment-method-handler/) - determines how payments are processed
+- [`PromotionCondition`](/reference/typescript-api/promotions/promotion-condition/) - determines whether a promotion is applicable
+- [`PromotionAction`](/reference/typescript-api/promotions/promotion-action/) - determines what happens when a promotion is applied
+- [`ShippingEligibilityChecker`](/reference/typescript-api/shipping/shipping-eligibility-checker/) - determines whether a shipping method is available
+- [`ShippingCalculator`](/reference/typescript-api/shipping/shipping-calculator/) - determines how shipping costs are calculated
+
+Whereas strategies are typically used to provide a single implementation of a particular feature, configurable operations
+are used to provide a set of implementations which can be selected from at runtime.
+
+For example, Vendure ships with a set of default CollectionFilters:
+
+```ts title="default-collection-filters.ts"
+export const defaultCollectionFilters = [
+    facetValueCollectionFilter,
+    variantNameCollectionFilter,
+    variantIdCollectionFilter,
+    productIdCollectionFilter,
+];
+```
+
+When setting up a Collection, you can choose from these available default filters:
+
+![CollectionFilters](./collection-filters.webp)
+
+When one is selected, the UI will allow you to configure the arguments for that filter:
+
+![CollectionFilters args](./collection-filters-args.webp)
+
+Let's take a look at a simplified implementation of the `variantNameCollectionFilter`:
+
+```ts title="variant-name-collection-filter.ts"
+import { CollectionFilter, LanguageCode } from '@vendure/core';
+
+export const variantNameCollectionFilter = new CollectionFilter({
+    args: {
+        operator: {
+            type: 'string',
+            ui: {
+                component: 'select-form-input',
+                options: [
+                    { value: 'startsWith' },
+                    { value: 'endsWith' },
+                    { value: 'contains' },
+                    { value: 'doesNotContain' },
+                ],
+            },
+        },
+        term: { type: 'string' },
+    },
+    code: 'variant-name-filter',
+    description: [{ languageCode: LanguageCode.en, value: 'Filter by product variant name' }],
+    apply: (qb, args) => {
+        // ... implementation omitted
+    },
+});
+```
+
+Here are the important parts:
+
+- Configurable operations are **instances** of a pre-defined class, and are instantiated before being passed to your config.
+- They must have a `code` property which is a unique string identifier.
+- They must have a `description` property which is a localizable, human-readable description of the operation.
+- They must have an `args` property which defines the arguments which can be configured via the Admin UI. If the operation has no arguments,
+then this would be an empty object.
+- They will have one or more methods that need to be implemented, depending on the type of operation. In this case, the `apply()` method
+is used to apply the filter to the query builder.
+
+### Configurable operation args
+
+The `args` property is an object which defines the arguments which can be configured via the Admin UI. Each property of the `args`
+object is a key-value pair, where the key is the name of the argument, and the value is an object which defines the type of the argument
+and any additional configuration.
+
+As an example let's look at the `dummyPaymentMethodHandler`, a test payment method which we ship with Vendure core:
+
+```ts title="dummy-payment-method.ts"
+import { PaymentMethodHandler, LanguageCode } from '@vendure/core';
+
+export const dummyPaymentHandler = new PaymentMethodHandler({
+    code: 'dummy-payment-handler',
+    description: [/* omitted for brevity */],
+    args: {
+        automaticSettle: {
+            type: 'boolean',
+            label: [
+                {
+                    languageCode: LanguageCode.en,
+                    value: 'Authorize and settle in 1 step',
+                },
+            ],
+            description: [
+                {
+                    languageCode: LanguageCode.en,
+                    value: 'If enabled, Payments will be created in the "Settled" state.',
+                },
+            ],
+            required: true,
+            defaultValue: false,
+        },
+    },
+    createPayment: async (ctx, order, amount, args, metadata, method) => {
+        // Inside this method, the `args` argument is type-safe and will be
+        // an object with the following shape:
+        // {
+        //   automaticSettle: boolean
+        // }
+
+        // ... implementation omitted
+    },
+})
+```
+
+The following properties are used to configure the argument:
+
+#### type
+
+<span class="badge badge--primary">Required</span>
+
+[`ConfigArgType`](/reference/typescript-api/configurable-operation-def/config-arg-type)
+
+The following types are available: `string`, `int`, `float`, `boolean`, `datetime`, `ID`.
+
+#### label
+
+<span class="badge badge--secondary">Optional</span>
+
+[`LocalizedString`](/reference/typescript-api/common/localized-string/)
+
+A human-readable label for the argument. This is used in the Admin UI.
+
+#### description
+
+<span class="badge badge--secondary">Optional</span>
+
+[`LocalizedString`](/reference/typescript-api/common/localized-string/)
+
+A human-readable description for the argument. This is used in the Admin UI as a tooltip.
+
+#### required
+
+<span class="badge badge--secondary">Optional</span>
+
+`boolean`
+
+Whether the argument is required. If `true`, then the Admin UI will not allow the user to save the configuration
+unless a value has been provided for this argument.
+
+#### defaultValue
+
+<span class="badge badge--secondary">Optional</span>
+
+`any` (depends on the `type`)
+
+The default value for the argument. If not provided, then the argument will be `undefined` by default.
+
+#### list
+
+<span class="badge badge--secondary">Optional</span>
+
+`boolean`
+
+Whether the argument is a list of values. If `true`, then the Admin UI will allow the user to add multiple values
+for this argument. Defaults to `false`.
+
+#### ui
+
+<span class="badge badge--secondary">Optional</span>
+
+Allows you to specify the UI component that will be used to render the argument in the Admin UI, by specifying
+a `component` property, and optional properties to configure that component.
+
+```ts
+{
+    args: {
+        operator: {
+            type: 'string',
+            ui: {
+                component: 'select-form-input',
+                options: [
+                    { value: 'startsWith' },
+                    { value: 'endsWith' },
+                    { value: 'contains' },
+                    { value: 'doesNotContain' },
+                ],
+            },
+        },
+    }
+}
+```
+
+A full description of the available UI components can be found in the [Custom Fields guide](/guides/concepts/custom-fields/#custom-field-ui).
+
+### Injecting dependencies
+
+Configurable operations are instantiated before being passed to your config, so the mechanism for injecting dependencies
+is similar to that of strategies: namely you use an optional `init()` method to inject dependencies into the operation instance.
+
+The main difference is that the injected dependency cannot then be stored as a class property, since you are not defining
+a class when you define a configurable operation. Instead, you can store the dependency as a closure variable.
+
+Here’s an example of a ShippingCalculator that injects a service which has been defined in a plugin:
+
+```ts title="src/config/custom-shipping-calculator.ts"
+import { Injector, ShippingCalculator } from '@vendure/core';
+import { ShippingRatesService } from './shipping-rates.service';
+
+// We keep reference to our injected service by keeping it
+// in the top-level scope of the file.
+let shippingRatesService: ShippingRatesService;
+
+export const customShippingCalculator = new ShippingCalculator({
+    code: 'custom-shipping-calculator',
+    description: [],
+    args: {},
+
+    init(injector: Injector) {
+        // The init function is called during bootstrap, and allows
+        // us to inject any providers we need.
+        shippingRatesService = injector.get(ShippingRatesService);
+    },
+
+    calculate: async (order, args) => {
+        // We can now use the injected provider in the business logic.
+        const { price, priceWithTax } = await shippingRatesService.getRate({
+            destination: order.shippingAddress,
+            contents: order.lines,
+        });
+
+        return {
+            price,
+            priceWithTax,
+        };
+    },
+});
+```
+
+
+
+

BIN
docs/docs/guides/concepts/the-api-layer/Vendure_docs-api_request.webp


+ 123 - 0
docs/docs/guides/concepts/the-api-layer/index.mdx

@@ -0,0 +1,123 @@
+---
+title: 'The API Layer'
+sidebar_position: 1
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+Vendure is a headless platform, which means that all functionality is exposed via GraphQL APIs. The API can be thought of
+as a number of layers through which a request will pass, each of which is responsible for a different aspect of the
+request/response lifecycle.
+
+## The journey of an API call
+
+Let's take a basic API call and trace its journey from the client to the server and back again.
+
+
+<Tabs>
+<TabItem value="Request" label="Request" default>
+
+```graphql title="GraphQL Playground Shop API"
+query {
+    product(id: "1") {
+        id
+        name
+        description
+    }
+}
+```
+
+This query is asking for the `id`, `name` and `description` of a `Product` with the id of `1`.
+
+</TabItem>
+<TabItem value="Response" label="Response">
+
+```json
+{
+  "data": {
+    "product": {
+      "id": "1",
+      "name": "Laptop",
+      "description": "Now equipped with seventh-generation Intel Core processors, Laptop is snappier than ever. From daily tasks like launching apps and opening files to more advanced computing, you can power through your day thanks to faster SSDs and Turbo Boost processing up to 3.6GHz."
+    }
+  }
+}
+```
+
+GraphQL returns only the specific fields you ask for in your query.
+
+</TabItem>
+</Tabs>
+
+
+:::note
+
+If you have your local development server running, you can try this out by opening the GraphQL Playground in your browser:
+
+[http://localhost:3000/shop-api](http://localhost:3000/shop-api)
+
+:::
+
+![./Vendure_docs-api_request.webp](./Vendure_docs-api_request.webp)
+
+
+## Middleware
+
+"Middleware" is a term for a function which is executed before or after the main logic of a request. In Vendure, middleware
+is used to perform tasks such as authentication, logging, and error handling. There are several types of middleware:
+
+* **Express middleware**: At the lowest level, Vendure makes use of the popular Express server library. Express middleware
+can be added to the sever via the [`apiOptions.middleware`](/reference/typescript-api/configuration/api-options#middleware) config property. There are hundreds of tried-and-tested Express
+middleware packages available, and they can be used to add functionality such as CORS, compression, rate-limiting, etc.
+* **NestJS-specific middleware**: NestJS allows you to define specific types of middleware including [Guards](https://docs.nestjs.com/guards),
+[Interceptors](https://docs.nestjs.com/interceptors), [Pipes](https://docs.nestjs.com/pipes) and [Filters](https://docs.nestjs.com/exception-filters).
+Vendure uses a number of these mechanisms internally to handle authentication, transaction management, error handling and
+data transformation. They are defined via decorators on custom resolvers or controllers.
+* **Apollo Server plugins**: Apollo Server (the underlying GraphQL server library used by Vendure) allows you to define
+[plugins](https://www.apollographql.com/docs/apollo-server/integrations/plugins/) which can be used to hook into various
+stages of the GraphQL request lifecycle and perform tasks such as data transformation. These are defined via the
+[`apiOptions.apolloServerPlugins`](/reference/typescript-api/configuration/api-options#apolloserverplugins) config property.
+
+## Resolvers
+
+A "resolver" is a GraphQL concept, and refers to a function which is responsible for returning the data for a particular
+field. In Vendure, a resolver can also refer to a class which contains multiple resolver functions. For every query or
+mutation, there is a corresponding resolver function which is responsible for returning the requested data (and performing
+side-effect such as updating data in the case of mutations).
+
+Here's a simplified example of a resolver function for the `product` query:
+
+```ts
+import { Query, Resolver, Args } from '@nestjs/graphql';
+import { Ctx, RequestContext, ProductService } from '@vendure/core';
+
+@Resolver()
+export class ShopProductsResolver {
+
+     constructor(private productService: ProductService) {}
+
+     @Query()
+     product(@Ctx() ctx: RequestContext, @Args() args: { id: string }) {
+         return this.productService.findOne(ctx, args.id);
+     }
+}
+```
+
+- The `@Resolver()` decorator marks this class as a resolver.
+- The `@Query()` decorator marks the `product()` method as a resolver function.
+- The `@Ctx()` decorator injects the [`RequestContext` object](/reference/typescript-api/request/request-context/), which contains information about the
+current request, such as the current user, the active channel, the active language, etc. The `RequestContext` is a key part
+of the Vendure architecture, and is used throughout the application to provide context to the various services and plugins. In general, your
+resolver functions should always accept a `RequestContext` as the first argument, and pass it through to the services.
+- The `@Args()` decorator injects the arguments passed to the query, in this case the `id` that we provided in our query.
+
+As you can see, the resolver function is very simple, and simply delegates the work to the `ProductService` which is
+responsible for fetching the data from the database.
+
+:::tip
+
+In general, resolver functions should be kept as simple as possible,
+and the bulk of the business logic should be delegated to the service layer.
+
+:::

+ 196 - 0
docs/docs/guides/concepts/the-service-layer/index.mdx

@@ -0,0 +1,196 @@
+---
+title: 'The Service Layer'
+sidebar_position: 2
+---
+
+The service layer is the core of the application. This is where the business logic is implemented, and where
+the application interacts with the database. When a request comes in to the API, it gets routed to a resolver
+which then calls a service method to perform the required operation.
+
+![../the-api-layer/Vendure_docs-api_request.webp](../the-api-layer/Vendure_docs-api_request.webp)
+
+:::info
+Services are classes which, in NestJS terms, are [providers](https://docs.nestjs.com/providers#services). They
+follow all the rules of NestJS providers, including dependency injection, scoping, etc.
+:::
+
+Services are generally scoped to a specific domain or entity. For instance, in the Vendure core, there is a [`Product` entity](/reference/typescript-api/entities/product),
+and a corresponding [`ProductService`](/reference/typescript-api/services/product-service) which contains all the methods for interacting with products.
+
+Here's a simplified example of a the `ProductService`, including an implementation of the `findOne()` method that was
+used in the example in the [previous section](/guides/concepts/the-api-layer/#resolvers):
+
+```ts title="src/services/product.service.ts"
+import { Injectable } from '@nestjs/common';
+import { IsNull } from 'typeorm';
+import { ID, Product, RequestContext, TransactionalConnection, TranslatorService } from '@vendure/core';
+
+@Injectable()
+export class ProductService {
+
+    constructor(private connection: TransactionalConnection,
+                private translator: TranslatorService){}
+
+    /**
+     * @description
+     * Returns a Product with the given id, or undefined if not found.
+     */
+    async findOne(ctx: RequestContext, productId: ID): Promise<Product | undefined> {
+        const product = await this.connection.findOneInChannel(ctx, Product, productId, ctx.channelId, {
+            where: {
+                deletedAt: IsNull(),
+            },
+        });
+        if (!product) {
+            return;
+        }
+        return this.translator.translate(product, ctx);
+    }
+
+    // ... other methods
+    findMany() {}
+    create() {}
+    update() {}
+}
+```
+
+- The `@Injectable()` decorator is a [NestJS](https://docs.nestjs.com/providers#services) decorator which allows the service
+    to be injected into other services or resolvers.
+- The `constructor()` method is where the dependencies of the service are injected. In this case, the `TransactionalConnection`
+    is used to access the database, and the `TranslatorService` is used to translate the Product entity into the current
+    language.
+
+## Accessing the database
+
+One of the main responsibilities of the service layer is to interact with the database. For this, you will be using
+the [`TransactionalConnection` class](/reference/typescript-api/data-access/transactional-connection/), which is a wrapper
+around the [TypeORM `DataSource` object](https://typeorm.io/data-source-api). The primary purpose of the `TransactionalConnection`
+is to ensure that database operations can be performed within a transaction (which is essential for ensuring data integrity), even
+across multiple services. Furthermore, it exposes some helper methods which make it easier to perform common operations.
+
+:::info
+
+Always pass the `RequestContext` (`ctx`) to the `TransactionalConnection` methods. This ensures the operation occurs within
+any active transaction.
+
+:::
+
+There are two primary APIs for accessing data provided by TypeORM: the **Find API** and the **QueryBuilder API**.
+
+### The Find API
+
+This API is the most convenient and type-safe way to query the database. It provides a powerful type-safe way to query
+including support for eager relations, pagination, sorting, filtering and more.
+
+Here are some examples of using the Find API:
+
+```ts title="src/services/item.service.ts"
+import { Injectable } from '@nestjs/common';
+import { ID, RequestContext, TransactionalConnection } from '@vendure/core';
+import { IsNull } from 'typeorm';
+import { Item } from '../entities/item.entity';
+
+@Injectable()
+export class ItemService {
+
+    constructor(private connection: TransactionalConnection) {}
+
+    findById(ctx: RequestContext, itemId: ID): Promise<Item | null> {
+        return this.connection.getRepository(ctx, Item).findOne({
+            where: { id: itemId },
+        });
+    }
+
+    findByName(ctx: RequestContext, name: string): Promise<Item | null> {
+        return this.connection.getRepository(ctx, Item).findOne({
+            where: {
+                // Multiple where clauses can be specified,
+                // which are joined with AND
+                name,
+                deletedAt: IsNull(),
+            },
+        });
+    }
+
+    findWithRelations() {
+        return this.connection.getRepository(ctx, Item).findOne({
+            where: { name },
+            relations: {
+                // Join the `item.customer` relation
+                customer: true,
+                product: {
+                    // Here we are joining a nested relation `item.product.featuredAsset`
+                    featuredAsset: true,
+                },
+            },
+        });
+    }
+
+    findMany(ctx: RequestContext): Promise<Item[]> {
+        return this.connection.getRepository(ctx, Item).find({
+            // Pagination
+            skip: 0,
+            take: 10,
+            // Sorting
+            order: {
+                name: 'ASC',
+            },
+        });
+    }
+}
+```
+
+:::info
+
+Further examples can be found in the [TypeORM Find Options documentation](https://typeorm.io/find-options).
+
+:::
+
+### The QueryBuilder API
+
+When the Find API is not sufficient, the QueryBuilder API can be used to construct more complex queries. For instance,
+if you want to have a more complex `WHERE` clause than can be achieved with the Find API, or if you want to perform
+sub-queries, then the QueryBuilder API is the way to go.
+
+Here are some examples of using the QueryBuilder API:
+
+```ts title="src/services/item.service.ts"
+import { Injectable } from '@nestjs/common';
+import { ID, RequestContext, TransactionalConnection } from '@vendure/core';
+import { Brackets, IsNull } from 'typeorm';
+import { Item } from '../entities/item.entity';
+
+@Injectable()
+export class ItemService {
+
+    constructor(private connection: TransactionalConnection) {}
+
+    findById(ctx: RequestContext, itemId: ID): Promise<Item | null> {
+        // This is simple enough that you should prefer the Find API,
+        // but here is how it would be done with the QueryBuilder API:
+        return this.connection.getRepository(ctx, Item).createQueryBuilder('item')
+            .where('item.id = :id', { id: itemId })
+            .getOne();
+    }
+
+    findManyWithSubquery(ctx: RequestContext, name: string) {
+        // Here's a more complex query that would not be possible using the Find API:
+        return this.connection.getRepository(ctx, Item).createQueryBuilder('item')
+            .where('item.name = :name', { name })
+            .andWhere(
+                new Brackets(qb1 => {
+                    qb1.where('item.state = :state1', { state1: 'PENDING' })
+                       .orWhere('item.state = :state2', { state2: 'RETRYING' });
+                }),
+            )
+            .orderBy('item.createdAt', 'ASC')
+            .getMany();
+    }
+}
+```
+
+:::info
+
+Further examples can be found in the [TypeORM QueryBuilder documentation](https://typeorm.io/select-query-builder).
+
+:::

+ 0 - 487
docs/docs/guides/developer-guide/customizing-models/index.md

@@ -1,487 +0,0 @@
----
-title: 'Customizing Models'
-showtoc: true
----
-
-# Customizing Models with custom fields
-
-Custom fields allow you to add your own custom data properties to many of the Vendure entities. The entities which may have custom fields defined are listed in the [CustomFields documentation]({{< relref "/reference/typescript-api/custom-fields" >}})
-
-They are specified in the VendureConfig:
-
-```ts
-const config = {
-  // ...
-  customFields: {
-    Product: [
-      { name: 'infoUrl', type: 'string' },
-      { name: 'downloadable', type: 'boolean' },
-      { name: 'shortName', type: 'localeString' },
-    ],
-    User: [
-      { name: 'socialLoginToken', type: 'string', unique: true },
-    ],
-  },
-}
-```
-
-With the example config above, the following will occur:
-
-1. The database schema will be altered, and a column will be added for each custom field. **Note: changes to custom fields require a database migration**. See the [Migrations guide]({{< relref "migrations" >}}).
-2. The GraphQL APIs will be modified to add the custom fields to the `Product` and `User` types respectively.
-3. If you are using the [admin-ui-plugin]({{< relref "/reference/typescript-api/core-plugins/admin-ui-plugin" >}}), the Admin UI detail pages will now contain form inputs to allow the custom field data to be added or edited, and the list view data tables will allow custom field columns to be added, sorted and filtered. 
-
-
-![custom-fields-data-table.webp](custom-fields-data-table.webp)
-
-The values of the custom fields can then be set and queried via the GraphQL APIs:
-
-```graphql
-mutation {
-  updateProduct(input: {
-    id: 1
-    customFields: {
-      infoUrl: "https://some-url.com",
-      downloadable: true,
-    }
-    translations: [
-      { languageCode: en, customFields: { shortName: "foo" } }
-    ]
-  }) {
-    id
-    customFields {
-      infoUrl
-      downloadable
-      shortName
-    }
-  }
-}
-```
-
-## Available custom field types
-
-The following types are available for custom fields:
-
-| Type           | Description                  | Example                                   |
-| -------------- | ---------------------------- | ----------------------------------------- |
-| `string`       | Short string data            | url, label                                |
-| `localeString` | Localized short strings      | localized url                             |
-| `text`         | Long text data               | extended product info, json config object |
-| `localText`    | Localized long tex           | localized extended product info           |
-| `int`          | Integer                      | product weight, customer loyalty points   |
-| `float`        | Floating point number        | product review rating                     |
-| `boolean`      | Boolean                      | isDownloadable flag on product            |
-| `datetime`     | A datetime                   | date that variant is back in stock        |
-| `relation`     | A relation to another entity | Asset used as a customer avatar           |
-
-To see the underlying DB data type and GraphQL type used for each, see the [CustomFieldType doc]({{< relref "custom-field-type" >}}).
-
-## CustomField UI Form Inputs
-
-By default, the Admin UI will use an appropriate input component depending on the `type` of the custom field.
-For instance, `string` fields will use a `<input type="text">` component, and `boolean` fields will use a `<input type="checkbox">` component.
-
-These defaults can be overridden by using the `ui` property of the custom field config object. For example, if we want a number to be displayed as a currency input:
-
-```ts {hl_lines=[8]}
-const config = {
-  // ...
-  customFields: {
-    ProductVariant: [
-      {
-        name: 'rrp',
-        type: 'int',
-        ui: { component: 'currency-form-input' },
-      },
-    ]
-  }
-}
-```
-
-The built-in form inputs are listed in the [DefaultFormConfigHash docs]({{< relref "default-form-config-hash" >}}).
-
-If you want to use a completely custom form input component which is not provided by the Admin UI, you'll need to create a plugin which [extends the Admin UI]({{< relref "extending-the-admin-ui" >}}) with [custom form inputs]({{< relref "custom-form-inputs" >}}).
-
-Here's an example config demonstrating several ways to customize the UI controls for custom fields:
-
-```ts
-import { LanguageCode, VendureConfig } from '@vendure/core';
-
-const config: VendureConfig = {
-  // ...
-  customFields: {
-    Product: [
-      // Rich text editor
-      {name: 'additionalInfo', type: 'text', ui: {component: 'rich-text-form-input'}},
-      // JSON editor
-      {name: 'specs', type: 'text', ui: {component: 'json-editor-form-input'}},
-      // Numeric with suffix
-      {
-        name: 'weight',
-        type: 'int',
-        ui: {component: 'number-form-input', suffix: 'g'},
-      },
-      // Currency input
-      {
-        name: 'RRP',
-        type: 'int',
-        ui: {component: 'currency-form-input'},
-      },
-      // Select with options
-      {
-        name: 'pageType',
-        type: 'string',
-        ui: {
-          component: 'select-form-input',
-          options: [
-            {value: 'static', label: [{languageCode: LanguageCode.en, value: 'Static'}]},
-            {value: 'dynamic', label: [{languageCode: LanguageCode.en, value: 'Dynamic'}]},
-          ],
-        },
-      },
-      // Text with prefix
-      {
-        name: 'link',
-        type: 'string',
-        ui: {
-          component: 'text-form-input',
-          prefix: 'https://',
-        },
-      },
-    ],
-  },
-};
-```
-
-and the resulting UI:
-
-![custom-fields-ui.webp](custom-fields-ui.webp)
-
-## Tabbed custom fields
-
-With a large, complex project, it's common for lots of custom fields to be required. This can get visually noisy in the UI, so Vendure supports tabbed custom fields. Just specify the tab name in the `ui` object, and those fields with the same tab name will be grouped in the UI! The tab name can also be a translation token if you need to support multiple languages.
-
-```ts
-const config = {
-  // ...
-  customFields: {
-    Product: [
-      { name: 'additionalInfo', type: 'text', ui: { component: 'rich-text-form-input' } },
-      { name: 'specs', type: 'text', ui: { component: 'json-editor-form-input' } },
-      { name: 'width', type: 'int', ui: { tab: 'Shipping' } },
-      { name: 'height', type: 'int', ui: { tab: 'Shipping' } },
-      { name: 'depth', type: 'int', ui: { tab: 'Shipping' } },
-      { name: 'weight', type: 'int', ui: { tab: 'Shipping' } },
-    ],
-  },
-}
-```
-
-## Configurable Order Products
-
-One common use of custom fields is to support configurable products. Imagine we are selling pens which allow some text to be engraved. To do this we would add a **custom field on the OrderLine**:
-
-```ts
-OrderLine: [
-  {
-    name: 'engravingText',
-    type: 'string',
-    label: [
-      {
-        languageCode: LanguageCode.en,
-        value: 'The text to engrave on the product'
-      },
-    ],
-  },
-]
-```
-
-Once defined, the [addItemToOrder mutation]({{< relref "/reference/graphql-api/shop/mutations" >}}#additemtoorder) will have a third argument available, which accepts values for the custom field defined above:
-
-```graphql
-mutation {
-  addItemToOrder(
-    productVariantId: "42"
-    quantity: 1
-    customFields: {
-      engravingText: "Thanks for all the fish!"
-    }
-  ) {
-    ...on Order {
-      id
-      lines {
-        id
-        quantity
-        customFields {
-          engravingText
-        }
-      }
-    }
-  }
-}
-```
-
-Furthermore, the values of these OrderLine custom fields can even be used to modify the price. This is done by defining a custom [OrderItemPriceCalculationStrategy]({{< relref "order-item-price-calculation-strategy" >}}):
-
-```ts
-import { RequestContext, PriceCalculationResult,
-  ProductVariant, OrderItemPriceCalculationStrategy } from '@vendure/core';
-
-export class EngravingPriceStrategy implements OrderItemPriceCalculationStrategy {
-
-  calculateUnitPrice(
-    ctx: RequestContext,
-    productVariant: ProductVariant,
-    customFields: { engravingText?: string },
-  ) {
-    let price = productVariant.listPrice;
-    if (customFields.engravingText) {
-      // Add $5 for engraving
-      price += 500;
-    }
-    return {
-      price,
-      priceIncludesTax: productVariant.listPriceIncludesTax,
-    };
-  }
-}
-```
-
-## TypeScript Typings
-
-Because custom fields are generated at run-time, TypeScript has no way of knowing about them based on your
-VendureConfig. Consider the example above - let's say we have a [plugin]({{< relref "/guides/plugins" >}}) which needs to
-access the custom field values on a Product entity.
-
-Attempting to access the custom field will result in a TS compiler error:
-
-```ts {hl_lines=[12,13]}
-import { RequestContext, TransactionalConnection, ID, Product } from '@vendure/core';
-
-export class MyService {
-  constructor(private connection: TransactionalConnection) {}
-
-  async getInfoUrl(ctx: RequestContext, productId: ID) {
-    const product = await this.connection
-      .getRepository(ctx, Product)
-      .findOne(productId);
-
-    return product.customFields.infoUrl;
-  }                           // ^ TS2339: Property 'infoUrl'
-}                             // does not exist on type 'CustomProductFields'.
-```
-
-The "easy" way to solve this is to assert the `customFields` object as `any`:
-
-```ts
-return (product.customFields as any).infoUrl;
-```
-
-However, this sacrifices type safety. To make our custom fields type-safe we can take advantage of a couple of more advanced TypeScript features - [declaration merging](https://www.typescriptlang.org/docs/handbook/declaration-merging.html#merging-interfaces) and [ambient modules](https://www.typescriptlang.org/docs/handbook/modules.html#ambient-modules). This allows us to extend the built-in `CustomProductFields` interface to add our custom fields to it:
-
-```ts
-// types.ts
-
-// Note: we are using deep a import here, rather than importing from `@vendure/core` due to
-// a possible bug in TypeScript (https://github.com/microsoft/TypeScript/issues/46617) which
-// causes issues when multiple plugins extend the same custom fields interface.
-import { CustomProductFields } from '@vendure/core/dist/entity/custom-entity-fields';
-
-declare module '@vendure/core/dist/entity/custom-entity-fields' {
-  interface CustomProductFields {
-    infoUrl: string;
-    downloadable: boolean;
-    shortName: string;
-  }
-}
-```
-
-When this file is then imported into our service file (either directly or indirectly), TypeScript will know about our custom fields, and we do not need to do any type assertions.
-
-```ts
-return product.customFields.infoUrl;
-// no error, plus TS autocomplete works.
-```
-
-{{< alert "warning" >}}
-Note that for the typings to work correctly, **order of imports matters**.
-
-One way to ensure that your custom field typings always get imported first is to include them as the first item in the tsconfig "include" array.
-{{< /alert >}}
-
-{{< alert "primary" >}}
-For a working example of this setup, see the [real-world-vendure repo](https://github.com/vendure-ecommerce/real-world-vendure/blob/master/src/plugins/reviews/types.ts)
-{{< /alert >}}
-
-## Examples
-
-### defaultValue & nullable
-
-A default value for the custom field may be specified, and also whether the field may be nullable (or empty). Any fields set to `nullable: false` should have a default value specified.
-
-```ts
-Product: [
-  {
-    name: 'downloadable',
-    type: 'boolean',
-    defaultValue: false,
-    nullable: false,
-  },
-]
-```
-
-### Labels and descriptions
-
-Labels and descriptions can be specified to supply more information about the purpose of the custom field, and also to allow translations to be set. In the Admin UI, the `label` will be used in any forms featuring the custom field, and will fall back to `name` if no label is specified.
-
-```ts
-Product: [
-  {
-    name: 'extendedDescription',
-    type: 'localeString',
-    label: [
-      { languageCode: LanguageCode.en, value: 'Extended description' },
-      { languageCode: LanguageCode.de, value: 'Erweiterte Beschreibung' },
-    ],
-    description: [
-      { languageCode: LanguageCode.en, value: 'Technical specs, external links and images' },
-      { languageCode: LanguageCode.de, value: 'Technische Daten, externe Links und Bilder' },
-    ],
-    length: 65535,
-  },
-]
-```
-
-### Lists
-
-A custom field may hold an array of values by setting the `list` property to `true`:
-
-```ts
-Product: [
-  {
-    name: 'keywords',
-    type: 'localeString',
-    list: true,
-  },
-]
-```
-
-### Validation
-
-Certain custom field types may be configured with validation parameters:
-
-```ts
-Product: [
-  {
-    name: 'partCode',
-    type: 'string',
-    pattern: '^[0-9]{4}\-[A-Z]{3-4}$'
-  },
-  {
-    name: 'location',
-    type: 'string',
-    options: [
-      { value: 'warehouse1' },
-      { value: 'warehouse2' },
-      { value: 'shop' },
-    ]
-  },
-  {
-    name: 'weight',
-    type: 'int',
-    min: 0,
-    max: 9999,
-    step: 1,
-  },
-]
-```
-
-In the above examples, attempting to set a custom field value which does not conform to the specified parameters (e.g. a `partCode` of `'121A'`) will throw an exception. In the Admin UI, these constraints will also be expressed in the form fields used to enter the data.
-
-For even more control over validation, a `validate` function may be provided to any field type, which will run whenever the value is set via the GraphQL API. This function can even be asynchronous and may use the [Injector]({{< relref "injector" >}}) to access providers. Returning a string or LocalizedString means validation failed.
-
-```ts
-Product: [
-  {
-    name: 'partCode',
-    type: 'string',
-    validate: async(value, injector) => {
-      const partCodeService = injector.get(PartCodeService);
-      const isValid = await partCodeService.validateCode(value);
-      if (!isValid) {
-        return `Part code ${value} is not valid`;
-      }
-    },
-  },
-]
-```
-
-### public, readonly & internal
-
-Some custom fields may be used internally in your business logic, or for integration with external systems. In this case the can restrict access to the information they contain. In this example, the Customer entity has an externalId relating to an external integration.
-
--   `public: false` means that it will not be exposed via the Shop API.
--   `readonly: true` means it will be exposed, but cannot be updated via the Admin API. It can only be changed programmatically in plugin code.
--   `internal: false` - means the field _will_ be exposed via the GraphQL APIs (in this case on the Admin API due to the `public: false` setting). If it was set to `internal: true`, then the field would not be exposed _at all_ in either of the GraphQL APIs, and will not be visible in the Admin UI. Internal custom fields are useful for purely internal implementation details.
-
-```ts
-Customer: [
-  {
-    name: 'externalId',
-    type: 'string',
-    public: false,
-    readonly: true,
-    internal: false,
-  },
-],
-```
-
-### Relations
-
-It is possible to set up custom fields that hold references to other entities using the `'relation'` type:
-
-```ts
-Customer: [
-  {
-    name: 'avatar',
-    type: 'relation',
-    entity: Asset,
-    // may be omitted if the entity name matches the GraphQL type name,
-    // which is true for all built-in entities.
-    graphQLType: 'Asset',
-    // Whether to "eagerly" load the relation
-    // See https://typeorm.io/#/eager-and-lazy-relations
-    eager: false,
-  },
-]
-```
-
-In this example, we set up a many-to-one relationship from Customer to Asset, allowing us to specify an avatar image for each Customer. Relation custom fields are unique in that the input and output names are not the same - the input will expect an ID and will be named `'<field name>Id'` or `'<field name>Ids'` for list types.
-
-```graphql
-mutation {
-  updateCustomer(input: {
-    id: 1
-    customFields: {
-      avatarId: 42,
-    }
-  }) {
-    id
-    customFields {
-      avatar {
-        id
-        name
-        preview
-      }
-    }
-  }
-}
-```
-
-{{% alert %}}
-**UI for relation type**
-
-The Admin UI app has built-in selection components for "relation" custom fields that reference certain common entity types, such as Asset, Product, ProductVariant and Customer. If you are relating to an entity not covered by the built-in selection components, you will see a generic relation component which allows you to manually enter the ID of the entity you wish to select.
-
-If the generic selector is not suitable, or is you wish to replace one of the built-in selector components, you can create a UI extension that defines a custom field control for that custom field. You can read more about this in the [custom form input guide]({{< relref "custom-form-inputs" >}})
-{{< /alert >}}

+ 0 - 9
docs/docs/guides/getting-started/installation.md

@@ -6,8 +6,6 @@ sidebar_position: 1
 import Tabs from '@theme/Tabs';
 import TabItem from '@theme/TabItem';
 
-# Getting Started
-
 ## Requirements
  
 * [Node.js](https://nodejs.org/en/) **v16** or above, with support for **even-numbered Node.js versions**.
@@ -81,10 +79,3 @@ If you encounter any issues during installation, you can get a more detailed out
 ```sh
 npx @vendure/create my-shop --log-level verbose
 ```
-
-## Next Steps
-
-* Learn more about [Configuration]({{< relref "/guides/developer-guide/configuration" >}}) of your Vendure server.
-* Get a better understanding of how Vendure works by reading the [Architecture Overview]({{< relref "/guides/developer-guide/overview" >}})
-* Start writing custom plugins with the [Plugin guide]({{< relref "/guides/plugins" >}})
-* Learn how to implement a storefront with the [GraphQL API Guide]({{< relref "/guides/storefront/shop-api-guide" >}})

BIN
docs/docs/guides/getting-started/key-concepts/vendure_architecture.png


BIN
docs/docs/guides/getting-started/overview/Vendure_docs-architecture.webp


+ 12 - 9
docs/docs/guides/getting-started/key-concepts/index.md → docs/docs/guides/getting-started/overview/index.md

@@ -1,11 +1,11 @@
 ---
-title: "Vendure Key Concepts"
+title: "Vendure Overview"
 sidebar_position: 2
 ---
 
 Read this page to gain a high-level understanding of Vendure and concepts you will need to know to build your application.
 
-## Vendure Architecture Overview
+## Architecture
 
 Vendure is a headless e-commerce platform. By "headless" we mean that it exposes all of its functionality via APIs. Specifically, Vendure features two GraphQL APIs: one for storefronts (Shop API) and the other for administrative functions (Admin API).
 
@@ -16,9 +16,9 @@ These are the major parts of a Vendure application:
 * **Admin UI**: The Admin UI is how shop administrators manage orders, customers, products, settings and so on. It is not actually part of the Vendure core, but is provided as a plugin (the [AdminUiPlugin](reference/typescript-api/core-plugins/admin-ui-plugin/)) which is installed for you in a standard Vendure installation. The Admin UI can be further extended to support custom functionality, as detailed in the 
 * **Storefront**: With headless commerce, you are free to implement your storefront exactly as you see fit, unconstrained by the back-end, using any technologies that you like. To make this process easier, we have created a number of storefront starter kits, as well as [guides on building a storefront](/guides/storefront/building-a-storefront/).
 
-![./vendure_architecture.png](./vendure_architecture.png) 
+![./Vendure_docs-architecture.webp](./Vendure_docs-architecture.webp) 
 
-## Vendure's technology stack
+## Technology stack
 
 Vendure is built on the following open-source technologies:
 
@@ -28,10 +28,13 @@ Vendure is built on the following open-source technologies:
 - **GraphQL**: The Shop and Admin APIs use [GraphQL](https://graphql.org/), which is a modern API technology which allows you to specify the exact data that your client application needs in a convenient and type-safe way. Internally we use [Apollo Server](https://www.apollographql.com/docs/apollo-server/) to power our GraphQL APIs.
 - **Angular**: The Admin UI is built with [Angular](https://angular.io/), a popular, stable application framework from Google. Note that you do not need to know Angular to use Vendure, and UI extensions can even be written in the front-end framework of your choice, such as React or Vue.
 
-## Key Concepts
+## Design principles
+
+Vendure is designed to be:
+
+- **Flexible**: Vendure is designed to be flexible enough to support a wide range of e-commerce use-cases, while taking care of the common functionality for you. It is not a "one-size-fits-all" solution, but rather a framework which you can extend and customize to suit your needs.
+- **Extensible**: A typical e-commerce application needs to integrate with many external systems for payments, shipping, inventory management, email sending, and so on. Vendure makes heavy use of the **strategy pattern** - a software design pattern which allows you to replace default behaviors with your own custom implementations as needed.
+- **Modular**: Vendure is built with a modular architecture, where each unit of functionality of your application is encapsulated in a **plugin**. This makes it easy to add or remove functionality as needed, and to share plugins with the community.
+- **Type-safe**: Vendure is written in TypeScript, which means that you get the benefits of static type-checking and code completion in your IDE. Our use of GraphQL for our APIs brings static typing to the API layer, enabling rapid development with type-safety across the entire stack.
 
-- Configuration
-- Entities
-- Services
-- Plugins
 

+ 0 - 0
docs/docs/guides/getting-started/writing-a-vendure-plugin.md → docs/docs/guides/how-to/writing-a-vendure-plugin.md


+ 11 - 11
docs/docs/reference/admin-ui-api/action-bar/action-bar-item.md

@@ -1,7 +1,7 @@
 ---
 title: "ActionBarItem"
 weight: 10
-date: 2023-07-21T15:46:19.150Z
+date: 2023-07-26T19:00:02.497Z
 showtoc: true
 generated: true
 ---
@@ -36,52 +36,52 @@ interface ActionBarItem {
 
 ### id
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### label
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### locationId
 
-<MemberInfo kind="property" type="<a href='/reference/admin-ui-api/action-bar/action-bar-location-id#actionbarlocationid'>ActionBarLocationId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/admin-ui-api/action-bar/action-bar-location-id#actionbarlocationid'>ActionBarLocationId</a>`}   />
 
 
 ### disabled
 
-<MemberInfo kind="property" type="Observable&#60;boolean&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;boolean&#62;`}   />
 
 
 ### onClick
 
-<MemberInfo kind="property" type="(event: MouseEvent, context: <a href='/reference/admin-ui-api/action-bar/on-click-context#onclickcontext'>OnClickContext</a>) =&#62; void"   />
+<MemberInfo kind="property" type={`(event: MouseEvent, context: <a href='/reference/admin-ui-api/action-bar/on-click-context#onclickcontext'>OnClickContext</a>) =&#62; void`}   />
 
 
 ### routerLink
 
-<MemberInfo kind="property" type="RouterLinkDefinition"   />
+<MemberInfo kind="property" type={`RouterLinkDefinition`}   />
 
 
 ### buttonColor
 
-<MemberInfo kind="property" type="'primary' | 'success' | 'warning'"   />
+<MemberInfo kind="property" type={`'primary' | 'success' | 'warning'`}   />
 
 
 ### buttonStyle
 
-<MemberInfo kind="property" type="'solid' | 'outline' | 'link'"   />
+<MemberInfo kind="property" type={`'solid' | 'outline' | 'link'`}   />
 
 
 ### icon
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### requiresPermission
 
-<MemberInfo kind="property" type="string | string[]"   />
+<MemberInfo kind="property" type={`string | string[]`}   />
 
 
 

+ 1 - 1
docs/docs/reference/admin-ui-api/action-bar/action-bar-location-id.md

@@ -1,7 +1,7 @@
 ---
 title: "ActionBarLocationId"
 weight: 10
-date: 2023-07-21T15:46:19.020Z
+date: 2023-07-26T19:00:02.227Z
 showtoc: true
 generated: true
 ---

+ 2 - 2
docs/docs/reference/admin-ui-api/action-bar/add-action-bar-item.md

@@ -1,7 +1,7 @@
 ---
 title: "AddActionBarItem"
 weight: 10
-date: 2023-07-21T15:46:19.168Z
+date: 2023-07-26T19:00:02.533Z
 showtoc: true
 generated: true
 ---
@@ -45,5 +45,5 @@ Parameters
 
 ### config
 
-<MemberInfo kind="parameter" type="<a href='/reference/admin-ui-api/action-bar/action-bar-item#actionbaritem'>ActionBarItem</a>" />
+<MemberInfo kind="parameter" type={`<a href='/reference/admin-ui-api/action-bar/action-bar-item#actionbaritem'>ActionBarItem</a>`} />
 

+ 4 - 4
docs/docs/reference/admin-ui-api/action-bar/on-click-context.md

@@ -1,7 +1,7 @@
 ---
 title: "OnClickContext"
 weight: 10
-date: 2023-07-21T15:46:19.143Z
+date: 2023-07-26T19:00:02.488Z
 showtoc: true
 generated: true
 ---
@@ -29,17 +29,17 @@ interface OnClickContext {
 
 ### route
 
-<MemberInfo kind="property" type="ActivatedRoute"   />
+<MemberInfo kind="property" type={`ActivatedRoute`}   />
 
 
 ### dataService
 
-<MemberInfo kind="property" type="<a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>`}   />
 
 
 ### notificationService
 
-<MemberInfo kind="property" type="<a href='/reference/admin-ui-api/providers/notification-service#notificationservice'>NotificationService</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/admin-ui-api/providers/notification-service#notificationservice'>NotificationService</a>`}   />
 
 
 

+ 1 - 1
docs/docs/reference/admin-ui-api/action-bar/page-location-id.md

@@ -1,7 +1,7 @@
 ---
 title: "PageLocationId"
 weight: 10
-date: 2023-07-21T15:46:19.018Z
+date: 2023-07-26T19:00:02.224Z
 showtoc: true
 generated: true
 ---

+ 55 - 55
docs/docs/reference/admin-ui-api/bulk-actions/bulk-action.md

@@ -1,7 +1,7 @@
 ---
 title: "BulkAction"
 weight: 10
-date: 2023-07-21T15:46:19.043Z
+date: 2023-07-26T19:00:02.274Z
 showtoc: true
 generated: true
 ---
@@ -15,16 +15,16 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 <GenerationInfo sourceFile="packages/admin-ui/src/lib/core/src/providers/bulk-action-registry/bulk-action-types.ts" sourceLine="99" packageName="@vendure/admin-ui" since="1.8.0" />
 
-Configures a bulk action which can be performed on all selected items in a list view.
-
+Configures a bulk action which can be performed on all selected items in a list view.
+
 For a full example, see the <a href='/reference/admin-ui-api/bulk-actions/register-bulk-action#registerbulkaction'>registerBulkAction</a> docs.
 
 ```ts title="Signature"
 interface BulkAction<ItemType = any, ComponentType = any> {
   location: BulkActionLocationId;
   label: string;
-  getTranslationVars?: (
-        context: BulkActionFunctionContext<ItemType, ComponentType>,
+  getTranslationVars?: (
+        context: BulkActionFunctionContext<ItemType, ComponentType>,
     ) => Record<string, string | number> | Promise<Record<string, string | number>>;
   icon?: string;
   iconClass?: string;
@@ -38,50 +38,50 @@ interface BulkAction<ItemType = any, ComponentType = any> {
 
 ### location
 
-<MemberInfo kind="property" type="<a href='/reference/admin-ui-api/bulk-actions/bulk-action#bulkactionlocationid'>BulkActionLocationId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/admin-ui-api/bulk-actions/bulk-action#bulkactionlocationid'>BulkActionLocationId</a>`}   />
 
 
 ### label
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### getTranslationVars
 
-<MemberInfo kind="property" type="(         context: <a href='/reference/admin-ui-api/bulk-actions/bulk-action#bulkactionfunctioncontext'>BulkActionFunctionContext</a>&#60;ItemType, ComponentType&#62;,     ) =&#62; Record&#60;string, string | number&#62; | Promise&#60;Record&#60;string, string | number&#62;&#62;"   />
+<MemberInfo kind="property" type={`(
         context: <a href='/reference/admin-ui-api/bulk-actions/bulk-action#bulkactionfunctioncontext'>BulkActionFunctionContext</a>&#60;ItemType, ComponentType&#62;,
     ) =&#62; Record&#60;string, string | number&#62; | Promise&#60;Record&#60;string, string | number&#62;&#62;`}   />
 
-An optional function that should resolve to a map of translation variables which can be
+An optional function that should resolve to a map of translation variables which can be
 used when translating the `label` string.
 ### icon
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
-A valid [Clarity Icons](https://core.clarity.design/foundation/icons/shapes/) icon shape, e.g.
+A valid [Clarity Icons](https://core.clarity.design/foundation/icons/shapes/) icon shape, e.g.
 "cog", "user", "info-standard".
 ### iconClass
 
-<MemberInfo kind="property" type="string"   />
-
-A class to be added to the icon element. Examples:
+<MemberInfo kind="property" type={`string`}   />
 
-- is-success
-- is-danger
-- is-warning
-- is-info
+A class to be added to the icon element. Examples:
+
+- is-success
+- is-danger
+- is-warning
+- is-info
 - is-highlight
 ### onClick
 
-<MemberInfo kind="property" type="(context: <a href='/reference/admin-ui-api/bulk-actions/bulk-action#bulkactionclickcontext'>BulkActionClickContext</a>&#60;ItemType, ComponentType&#62;) =&#62; void"   />
+<MemberInfo kind="property" type={`(context: <a href='/reference/admin-ui-api/bulk-actions/bulk-action#bulkactionclickcontext'>BulkActionClickContext</a>&#60;ItemType, ComponentType&#62;) =&#62; void`}   />
 
 Defines the logic that executes when the bulk action button is clicked.
 ### isVisible
 
-<MemberInfo kind="property" type="(context: <a href='/reference/admin-ui-api/bulk-actions/bulk-action#bulkactionfunctioncontext'>BulkActionFunctionContext</a>&#60;ItemType, ComponentType&#62;) =&#62; boolean | Promise&#60;boolean&#62;"   />
-
-A function that determines whether this bulk action item should be displayed in the menu.
-If not defined, the item will always be displayed.
+<MemberInfo kind="property" type={`(context: <a href='/reference/admin-ui-api/bulk-actions/bulk-action#bulkactionfunctioncontext'>BulkActionFunctionContext</a>&#60;ItemType, ComponentType&#62;) =&#62; boolean | Promise&#60;boolean&#62;`}   />
 
-This function will be invoked each time the selection is changed, so try to avoid expensive code
+A function that determines whether this bulk action item should be displayed in the menu.
+If not defined, the item will always be displayed.
+
+This function will be invoked each time the selection is changed, so try to avoid expensive code
 running here.
 
 *Example*
@@ -102,7 +102,7 @@ registerBulkAction({
 ```
 ### requiresPermission
 
-<MemberInfo kind="property" type="string | ((userPermissions: string[]) =&#62; boolean)"   />
+<MemberInfo kind="property" type={`string | ((userPermissions: string[]) =&#62; boolean)`}   />
 
 Control the display of this item based on the user permissions.
 
@@ -132,25 +132,25 @@ registerBulkAction({
 A valid location of a list view that supports the bulk actions API.
 
 ```ts title="Signature"
-type BulkActionLocationId = | 'product-list'
-    | 'facet-list'
-    | 'collection-list'
-    | 'customer-list'
-    | 'customer-group-list'
-    | 'customer-group-members-list'
-    | 'customer-group-members-picker-list'
-    | 'promotion-list'
-    | 'seller-list'
-    | 'channel-list'
-    | 'administrator-list'
-    | 'role-list'
-    | 'shipping-method-list'
-    | 'stock-location-list'
-    | 'payment-method-list'
-    | 'tax-category-list'
-    | 'tax-rate-list'
-    | 'zone-list'
-    | 'zone-members-list'
+type BulkActionLocationId = | 'product-list'
+    | 'facet-list'
+    | 'collection-list'
+    | 'customer-list'
+    | 'customer-group-list'
+    | 'customer-group-members-list'
+    | 'customer-group-members-picker-list'
+    | 'promotion-list'
+    | 'seller-list'
+    | 'channel-list'
+    | 'administrator-list'
+    | 'role-list'
+    | 'shipping-method-list'
+    | 'stock-location-list'
+    | 'payment-method-list'
+    | 'tax-category-list'
+    | 'tax-rate-list'
+    | 'zone-list'
+    | 'zone-members-list'
     | string
 ```
 
@@ -159,7 +159,7 @@ type BulkActionLocationId = | 'product-list'
 
 <GenerationInfo sourceFile="packages/admin-ui/src/lib/core/src/providers/bulk-action-registry/bulk-action-types.ts" sourceLine="43" packageName="@vendure/admin-ui" since="1.8.0" />
 
-This is the argument which gets passed to the `getTranslationVars` and `isVisible` functions
+This is the argument which gets passed to the `getTranslationVars` and `isVisible` functions
 of the BulkAction definition.
 
 ```ts title="Signature"
@@ -175,26 +175,26 @@ interface BulkActionFunctionContext<ItemType, ComponentType> {
 
 ### selection
 
-<MemberInfo kind="property" type="ItemType[]"   />
+<MemberInfo kind="property" type={`ItemType[]`}   />
 
 An array of the selected items from the list.
 ### hostComponent
 
-<MemberInfo kind="property" type="ComponentType"   />
+<MemberInfo kind="property" type={`ComponentType`}   />
 
-The component instance that is hosting the list view. For instance,
-`ProductListComponent`. This can be used to call methods on the instance,
-e.g. calling `hostComponent.refresh()` to force a list refresh after
+The component instance that is hosting the list view. For instance,
+`ProductListComponent`. This can be used to call methods on the instance,
+e.g. calling `hostComponent.refresh()` to force a list refresh after
 deleting the selected items.
 ### injector
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/common/injector#injector'>Injector</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/common/injector#injector'>Injector</a>`}   />
 
-The Angular [Injector](https://angular.io/api/core/Injector) which can be used
+The Angular [Injector](https://angular.io/api/core/Injector) which can be used
 to get service instances which might be needed in the click handler.
 ### route
 
-<MemberInfo kind="property" type="ActivatedRoute"   />
+<MemberInfo kind="property" type={`ActivatedRoute`}   />
 
 
 
@@ -222,12 +222,12 @@ interface BulkActionClickContext<ItemType, ComponentType> extends BulkActionFunc
 
 ### clearSelection
 
-<MemberInfo kind="property" type="() =&#62; void"   />
+<MemberInfo kind="property" type={`() =&#62; void`}   />
 
 Clears the selection in the active list view.
 ### event
 
-<MemberInfo kind="property" type="MouseEvent"   />
+<MemberInfo kind="property" type={`MouseEvent`}   />
 
 The click event itself.
 

+ 2 - 2
docs/docs/reference/admin-ui-api/bulk-actions/register-bulk-action.md

@@ -1,7 +1,7 @@
 ---
 title: "RegisterBulkAction"
 weight: 10
-date: 2023-07-21T15:46:19.063Z
+date: 2023-07-26T19:00:02.324Z
 showtoc: true
 generated: true
 ---
@@ -69,5 +69,5 @@ Parameters
 
 ### bulkAction
 
-<MemberInfo kind="parameter" type="<a href='/reference/admin-ui-api/bulk-actions/bulk-action#bulkaction'>BulkAction</a>" />
+<MemberInfo kind="parameter" type={`<a href='/reference/admin-ui-api/bulk-actions/bulk-action#bulkaction'>BulkAction</a>`} />
 

+ 20 - 20
docs/docs/reference/admin-ui-api/components/asset-picker-dialog-component.md

@@ -1,7 +1,7 @@
 ---
 title: "AssetPickerDialogComponent"
 weight: 10
-date: 2023-07-21T15:46:19.207Z
+date: 2023-07-26T19:00:02.591Z
 showtoc: true
 generated: true
 ---
@@ -68,97 +68,97 @@ class AssetPickerDialogComponent implements OnInit, AfterViewInit, OnDestroy, Di
 
 ### assets$
 
-<MemberInfo kind="property" type="Observable&#60;AssetLike[]&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;AssetLike[]&#62;`}   />
 
 
 ### allTags$
 
-<MemberInfo kind="property" type="Observable&#60;TagFragment[]&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;TagFragment[]&#62;`}   />
 
 
 ### paginationConfig
 
-<MemberInfo kind="property" type="PaginationInstance"   />
+<MemberInfo kind="property" type={`PaginationInstance`}   />
 
 
 ### multiSelect
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### initialTags
 
-<MemberInfo kind="property" type="string[]"   />
+<MemberInfo kind="property" type={`string[]`}   />
 
 
 ### resolveWith
 
-<MemberInfo kind="property" type="(result?: <a href='/reference/typescript-api/entities/asset#asset'>Asset</a>[]) =&#62; void"   />
+<MemberInfo kind="property" type={`(result?: <a href='/reference/typescript-api/entities/asset#asset'>Asset</a>[]) =&#62; void`}   />
 
 
 ### selection
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/entities/asset#asset'>Asset</a>[]"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/entities/asset#asset'>Asset</a>[]`}   />
 
 
 ### searchTerm$
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### filterByTags$
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### uploading
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, notificationService: <a href='/reference/admin-ui-api/providers/notification-service#notificationservice'>NotificationService</a>) => AssetPickerDialogComponent"   />
+<MemberInfo kind="method" type={`(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, notificationService: <a href='/reference/admin-ui-api/providers/notification-service#notificationservice'>NotificationService</a>) => AssetPickerDialogComponent`}   />
 
 
 ### ngOnInit
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### ngAfterViewInit
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### ngOnDestroy
 
-<MemberInfo kind="method" type="() => void"   />
+<MemberInfo kind="method" type={`() => void`}   />
 
 
 ### pageChange
 
-<MemberInfo kind="method" type="(page: number) => "   />
+<MemberInfo kind="method" type={`(page: number) => `}   />
 
 
 ### itemsPerPageChange
 
-<MemberInfo kind="method" type="(itemsPerPage: number) => "   />
+<MemberInfo kind="method" type={`(itemsPerPage: number) => `}   />
 
 
 ### cancel
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### select
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### createAssets
 
-<MemberInfo kind="method" type="(files: File[]) => "   />
+<MemberInfo kind="method" type={`(files: File[]) => `}   />
 
 
 

+ 6 - 6
docs/docs/reference/admin-ui-api/components/chip-component.md

@@ -1,7 +1,7 @@
 ---
 title: "ChipComponent"
 weight: 10
-date: 2023-07-21T15:46:19.232Z
+date: 2023-07-26T19:00:02.634Z
 showtoc: true
 generated: true
 ---
@@ -40,28 +40,28 @@ class ChipComponent {
 
 ### icon
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 The icon should be the name of one of the available Clarity icons: https://clarity.design/foundation/icons/shapes/
 ### invert
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### colorFrom
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 If set, the chip will have an auto-generated background
 color based on the string value passed in.
 ### colorType
 
-<MemberInfo kind="property" type="'error' | 'success' | 'warning'"   />
+<MemberInfo kind="property" type={`'error' | 'success' | 'warning'`}   />
 
 The color of the chip can also be one of the standard status colors.
 ### iconClick
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 

+ 22 - 22
docs/docs/reference/admin-ui-api/components/currency-input-component.md

@@ -1,7 +1,7 @@
 ---
 title: "CurrencyInputComponent"
 weight: 10
-date: 2023-07-21T15:46:19.239Z
+date: 2023-07-26T19:00:02.650Z
 showtoc: true
 generated: true
 ---
@@ -60,107 +60,107 @@ class CurrencyInputComponent implements ControlValueAccessor, OnInit, OnChanges,
 
 ### disabled
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### readonly
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### value
 
-<MemberInfo kind="property" type="number"   />
+<MemberInfo kind="property" type={`number`}   />
 
 
 ### currencyCode
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### valueChange
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### prefix$
 
-<MemberInfo kind="property" type="Observable&#60;string&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;string&#62;`}   />
 
 
 ### suffix$
 
-<MemberInfo kind="property" type="Observable&#60;string&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;string&#62;`}   />
 
 
 ### hasFractionPart
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### onChange
 
-<MemberInfo kind="property" type="(val: any) =&#62; void"   />
+<MemberInfo kind="property" type={`(val: any) =&#62; void`}   />
 
 
 ### onTouch
 
-<MemberInfo kind="property" type="() =&#62; void"   />
+<MemberInfo kind="property" type={`() =&#62; void`}   />
 
 
 ### _inputValue
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef: ChangeDetectorRef) => CurrencyInputComponent"   />
+<MemberInfo kind="method" type={`(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef: ChangeDetectorRef) => CurrencyInputComponent`}   />
 
 
 ### ngOnInit
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### ngOnChanges
 
-<MemberInfo kind="method" type="(changes: SimpleChanges) => "   />
+<MemberInfo kind="method" type={`(changes: SimpleChanges) => `}   />
 
 
 ### ngOnDestroy
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### registerOnChange
 
-<MemberInfo kind="method" type="(fn: any) => "   />
+<MemberInfo kind="method" type={`(fn: any) => `}   />
 
 
 ### registerOnTouched
 
-<MemberInfo kind="method" type="(fn: any) => "   />
+<MemberInfo kind="method" type={`(fn: any) => `}   />
 
 
 ### setDisabledState
 
-<MemberInfo kind="method" type="(isDisabled: boolean) => "   />
+<MemberInfo kind="method" type={`(isDisabled: boolean) => `}   />
 
 
 ### onInput
 
-<MemberInfo kind="method" type="(value: string) => "   />
+<MemberInfo kind="method" type={`(value: string) => `}   />
 
 
 ### onFocus
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### writeValue
 
-<MemberInfo kind="method" type="(value: any) => void"   />
+<MemberInfo kind="method" type={`(value: any) => void`}   />
 
 
 

+ 27 - 27
docs/docs/reference/admin-ui-api/components/data-table-component.md

@@ -1,7 +1,7 @@
 ---
 title: "DataTableComponent"
 weight: 10
-date: 2023-07-21T15:46:19.268Z
+date: 2023-07-26T19:00:02.719Z
 showtoc: true
 generated: true
 ---
@@ -111,132 +111,132 @@ class DataTableComponent<T> implements AfterContentInit, OnChanges, OnInit, OnDe
 
 ### items
 
-<MemberInfo kind="property" type="T[]"   />
+<MemberInfo kind="property" type={`T[]`}   />
 
 
 ### itemsPerPage
 
-<MemberInfo kind="property" type="number"   />
+<MemberInfo kind="property" type={`number`}   />
 
 
 ### currentPage
 
-<MemberInfo kind="property" type="number"   />
+<MemberInfo kind="property" type={`number`}   />
 
 
 ### totalItems
 
-<MemberInfo kind="property" type="number"   />
+<MemberInfo kind="property" type={`number`}   />
 
 
 ### emptyStateLabel
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### selectionManager
 
-<MemberInfo kind="property" type="SelectionManager&#60;T&#62;"   />
+<MemberInfo kind="property" type={`SelectionManager&#60;T&#62;`}   />
 
 
 ### pageChange
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### itemsPerPageChange
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### allSelected
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### isRowSelectedFn
 
-<MemberInfo kind="property" type="(item: T) =&#62; boolean"   />
+<MemberInfo kind="property" type={`(item: T) =&#62; boolean`}   />
 
 
 ### allSelectChange
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### rowSelectChange
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### columns
 
-<MemberInfo kind="property" type="QueryList&#60;DataTableColumnComponent&#62;"   />
+<MemberInfo kind="property" type={`QueryList&#60;DataTableColumnComponent&#62;`}   />
 
 
 ### templateRefs
 
-<MemberInfo kind="property" type="QueryList&#60;TemplateRef&#60;any&#62;&#62;"   />
+<MemberInfo kind="property" type={`QueryList&#60;TemplateRef&#60;any&#62;&#62;`}   />
 
 
 ### rowTemplate
 
-<MemberInfo kind="property" type="TemplateRef&#60;any&#62;"   />
+<MemberInfo kind="property" type={`TemplateRef&#60;any&#62;`}   />
 
 
 ### currentStart
 
-<MemberInfo kind="property" type="number"   />
+<MemberInfo kind="property" type={`number`}   />
 
 
 ### currentEnd
 
-<MemberInfo kind="property" type="number"   />
+<MemberInfo kind="property" type={`number`}   />
 
 
 ### disableSelect
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(changeDetectorRef: ChangeDetectorRef) => DataTableComponent"   />
+<MemberInfo kind="method" type={`(changeDetectorRef: ChangeDetectorRef) => DataTableComponent`}   />
 
 
 ### ngOnInit
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### ngOnChanges
 
-<MemberInfo kind="method" type="(changes: SimpleChanges) => "   />
+<MemberInfo kind="method" type={`(changes: SimpleChanges) => `}   />
 
 
 ### ngOnDestroy
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### ngAfterContentInit
 
-<MemberInfo kind="method" type="() => void"   />
+<MemberInfo kind="method" type={`() => void`}   />
 
 
 ### trackByFn
 
-<MemberInfo kind="method" type="(index: number, item: any) => "   />
+<MemberInfo kind="method" type={`(index: number, item: any) => `}   />
 
 
 ### onToggleAllClick
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### onRowClick
 
-<MemberInfo kind="method" type="(item: T, event: MouseEvent) => "   />
+<MemberInfo kind="method" type={`(item: T, event: MouseEvent) => `}   />
 
 
 

+ 38 - 38
docs/docs/reference/admin-ui-api/components/data-table2component.md

@@ -1,7 +1,7 @@
 ---
 title: "DataTable2Component"
 weight: 10
-date: 2023-07-21T15:46:19.300Z
+date: 2023-07-26T19:00:02.830Z
 showtoc: true
 generated: true
 ---
@@ -124,187 +124,187 @@ class DataTable2Component<T> implements AfterContentInit, OnChanges, OnDestroy {
 
 ### id
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### items
 
-<MemberInfo kind="property" type="T[]"   />
+<MemberInfo kind="property" type={`T[]`}   />
 
 
 ### itemsPerPage
 
-<MemberInfo kind="property" type="number"   />
+<MemberInfo kind="property" type={`number`}   />
 
 
 ### currentPage
 
-<MemberInfo kind="property" type="number"   />
+<MemberInfo kind="property" type={`number`}   />
 
 
 ### totalItems
 
-<MemberInfo kind="property" type="number"   />
+<MemberInfo kind="property" type={`number`}   />
 
 
 ### emptyStateLabel
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### filters
 
-<MemberInfo kind="property" type="DataTableFilterCollection"   />
+<MemberInfo kind="property" type={`DataTableFilterCollection`}   />
 
 
 ### activeIndex
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### pageChange
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### itemsPerPageChange
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### columns
 
-<MemberInfo kind="property" type="QueryList&#60;DataTable2ColumnComponent&#60;T&#62;&#62;"   />
+<MemberInfo kind="property" type={`QueryList&#60;DataTable2ColumnComponent&#60;T&#62;&#62;`}   />
 
 
 ### customFieldColumns
 
-<MemberInfo kind="property" type="QueryList&#60;DataTableCustomFieldColumnComponent&#60;T&#62;&#62;"   />
+<MemberInfo kind="property" type={`QueryList&#60;DataTableCustomFieldColumnComponent&#60;T&#62;&#62;`}   />
 
 
 ### searchComponent
 
-<MemberInfo kind="property" type="DataTable2SearchComponent"   />
+<MemberInfo kind="property" type={`DataTable2SearchComponent`}   />
 
 
 ### bulkActionMenuComponent
 
-<MemberInfo kind="property" type="BulkActionMenuComponent"   />
+<MemberInfo kind="property" type={`BulkActionMenuComponent`}   />
 
 
 ### customSearchTemplate
 
-<MemberInfo kind="property" type="TemplateRef&#60;any&#62;"   />
+<MemberInfo kind="property" type={`TemplateRef&#60;any&#62;`}   />
 
 
 ### templateRefs
 
-<MemberInfo kind="property" type="QueryList&#60;TemplateRef&#60;any&#62;&#62;"   />
+<MemberInfo kind="property" type={`QueryList&#60;TemplateRef&#60;any&#62;&#62;`}   />
 
 
 ### rowTemplate
 
-<MemberInfo kind="property" type="TemplateRef&#60;any&#62;"   />
+<MemberInfo kind="property" type={`TemplateRef&#60;any&#62;`}   />
 
 
 ### currentStart
 
-<MemberInfo kind="property" type="number"   />
+<MemberInfo kind="property" type={`number`}   />
 
 
 ### currentEnd
 
-<MemberInfo kind="property" type="number"   />
+<MemberInfo kind="property" type={`number`}   />
 
 
 ### disableSelect
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### showSearchFilterRow
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### uiLanguage$
 
-<MemberInfo kind="property" type="Observable&#60;<a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;<a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>&#62;`}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(changeDetectorRef: ChangeDetectorRef, localStorageService: LocalStorageService, dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>) => DataTable2Component"   />
+<MemberInfo kind="method" type={`(changeDetectorRef: ChangeDetectorRef, localStorageService: LocalStorageService, dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>) => DataTable2Component`}   />
 
 
 ### selectionManager
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### allColumns
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### visibleSortedColumns
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### sortedColumns
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### ngOnChanges
 
-<MemberInfo kind="method" type="(changes: SimpleChanges) => "   />
+<MemberInfo kind="method" type={`(changes: SimpleChanges) => `}   />
 
 
 ### ngOnDestroy
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### ngAfterContentInit
 
-<MemberInfo kind="method" type="() => void"   />
+<MemberInfo kind="method" type={`() => void`}   />
 
 
 ### onColumnReorder
 
-<MemberInfo kind="method" type="(event: { column: DataTable2ColumnComponent&#60;any&#62;; newIndex: number }) => "   />
+<MemberInfo kind="method" type={`(event: { column: DataTable2ColumnComponent&#60;any&#62;; newIndex: number }) => `}   />
 
 
 ### onColumnsReset
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### toggleSearchFilterRow
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### trackByFn
 
-<MemberInfo kind="method" type="(index: number, item: any) => "   />
+<MemberInfo kind="method" type={`(index: number, item: any) => `}   />
 
 
 ### onToggleAllClick
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### onRowClick
 
-<MemberInfo kind="method" type="(item: T, event: MouseEvent) => "   />
+<MemberInfo kind="method" type={`(item: T, event: MouseEvent) => `}   />
 
 
 ### getDataTableConfig
 
-<MemberInfo kind="method" type="() => DataTableConfig"   />
+<MemberInfo kind="method" type={`() => DataTableConfig`}   />
 
 
 

+ 39 - 39
docs/docs/reference/admin-ui-api/components/datetime-picker-component.md

@@ -1,7 +1,7 @@
 ---
 title: "DatetimePickerComponent"
 weight: 10
-date: 2023-07-21T15:46:19.343Z
+date: 2023-07-26T19:00:02.998Z
 showtoc: true
 generated: true
 ---
@@ -73,194 +73,194 @@ class DatetimePickerComponent implements ControlValueAccessor, AfterViewInit, On
 
 ### yearRange
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 The range above and below the current year which is selectable from
 the year select control. If a min or max value is set, these will
 override the yearRange.
 ### weekStartDay
 
-<MemberInfo kind="property" type="DayOfWeek"   />
+<MemberInfo kind="property" type={`DayOfWeek`}   />
 
 The day that the week should start with in the calendar view.
 ### timeGranularityInterval
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 The granularity of the minutes time picker
 ### min
 
-<MemberInfo kind="property" type="string | null"   />
+<MemberInfo kind="property" type={`string | null`}   />
 
 The minimum date as an ISO string
 ### max
 
-<MemberInfo kind="property" type="string | null"   />
+<MemberInfo kind="property" type={`string | null`}   />
 
 The maximum date as an ISO string
 ### readonly
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 Sets the readonly state
 ### dropdownComponent
 
-<MemberInfo kind="property" type="<a href='/reference/admin-ui-api/components/dropdown-component#dropdowncomponent'>DropdownComponent</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/admin-ui-api/components/dropdown-component#dropdowncomponent'>DropdownComponent</a>`}   />
 
 
 ### datetimeInput
 
-<MemberInfo kind="property" type="ElementRef&#60;HTMLInputElement&#62;"   />
+<MemberInfo kind="property" type={`ElementRef&#60;HTMLInputElement&#62;`}   />
 
 
 ### calendarTable
 
-<MemberInfo kind="property" type="ElementRef&#60;HTMLTableElement&#62;"   />
+<MemberInfo kind="property" type={`ElementRef&#60;HTMLTableElement&#62;`}   />
 
 
 ### disabled
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### calendarView$
 
-<MemberInfo kind="property" type="Observable&#60;CalendarView&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;CalendarView&#62;`}   />
 
 
 ### current$
 
-<MemberInfo kind="property" type="Observable&#60;CurrentView&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;CurrentView&#62;`}   />
 
 
 ### selected$
 
-<MemberInfo kind="property" type="Observable&#60;Date | null&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;Date | null&#62;`}   />
 
 
 ### selectedHours$
 
-<MemberInfo kind="property" type="Observable&#60;number | null&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;number | null&#62;`}   />
 
 
 ### selectedMinutes$
 
-<MemberInfo kind="property" type="Observable&#60;number | null&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;number | null&#62;`}   />
 
 
 ### years
 
-<MemberInfo kind="property" type="number[]"   />
+<MemberInfo kind="property" type={`number[]`}   />
 
 
 ### weekdays
 
-<MemberInfo kind="property" type="string[]"   />
+<MemberInfo kind="property" type={`string[]`}   />
 
 
 ### hours
 
-<MemberInfo kind="property" type="number[]"   />
+<MemberInfo kind="property" type={`number[]`}   />
 
 
 ### minutes
 
-<MemberInfo kind="property" type="number[]"   />
+<MemberInfo kind="property" type={`number[]`}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(changeDetectorRef: ChangeDetectorRef, datetimePickerService: DatetimePickerService) => DatetimePickerComponent"   />
+<MemberInfo kind="method" type={`(changeDetectorRef: ChangeDetectorRef, datetimePickerService: DatetimePickerService) => DatetimePickerComponent`}   />
 
 
 ### ngOnInit
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### ngAfterViewInit
 
-<MemberInfo kind="method" type="() => void"   />
+<MemberInfo kind="method" type={`() => void`}   />
 
 
 ### ngOnDestroy
 
-<MemberInfo kind="method" type="() => void"   />
+<MemberInfo kind="method" type={`() => void`}   />
 
 
 ### registerOnChange
 
-<MemberInfo kind="method" type="(fn: any) => "   />
+<MemberInfo kind="method" type={`(fn: any) => `}   />
 
 
 ### registerOnTouched
 
-<MemberInfo kind="method" type="(fn: any) => "   />
+<MemberInfo kind="method" type={`(fn: any) => `}   />
 
 
 ### setDisabledState
 
-<MemberInfo kind="method" type="(isDisabled: boolean) => "   />
+<MemberInfo kind="method" type={`(isDisabled: boolean) => `}   />
 
 
 ### writeValue
 
-<MemberInfo kind="method" type="(value: string | null) => "   />
+<MemberInfo kind="method" type={`(value: string | null) => `}   />
 
 
 ### prevMonth
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### nextMonth
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### selectToday
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### setYear
 
-<MemberInfo kind="method" type="(event: Event) => "   />
+<MemberInfo kind="method" type={`(event: Event) => `}   />
 
 
 ### setMonth
 
-<MemberInfo kind="method" type="(event: Event) => "   />
+<MemberInfo kind="method" type={`(event: Event) => `}   />
 
 
 ### selectDay
 
-<MemberInfo kind="method" type="(day: DayCell) => "   />
+<MemberInfo kind="method" type={`(day: DayCell) => `}   />
 
 
 ### clearValue
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### handleCalendarKeydown
 
-<MemberInfo kind="method" type="(event: KeyboardEvent) => "   />
+<MemberInfo kind="method" type={`(event: KeyboardEvent) => `}   />
 
 
 ### setHour
 
-<MemberInfo kind="method" type="(event: Event) => "   />
+<MemberInfo kind="method" type={`(event: Event) => `}   />
 
 
 ### setMinute
 
-<MemberInfo kind="method" type="(event: Event) => "   />
+<MemberInfo kind="method" type={`(event: Event) => `}   />
 
 
 ### closeDatepicker
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 

+ 8 - 8
docs/docs/reference/admin-ui-api/components/dropdown-component.md

@@ -1,7 +1,7 @@
 ---
 title: "DropdownComponent"
 weight: 10
-date: 2023-07-21T15:46:19.392Z
+date: 2023-07-26T19:00:03.174Z
 showtoc: true
 generated: true
 ---
@@ -54,37 +54,37 @@ class DropdownComponent {
 
 ### isOpen
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### trigger
 
-<MemberInfo kind="property" type="ElementRef"   />
+<MemberInfo kind="property" type={`ElementRef`}   />
 
 
 ### manualToggle
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### onClick
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### toggleOpen
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### onOpenChange
 
-<MemberInfo kind="method" type="(callback: (isOpen: boolean) =&#62; void) => "   />
+<MemberInfo kind="method" type={`(callback: (isOpen: boolean) =&#62; void) => `}   />
 
 
 ### setTriggerElement
 
-<MemberInfo kind="method" type="(elementRef: ElementRef) => "   />
+<MemberInfo kind="method" type={`(elementRef: ElementRef) => `}   />
 
 
 

+ 21 - 21
docs/docs/reference/admin-ui-api/components/facet-value-selector-component.md

@@ -1,7 +1,7 @@
 ---
 title: "FacetValueSelectorComponent"
 weight: 10
-date: 2023-07-21T15:46:19.401Z
+date: 2023-07-26T19:00:03.205Z
 showtoc: true
 generated: true
 ---
@@ -68,102 +68,102 @@ class FacetValueSelectorComponent implements OnInit, OnDestroy, ControlValueAcce
 
 ### selectedValuesChange
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### readonly
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### transformControlValueAccessorValue
 
-<MemberInfo kind="property" type="(value: FacetValueFragment[]) =&#62; any[]"   />
+<MemberInfo kind="property" type={`(value: FacetValueFragment[]) =&#62; any[]`}   />
 
 
 ### searchInput$
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### searchLoading
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### searchResults$
 
-<MemberInfo kind="property" type="Observable&#60;FacetValueFragment[]&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;FacetValueFragment[]&#62;`}   />
 
 
 ### selectedIds$
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### onChangeFn
 
-<MemberInfo kind="property" type="(val: any) =&#62; void"   />
+<MemberInfo kind="property" type={`(val: any) =&#62; void`}   />
 
 
 ### onTouchFn
 
-<MemberInfo kind="property" type="() =&#62; void"   />
+<MemberInfo kind="property" type={`() =&#62; void`}   />
 
 
 ### disabled
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### value
 
-<MemberInfo kind="property" type="Array&#60;string | FacetValueFragment&#62;"   />
+<MemberInfo kind="property" type={`Array&#60;string | FacetValueFragment&#62;`}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef: ChangeDetectorRef) => FacetValueSelectorComponent"   />
+<MemberInfo kind="method" type={`(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef: ChangeDetectorRef) => FacetValueSelectorComponent`}   />
 
 
 ### ngOnInit
 
-<MemberInfo kind="method" type="() => void"   />
+<MemberInfo kind="method" type={`() => void`}   />
 
 
 ### ngOnDestroy
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### onChange
 
-<MemberInfo kind="method" type="(selected: FacetValueFragment[]) => "   />
+<MemberInfo kind="method" type={`(selected: FacetValueFragment[]) => `}   />
 
 
 ### registerOnChange
 
-<MemberInfo kind="method" type="(fn: any) => "   />
+<MemberInfo kind="method" type={`(fn: any) => `}   />
 
 
 ### registerOnTouched
 
-<MemberInfo kind="method" type="(fn: any) => "   />
+<MemberInfo kind="method" type={`(fn: any) => `}   />
 
 
 ### setDisabledState
 
-<MemberInfo kind="method" type="(isDisabled: boolean) => void"   />
+<MemberInfo kind="method" type={`(isDisabled: boolean) => void`}   />
 
 
 ### focus
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### writeValue
 
-<MemberInfo kind="method" type="(obj: string | FacetValueFragment[] | Array&#60;string | number&#62; | null) => void"   />
+<MemberInfo kind="method" type={`(obj: string | FacetValueFragment[] | Array&#60;string | number&#62; | null) => void`}   />
 
 
 

+ 10 - 10
docs/docs/reference/admin-ui-api/components/object-tree-component.md

@@ -1,7 +1,7 @@
 ---
 title: "ObjectTreeComponent"
 weight: 10
-date: 2023-07-21T15:46:19.427Z
+date: 2023-07-26T19:00:03.304Z
 showtoc: true
 generated: true
 ---
@@ -44,47 +44,47 @@ class ObjectTreeComponent implements OnChanges {
 
 ### value
 
-<MemberInfo kind="property" type="{ [key: string]: any } | string"   />
+<MemberInfo kind="property" type={`{ [key: string]: any } | string`}   />
 
 
 ### isArrayItem
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### depth
 
-<MemberInfo kind="property" type="number"   />
+<MemberInfo kind="property" type={`number`}   />
 
 
 ### expanded
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### valueIsArray
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### entries
 
-<MemberInfo kind="property" type="Array&#60;{ key: string; value: any }&#62;"   />
+<MemberInfo kind="property" type={`Array&#60;{ key: string; value: any }&#62;`}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(parent: <a href='/reference/admin-ui-api/components/object-tree-component#objecttreecomponent'>ObjectTreeComponent</a>) => ObjectTreeComponent"   />
+<MemberInfo kind="method" type={`(parent: <a href='/reference/admin-ui-api/components/object-tree-component#objecttreecomponent'>ObjectTreeComponent</a>) => ObjectTreeComponent`}   />
 
 
 ### ngOnChanges
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### isObject
 
-<MemberInfo kind="method" type="(value: any) => boolean"   />
+<MemberInfo kind="method" type={`(value: any) => boolean`}   />
 
 
 

+ 3 - 3
docs/docs/reference/admin-ui-api/components/order-state-label-component.md

@@ -1,7 +1,7 @@
 ---
 title: "OrderStateLabelComponent"
 weight: 10
-date: 2023-07-21T15:46:19.440Z
+date: 2023-07-26T19:00:03.363Z
 showtoc: true
 generated: true
 ---
@@ -34,12 +34,12 @@ class OrderStateLabelComponent {
 
 ### state
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### chipColorType
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 

+ 8 - 8
docs/docs/reference/admin-ui-api/components/product-variant-selector-component.md

@@ -1,7 +1,7 @@
 ---
 title: "ProductVariantSelectorComponent"
 weight: 10
-date: 2023-07-21T15:46:19.443Z
+date: 2023-07-26T19:00:03.373Z
 showtoc: true
 generated: true
 ---
@@ -43,37 +43,37 @@ class ProductVariantSelectorComponent implements OnInit {
 
 ### searchInput$
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### searchLoading
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### searchResults$
 
-<MemberInfo kind="property" type="Observable&#60;ProductSelectorSearchQuery['search']['items']&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;ProductSelectorSearchQuery['search']['items']&#62;`}   />
 
 
 ### productSelected
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>) => ProductVariantSelectorComponent"   />
+<MemberInfo kind="method" type={`(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>) => ProductVariantSelectorComponent`}   />
 
 
 ### ngOnInit
 
-<MemberInfo kind="method" type="() => void"   />
+<MemberInfo kind="method" type={`() => void`}   />
 
 
 ### selectResult
 
-<MemberInfo kind="method" type="(product?: ProductSelectorSearchQuery['search']['items'][number]) => "   />
+<MemberInfo kind="method" type={`(product?: ProductSelectorSearchQuery['search']['items'][number]) => `}   />
 
 
 

+ 13 - 13
docs/docs/reference/admin-ui-api/components/rich-text-editor-component.md

@@ -1,7 +1,7 @@
 ---
 title: "RichTextEditorComponent"
 weight: 10
-date: 2023-07-21T15:46:19.449Z
+date: 2023-07-26T19:00:03.418Z
 showtoc: true
 generated: true
 ---
@@ -51,62 +51,62 @@ class RichTextEditorComponent implements ControlValueAccessor, AfterViewInit, On
 
 ### label
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### _readonly
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### onChange
 
-<MemberInfo kind="property" type="(val: any) =&#62; void"   />
+<MemberInfo kind="property" type={`(val: any) =&#62; void`}   />
 
 
 ### onTouch
 
-<MemberInfo kind="property" type="() =&#62; void"   />
+<MemberInfo kind="property" type={`() =&#62; void`}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(changeDetector: ChangeDetectorRef, prosemirrorService: ProsemirrorService, viewContainerRef: ViewContainerRef, contextMenuService: ContextMenuService) => RichTextEditorComponent"   />
+<MemberInfo kind="method" type={`(changeDetector: ChangeDetectorRef, prosemirrorService: ProsemirrorService, viewContainerRef: ViewContainerRef, contextMenuService: ContextMenuService) => RichTextEditorComponent`}   />
 
 
 ### menuElement
 
-<MemberInfo kind="property" type="HTMLDivElement | null"   />
+<MemberInfo kind="property" type={`HTMLDivElement | null`}   />
 
 
 ### ngAfterViewInit
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### ngOnDestroy
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### registerOnChange
 
-<MemberInfo kind="method" type="(fn: any) => "   />
+<MemberInfo kind="method" type={`(fn: any) => `}   />
 
 
 ### registerOnTouched
 
-<MemberInfo kind="method" type="(fn: any) => "   />
+<MemberInfo kind="method" type={`(fn: any) => `}   />
 
 
 ### setDisabledState
 
-<MemberInfo kind="method" type="(isDisabled: boolean) => "   />
+<MemberInfo kind="method" type={`(isDisabled: boolean) => `}   />
 
 
 ### writeValue
 
-<MemberInfo kind="method" type="(value: any) => "   />
+<MemberInfo kind="method" type={`(value: any) => `}   />
 
 
 

+ 17 - 17
docs/docs/reference/admin-ui-api/components/zone-selector-component.md

@@ -1,7 +1,7 @@
 ---
 title: "ZoneSelectorComponent"
 weight: 10
-date: 2023-07-21T15:46:19.462Z
+date: 2023-07-26T19:00:03.451Z
 showtoc: true
 generated: true
 ---
@@ -47,82 +47,82 @@ class ZoneSelectorComponent implements ControlValueAccessor {
 
 ### selectedValuesChange
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### readonly
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### transformControlValueAccessorValue
 
-<MemberInfo kind="property" type="(value: <a href='/reference/typescript-api/entities/zone#zone'>Zone</a> | undefined) =&#62; any"   />
+<MemberInfo kind="property" type={`(value: <a href='/reference/typescript-api/entities/zone#zone'>Zone</a> | undefined) =&#62; any`}   />
 
 
 ### selectedId$
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### onChangeFn
 
-<MemberInfo kind="property" type="(val: any) =&#62; void"   />
+<MemberInfo kind="property" type={`(val: any) =&#62; void`}   />
 
 
 ### onTouchFn
 
-<MemberInfo kind="property" type="() =&#62; void"   />
+<MemberInfo kind="property" type={`() =&#62; void`}   />
 
 
 ### disabled
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### value
 
-<MemberInfo kind="property" type="string | <a href='/reference/typescript-api/entities/zone#zone'>Zone</a>"   />
+<MemberInfo kind="property" type={`string | <a href='/reference/typescript-api/entities/zone#zone'>Zone</a>`}   />
 
 
 ### zones$
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef: ChangeDetectorRef) => ZoneSelectorComponent"   />
+<MemberInfo kind="method" type={`(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef: ChangeDetectorRef) => ZoneSelectorComponent`}   />
 
 
 ### onChange
 
-<MemberInfo kind="method" type="(selected: <a href='/reference/typescript-api/entities/zone#zone'>Zone</a>) => "   />
+<MemberInfo kind="method" type={`(selected: <a href='/reference/typescript-api/entities/zone#zone'>Zone</a>) => `}   />
 
 
 ### registerOnChange
 
-<MemberInfo kind="method" type="(fn: any) => "   />
+<MemberInfo kind="method" type={`(fn: any) => `}   />
 
 
 ### registerOnTouched
 
-<MemberInfo kind="method" type="(fn: any) => "   />
+<MemberInfo kind="method" type={`(fn: any) => `}   />
 
 
 ### setDisabledState
 
-<MemberInfo kind="method" type="(isDisabled: boolean) => void"   />
+<MemberInfo kind="method" type={`(isDisabled: boolean) => void`}   />
 
 
 ### focus
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### writeValue
 
-<MemberInfo kind="method" type="(obj: string | <a href='/reference/typescript-api/entities/zone#zone'>Zone</a> | null) => void"   />
+<MemberInfo kind="method" type={`(obj: string | <a href='/reference/typescript-api/entities/zone#zone'>Zone</a> | null) => void`}   />
 
 
 

+ 3 - 3
docs/docs/reference/admin-ui-api/custom-detail-components/custom-detail-component-config.md

@@ -1,7 +1,7 @@
 ---
 title: "CustomDetailComponentConfig"
 weight: 10
-date: 2023-07-21T15:46:19.069Z
+date: 2023-07-26T19:00:02.339Z
 showtoc: true
 generated: true
 ---
@@ -28,12 +28,12 @@ interface CustomDetailComponentConfig {
 
 ### locationId
 
-<MemberInfo kind="property" type="<a href='/reference/admin-ui-api/custom-detail-components/custom-detail-component-location-id#customdetailcomponentlocationid'>CustomDetailComponentLocationId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/admin-ui-api/custom-detail-components/custom-detail-component-location-id#customdetailcomponentlocationid'>CustomDetailComponentLocationId</a>`}   />
 
 
 ### component
 
-<MemberInfo kind="property" type="Type&#60;<a href='/reference/admin-ui-api/custom-detail-components/custom-detail-component#customdetailcomponent'>CustomDetailComponent</a>&#62;"   />
+<MemberInfo kind="property" type={`Type&#60;<a href='/reference/admin-ui-api/custom-detail-components/custom-detail-component#customdetailcomponent'>CustomDetailComponent</a>&#62;`}   />
 
 
 

+ 2 - 1
docs/docs/reference/admin-ui-api/custom-detail-components/custom-detail-component-location-id.md

@@ -1,7 +1,7 @@
 ---
 title: "CustomDetailComponentLocationId"
 weight: 10
-date: 2023-07-21T15:46:19.022Z
+date: 2023-07-26T19:00:02.230Z
 showtoc: true
 generated: true
 ---
@@ -25,6 +25,7 @@ type CustomDetailComponentLocationId = | 'administrator-profile'
     | 'country-detail'
     | 'customer-detail'
     | 'customer-group-detail'
+    | 'draft-order-detail'
     | 'facet-detail'
     | 'global-settings-detail'
     | 'order-detail'

+ 3 - 3
docs/docs/reference/admin-ui-api/custom-detail-components/custom-detail-component.md

@@ -1,7 +1,7 @@
 ---
 title: "CustomDetailComponent"
 weight: 10
-date: 2023-07-21T15:46:19.065Z
+date: 2023-07-26T19:00:02.330Z
 showtoc: true
 generated: true
 ---
@@ -29,12 +29,12 @@ interface CustomDetailComponent {
 
 ### entity$
 
-<MemberInfo kind="property" type="Observable&#60;any&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;any&#62;`}   />
 
 
 ### detailForm
 
-<MemberInfo kind="property" type="UntypedFormGroup"   />
+<MemberInfo kind="property" type={`UntypedFormGroup`}   />
 
 
 

+ 2 - 2
docs/docs/reference/admin-ui-api/custom-detail-components/register-custom-detail-component.md

@@ -1,7 +1,7 @@
 ---
 title: "RegisterCustomDetailComponent"
 weight: 10
-date: 2023-07-21T15:46:19.073Z
+date: 2023-07-26T19:00:02.348Z
 showtoc: true
 generated: true
 ---
@@ -25,5 +25,5 @@ Parameters
 
 ### config
 
-<MemberInfo kind="parameter" type="<a href='/reference/admin-ui-api/custom-detail-components/custom-detail-component-config#customdetailcomponentconfig'>CustomDetailComponentConfig</a>" />
+<MemberInfo kind="parameter" type={`<a href='/reference/admin-ui-api/custom-detail-components/custom-detail-component-config#customdetailcomponentconfig'>CustomDetailComponentConfig</a>`} />
 

+ 2 - 2
docs/docs/reference/admin-ui-api/custom-history-entry-components/customer-history-entry-component.md

@@ -1,7 +1,7 @@
 ---
 title: "CustomerHistoryEntryComponent"
 weight: 10
-date: 2023-07-21T15:46:19.085Z
+date: 2023-07-26T19:00:02.379Z
 showtoc: true
 generated: true
 ---
@@ -30,7 +30,7 @@ interface CustomerHistoryEntryComponent extends HistoryEntryComponent {
 
 ### customer
 
-<MemberInfo kind="property" type="CustomerFragment"   />
+<MemberInfo kind="property" type={`CustomerFragment`}   />
 
 
 

+ 6 - 6
docs/docs/reference/admin-ui-api/custom-history-entry-components/history-entry-component.md

@@ -1,7 +1,7 @@
 ---
 title: "HistoryEntryComponent"
 weight: 10
-date: 2023-07-21T15:46:19.075Z
+date: 2023-07-26T19:00:02.353Z
 showtoc: true
 generated: true
 ---
@@ -33,29 +33,29 @@ interface HistoryEntryComponent {
 
 ### entry
 
-<MemberInfo kind="property" type="TimelineHistoryEntry"   />
+<MemberInfo kind="property" type={`TimelineHistoryEntry`}   />
 
 The HistoryEntry data.
 ### getDisplayType
 
-<MemberInfo kind="property" type="(entry: TimelineHistoryEntry) =&#62; TimelineDisplayType"   />
+<MemberInfo kind="property" type={`(entry: TimelineHistoryEntry) =&#62; TimelineDisplayType`}   />
 
 Defines whether this entry is highlighted with a "success", "error" etc. color.
 ### isFeatured
 
-<MemberInfo kind="property" type="(entry: TimelineHistoryEntry) =&#62; boolean"   />
+<MemberInfo kind="property" type={`(entry: TimelineHistoryEntry) =&#62; boolean`}   />
 
 Featured entries are always expanded. Non-featured entries start of collapsed and can be clicked
 to expand.
 ### getName
 
-<MemberInfo kind="property" type="(entry: TimelineHistoryEntry) =&#62; string | undefined"   />
+<MemberInfo kind="property" type={`(entry: TimelineHistoryEntry) =&#62; string | undefined`}   />
 
 Returns the name of the person who did this action. For example, it could be the Customer's name
 or "Administrator".
 ### getIconShape
 
-<MemberInfo kind="property" type="(entry: TimelineHistoryEntry) =&#62; string | string[] | undefined"   />
+<MemberInfo kind="property" type={`(entry: TimelineHistoryEntry) =&#62; string | string[] | undefined`}   />
 
 Optional Clarity icon shape to display with the entry. Examples: `'note'`, `['success-standard', 'is-solid']`
 

+ 3 - 3
docs/docs/reference/admin-ui-api/custom-history-entry-components/history-entry-config.md

@@ -1,7 +1,7 @@
 ---
 title: "HistoryEntryConfig"
 weight: 10
-date: 2023-07-21T15:46:19.088Z
+date: 2023-07-26T19:00:02.385Z
 showtoc: true
 generated: true
 ---
@@ -28,12 +28,12 @@ interface HistoryEntryConfig {
 
 ### type
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 The type should correspond to the custom HistoryEntryType string.
 ### component
 
-<MemberInfo kind="property" type="Type&#60;<a href='/reference/admin-ui-api/custom-history-entry-components/history-entry-component#historyentrycomponent'>HistoryEntryComponent</a>&#62;"   />
+<MemberInfo kind="property" type={`Type&#60;<a href='/reference/admin-ui-api/custom-history-entry-components/history-entry-component#historyentrycomponent'>HistoryEntryComponent</a>&#62;`}   />
 
 The component to be rendered for this history entry type.
 

+ 2 - 2
docs/docs/reference/admin-ui-api/custom-history-entry-components/order-history-entry-component.md

@@ -1,7 +1,7 @@
 ---
 title: "OrderHistoryEntryComponent"
 weight: 10
-date: 2023-07-21T15:46:19.082Z
+date: 2023-07-26T19:00:02.370Z
 showtoc: true
 generated: true
 ---
@@ -30,7 +30,7 @@ interface OrderHistoryEntryComponent extends HistoryEntryComponent {
 
 ### order
 
-<MemberInfo kind="property" type="OrderDetailFragment"   />
+<MemberInfo kind="property" type={`OrderDetailFragment`}   />
 
 
 

+ 2 - 2
docs/docs/reference/admin-ui-api/custom-history-entry-components/register-history-entry-component.md

@@ -1,7 +1,7 @@
 ---
 title: "RegisterHistoryEntryComponent"
 weight: 10
-date: 2023-07-21T15:46:19.093Z
+date: 2023-07-26T19:00:02.394Z
 showtoc: true
 generated: true
 ---
@@ -25,5 +25,5 @@ Parameters
 
 ### config
 
-<MemberInfo kind="parameter" type="<a href='/reference/admin-ui-api/custom-history-entry-components/history-entry-config#historyentryconfig'>HistoryEntryConfig</a>" />
+<MemberInfo kind="parameter" type={`<a href='/reference/admin-ui-api/custom-history-entry-components/history-entry-config#historyentryconfig'>HistoryEntryConfig</a>`} />
 

+ 99 - 99
docs/docs/reference/admin-ui-api/custom-input-components/default-inputs.md

@@ -1,7 +1,7 @@
 ---
 title: "Default Inputs"
 weight: 10
-date: 2023-07-21T15:46:19.482Z
+date: 2023-07-26T19:00:03.549Z
 showtoc: true
 generated: true
 ---
@@ -33,22 +33,22 @@ class BooleanFormInputComponent implements FormInputComponent {
 
 ### id
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>`}   />
 
 
 ### readonly
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### formControl
 
-<MemberInfo kind="property" type="UntypedFormControl"   />
+<MemberInfo kind="property" type={`UntypedFormControl`}   />
 
 
 ### config
 
-<MemberInfo kind="property" type="DefaultFormComponentConfig&#60;'boolean-form-input'&#62;"   />
+<MemberInfo kind="property" type={`DefaultFormComponentConfig&#60;'boolean-form-input'&#62;`}   />
 
 
 
@@ -81,17 +81,17 @@ class HtmlEditorFormInputComponent extends BaseCodeEditorFormInputComponent impl
 
 ### id
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>`}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(changeDetector: ChangeDetectorRef) => HtmlEditorFormInputComponent"   />
+<MemberInfo kind="method" type={`(changeDetector: ChangeDetectorRef) => HtmlEditorFormInputComponent`}   />
 
 
 ### ngOnInit
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 
@@ -124,17 +124,17 @@ class JsonEditorFormInputComponent extends BaseCodeEditorFormInputComponent impl
 
 ### id
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>`}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(changeDetector: ChangeDetectorRef) => JsonEditorFormInputComponent"   />
+<MemberInfo kind="method" type={`(changeDetector: ChangeDetectorRef) => JsonEditorFormInputComponent`}   />
 
 
 ### ngOnInit
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 
@@ -169,47 +169,47 @@ class CombinationModeFormInputComponent implements FormInputComponent, OnInit {
 
 ### id
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>`}   />
 
 
 ### readonly
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### formControl
 
-<MemberInfo kind="property" type="UntypedFormControl"   />
+<MemberInfo kind="property" type={`UntypedFormControl`}   />
 
 
 ### config
 
-<MemberInfo kind="property" type="DefaultFormComponentConfig&#60;'combination-mode-form-input'&#62;"   />
+<MemberInfo kind="property" type={`DefaultFormComponentConfig&#60;'combination-mode-form-input'&#62;`}   />
 
 
 ### selectable$
 
-<MemberInfo kind="property" type="Observable&#60;boolean&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;boolean&#62;`}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(configurableInputComponent: ConfigurableInputComponent) => CombinationModeFormInputComponent"   />
+<MemberInfo kind="method" type={`(configurableInputComponent: ConfigurableInputComponent) => CombinationModeFormInputComponent`}   />
 
 
 ### ngOnInit
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### setCombinationModeAnd
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### setCombinationModeOr
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 
@@ -241,32 +241,32 @@ class CurrencyFormInputComponent implements FormInputComponent {
 
 ### id
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>`}   />
 
 
 ### readonly
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### formControl
 
-<MemberInfo kind="property" type="UntypedFormControl"   />
+<MemberInfo kind="property" type={`UntypedFormControl`}   />
 
 
 ### currencyCode$
 
-<MemberInfo kind="property" type="Observable&#60;<a href='/reference/typescript-api/common/currency-code#currencycode'>CurrencyCode</a>&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;<a href='/reference/typescript-api/common/currency-code#currencycode'>CurrencyCode</a>&#62;`}   />
 
 
 ### config
 
-<MemberInfo kind="property" type="DefaultFormComponentConfig&#60;'currency-form-input'&#62;"   />
+<MemberInfo kind="property" type={`DefaultFormComponentConfig&#60;'currency-form-input'&#62;`}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>) => CurrencyFormInputComponent"   />
+<MemberInfo kind="method" type={`(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>) => CurrencyFormInputComponent`}   />
 
 
 
@@ -302,47 +302,47 @@ class CustomerGroupFormInputComponent implements FormInputComponent, OnInit {
 
 ### id
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>`}   />
 
 
 ### readonly
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### formControl
 
-<MemberInfo kind="property" type="FormControl&#60;string | { id: string }&#62;"   />
+<MemberInfo kind="property" type={`FormControl&#60;string | { id: string }&#62;`}   />
 
 
 ### customerGroups$
 
-<MemberInfo kind="property" type="Observable&#60;GetCustomerGroupsQuery['customerGroups']['items']&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;GetCustomerGroupsQuery['customerGroups']['items']&#62;`}   />
 
 
 ### config
 
-<MemberInfo kind="property" type="DefaultFormComponentConfig&#60;'customer-group-form-input'&#62;"   />
+<MemberInfo kind="property" type={`DefaultFormComponentConfig&#60;'customer-group-form-input'&#62;`}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>) => CustomerGroupFormInputComponent"   />
+<MemberInfo kind="method" type={`(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>) => CustomerGroupFormInputComponent`}   />
 
 
 ### ngOnInit
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### selectGroup
 
-<MemberInfo kind="method" type="(group: ItemOf&#60;GetCustomerGroupsQuery, 'customerGroups'&#62;) => "   />
+<MemberInfo kind="method" type={`(group: ItemOf&#60;GetCustomerGroupsQuery, 'customerGroups'&#62;) => `}   />
 
 
 ### compareWith
 
-<MemberInfo kind="method" type="(o1: ItemOf&#60;GetCustomerGroupsQuery, 'customerGroups'&#62;, o2: ItemOf&#60;GetCustomerGroupsQuery, 'customerGroups'&#62;) => "   />
+<MemberInfo kind="method" type={`(o1: ItemOf&#60;GetCustomerGroupsQuery, 'customerGroups'&#62;, o2: ItemOf&#60;GetCustomerGroupsQuery, 'customerGroups'&#62;) => `}   />
 
 
 
@@ -375,37 +375,37 @@ class DateFormInputComponent implements FormInputComponent {
 
 ### id
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>`}   />
 
 
 ### readonly
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### formControl
 
-<MemberInfo kind="property" type="UntypedFormControl"   />
+<MemberInfo kind="property" type={`UntypedFormControl`}   />
 
 
 ### config
 
-<MemberInfo kind="property" type="DefaultFormComponentConfig&#60;'date-form-input'&#62;"   />
+<MemberInfo kind="property" type={`DefaultFormComponentConfig&#60;'date-form-input'&#62;`}   />
 
 
 ### min
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### max
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### yearRange
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 
@@ -445,32 +445,32 @@ class FacetValueFormInputComponent implements FormInputComponent {
 
 ### id
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>`}   />
 
 
 ### isListInput
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### readonly
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### formControl
 
-<MemberInfo kind="property" type="UntypedFormControl"   />
+<MemberInfo kind="property" type={`UntypedFormControl`}   />
 
 
 ### config
 
-<MemberInfo kind="property" type="InputComponentConfig"   />
+<MemberInfo kind="property" type={`InputComponentConfig`}   />
 
 
 ### valueTransformFn
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 
@@ -505,47 +505,47 @@ class NumberFormInputComponent implements FormInputComponent {
 
 ### id
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>`}   />
 
 
 ### readonly
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### formControl
 
-<MemberInfo kind="property" type="UntypedFormControl"   />
+<MemberInfo kind="property" type={`UntypedFormControl`}   />
 
 
 ### config
 
-<MemberInfo kind="property" type="DefaultFormComponentConfig&#60;'number-form-input'&#62;"   />
+<MemberInfo kind="property" type={`DefaultFormComponentConfig&#60;'number-form-input'&#62;`}   />
 
 
 ### prefix
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### suffix
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### min
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### max
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### step
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 
@@ -575,22 +575,22 @@ class PasswordFormInputComponent implements FormInputComponent {
 
 ### id
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>`}   />
 
 
 ### readonly
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### formControl
 
-<MemberInfo kind="property" type="UntypedFormControl"   />
+<MemberInfo kind="property" type={`UntypedFormControl`}   />
 
 
 ### config
 
-<MemberInfo kind="property" type="InputComponentConfig"   />
+<MemberInfo kind="property" type={`InputComponentConfig`}   />
 
 
 
@@ -627,52 +627,52 @@ class ProductSelectorFormInputComponent implements FormInputComponent, OnInit {
 
 ### id
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>`}   />
 
 
 ### isListInput
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### readonly
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### formControl
 
-<MemberInfo kind="property" type="FormControl&#60;Array&#60;string | { id: string }&#62;&#62;"   />
+<MemberInfo kind="property" type={`FormControl&#60;Array&#60;string | { id: string }&#62;&#62;`}   />
 
 
 ### config
 
-<MemberInfo kind="property" type="DefaultFormComponentUiConfig&#60;'product-selector-form-input'&#62;"   />
+<MemberInfo kind="property" type={`DefaultFormComponentUiConfig&#60;'product-selector-form-input'&#62;`}   />
 
 
 ### selection$
 
-<MemberInfo kind="property" type="Observable&#60;Array&#60;GetProductVariantQuery['productVariant']&#62;&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;Array&#60;GetProductVariantQuery['productVariant']&#62;&#62;`}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>) => ProductSelectorFormInputComponent"   />
+<MemberInfo kind="method" type={`(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>) => ProductSelectorFormInputComponent`}   />
 
 
 ### ngOnInit
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### addProductVariant
 
-<MemberInfo kind="method" type="(product: ProductSelectorSearchQuery['search']['items'][number]) => "   />
+<MemberInfo kind="method" type={`(product: ProductSelectorSearchQuery['search']['items'][number]) => `}   />
 
 
 ### removeProductVariant
 
-<MemberInfo kind="method" type="(id: string) => "   />
+<MemberInfo kind="method" type={`(id: string) => `}   />
 
 
 
@@ -704,22 +704,22 @@ class RelationFormInputComponent implements FormInputComponent {
 
 ### id
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>`}   />
 
 
 ### readonly
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### formControl
 
-<MemberInfo kind="property" type="UntypedFormControl"   />
+<MemberInfo kind="property" type={`UntypedFormControl`}   />
 
 
 ### config
 
-<MemberInfo kind="property" type="RelationCustomFieldConfig"   />
+<MemberInfo kind="property" type={`RelationCustomFieldConfig`}   />
 
 
 
@@ -749,22 +749,22 @@ class RichTextFormInputComponent implements FormInputComponent {
 
 ### id
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>`}   />
 
 
 ### readonly
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### formControl
 
-<MemberInfo kind="property" type="UntypedFormControl"   />
+<MemberInfo kind="property" type={`UntypedFormControl`}   />
 
 
 ### config
 
-<MemberInfo kind="property" type="DefaultFormComponentConfig&#60;'rich-text-form-input'&#62;"   />
+<MemberInfo kind="property" type={`DefaultFormComponentConfig&#60;'rich-text-form-input'&#62;`}   />
 
 
 
@@ -800,47 +800,47 @@ class SelectFormInputComponent implements FormInputComponent, OnInit {
 
 ### id
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>`}   />
 
 
 ### readonly
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### formControl
 
-<MemberInfo kind="property" type="UntypedFormControl"   />
+<MemberInfo kind="property" type={`UntypedFormControl`}   />
 
 
 ### config
 
-<MemberInfo kind="property" type="DefaultFormComponentConfig&#60;'select-form-input'&#62; &#38; CustomFieldConfigFragment"   />
+<MemberInfo kind="property" type={`DefaultFormComponentConfig&#60;'select-form-input'&#62; &#38; CustomFieldConfigFragment`}   />
 
 
 ### uiLanguage$
 
-<MemberInfo kind="property" type="Observable&#60;<a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;<a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>&#62;`}   />
 
 
 ### options
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>) => SelectFormInputComponent"   />
+<MemberInfo kind="method" type={`(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>) => SelectFormInputComponent`}   />
 
 
 ### ngOnInit
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### trackByFn
 
-<MemberInfo kind="method" type="(index: number, item: any) => "   />
+<MemberInfo kind="method" type={`(index: number, item: any) => `}   />
 
 
 
@@ -872,32 +872,32 @@ class TextFormInputComponent implements FormInputComponent {
 
 ### id
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>`}   />
 
 
 ### readonly
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### formControl
 
-<MemberInfo kind="property" type="UntypedFormControl"   />
+<MemberInfo kind="property" type={`UntypedFormControl`}   />
 
 
 ### config
 
-<MemberInfo kind="property" type="DefaultFormComponentConfig&#60;'text-form-input'&#62;"   />
+<MemberInfo kind="property" type={`DefaultFormComponentConfig&#60;'text-form-input'&#62;`}   />
 
 
 ### prefix
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### suffix
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 
@@ -928,27 +928,27 @@ class TextareaFormInputComponent implements FormInputComponent {
 
 ### id
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/configurable-operation-def/default-form-component-id#defaultformcomponentid'>DefaultFormComponentId</a>`}   />
 
 
 ### readonly
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### formControl
 
-<MemberInfo kind="property" type="UntypedFormControl"   />
+<MemberInfo kind="property" type={`UntypedFormControl`}   />
 
 
 ### config
 
-<MemberInfo kind="property" type="DefaultFormComponentConfig&#60;'textarea-form-input'&#62;"   />
+<MemberInfo kind="property" type={`DefaultFormComponentConfig&#60;'textarea-form-input'&#62;`}   />
 
 
 ### spellcheck
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 

+ 5 - 5
docs/docs/reference/admin-ui-api/custom-input-components/form-input-component.md

@@ -1,7 +1,7 @@
 ---
 title: "FormInputComponent"
 weight: 10
-date: 2023-07-21T15:46:19.011Z
+date: 2023-07-26T19:00:02.209Z
 showtoc: true
 generated: true
 ---
@@ -31,20 +31,20 @@ interface FormInputComponent<C = InputComponentConfig> {
 
 ### isListInput
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 Should be set to `true` if this component is designed to handle lists.
 If `true` then the formControl value will be an array of all the
 values in the list.
 ### readonly
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 This is set by the Admin UI when consuming this component, indicating that the
 component should be rendered in a read-only state.
 ### formControl
 
-<MemberInfo kind="property" type="FormControl"   />
+<MemberInfo kind="property" type={`FormControl`}   />
 
 This controls the actual value of the form item. The current value is available
 as `this.formControl.value`, and an Observable stream of value changes is available
@@ -54,7 +54,7 @@ as `this.formControl.valueChanges`. To update the value, use `.setValue(val)` an
 Full documentation can be found in the [Angular docs](https://angular.io/api/forms/FormControl).
 ### config
 
-<MemberInfo kind="property" type="C"   />
+<MemberInfo kind="property" type={`C`}   />
 
 The `config` property contains the full configuration object of the custom field or configurable argument.
 

+ 3 - 3
docs/docs/reference/admin-ui-api/custom-input-components/register-form-input-component.md

@@ -1,7 +1,7 @@
 ---
 title: "RegisterFormInputComponent"
 weight: 10
-date: 2023-07-21T15:46:19.566Z
+date: 2023-07-26T19:00:03.926Z
 showtoc: true
 generated: true
 ---
@@ -68,9 +68,9 @@ Parameters
 
 ### id
 
-<MemberInfo kind="parameter" type="string" />
+<MemberInfo kind="parameter" type={`string`} />
 
 ### component
 
-<MemberInfo kind="parameter" type="Type&#60;<a href='/reference/admin-ui-api/custom-input-components/form-input-component#forminputcomponent'>FormInputComponent</a>&#62;" />
+<MemberInfo kind="parameter" type={`Type&#60;<a href='/reference/admin-ui-api/custom-input-components/form-input-component#forminputcomponent'>FormInputComponent</a>&#62;`} />
 

+ 2 - 2
docs/docs/reference/admin-ui-api/directives/if-multichannel-directive.md

@@ -1,7 +1,7 @@
 ---
 title: "IfMultichannelDirective"
 weight: 10
-date: 2023-07-21T15:46:19.475Z
+date: 2023-07-26T19:00:03.523Z
 showtoc: true
 generated: true
 ---
@@ -39,7 +39,7 @@ class IfMultichannelDirective extends IfDirectiveBase<[]> {
 
 ### constructor
 
-<MemberInfo kind="method" type="(_viewContainer: ViewContainerRef, templateRef: TemplateRef&#60;any&#62;, dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>) => IfMultichannelDirective"   />
+<MemberInfo kind="method" type={`(_viewContainer: ViewContainerRef, templateRef: TemplateRef&#60;any&#62;, dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>) => IfMultichannelDirective`}   />
 
 
 

+ 2 - 2
docs/docs/reference/admin-ui-api/directives/if-permissions-directive.md

@@ -1,7 +1,7 @@
 ---
 title: "IfPermissionsDirective"
 weight: 10
-date: 2023-07-21T15:46:19.479Z
+date: 2023-07-26T19:00:03.537Z
 showtoc: true
 generated: true
 ---
@@ -41,7 +41,7 @@ class IfPermissionsDirective extends IfDirectiveBase<Array<Permission[] | null>>
 
 ### constructor
 
-<MemberInfo kind="method" type="(_viewContainer: ViewContainerRef, templateRef: TemplateRef&#60;any&#62;, dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef: ChangeDetectorRef) => IfPermissionsDirective"   />
+<MemberInfo kind="method" type={`(_viewContainer: ViewContainerRef, templateRef: TemplateRef&#60;any&#62;, dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef: ChangeDetectorRef) => IfPermissionsDirective`}   />
 
 
 

+ 19 - 19
docs/docs/reference/admin-ui-api/list-detail-views/base-detail-component.md

@@ -1,7 +1,7 @@
 ---
 title: "BaseDetailComponent"
 weight: 10
-date: 2023-07-21T15:46:18.909Z
+date: 2023-07-26T19:00:01.939Z
 showtoc: true
 generated: true
 ---
@@ -81,92 +81,92 @@ class BaseDetailComponent<Entity extends { id: string; updatedAt?: string }> imp
 
 ### entity$
 
-<MemberInfo kind="property" type="Observable&#60;Entity&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;Entity&#62;`}   />
 
 
 ### availableLanguages$
 
-<MemberInfo kind="property" type="Observable&#60;<a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>[]&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;<a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>[]&#62;`}   />
 
 
 ### languageCode$
 
-<MemberInfo kind="property" type="Observable&#60;<a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;<a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>&#62;`}   />
 
 
 ### languageCode
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>`}   />
 
 
 ### isNew$
 
-<MemberInfo kind="property" type="Observable&#60;boolean&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;boolean&#62;`}   />
 
 
 ### id
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### detailForm
 
-<MemberInfo kind="property" type="UntypedFormGroup"   />
+<MemberInfo kind="property" type={`UntypedFormGroup`}   />
 
 
 ### destroy$
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(route: ActivatedRoute, router: Router, serverConfigService: ServerConfigService, dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>) => BaseDetailComponent"   />
+<MemberInfo kind="method" type={`(route: ActivatedRoute, router: Router, serverConfigService: ServerConfigService, dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>) => BaseDetailComponent`}   />
 
 
 ### init
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### setUpStreams
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### destroy
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### setLanguage
 
-<MemberInfo kind="method" type="(code: <a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>) => "   />
+<MemberInfo kind="method" type={`(code: <a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>) => `}   />
 
 
 ### canDeactivate
 
-<MemberInfo kind="method" type="() => boolean"   />
+<MemberInfo kind="method" type={`() => boolean`}   />
 
 
 ### setFormValues
 
-<MemberInfo kind="method" type="(entity: Entity, languageCode: <a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>) => void"   />
+<MemberInfo kind="method" type={`(entity: Entity, languageCode: <a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>) => void`}   />
 
 
 ### setCustomFieldFormValues
 
-<MemberInfo kind="method" type="(customFields: <a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[], formGroup: AbstractControl | null, entity: T, currentTranslation?: TranslationOf&#60;T&#62;) => "   />
+<MemberInfo kind="method" type={`(customFields: <a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[], formGroup: AbstractControl | null, entity: T, currentTranslation?: TranslationOf&#60;T&#62;) => `}   />
 
 
 ### getCustomFieldConfig
 
-<MemberInfo kind="method" type="(key: Exclude&#60;keyof <a href='/reference/typescript-api/custom-fields/#customfields'>CustomFields</a>, '__typename'&#62;) => <a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+<MemberInfo kind="method" type={`(key: Exclude&#60;keyof <a href='/reference/typescript-api/custom-fields/#customfields'>CustomFields</a>, '__typename'&#62;) => <a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]`}   />
 
 
 ### setQueryParam
 
-<MemberInfo kind="method" type="(key: string, value: any) => "   />
+<MemberInfo kind="method" type={`(key: string, value: any) => `}   />
 
 
 

+ 2 - 2
docs/docs/reference/admin-ui-api/list-detail-views/base-entity-resolver.md

@@ -1,7 +1,7 @@
 ---
 title: "BaseEntityResolver"
 weight: 10
-date: 2023-07-21T15:46:18.961Z
+date: 2023-07-26T19:00:02.084Z
 showtoc: true
 generated: true
 ---
@@ -52,7 +52,7 @@ class BaseEntityResolver<T> {
 
 ### constructor
 
-<MemberInfo kind="method" type="(router: Router, emptyEntity: T, entityStream: (id: string) =&#62; Observable&#60;T | null | undefined&#62;) => BaseEntityResolver"   />
+<MemberInfo kind="method" type={`(router: Router, emptyEntity: T, entityStream: (id: string) =&#62; Observable&#60;T | null | undefined&#62;) => BaseEntityResolver`}   />
 
 
 

+ 19 - 19
docs/docs/reference/admin-ui-api/list-detail-views/base-list-component.md

@@ -1,7 +1,7 @@
 ---
 title: "BaseListComponent"
 weight: 10
-date: 2023-07-21T15:46:18.964Z
+date: 2023-07-26T19:00:02.093Z
 showtoc: true
 generated: true
 ---
@@ -54,92 +54,92 @@ class BaseListComponent<ResultType, ItemType, VariableType extends Record<string
 
 ### searchTermControl
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### selectionManager
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### result$
 
-<MemberInfo kind="property" type="Observable&#60;ResultType&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;ResultType&#62;`}   />
 
 
 ### items$
 
-<MemberInfo kind="property" type="Observable&#60;ItemType[]&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;ItemType[]&#62;`}   />
 
 
 ### totalItems$
 
-<MemberInfo kind="property" type="Observable&#60;number&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;number&#62;`}   />
 
 
 ### itemsPerPage$
 
-<MemberInfo kind="property" type="Observable&#60;number&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;number&#62;`}   />
 
 
 ### currentPage$
 
-<MemberInfo kind="property" type="Observable&#60;number&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;number&#62;`}   />
 
 
 ### destroy$
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### refresh$
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="(router: Router, route: ActivatedRoute) => BaseListComponent"   />
+<MemberInfo kind="method" type={`(router: Router, route: ActivatedRoute) => BaseListComponent`}   />
 
 
 ### setQueryFn
 
-<MemberInfo kind="method" type="(listQueryFn: ListQueryFn&#60;ResultType&#62;, mappingFn: MappingFn&#60;ItemType, ResultType&#62;, onPageChangeFn?: OnPageChangeFn&#60;VariableType&#62;, defaults?: { take: number; skip: number }) => "   />
+<MemberInfo kind="method" type={`(listQueryFn: ListQueryFn&#60;ResultType&#62;, mappingFn: MappingFn&#60;ItemType, ResultType&#62;, onPageChangeFn?: OnPageChangeFn&#60;VariableType&#62;, defaults?: { take: number; skip: number }) => `}   />
 
 Sets the fetch function for the list being implemented.
 ### refreshListOnChanges
 
-<MemberInfo kind="method" type="(streams: Array&#60;Observable&#60;any&#62;&#62;) => "   />
+<MemberInfo kind="method" type={`(streams: Array&#60;Observable&#60;any&#62;&#62;) => `}   />
 
 Accepts a list of Observables which will trigger a refresh of the list when any of them emit.
 ### setPageNumber
 
-<MemberInfo kind="method" type="(page: number) => "   />
+<MemberInfo kind="method" type={`(page: number) => `}   />
 
 Sets the current page number in the url.
 ### setItemsPerPage
 
-<MemberInfo kind="method" type="(perPage: number) => "   />
+<MemberInfo kind="method" type={`(perPage: number) => `}   />
 
 Sets the number of items per page in the url.
 ### refresh
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 Re-fetch the current page of results.
 ### setQueryParam
 
-<MemberInfo kind="method" type="(hash: { [key: string]: any }, options?: { replaceUrl?: boolean; queryParamsHandling?: QueryParamsHandling }) => "   />
+<MemberInfo kind="method" type={`(hash: { [key: string]: any }, options?: { replaceUrl?: boolean; queryParamsHandling?: QueryParamsHandling }) => `}   />
 
 
 ### setQueryParam
 
-<MemberInfo kind="method" type="(key: string, value: any, options?: { replaceUrl?: boolean; queryParamsHandling?: QueryParamsHandling }) => "   />
+<MemberInfo kind="method" type={`(key: string, value: any, options?: { replaceUrl?: boolean; queryParamsHandling?: QueryParamsHandling }) => `}   />
 
 
 ### setQueryParam
 
-<MemberInfo kind="method" type="(keyOrHash: string | { [key: string]: any }, valueOrOptions?: any, maybeOptions?: { replaceUrl?: boolean; queryParamsHandling?: QueryParamsHandling }) => "   />
+<MemberInfo kind="method" type={`(keyOrHash: string | { [key: string]: any }, valueOrOptions?: any, maybeOptions?: { replaceUrl?: boolean; queryParamsHandling?: QueryParamsHandling }) => `}   />
 
 
 

+ 10 - 10
docs/docs/reference/admin-ui-api/list-detail-views/detail-component-with-resolver.md

@@ -1,7 +1,7 @@
 ---
 title: "DetailComponentWithResolver"
 weight: 10
-date: 2023-07-21T15:46:18.958Z
+date: 2023-07-26T19:00:02.079Z
 showtoc: true
 generated: true
 ---
@@ -15,8 +15,8 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 <GenerationInfo sourceFile="packages/admin-ui/src/lib/core/src/common/base-detail.component.ts" sourceLine="243" packageName="@vendure/admin-ui" />
 
-A helper function for creating tabs that point to a <a href='/reference/admin-ui-api/list-detail-views/typed-base-detail-component#typedbasedetailcomponent'>TypedBaseDetailComponent</a>. This takes
-care of the route resolver parts so that the detail component automatically has access to the
+A helper function for creating tabs that point to a <a href='/reference/admin-ui-api/list-detail-views/typed-base-detail-component#typedbasedetailcomponent'>TypedBaseDetailComponent</a>. This takes
+care of the route resolver parts so that the detail component automatically has access to the
 correct resolved detail data.
 
 *Example*
@@ -42,17 +42,17 @@ export class ProductSpecsUiExtensionModule {}
 ```
 
 ```ts title="Signature"
-function detailComponentWithResolver<T extends TypedDocumentNode<any, { id: string }>, Field extends keyof ResultOf<T>, R extends Field>(config: {
-    component: Type<TypedBaseDetailComponent<T, Field>>;
-    query: T;
-    entityKey: R;
-    getBreadcrumbs?: (entity: ResultOf<T>[R]) => BreadcrumbValue;
-    variables?: T extends TypedDocumentNode<any, infer V> ? Omit<V, 'id'> : never;
+function detailComponentWithResolver<T extends TypedDocumentNode<any, { id: string }>, Field extends keyof ResultOf<T>, R extends Field>(config: {
+    component: Type<TypedBaseDetailComponent<T, Field>>;
+    query: T;
+    entityKey: R;
+    getBreadcrumbs?: (entity: ResultOf<T>[R]) => BreadcrumbValue;
+    variables?: T extends TypedDocumentNode<any, infer V> ? Omit<V, 'id'> : never;
 }): void
 ```
 Parameters
 
 ### config
 
-<MemberInfo kind="parameter" type="{     component: Type&#60;<a href='/reference/admin-ui-api/list-detail-views/typed-base-detail-component#typedbasedetailcomponent'>TypedBaseDetailComponent</a>&#60;T, Field&#62;&#62;;     query: T;     entityKey: R;     getBreadcrumbs?: (entity: ResultOf&#60;T&#62;[R]) =&#62; BreadcrumbValue;     variables?: T extends TypedDocumentNode&#60;any, infer V&#62; ? Omit&#60;V, 'id'&#62; : never; }" />
+<MemberInfo kind="parameter" type={`{
     component: Type&#60;<a href='/reference/admin-ui-api/list-detail-views/typed-base-detail-component#typedbasedetailcomponent'>TypedBaseDetailComponent</a>&#60;T, Field&#62;&#62;;
     query: T;
     entityKey: R;
     getBreadcrumbs?: (entity: ResultOf&#60;T&#62;[R]) =&#62; BreadcrumbValue;
     variables?: T extends TypedDocumentNode&#60;any, infer V&#62; ? Omit&#60;V, 'id'&#62; : never;
 }`} />
 

+ 5 - 5
docs/docs/reference/admin-ui-api/list-detail-views/typed-base-detail-component.md

@@ -1,7 +1,7 @@
 ---
 title: "TypedBaseDetailComponent"
 weight: 10
-date: 2023-07-21T15:46:18.951Z
+date: 2023-07-26T19:00:02.064Z
 showtoc: true
 generated: true
 ---
@@ -34,22 +34,22 @@ class TypedBaseDetailComponent<T extends TypedDocumentNode<any, any>, Field exte
 
 ### result$
 
-<MemberInfo kind="property" type="Observable&#60;ResultOf&#60;T&#62;&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;ResultOf&#60;T&#62;&#62;`}   />
 
 
 ### entity
 
-<MemberInfo kind="property" type="ResultOf&#60;T&#62;[Field]"   />
+<MemberInfo kind="property" type={`ResultOf&#60;T&#62;[Field]`}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="() => TypedBaseDetailComponent"   />
+<MemberInfo kind="method" type={`() => TypedBaseDetailComponent`}   />
 
 
 ### init
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 

+ 13 - 13
docs/docs/reference/admin-ui-api/list-detail-views/typed-base-list-component.md

@@ -1,7 +1,7 @@
 ---
 title: "TypedBaseListComponent"
 weight: 10
-date: 2023-07-21T15:46:18.994Z
+date: 2023-07-26T19:00:02.164Z
 showtoc: true
 generated: true
 ---
@@ -50,62 +50,62 @@ class TypedBaseListComponent<T extends TypedDocumentNode<any, Vars>, Field exten
 
 ### availableLanguages$
 
-<MemberInfo kind="property" type="Observable&#60;<a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>[]&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;<a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>[]&#62;`}   />
 
 
 ### contentLanguage$
 
-<MemberInfo kind="property" type="Observable&#60;<a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;<a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>&#62;`}   />
 
 
 ### dataService
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### router
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### serverConfigService
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### constructor
 
-<MemberInfo kind="method" type="() => TypedBaseListComponent"   />
+<MemberInfo kind="method" type={`() => TypedBaseListComponent`}   />
 
 
 ### configure
 
-<MemberInfo kind="method" type="(config: {         document: T;         getItems: (data: ResultOf&#60;T&#62;) =&#62; { items: Array&#60;ItemOf&#60;ResultOf&#60;T&#62;, Field&#62;&#62;; totalItems: number };         setVariables?: (skip: number, take: number) =&#62; VariablesOf&#60;T&#62;;         refreshListOnChanges?: Array&#60;Observable&#60;any&#62;&#62;;     }) => "   />
+<MemberInfo kind="method" type={`(config: {         document: T;         getItems: (data: ResultOf&#60;T&#62;) =&#62; { items: Array&#60;ItemOf&#60;ResultOf&#60;T&#62;, Field&#62;&#62;; totalItems: number };         setVariables?: (skip: number, take: number) =&#62; VariablesOf&#60;T&#62;;         refreshListOnChanges?: Array&#60;Observable&#60;any&#62;&#62;;     }) => `}   />
 
 
 ### ngOnInit
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### createFilterCollection
 
-<MemberInfo kind="method" type="() => DataTableFilterCollection&#60;NonNullable&#60;NonNullable&#60;Vars['options']&#62;['filter']&#62;&#62;"   />
+<MemberInfo kind="method" type={`() => DataTableFilterCollection&#60;NonNullable&#60;NonNullable&#60;Vars['options']&#62;['filter']&#62;&#62;`}   />
 
 
 ### createSortCollection
 
-<MemberInfo kind="method" type="() => DataTableSortCollection&#60;NonNullable&#60;NonNullable&#60;Vars['options']&#62;['sort']&#62;&#62;"   />
+<MemberInfo kind="method" type={`() => DataTableSortCollection&#60;NonNullable&#60;NonNullable&#60;Vars['options']&#62;['sort']&#62;&#62;`}   />
 
 
 ### setLanguage
 
-<MemberInfo kind="method" type="(code: <a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>) => "   />
+<MemberInfo kind="method" type={`(code: <a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>) => `}   />
 
 
 ### getCustomFieldConfig
 
-<MemberInfo kind="method" type="(key: Exclude&#60;keyof <a href='/reference/typescript-api/custom-fields/#customfields'>CustomFields</a>, '__typename'&#62;) => <a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+<MemberInfo kind="method" type={`(key: Exclude&#60;keyof <a href='/reference/typescript-api/custom-fields/#customfields'>CustomFields</a>, '__typename'&#62;) => <a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]`}   />
 
 
 

+ 4 - 4
docs/docs/reference/admin-ui-api/nav-menu/add-nav-menu-item.md

@@ -1,7 +1,7 @@
 ---
 title: "AddNavMenuItem"
 weight: 10
-date: 2023-07-21T15:46:19.165Z
+date: 2023-07-26T19:00:02.526Z
 showtoc: true
 generated: true
 ---
@@ -48,13 +48,13 @@ Parameters
 
 ### config
 
-<MemberInfo kind="parameter" type="<a href='/reference/admin-ui-api/nav-menu/nav-menu-item#navmenuitem'>NavMenuItem</a>" />
+<MemberInfo kind="parameter" type={`<a href='/reference/admin-ui-api/nav-menu/nav-menu-item#navmenuitem'>NavMenuItem</a>`} />
 
 ### sectionId
 
-<MemberInfo kind="parameter" type="string" />
+<MemberInfo kind="parameter" type={`string`} />
 
 ### before
 
-<MemberInfo kind="parameter" type="string" />
+<MemberInfo kind="parameter" type={`string`} />
 

+ 3 - 3
docs/docs/reference/admin-ui-api/nav-menu/add-nav-menu-section.md

@@ -1,7 +1,7 @@
 ---
 title: "AddNavMenuSection"
 weight: 10
-date: 2023-07-21T15:46:19.162Z
+date: 2023-07-26T19:00:02.521Z
 showtoc: true
 generated: true
 ---
@@ -47,9 +47,9 @@ Parameters
 
 ### config
 
-<MemberInfo kind="parameter" type="<a href='/reference/admin-ui-api/nav-menu/nav-menu-section#navmenusection'>NavMenuSection</a>" />
+<MemberInfo kind="parameter" type={`<a href='/reference/admin-ui-api/nav-menu/nav-menu-section#navmenusection'>NavMenuSection</a>`} />
 
 ### before
 
-<MemberInfo kind="parameter" type="string" />
+<MemberInfo kind="parameter" type={`string`} />
 

+ 8 - 8
docs/docs/reference/admin-ui-api/nav-menu/nav-menu-item.md

@@ -1,7 +1,7 @@
 ---
 title: "NavMenuItem"
 weight: 10
-date: 2023-07-21T15:46:19.121Z
+date: 2023-07-26T19:00:02.451Z
 showtoc: true
 generated: true
 ---
@@ -34,37 +34,37 @@ interface NavMenuItem {
 
 ### id
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### label
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### routerLink
 
-<MemberInfo kind="property" type="RouterLinkDefinition"   />
+<MemberInfo kind="property" type={`RouterLinkDefinition`}   />
 
 
 ### onClick
 
-<MemberInfo kind="property" type="(event: MouseEvent) =&#62; void"   />
+<MemberInfo kind="property" type={`(event: MouseEvent) =&#62; void`}   />
 
 
 ### icon
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### requiresPermission
 
-<MemberInfo kind="property" type="string | ((userPermissions: string[]) =&#62; boolean)"   />
+<MemberInfo kind="property" type={`string | ((userPermissions: string[]) =&#62; boolean)`}   />
 
 
 ### statusBadge
 
-<MemberInfo kind="property" type="Observable&#60;<a href='/reference/admin-ui-api/nav-menu/navigation-types#navmenubadge'>NavMenuBadge</a>&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;<a href='/reference/admin-ui-api/nav-menu/navigation-types#navmenubadge'>NavMenuBadge</a>&#62;`}   />
 
 
 

+ 9 - 9
docs/docs/reference/admin-ui-api/nav-menu/nav-menu-section.md

@@ -1,7 +1,7 @@
 ---
 title: "NavMenuSection"
 weight: 10
-date: 2023-07-21T15:46:19.133Z
+date: 2023-07-26T19:00:02.469Z
 showtoc: true
 generated: true
 ---
@@ -35,42 +35,42 @@ interface NavMenuSection {
 
 ### id
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### label
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### items
 
-<MemberInfo kind="property" type="<a href='/reference/admin-ui-api/nav-menu/nav-menu-item#navmenuitem'>NavMenuItem</a>[]"   />
+<MemberInfo kind="property" type={`<a href='/reference/admin-ui-api/nav-menu/nav-menu-item#navmenuitem'>NavMenuItem</a>[]`}   />
 
 
 ### icon
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### displayMode
 
-<MemberInfo kind="property" type="'regular' | 'settings'"   />
+<MemberInfo kind="property" type={`'regular' | 'settings'`}   />
 
 
 ### requiresPermission
 
-<MemberInfo kind="property" type="string | ((userPermissions: string[]) =&#62; boolean)"   />
+<MemberInfo kind="property" type={`string | ((userPermissions: string[]) =&#62; boolean)`}   />
 
 Control the display of this item based on the user permissions.
 ### collapsible
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### collapsedByDefault
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 

+ 3 - 3
docs/docs/reference/admin-ui-api/nav-menu/navigation-types.md

@@ -1,7 +1,7 @@
 ---
 title: "Navigation Types"
 weight: 10
-date: 2023-07-21T15:46:19.115Z
+date: 2023-07-26T19:00:02.444Z
 showtoc: true
 generated: true
 ---
@@ -29,12 +29,12 @@ interface NavMenuBadge {
 
 ### type
 
-<MemberInfo kind="property" type="NavMenuBadgeType"   />
+<MemberInfo kind="property" type={`NavMenuBadgeType`}   />
 
 
 ### propagateToSection
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 If true, the badge will propagate to the NavMenuItem's
 parent section, displaying a notification badge next

+ 2 - 2
docs/docs/reference/admin-ui-api/pipes/asset-preview-pipe.md

@@ -1,7 +1,7 @@
 ---
 title: "AssetPreviewPipe"
 weight: 10
-date: 2023-07-21T15:46:19.569Z
+date: 2023-07-26T19:00:03.935Z
 showtoc: true
 generated: true
 ---
@@ -39,7 +39,7 @@ class AssetPreviewPipe implements PipeTransform {
 
 ### transform
 
-<MemberInfo kind="method" type="(asset?: AssetFragment, preset: string | number = 'thumb') => string"   />
+<MemberInfo kind="method" type={`(asset?: AssetFragment, preset: string | number = 'thumb') => string`}   />
 
 
 

+ 3 - 3
docs/docs/reference/admin-ui-api/pipes/duration-pipe.md

@@ -1,7 +1,7 @@
 ---
 title: "DurationPipe"
 weight: 10
-date: 2023-07-21T15:46:19.572Z
+date: 2023-07-26T19:00:03.947Z
 showtoc: true
 generated: true
 ---
@@ -38,12 +38,12 @@ class DurationPipe implements PipeTransform {
 
 ### constructor
 
-<MemberInfo kind="method" type="(i18nService: <a href='/reference/typescript-api/common/i18n-service#i18nservice'>I18nService</a>) => DurationPipe"   />
+<MemberInfo kind="method" type={`(i18nService: <a href='/reference/typescript-api/common/i18n-service#i18nservice'>I18nService</a>) => DurationPipe`}   />
 
 
 ### transform
 
-<MemberInfo kind="method" type="(value: number) => string"   />
+<MemberInfo kind="method" type={`(value: number) => string`}   />
 
 
 

+ 2 - 2
docs/docs/reference/admin-ui-api/pipes/file-size-pipe.md

@@ -1,7 +1,7 @@
 ---
 title: "FileSizePipe"
 weight: 10
-date: 2023-07-21T15:46:19.576Z
+date: 2023-07-26T19:00:03.964Z
 showtoc: true
 generated: true
 ---
@@ -36,7 +36,7 @@ class FileSizePipe implements PipeTransform {
 
 ### transform
 
-<MemberInfo kind="method" type="(value: number, useSiUnits:  = true) => any"   />
+<MemberInfo kind="method" type={`(value: number, useSiUnits:  = true) => any`}   />
 
 
 

+ 4 - 4
docs/docs/reference/admin-ui-api/pipes/has-permission-pipe.md

@@ -1,7 +1,7 @@
 ---
 title: "HasPermissionPipe"
 weight: 10
-date: 2023-07-21T15:46:19.579Z
+date: 2023-07-26T19:00:03.978Z
 showtoc: true
 generated: true
 ---
@@ -39,17 +39,17 @@ class HasPermissionPipe implements PipeTransform, OnDestroy {
 
 ### constructor
 
-<MemberInfo kind="method" type="(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef: ChangeDetectorRef) => HasPermissionPipe"   />
+<MemberInfo kind="method" type={`(dataService: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef: ChangeDetectorRef) => HasPermissionPipe`}   />
 
 
 ### transform
 
-<MemberInfo kind="method" type="(input: string | string[]) => any"   />
+<MemberInfo kind="method" type={`(input: string | string[]) => any`}   />
 
 
 ### ngOnDestroy
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 

+ 3 - 3
docs/docs/reference/admin-ui-api/pipes/locale-currency-name-pipe.md

@@ -1,7 +1,7 @@
 ---
 title: "LocaleCurrencyNamePipe"
 weight: 10
-date: 2023-07-21T15:46:19.583Z
+date: 2023-07-26T19:00:03.993Z
 showtoc: true
 generated: true
 ---
@@ -40,12 +40,12 @@ class LocaleCurrencyNamePipe extends LocaleBasePipe implements PipeTransform {
 
 ### constructor
 
-<MemberInfo kind="method" type="(dataService?: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef?: ChangeDetectorRef) => LocaleCurrencyNamePipe"   />
+<MemberInfo kind="method" type={`(dataService?: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef?: ChangeDetectorRef) => LocaleCurrencyNamePipe`}   />
 
 
 ### transform
 
-<MemberInfo kind="method" type="(value: any, display: 'full' | 'symbol' | 'name' = 'full', locale?: unknown) => any"   />
+<MemberInfo kind="method" type={`(value: any, display: 'full' | 'symbol' | 'name' = 'full', locale?: unknown) => any`}   />
 
 
 

+ 3 - 3
docs/docs/reference/admin-ui-api/pipes/locale-currency-pipe.md

@@ -1,7 +1,7 @@
 ---
 title: "LocaleCurrencyPipe"
 weight: 10
-date: 2023-07-21T15:46:19.587Z
+date: 2023-07-26T19:00:04.005Z
 showtoc: true
 generated: true
 ---
@@ -41,12 +41,12 @@ class LocaleCurrencyPipe extends LocaleBasePipe implements PipeTransform {
 
 ### constructor
 
-<MemberInfo kind="method" type="(dataService?: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef?: ChangeDetectorRef) => LocaleCurrencyPipe"   />
+<MemberInfo kind="method" type={`(dataService?: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef?: ChangeDetectorRef) => LocaleCurrencyPipe`}   />
 
 
 ### transform
 
-<MemberInfo kind="method" type="(value: unknown, args: unknown[]) => string | unknown"   />
+<MemberInfo kind="method" type={`(value: unknown, args: unknown[]) => string | unknown`}   />
 
 
 

+ 3 - 3
docs/docs/reference/admin-ui-api/pipes/locale-date-pipe.md

@@ -1,7 +1,7 @@
 ---
 title: "LocaleDatePipe"
 weight: 10
-date: 2023-07-21T15:46:19.591Z
+date: 2023-07-26T19:00:04.021Z
 showtoc: true
 generated: true
 ---
@@ -41,12 +41,12 @@ class LocaleDatePipe extends LocaleBasePipe implements PipeTransform {
 
 ### constructor
 
-<MemberInfo kind="method" type="(dataService?: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef?: ChangeDetectorRef) => LocaleDatePipe"   />
+<MemberInfo kind="method" type={`(dataService?: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef?: ChangeDetectorRef) => LocaleDatePipe`}   />
 
 
 ### transform
 
-<MemberInfo kind="method" type="(value: unknown, args: unknown[]) => unknown"   />
+<MemberInfo kind="method" type={`(value: unknown, args: unknown[]) => unknown`}   />
 
 
 

+ 3 - 3
docs/docs/reference/admin-ui-api/pipes/locale-language-name-pipe.md

@@ -1,7 +1,7 @@
 ---
 title: "LocaleLanguageNamePipe"
 weight: 10
-date: 2023-07-21T15:46:19.596Z
+date: 2023-07-26T19:00:04.038Z
 showtoc: true
 generated: true
 ---
@@ -40,12 +40,12 @@ class LocaleLanguageNamePipe extends LocaleBasePipe implements PipeTransform {
 
 ### constructor
 
-<MemberInfo kind="method" type="(dataService?: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef?: ChangeDetectorRef) => LocaleLanguageNamePipe"   />
+<MemberInfo kind="method" type={`(dataService?: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef?: ChangeDetectorRef) => LocaleLanguageNamePipe`}   />
 
 
 ### transform
 
-<MemberInfo kind="method" type="(value: any, locale?: unknown) => string"   />
+<MemberInfo kind="method" type={`(value: any, locale?: unknown) => string`}   />
 
 
 

+ 3 - 3
docs/docs/reference/admin-ui-api/pipes/locale-region-name-pipe.md

@@ -1,7 +1,7 @@
 ---
 title: "LocaleRegionNamePipe"
 weight: 10
-date: 2023-07-21T15:46:19.600Z
+date: 2023-07-26T19:00:04.047Z
 showtoc: true
 generated: true
 ---
@@ -40,12 +40,12 @@ class LocaleRegionNamePipe extends LocaleBasePipe implements PipeTransform {
 
 ### constructor
 
-<MemberInfo kind="method" type="(dataService?: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef?: ChangeDetectorRef) => LocaleRegionNamePipe"   />
+<MemberInfo kind="method" type={`(dataService?: <a href='/reference/admin-ui-api/providers/data-service#dataservice'>DataService</a>, changeDetectorRef?: ChangeDetectorRef) => LocaleRegionNamePipe`}   />
 
 
 ### transform
 
-<MemberInfo kind="method" type="(value: any, locale?: unknown) => string"   />
+<MemberInfo kind="method" type={`(value: any, locale?: unknown) => string`}   />
 
 
 

+ 3 - 3
docs/docs/reference/admin-ui-api/pipes/time-ago-pipe.md

@@ -1,7 +1,7 @@
 ---
 title: "TimeAgoPipe"
 weight: 10
-date: 2023-07-21T15:46:19.605Z
+date: 2023-07-26T19:00:04.061Z
 showtoc: true
 generated: true
 ---
@@ -37,12 +37,12 @@ class TimeAgoPipe implements PipeTransform {
 
 ### constructor
 
-<MemberInfo kind="method" type="(i18nService: <a href='/reference/typescript-api/common/i18n-service#i18nservice'>I18nService</a>) => TimeAgoPipe"   />
+<MemberInfo kind="method" type={`(i18nService: <a href='/reference/typescript-api/common/i18n-service#i18nservice'>I18nService</a>) => TimeAgoPipe`}   />
 
 
 ### transform
 
-<MemberInfo kind="method" type="(value: string | Date, nowVal?: string | Date) => string"   />
+<MemberInfo kind="method" type={`(value: string | Date, nowVal?: string | Date) => string`}   />
 
 
 

+ 11 - 11
docs/docs/reference/admin-ui-api/providers/data-service.md

@@ -1,7 +1,7 @@
 ---
 title: "DataService"
 weight: 10
-date: 2023-07-21T15:46:19.025Z
+date: 2023-07-26T19:00:02.234Z
 showtoc: true
 generated: true
 ---
@@ -31,7 +31,7 @@ class DataService {
 
 ### query
 
-<MemberInfo kind="method" type="(query: DocumentNode | TypedDocumentNode&#60;T, V&#62;, variables?: V, fetchPolicy: WatchQueryFetchPolicy = 'cache-and-network') => <a href='/reference/admin-ui-api/providers/data-service#queryresult'>QueryResult</a>&#60;T, V&#62;"   />
+<MemberInfo kind="method" type={`(query: DocumentNode | TypedDocumentNode&#60;T, V&#62;, variables?: V, fetchPolicy: WatchQueryFetchPolicy = 'cache-and-network') => <a href='/reference/admin-ui-api/providers/data-service#queryresult'>QueryResult</a>&#60;T, V&#62;`}   />
 
 Perform a GraphQL query. Returns a <a href='/reference/admin-ui-api/providers/data-service#queryresult'>QueryResult</a> which allows further control over
 they type of result returned, e.g. stream of values, single value etc.
@@ -52,7 +52,7 @@ const result$ = this.dataService.query(gql`
 ```
 ### mutate
 
-<MemberInfo kind="method" type="(mutation: DocumentNode | TypedDocumentNode&#60;T, V&#62;, variables?: V, update?: MutationUpdaterFn&#60;T&#62;) => Observable&#60;T&#62;"   />
+<MemberInfo kind="method" type={`(mutation: DocumentNode | TypedDocumentNode&#60;T, V&#62;, variables?: V, update?: MutationUpdaterFn&#60;T&#62;) => Observable&#60;T&#62;`}   />
 
 Perform a GraphQL mutation.
 
@@ -98,42 +98,42 @@ class QueryResult<T, V extends Record<string, any> = Record<string, any>> {
 
 ### constructor
 
-<MemberInfo kind="method" type="(queryRef: QueryRef&#60;T, V&#62;, apollo: Apollo) => QueryResult"   />
+<MemberInfo kind="method" type={`(queryRef: QueryRef&#60;T, V&#62;, apollo: Apollo) => QueryResult`}   />
 
 
 ### completed$
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### refetchOnChannelChange
 
-<MemberInfo kind="method" type="() => <a href='/reference/admin-ui-api/providers/data-service#queryresult'>QueryResult</a>&#60;T, V&#62;"   />
+<MemberInfo kind="method" type={`() => <a href='/reference/admin-ui-api/providers/data-service#queryresult'>QueryResult</a>&#60;T, V&#62;`}   />
 
 Re-fetch this query whenever the active Channel changes.
 ### single$
 
-<MemberInfo kind="property" type="Observable&#60;T&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;T&#62;`}   />
 
 Returns an Observable which emits a single result and then completes.
 ### stream$
 
-<MemberInfo kind="property" type="Observable&#60;T&#62;"   />
+<MemberInfo kind="property" type={`Observable&#60;T&#62;`}   />
 
 Returns an Observable which emits until unsubscribed.
 ### ref
 
-<MemberInfo kind="property" type="QueryRef&#60;T, V&#62;"   />
+<MemberInfo kind="property" type={`QueryRef&#60;T, V&#62;`}   />
 
 
 ### mapSingle
 
-<MemberInfo kind="method" type="(mapFn: (item: T) =&#62; R) => Observable&#60;R&#62;"   />
+<MemberInfo kind="method" type={`(mapFn: (item: T) =&#62; R) => Observable&#60;R&#62;`}   />
 
 Returns a single-result Observable after applying the map function.
 ### mapStream
 
-<MemberInfo kind="method" type="(mapFn: (item: T) =&#62; R) => Observable&#60;R&#62;"   />
+<MemberInfo kind="method" type={`(mapFn: (item: T) =&#62; R) => Observable&#60;R&#62;`}   />
 
 Returns a multiple-result Observable after applying the map function.
 

+ 14 - 14
docs/docs/reference/admin-ui-api/providers/modal-service.md

@@ -1,7 +1,7 @@
 ---
 title: "ModalService"
 weight: 10
-date: 2023-07-21T15:46:19.095Z
+date: 2023-07-26T19:00:02.399Z
 showtoc: true
 generated: true
 ---
@@ -30,12 +30,12 @@ class ModalService {
 
 ### constructor
 
-<MemberInfo kind="method" type="(componentFactoryResolver: ComponentFactoryResolver, overlayHostService: OverlayHostService) => ModalService"   />
+<MemberInfo kind="method" type={`(componentFactoryResolver: ComponentFactoryResolver, overlayHostService: OverlayHostService) => ModalService`}   />
 
 
 ### fromComponent
 
-<MemberInfo kind="method" type="(component: Type&#60;T&#62; &#38; Type&#60;<a href='/reference/admin-ui-api/providers/modal-service#dialog'>Dialog</a>&#60;R&#62;&#62;, options?: <a href='/reference/admin-ui-api/providers/modal-service#modaloptions'>ModalOptions</a>&#60;T&#62;) => Observable&#60;R | undefined&#62;"   />
+<MemberInfo kind="method" type={`(component: Type&#60;T&#62; &#38; Type&#60;<a href='/reference/admin-ui-api/providers/modal-service#dialog'>Dialog</a>&#60;R&#62;&#62;, options?: <a href='/reference/admin-ui-api/providers/modal-service#modaloptions'>ModalOptions</a>&#60;T&#62;) => Observable&#60;R | undefined&#62;`}   />
 
 Create a modal from a component. The component must implement the <a href='/reference/admin-ui-api/providers/modal-service#dialog'>Dialog</a> interface.
 Additionally, the component should include templates for the title and the buttons to be
@@ -79,7 +79,7 @@ class MyDialog implements Dialog {
 ```
 ### dialog
 
-<MemberInfo kind="method" type="(config: <a href='/reference/admin-ui-api/providers/modal-service#dialogconfig'>DialogConfig</a>&#60;T&#62;) => Observable&#60;T | undefined&#62;"   />
+<MemberInfo kind="method" type={`(config: <a href='/reference/admin-ui-api/providers/modal-service#dialogconfig'>DialogConfig</a>&#60;T&#62;) => Observable&#60;T | undefined&#62;`}   />
 
 Displays a modal dialog with the provided title, body and buttons.
 
@@ -104,7 +104,7 @@ interface Dialog<R = any> {
 
 ### resolveWith
 
-<MemberInfo kind="property" type="(result?: R) =&#62; void"   />
+<MemberInfo kind="property" type={`(result?: R) =&#62; void`}   />
 
 Function to be invoked in order to close the dialog when the action is complete.
 The Observable returned from the .fromComponent() method will emit the value passed
@@ -134,27 +134,27 @@ interface DialogConfig<T> {
 
 ### title
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### body
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### translationVars
 
-<MemberInfo kind="property" type="{ [key: string]: string | number }"   />
+<MemberInfo kind="property" type={`{ [key: string]: string | number }`}   />
 
 
 ### buttons
 
-<MemberInfo kind="property" type="Array&#60;DialogButtonConfig&#60;T&#62;&#62;"   />
+<MemberInfo kind="property" type={`Array&#60;DialogButtonConfig&#60;T&#62;&#62;`}   />
 
 
 ### size
 
-<MemberInfo kind="property" type="'sm' | 'md' | 'lg' | 'xl'"   />
+<MemberInfo kind="property" type={`'sm' | 'md' | 'lg' | 'xl'`}   />
 
 
 
@@ -181,23 +181,23 @@ interface ModalOptions<T> {
 
 ### size
 
-<MemberInfo kind="property" type="'sm' | 'md' | 'lg' | 'xl'"   />
+<MemberInfo kind="property" type={`'sm' | 'md' | 'lg' | 'xl'`}   />
 
 Sets the width of the dialog
 ### verticalAlign
 
-<MemberInfo kind="property" type="'top' | 'center' | 'bottom'"   />
+<MemberInfo kind="property" type={`'top' | 'center' | 'bottom'`}   />
 
 Sets the vertical alignment of the dialog
 ### closable
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 When true, the "x" icon is shown
 and clicking it or the mask will close the dialog
 ### locals
 
-<MemberInfo kind="property" type="Partial&#60;T&#62;"   />
+<MemberInfo kind="property" type={`Partial&#60;T&#62;`}   />
 
 Values to be passed directly to the component being instantiated inside the dialog.
 

+ 11 - 11
docs/docs/reference/admin-ui-api/providers/notification-service.md

@@ -1,7 +1,7 @@
 ---
 title: "NotificationService"
 weight: 10
-date: 2023-07-21T15:46:19.171Z
+date: 2023-07-26T19:00:02.537Z
 showtoc: true
 generated: true
 ---
@@ -46,32 +46,32 @@ class NotificationService {
 
 ### constructor
 
-<MemberInfo kind="method" type="(i18nService: <a href='/reference/typescript-api/common/i18n-service#i18nservice'>I18nService</a>, resolver: ComponentFactoryResolver, overlayHostService: OverlayHostService) => NotificationService"   />
+<MemberInfo kind="method" type={`(i18nService: <a href='/reference/typescript-api/common/i18n-service#i18nservice'>I18nService</a>, resolver: ComponentFactoryResolver, overlayHostService: OverlayHostService) => NotificationService`}   />
 
 
 ### success
 
-<MemberInfo kind="method" type="(message: string, translationVars?: { [key: string]: string | number }) => void"   />
+<MemberInfo kind="method" type={`(message: string, translationVars?: { [key: string]: string | number }) => void`}   />
 
 Display a success toast notification
 ### info
 
-<MemberInfo kind="method" type="(message: string, translationVars?: { [key: string]: string | number }) => void"   />
+<MemberInfo kind="method" type={`(message: string, translationVars?: { [key: string]: string | number }) => void`}   />
 
 Display an info toast notification
 ### warning
 
-<MemberInfo kind="method" type="(message: string, translationVars?: { [key: string]: string | number }) => void"   />
+<MemberInfo kind="method" type={`(message: string, translationVars?: { [key: string]: string | number }) => void`}   />
 
 Display a warning toast notification
 ### error
 
-<MemberInfo kind="method" type="(message: string, translationVars?: { [key: string]: string | number }) => void"   />
+<MemberInfo kind="method" type={`(message: string, translationVars?: { [key: string]: string | number }) => void`}   />
 
 Display an error toast notification
 ### notify
 
-<MemberInfo kind="method" type="(config: <a href='/reference/admin-ui-api/providers/notification-service#toastconfig'>ToastConfig</a>) => void"   />
+<MemberInfo kind="method" type={`(config: <a href='/reference/admin-ui-api/providers/notification-service#toastconfig'>ToastConfig</a>) => void`}   />
 
 Display a toast notification.
 
@@ -109,22 +109,22 @@ interface ToastConfig {
 
 ### message
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### translationVars
 
-<MemberInfo kind="property" type="{ [key: string]: string | number }"   />
+<MemberInfo kind="property" type={`{ [key: string]: string | number }`}   />
 
 
 ### type
 
-<MemberInfo kind="property" type="<a href='/reference/admin-ui-api/providers/notification-service#notificationtype'>NotificationType</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/admin-ui-api/providers/notification-service#notificationtype'>NotificationType</a>`}   />
 
 
 ### duration
 
-<MemberInfo kind="property" type="number"   />
+<MemberInfo kind="property" type={`number`}   />
 
 
 

+ 8 - 8
docs/docs/reference/admin-ui-api/tabs/page-tab-config.md

@@ -1,7 +1,7 @@
 ---
 title: "PageTabConfig"
 weight: 10
-date: 2023-07-21T15:46:19.190Z
+date: 2023-07-26T19:00:02.572Z
 showtoc: true
 generated: true
 ---
@@ -33,40 +33,40 @@ interface PageTabConfig {
 
 ### location
 
-<MemberInfo kind="property" type="<a href='/reference/admin-ui-api/action-bar/page-location-id#pagelocationid'>PageLocationId</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/admin-ui-api/action-bar/page-location-id#pagelocationid'>PageLocationId</a>`}   />
 
 A valid location representing a list or detail page.
 ### tabIcon
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 An optional icon to display in the tab. The icon
 should be a valid shape name from the [Clarity Icons](https://core.clarity.design/foundation/icons/shapes/)
 set.
 ### route
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 The route path to the tab. This will be appended to the
 route of the parent page.
 ### tab
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 The name of the tab to display in the UI.
 ### priority
 
-<MemberInfo kind="property" type="number"   />
+<MemberInfo kind="property" type={`number`}   />
 
 The priority of the tab. Tabs with a lower priority will be displayed first.
 ### component
 
-<MemberInfo kind="property" type="Type&#60;any&#62; | ReturnType&#60;typeof <a href='/reference/admin-ui-api/list-detail-views/detail-component-with-resolver#detailcomponentwithresolver'>detailComponentWithResolver</a>&#62;"   />
+<MemberInfo kind="property" type={`Type&#60;any&#62; | ReturnType&#60;typeof <a href='/reference/admin-ui-api/list-detail-views/detail-component-with-resolver#detailcomponentwithresolver'>detailComponentWithResolver</a>&#62;`}   />
 
 The component to render at the route of the tab.
 ### routeConfig
 
-<MemberInfo kind="property" type="Route"   />
+<MemberInfo kind="property" type={`Route`}   />
 
 You can optionally provide any native Angular route configuration options here.
 Any values provided here will take precedence over the values generated

+ 2 - 2
docs/docs/reference/admin-ui-api/tabs/register-page-tab.md

@@ -1,7 +1,7 @@
 ---
 title: "RegisterPageTab"
 weight: 10
-date: 2023-07-21T15:46:19.203Z
+date: 2023-07-26T19:00:02.587Z
 showtoc: true
 generated: true
 ---
@@ -41,5 +41,5 @@ Parameters
 
 ### config
 
-<MemberInfo kind="parameter" type="<a href='/reference/admin-ui-api/tabs/page-tab-config#pagetabconfig'>PageTabConfig</a>" />
+<MemberInfo kind="parameter" type={`<a href='/reference/admin-ui-api/tabs/page-tab-config#pagetabconfig'>PageTabConfig</a>`} />
 

+ 17 - 17
docs/docs/reference/admin-ui-api/ui-devkit/admin-ui-extension.md

@@ -1,7 +1,7 @@
 ---
 title: "AdminUiExtension"
 weight: 10
-date: 2023-07-21T15:46:19.618Z
+date: 2023-07-26T19:00:04.086Z
 showtoc: true
 generated: true
 ---
@@ -41,25 +41,25 @@ interface AdminUiExtension extends Partial<TranslationExtension>,
 
 ### id
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 An optional ID for the extension module. Only used internally for generating
 import paths to your module. If not specified, a unique hash will be used as the id.
 ### extensionPath
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 The path to the directory containing the extension module(s). The entire contents of this directory
 will be copied into the Admin UI app, including all TypeScript source files, html templates,
 scss style sheets etc.
 ### ngModules
 
-<MemberInfo kind="property" type="Array&#60;<a href='/reference/admin-ui-api/ui-devkit/admin-ui-extension#adminuiextensionsharedmodule'>AdminUiExtensionSharedModule</a> | <a href='/reference/admin-ui-api/ui-devkit/admin-ui-extension#adminuiextensionlazymodule'>AdminUiExtensionLazyModule</a>&#62;"   />
+<MemberInfo kind="property" type={`Array&#60;<a href='/reference/admin-ui-api/ui-devkit/admin-ui-extension#adminuiextensionsharedmodule'>AdminUiExtensionSharedModule</a> | <a href='/reference/admin-ui-api/ui-devkit/admin-ui-extension#adminuiextensionlazymodule'>AdminUiExtensionLazyModule</a>&#62;`}   />
 
 One or more Angular modules which extend the default Admin UI.
 ### pathAlias
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 An optional alias for the module so it can be referenced by other UI extension modules.
 
@@ -146,7 +146,7 @@ export class SampleUiExtensionModule {}
 ```
 ### exclude
 
-<MemberInfo kind="property" type="string[]"   />
+<MemberInfo kind="property" type={`string[]`}   />
 
 Optional array specifying filenames or [glob](https://github.com/isaacs/node-glob) patterns that should
 be skipped when copying the directory defined by `extensionPath`.
@@ -178,7 +178,7 @@ interface TranslationExtension {
 
 ### translations
 
-<MemberInfo kind="property" type="{ [languageCode in <a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>]?: string }"   />
+<MemberInfo kind="property" type={`{ [languageCode in <a href='/reference/typescript-api/common/language-code#languagecode'>LanguageCode</a>]?: string }`}   />
 
 Optional object defining any translation files for the Admin UI. The value should be an object with
 the key as a 2-character [ISO 639-1 language code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes),
@@ -214,7 +214,7 @@ interface StaticAssetExtension {
 
 ### staticAssets
 
-<MemberInfo kind="property" type="<a href='/reference/admin-ui-api/ui-devkit/admin-ui-extension#staticassetdefinition'>StaticAssetDefinition</a>[]"   />
+<MemberInfo kind="property" type={`<a href='/reference/admin-ui-api/ui-devkit/admin-ui-extension#staticassetdefinition'>StaticAssetDefinition</a>[]`}   />
 
 Optional array of paths to static assets which will be copied over to the Admin UI app's `/static`
 directory.
@@ -239,7 +239,7 @@ interface GlobalStylesExtension {
 
 ### globalStyles
 
-<MemberInfo kind="property" type="string[] | string"   />
+<MemberInfo kind="property" type={`string[] | string`}   />
 
 Specifies a path (or array of paths) to global style files (css or Sass) which will be
 incorporated into the Admin UI app global stylesheet.
@@ -264,7 +264,7 @@ interface SassVariableOverridesExtension {
 
 ### sassVariableOverrides
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 Specifies a path to a Sass style file containing variable declarations, which will take precedence over
 default values defined in Clarity.
@@ -303,19 +303,19 @@ interface AdminUiExtensionSharedModule {
 
 ### type
 
-<MemberInfo kind="property" type="'shared'"   />
+<MemberInfo kind="property" type={`'shared'`}   />
 
 Shared modules are directly imported into the main AppModule of the Admin UI
 and should be used to declare custom form components and define custom
 navigation items.
 ### ngModuleFileName
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 The name of the file containing the extension module class.
 ### ngModuleName
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 The name of the extension module class.
 
@@ -342,25 +342,25 @@ interface AdminUiExtensionLazyModule {
 
 ### type
 
-<MemberInfo kind="property" type="'lazy'"   />
+<MemberInfo kind="property" type={`'lazy'`}   />
 
 Lazy modules are lazy-loaded at the `/extensions/` route and should be used for
 modules which define new views for the Admin UI.
 ### route
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 The route specifies the route at which the module will be lazy-loaded. E.g. a value
 of `'foo'` will cause the module to lazy-load when the `/extensions/foo` route
 is activated.
 ### ngModuleFileName
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 The name of the file containing the extension module class.
 ### ngModuleName
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 The name of the extension module class.
 

+ 2 - 2
docs/docs/reference/admin-ui-api/ui-devkit/compile-ui-extensions.md

@@ -1,7 +1,7 @@
 ---
 title: "CompileUiExtensions"
 weight: 10
-date: 2023-07-21T15:46:19.616Z
+date: 2023-07-26T19:00:04.079Z
 showtoc: true
 generated: true
 ---
@@ -24,5 +24,5 @@ Parameters
 
 ### options
 
-<MemberInfo kind="parameter" type="<a href='/reference/admin-ui-api/ui-devkit/ui-extension-compiler-options#uiextensioncompileroptions'>UiExtensionCompilerOptions</a>" />
+<MemberInfo kind="parameter" type={`<a href='/reference/admin-ui-api/ui-devkit/ui-extension-compiler-options#uiextensioncompileroptions'>UiExtensionCompilerOptions</a>`} />
 

+ 2 - 2
docs/docs/reference/admin-ui-api/ui-devkit/helpers.md

@@ -1,7 +1,7 @@
 ---
 title: "Helpers"
 weight: 10
-date: 2023-07-21T15:46:19.617Z
+date: 2023-07-26T19:00:04.083Z
 showtoc: true
 generated: true
 ---
@@ -41,5 +41,5 @@ Parameters
 
 ### options
 
-<MemberInfo kind="parameter" type="BrandingOptions" />
+<MemberInfo kind="parameter" type={`BrandingOptions`} />
 

+ 8 - 8
docs/docs/reference/admin-ui-api/ui-devkit/ui-devkit-client.md

@@ -1,7 +1,7 @@
 ---
 title: "UiDevkitClient"
 weight: 10
-date: 2023-07-21T15:46:19.610Z
+date: 2023-07-26T19:00:04.067Z
 showtoc: true
 generated: true
 ---
@@ -27,7 +27,7 @@ Parameters
 
 ### value
 
-<MemberInfo kind="parameter" type="string" />
+<MemberInfo kind="parameter" type={`string`} />
 
 
 
@@ -85,15 +85,15 @@ Parameters
 
 ### document
 
-<MemberInfo kind="parameter" type="string" />
+<MemberInfo kind="parameter" type={`string`} />
 
 ### variables
 
-<MemberInfo kind="parameter" type="{ [key: string]: any }" />
+<MemberInfo kind="parameter" type={`{ [key: string]: any }`} />
 
 ### fetchPolicy
 
-<MemberInfo kind="parameter" type="WatchQueryFetchPolicy" />
+<MemberInfo kind="parameter" type={`WatchQueryFetchPolicy`} />
 
 
 
@@ -130,11 +130,11 @@ Parameters
 
 ### document
 
-<MemberInfo kind="parameter" type="string" />
+<MemberInfo kind="parameter" type={`string`} />
 
 ### variables
 
-<MemberInfo kind="parameter" type="{ [key: string]: any }" />
+<MemberInfo kind="parameter" type={`{ [key: string]: any }`} />
 
 
 
@@ -162,5 +162,5 @@ Parameters
 
 ### options
 
-<MemberInfo kind="parameter" type="NotificationMessage['data']" />
+<MemberInfo kind="parameter" type={`NotificationMessage['data']`} />
 

+ 8 - 8
docs/docs/reference/admin-ui-api/ui-devkit/ui-extension-compiler-options.md

@@ -1,7 +1,7 @@
 ---
 title: "UiExtensionCompilerOptions"
 weight: 10
-date: 2023-07-21T15:46:19.636Z
+date: 2023-07-26T19:00:04.140Z
 showtoc: true
 generated: true
 ---
@@ -33,18 +33,18 @@ interface UiExtensionCompilerOptions {
 
 ### outputPath
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 The directory into which the sources for the extended Admin UI will be copied.
 ### extensions
 
-<MemberInfo kind="property" type="Extension[]"   />
+<MemberInfo kind="property" type={`Extension[]`}   />
 
 An array of objects which configure Angular modules and/or
 translations with which to extend the Admin UI.
 ### devMode
 
-<MemberInfo kind="property" type="boolean" default="false"   />
+<MemberInfo kind="property" type={`boolean`} default="false"   />
 
 Set to `true` in order to compile the Admin UI in development mode (using the Angular CLI
 [ng serve](https://angular.io/cli/serve) command). When in dev mode, any changes to
@@ -52,7 +52,7 @@ UI extension files will be watched and trigger a rebuild of the Admin UI with li
 reloading.
 ### baseHref
 
-<MemberInfo kind="property" type="string" default="'/admin/'"   />
+<MemberInfo kind="property" type={`string`} default="'/admin/'"   />
 
 Allows the baseHref of the compiled Admin UI app to be set. This determines the prefix
 of the app, for example with the default value of `'/admin/'`, the Admin UI app
@@ -77,20 +77,20 @@ AdminUiPlugin.init({
 ```
 ### watchPort
 
-<MemberInfo kind="property" type="number" default="4200 | undefined"   />
+<MemberInfo kind="property" type={`number`} default="4200 | undefined"   />
 
 In watch mode, allows the port of the dev server to be specified. Defaults to the Angular CLI default
 of `4200`.
 ### command
 
-<MemberInfo kind="property" type="'yarn' | 'npm'"  since="1.5.0"  />
+<MemberInfo kind="property" type={`'yarn' | 'npm'`}  since="1.5.0"  />
 
 Internally, the Angular CLI will be invoked as an npm script. By default, the compiler will use Yarn
 to run the script if it is detected, otherwise it will use npm. This setting allows you to explicitly
 set which command to use, rather than relying on the default behavior.
 ### additionalProcessArguments
 
-<MemberInfo kind="property" type="<a href='/reference/admin-ui-api/ui-devkit/ui-extension-compiler-process-argument#uiextensioncompilerprocessargument'>UiExtensionCompilerProcessArgument</a>[]" default="undefined"  since="1.5.0"  />
+<MemberInfo kind="property" type={`<a href='/reference/admin-ui-api/ui-devkit/ui-extension-compiler-process-argument#uiextensioncompilerprocessargument'>UiExtensionCompilerProcessArgument</a>[]`} default="undefined"  since="1.5.0"  />
 
 Additional command-line arguments which will get passed to the [ng build](https://angular.io/cli/build)
 command (or [ng serve](https://angular.io/cli/serve) if `devMode = true`).

+ 1 - 1
docs/docs/reference/admin-ui-api/ui-devkit/ui-extension-compiler-process-argument.md

@@ -1,7 +1,7 @@
 ---
 title: "UiExtensionCompilerProcessArgument"
 weight: 10
-date: 2023-07-21T15:46:19.635Z
+date: 2023-07-26T19:00:04.136Z
 showtoc: true
 generated: true
 ---

+ 11 - 4
docs/docs/reference/typescript-api/assets/asset-naming-strategy.md

@@ -1,7 +1,7 @@
 ---
 title: "AssetNamingStrategy"
 weight: 10
-date: 2023-07-21T15:46:14.870Z
+date: 2023-07-26T18:59:54.132Z
 showtoc: true
 generated: true
 ---
@@ -13,11 +13,18 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## AssetNamingStrategy
 
-<GenerationInfo sourceFile="packages/core/src/config/asset-naming-strategy/asset-naming-strategy.ts" sourceLine="11" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/asset-naming-strategy/asset-naming-strategy.ts" sourceLine="18" packageName="@vendure/core" />
 
 The AssetNamingStrategy determines how file names are generated based on the uploaded source file name,
 as well as how to handle naming conflicts.
 
+:::info
+
+This is configured via the `assetOptions.assetNamingStrategy` property of
+your VendureConfig.
+
+:::
+
 ```ts title="Signature"
 interface AssetNamingStrategy extends InjectableStrategy {
   generateSourceFileName(ctx: RequestContext, originalFileName: string, conflictFileName?: string): string;
@@ -32,7 +39,7 @@ interface AssetNamingStrategy extends InjectableStrategy {
 
 ### generateSourceFileName
 
-<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, originalFileName: string, conflictFileName?: string) => string"   />
+<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, originalFileName: string, conflictFileName?: string) => string`}   />
 
 Given the original file name of the uploaded file, generate a file name to
 be stored on the server. Operations like normalization and time-stamping can
@@ -44,7 +51,7 @@ file name should then be generated. This process will repeat until a unique file
 been returned.
 ### generatePreviewFileName
 
-<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, sourceFileName: string, conflictFileName?: string) => string"   />
+<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, sourceFileName: string, conflictFileName?: string) => string`}   />
 
 Given the source file name generated in the `generateSourceFileName` method, this method
 should generate the file name of the preview image.

+ 6 - 6
docs/docs/reference/typescript-api/assets/asset-options.md

@@ -1,7 +1,7 @@
 ---
 title: "AssetOptions"
 weight: 10
-date: 2023-07-21T15:46:15.603Z
+date: 2023-07-26T18:59:55.360Z
 showtoc: true
 generated: true
 ---
@@ -33,22 +33,22 @@ interface AssetOptions {
 
 ### assetNamingStrategy
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/assets/asset-naming-strategy#assetnamingstrategy'>AssetNamingStrategy</a>" default="<a href='/reference/typescript-api/assets/default-asset-naming-strategy#defaultassetnamingstrategy'>DefaultAssetNamingStrategy</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/assets/asset-naming-strategy#assetnamingstrategy'>AssetNamingStrategy</a>`} default="<a href='/reference/typescript-api/assets/default-asset-naming-strategy#defaultassetnamingstrategy'>DefaultAssetNamingStrategy</a>"   />
 
 Defines how asset files and preview images are named before being saved.
 ### assetStorageStrategy
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/assets/asset-storage-strategy#assetstoragestrategy'>AssetStorageStrategy</a>" default="NoAssetStorageStrategy"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/assets/asset-storage-strategy#assetstoragestrategy'>AssetStorageStrategy</a>`} default="NoAssetStorageStrategy"   />
 
 Defines the strategy used for storing uploaded binary files.
 ### assetPreviewStrategy
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/assets/asset-preview-strategy#assetpreviewstrategy'>AssetPreviewStrategy</a>" default="NoAssetPreviewStrategy"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/assets/asset-preview-strategy#assetpreviewstrategy'>AssetPreviewStrategy</a>`} default="NoAssetPreviewStrategy"   />
 
 Defines the strategy used for creating preview images of uploaded assets.
 ### permittedFileTypes
 
-<MemberInfo kind="property" type="string[]" default="image, audio, video MIME types plus PDFs"   />
+<MemberInfo kind="property" type={`string[]`} default="image, audio, video MIME types plus PDFs"   />
 
 An array of the permitted file types that may be uploaded as Assets. Each entry
 should be in the form of a valid
@@ -56,7 +56,7 @@ should be in the form of a valid
 i.e. either a file extension (".pdf") or a mime type ("image/*", "audio/mpeg" etc.).
 ### uploadMaxFileSize
 
-<MemberInfo kind="property" type="number" default="20971520"   />
+<MemberInfo kind="property" type={`number`} default="20971520"   />
 
 The max file size in bytes for uploaded assets.
 

+ 11 - 3
docs/docs/reference/typescript-api/assets/asset-preview-strategy.md

@@ -1,7 +1,7 @@
 ---
 title: "AssetPreviewStrategy"
 weight: 10
-date: 2023-07-21T15:46:14.885Z
+date: 2023-07-26T18:59:54.175Z
 showtoc: true
 generated: true
 ---
@@ -13,15 +13,23 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## AssetPreviewStrategy
 
-<GenerationInfo sourceFile="packages/core/src/config/asset-preview-strategy/asset-preview-strategy.ts" sourceLine="17" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/asset-preview-strategy/asset-preview-strategy.ts" sourceLine="25" packageName="@vendure/core" />
 
 The AssetPreviewStrategy determines how preview images for assets are created. For image
 assets, this would usually typically involve resizing to sensible dimensions. Other file types
 could be previewed in a variety of ways, e.g.:
+
 - waveform images generated for audio files
 - preview images generated for pdf documents
 - watermarks added to preview images
 
+:::info
+
+This is configured via the `assetOptions.assetPreviewStrategy` property of
+your VendureConfig.
+
+:::
+
 ```ts title="Signature"
 interface AssetPreviewStrategy extends InjectableStrategy {
   generatePreviewImage(ctx: RequestContext, mimeType: string, data: Buffer): Promise<Buffer>;
@@ -35,7 +43,7 @@ interface AssetPreviewStrategy extends InjectableStrategy {
 
 ### generatePreviewImage
 
-<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, mimeType: string, data: Buffer) => Promise&#60;Buffer&#62;"   />
+<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, mimeType: string, data: Buffer) => Promise&#60;Buffer&#62;`}   />
 
 
 

+ 16 - 9
docs/docs/reference/typescript-api/assets/asset-storage-strategy.md

@@ -1,7 +1,7 @@
 ---
 title: "AssetStorageStrategy"
 weight: 10
-date: 2023-07-21T15:46:14.890Z
+date: 2023-07-26T18:59:54.184Z
 showtoc: true
 generated: true
 ---
@@ -13,11 +13,18 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## AssetStorageStrategy
 
-<GenerationInfo sourceFile="packages/core/src/config/asset-storage-strategy/asset-storage-strategy.ts" sourceLine="13" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/asset-storage-strategy/asset-storage-strategy.ts" sourceLine="20" packageName="@vendure/core" />
 
 The AssetPersistenceStrategy determines how Asset files are physically stored
 and retrieved.
 
+:::info
+
+This is configured via the `assetOptions.assetStorageStrategy` property of
+your VendureConfig.
+
+:::
+
 ```ts title="Signature"
 interface AssetStorageStrategy extends InjectableStrategy {
   writeFileFromBuffer(fileName: string, data: Buffer): Promise<string>;
@@ -37,42 +44,42 @@ interface AssetStorageStrategy extends InjectableStrategy {
 
 ### writeFileFromBuffer
 
-<MemberInfo kind="method" type="(fileName: string, data: Buffer) => Promise&#60;string&#62;"   />
+<MemberInfo kind="method" type={`(fileName: string, data: Buffer) => Promise&#60;string&#62;`}   />
 
 Writes a buffer to the store and returns a unique identifier for that
 file such as a file path or a URL.
 ### writeFileFromStream
 
-<MemberInfo kind="method" type="(fileName: string, data: Stream) => Promise&#60;string&#62;"   />
+<MemberInfo kind="method" type={`(fileName: string, data: Stream) => Promise&#60;string&#62;`}   />
 
 Writes a readable stream to the store and returns a unique identifier for that
 file such as a file path or a URL.
 ### readFileToBuffer
 
-<MemberInfo kind="method" type="(identifier: string) => Promise&#60;Buffer&#62;"   />
+<MemberInfo kind="method" type={`(identifier: string) => Promise&#60;Buffer&#62;`}   />
 
 Reads a file based on an identifier which was generated by the writeFile
 method, and returns the as a Buffer.
 ### readFileToStream
 
-<MemberInfo kind="method" type="(identifier: string) => Promise&#60;Stream&#62;"   />
+<MemberInfo kind="method" type={`(identifier: string) => Promise&#60;Stream&#62;`}   />
 
 Reads a file based on an identifier which was generated by the writeFile
 method, and returns the file as a Stream.
 ### deleteFile
 
-<MemberInfo kind="method" type="(identifier: string) => Promise&#60;void&#62;"   />
+<MemberInfo kind="method" type={`(identifier: string) => Promise&#60;void&#62;`}   />
 
 Deletes a file from the storage.
 ### fileExists
 
-<MemberInfo kind="method" type="(fileName: string) => Promise&#60;boolean&#62;"   />
+<MemberInfo kind="method" type={`(fileName: string) => Promise&#60;boolean&#62;`}   />
 
 Check whether a file with the given name already exists. Used to avoid
 naming conflicts before saving the file.
 ### toAbsoluteUrl
 
-<MemberInfo kind="method" type="(request: Request, identifier: string) => string"   />
+<MemberInfo kind="method" type={`(request: Request, identifier: string) => string`}   />
 
 Convert an identifier as generated by the writeFile... methods into an absolute
 url (if it is not already in that form). If no conversion step is needed

+ 3 - 3
docs/docs/reference/typescript-api/assets/default-asset-naming-strategy.md

@@ -1,7 +1,7 @@
 ---
 title: "DefaultAssetNamingStrategy"
 weight: 10
-date: 2023-07-21T15:46:14.878Z
+date: 2023-07-26T18:59:54.145Z
 showtoc: true
 generated: true
 ---
@@ -32,12 +32,12 @@ class DefaultAssetNamingStrategy implements AssetNamingStrategy {
 
 ### generateSourceFileName
 
-<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, originalFileName: string, conflictFileName?: string) => string"   />
+<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, originalFileName: string, conflictFileName?: string) => string`}   />
 
 
 ### generatePreviewFileName
 
-<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, sourceFileName: string, conflictFileName?: string) => string"   />
+<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, sourceFileName: string, conflictFileName?: string) => string`}   />
 
 
 

+ 16 - 16
docs/docs/reference/typescript-api/auth/auth-options.md

@@ -1,7 +1,7 @@
 ---
 title: "AuthOptions"
 weight: 10
-date: 2023-07-21T15:46:15.552Z
+date: 2023-07-26T18:59:55.299Z
 showtoc: true
 generated: true
 ---
@@ -41,14 +41,14 @@ interface AuthOptions {
 
 ### disableAuth
 
-<MemberInfo kind="property" type="boolean" default="false"   />
+<MemberInfo kind="property" type={`boolean`} default="false"   />
 
 Disable authentication & permissions checks.
 NEVER set the to true in production. It exists
 only to aid certain development tasks.
 ### tokenMethod
 
-<MemberInfo kind="property" type="'cookie' | 'bearer' | ReadonlyArray&#60;'cookie' | 'bearer'&#62;" default="'cookie'"   />
+<MemberInfo kind="property" type={`'cookie' | 'bearer' | ReadonlyArray&#60;'cookie' | 'bearer'&#62;`} default="'cookie'"   />
 
 Sets the method by which the session token is delivered and read.
 
@@ -65,17 +65,17 @@ by default).
 From v1.2.0 it is possible to specify both methods as a tuple: `['cookie', 'bearer']`.
 ### cookieOptions
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/auth/cookie-options#cookieoptions'>CookieOptions</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/auth/cookie-options#cookieoptions'>CookieOptions</a>`}   />
 
 Options related to the handling of cookies when using the 'cookie' tokenMethod.
 ### authTokenHeaderKey
 
-<MemberInfo kind="property" type="string" default="'vendure-auth-token'"   />
+<MemberInfo kind="property" type={`string`} default="'vendure-auth-token'"   />
 
 Sets the header property which will be used to send the auth token when using the 'bearer' method.
 ### sessionDuration
 
-<MemberInfo kind="property" type="string | number" default="'1y'"   />
+<MemberInfo kind="property" type={`string | number`} default="'1y'"   />
 
 Session duration, i.e. the time which must elapse from the last authenticated request
 after which the user must re-authenticate.
@@ -84,21 +84,21 @@ Expressed as a string describing a time span per
 [zeit/ms](https://github.com/zeit/ms.js).  Eg: `60`, `'2 days'`, `'10h'`, `'7d'`
 ### sessionCacheStrategy
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/auth/session-cache-strategy#sessioncachestrategy'>SessionCacheStrategy</a>" default="<a href='/reference/typescript-api/auth/in-memory-session-cache-strategy#inmemorysessioncachestrategy'>InMemorySessionCacheStrategy</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/auth/session-cache-strategy#sessioncachestrategy'>SessionCacheStrategy</a>`} default="<a href='/reference/typescript-api/auth/in-memory-session-cache-strategy#inmemorysessioncachestrategy'>InMemorySessionCacheStrategy</a>"   />
 
 This strategy defines how sessions will be cached. By default, sessions are cached using a simple
 in-memory caching strategy which is suitable for development and low-traffic, single-instance
 deployments.
 ### sessionCacheTTL
 
-<MemberInfo kind="property" type="number" default="300"   />
+<MemberInfo kind="property" type={`number`} default="300"   />
 
 The "time to live" of a given item in the session cache. This determines the length of time (in seconds)
 that a cache entry is kept before being considered "stale" and being replaced with fresh data
 taken from the database.
 ### requireVerification
 
-<MemberInfo kind="property" type="boolean" default="true"   />
+<MemberInfo kind="property" type={`boolean`} default="true"   />
 
 Determines whether new User accounts require verification of their email address.
 
@@ -107,7 +107,7 @@ If set to "true", when registering via the `registerCustomerAccount` mutation, o
 (once the email with the verification token has been opened) via the `verifyCustomerAccount` mutation.
 ### verificationTokenDuration
 
-<MemberInfo kind="property" type="string | number" default="'7d'"   />
+<MemberInfo kind="property" type={`string | number`} default="'7d'"   />
 
 Sets the length of time that a verification token is valid for, after which the verification token must be refreshed.
 
@@ -115,35 +115,35 @@ Expressed as a string describing a time span per
 [zeit/ms](https://github.com/zeit/ms.js).  Eg: `60`, `'2 days'`, `'10h'`, `'7d'`
 ### superadminCredentials
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/auth/superadmin-credentials#superadmincredentials'>SuperadminCredentials</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/auth/superadmin-credentials#superadmincredentials'>SuperadminCredentials</a>`}   />
 
 Configures the credentials to be used to create a superadmin
 ### shopAuthenticationStrategy
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/auth/authentication-strategy#authenticationstrategy'>AuthenticationStrategy</a>[]" default="<a href='/reference/typescript-api/auth/native-authentication-strategy#nativeauthenticationstrategy'>NativeAuthenticationStrategy</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/auth/authentication-strategy#authenticationstrategy'>AuthenticationStrategy</a>[]`} default="<a href='/reference/typescript-api/auth/native-authentication-strategy#nativeauthenticationstrategy'>NativeAuthenticationStrategy</a>"   />
 
 Configures one or more AuthenticationStrategies which defines how authentication
 is handled in the Shop API.
 ### adminAuthenticationStrategy
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/auth/authentication-strategy#authenticationstrategy'>AuthenticationStrategy</a>[]" default="<a href='/reference/typescript-api/auth/native-authentication-strategy#nativeauthenticationstrategy'>NativeAuthenticationStrategy</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/auth/authentication-strategy#authenticationstrategy'>AuthenticationStrategy</a>[]`} default="<a href='/reference/typescript-api/auth/native-authentication-strategy#nativeauthenticationstrategy'>NativeAuthenticationStrategy</a>"   />
 
 Configures one or more AuthenticationStrategy which defines how authentication
 is handled in the Admin API.
 ### customPermissions
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/auth/permission-definition#permissiondefinition'>PermissionDefinition</a>[]" default="[]"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/auth/permission-definition#permissiondefinition'>PermissionDefinition</a>[]`} default="[]"   />
 
 Allows custom Permissions to be defined, which can be used to restrict access to custom
 GraphQL resolvers defined in plugins.
 ### passwordHashingStrategy
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/auth/password-hashing-strategy#passwordhashingstrategy'>PasswordHashingStrategy</a>" default="<a href='/reference/typescript-api/auth/bcrypt-password-hashing-strategy#bcryptpasswordhashingstrategy'>BcryptPasswordHashingStrategy</a>"  since="1.3.0"  />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/auth/password-hashing-strategy#passwordhashingstrategy'>PasswordHashingStrategy</a>`} default="<a href='/reference/typescript-api/auth/bcrypt-password-hashing-strategy#bcryptpasswordhashingstrategy'>BcryptPasswordHashingStrategy</a>"  since="1.3.0"  />
 
 Allows you to customize the way passwords are hashed when using the <a href='/reference/typescript-api/auth/native-authentication-strategy#nativeauthenticationstrategy'>NativeAuthenticationStrategy</a>.
 ### passwordValidationStrategy
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/auth/password-validation-strategy#passwordvalidationstrategy'>PasswordValidationStrategy</a>" default="<a href='/reference/typescript-api/auth/default-password-validation-strategy#defaultpasswordvalidationstrategy'>DefaultPasswordValidationStrategy</a>"  since="1.5.0"  />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/auth/password-validation-strategy#passwordvalidationstrategy'>PasswordValidationStrategy</a>`} default="<a href='/reference/typescript-api/auth/default-password-validation-strategy#defaultpasswordvalidationstrategy'>DefaultPasswordValidationStrategy</a>"  since="1.5.0"  />
 
 Allows you to set a custom policy for passwords when using the <a href='/reference/typescript-api/auth/native-authentication-strategy#nativeauthenticationstrategy'>NativeAuthenticationStrategy</a>.
 By default, it uses the <a href='/reference/typescript-api/auth/default-password-validation-strategy#defaultpasswordvalidationstrategy'>DefaultPasswordValidationStrategy</a>, which will impose a minimum length

+ 13 - 6
docs/docs/reference/typescript-api/auth/authentication-strategy.md

@@ -1,7 +1,7 @@
 ---
 title: "AuthenticationStrategy"
 weight: 10
-date: 2023-07-21T15:46:14.906Z
+date: 2023-07-26T18:59:54.207Z
 showtoc: true
 generated: true
 ---
@@ -13,13 +13,20 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## AuthenticationStrategy
 
-<GenerationInfo sourceFile="packages/core/src/config/auth/authentication-strategy.ts" sourceLine="16" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/auth/authentication-strategy.ts" sourceLine="23" packageName="@vendure/core" />
 
 An AuthenticationStrategy defines how a User (which can be a Customer in the Shop API or
 and Administrator in the Admin API) may be authenticated.
 
 Real-world examples can be found in the [Authentication guide](/guides/developer-guide/authentication/).
 
+:::info
+
+This is configured via the `authOptions.shopAuthenticationStrategy` and `authOptions.adminAuthenticationStrategy`
+properties of your VendureConfig.
+
+:::
+
 ```ts title="Signature"
 interface AuthenticationStrategy<Data = unknown> extends InjectableStrategy {
   readonly name: string;
@@ -36,12 +43,12 @@ interface AuthenticationStrategy<Data = unknown> extends InjectableStrategy {
 
 ### name
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 The name of the strategy, for example `'facebook'`, `'google'`, `'keycloak'`.
 ### defineInputType
 
-<MemberInfo kind="method" type="() => DocumentNode"   />
+<MemberInfo kind="method" type={`() => DocumentNode`}   />
 
 Defines the type of the GraphQL Input object expected by the `authenticate`
 mutation. The final input object will be a map, with the key being the name
@@ -79,7 +86,7 @@ authenticate(input: {
 the _first_ input will be assumed to be the top-level input.
 ### authenticate
 
-<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, data: Data) => Promise&#60;<a href='/reference/typescript-api/entities/user#user'>User</a> | false | string&#62;"   />
+<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, data: Data) => Promise&#60;<a href='/reference/typescript-api/entities/user#user'>User</a> | false | string&#62;`}   />
 
 Used to authenticate a user with the authentication provider. This method
 will implement the provider-specific authentication logic, and should resolve to either a
@@ -87,7 +94,7 @@ will implement the provider-specific authentication logic, and should resolve to
 A `string` return could be used to describe what error happened, otherwise `false` to an unknown error.
 ### onLogOut
 
-<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, user: <a href='/reference/typescript-api/entities/user#user'>User</a>) => Promise&#60;void&#62;"   />
+<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, user: <a href='/reference/typescript-api/entities/user#user'>User</a>) => Promise&#60;void&#62;`}   />
 
 Called when a user logs out, and may perform any required tasks
 related to the user logging out with the external provider.

+ 3 - 3
docs/docs/reference/typescript-api/auth/bcrypt-password-hashing-strategy.md

@@ -1,7 +1,7 @@
 ---
 title: "BcryptPasswordHashingStrategy"
 weight: 10
-date: 2023-07-21T15:46:14.914Z
+date: 2023-07-26T18:59:54.219Z
 showtoc: true
 generated: true
 ---
@@ -31,12 +31,12 @@ class BcryptPasswordHashingStrategy implements PasswordHashingStrategy {
 
 ### hash
 
-<MemberInfo kind="method" type="(plaintext: string) => Promise&#60;string&#62;"   />
+<MemberInfo kind="method" type={`(plaintext: string) => Promise&#60;string&#62;`}   />
 
 
 ### check
 
-<MemberInfo kind="method" type="(plaintext: string, hash: string) => Promise&#60;boolean&#62;"   />
+<MemberInfo kind="method" type={`(plaintext: string, hash: string) => Promise&#60;boolean&#62;`}   />
 
 
 

+ 11 - 11
docs/docs/reference/typescript-api/auth/cookie-options.md

@@ -1,7 +1,7 @@
 ---
 title: "CookieOptions"
 weight: 10
-date: 2023-07-21T15:46:15.539Z
+date: 2023-07-26T18:59:55.281Z
 showtoc: true
 generated: true
 ---
@@ -38,12 +38,12 @@ interface CookieOptions {
 
 ### name
 
-<MemberInfo kind="property" type="string" default="'session'"   />
+<MemberInfo kind="property" type={`string`} default="'session'"   />
 
 The name of the cookie to set.
 ### secret
 
-<MemberInfo kind="property" type="string" default="(random character string)"   />
+<MemberInfo kind="property" type={`string`} default="(random character string)"   />
 
 The secret used for signing the session cookies for authenticated users. Only applies
 tokenMethod is set to 'cookie'.
@@ -53,45 +53,45 @@ source control for security reasons, but may be loaded from an external
 file not under source control, or from an environment variable, for example.
 ### path
 
-<MemberInfo kind="property" type="string" default="'/'"   />
+<MemberInfo kind="property" type={`string`} default="'/'"   />
 
 a string indicating the path of the cookie.
 ### domain
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 a string indicating the domain of the cookie (no default).
 ### sameSite
 
-<MemberInfo kind="property" type="'strict' | 'lax' | 'none' | boolean" default="false"   />
+<MemberInfo kind="property" type={`'strict' | 'lax' | 'none' | boolean`} default="false"   />
 
 a boolean or string indicating whether the cookie is a "same site" cookie (false by default). This can be set to 'strict',
 'lax', 'none', or true (which maps to 'strict').
 ### secure
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 a boolean indicating whether the cookie is only to be sent over HTTPS (false by default for HTTP, true by default for HTTPS).
 ### secureProxy
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 a boolean indicating whether the cookie is only to be sent over HTTPS (use this if you handle SSL not in your node process).
 ### httpOnly
 
-<MemberInfo kind="property" type="boolean" default="true"   />
+<MemberInfo kind="property" type={`boolean`} default="true"   />
 
 a boolean indicating whether the cookie is only to be sent over HTTP(S), and not made available to client JavaScript (true by default).
 ### signed
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 a boolean indicating whether the cookie is to be signed (true by default). If this is true, another cookie of the same name with the .sig
 suffix appended will also be sent, with a 27-byte url-safe base64 SHA1 value representing the hash of cookie-name=cookie-value against the
 first Keygrip key. This signature key is used to detect tampering the next time a cookie is received.
 ### overwrite
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 a boolean indicating whether to overwrite previously set cookies of the same name (true by default). If this is true, all cookies set during
 the same request with the same name (regardless of path or domain) are filtered out of the Set-Cookie header when setting this cookie.

+ 3 - 3
docs/docs/reference/typescript-api/auth/default-password-validation-strategy.md

@@ -1,7 +1,7 @@
 ---
 title: "DefaultPasswordValidationStrategy"
 weight: 10
-date: 2023-07-21T15:46:14.920Z
+date: 2023-07-26T18:59:54.229Z
 showtoc: true
 generated: true
 ---
@@ -37,12 +37,12 @@ class DefaultPasswordValidationStrategy implements PasswordValidationStrategy {
 
 ### constructor
 
-<MemberInfo kind="method" type="(options: { minLength?: number; regexp?: RegExp }) => DefaultPasswordValidationStrategy"   />
+<MemberInfo kind="method" type={`(options: { minLength?: number; regexp?: RegExp }) => DefaultPasswordValidationStrategy`}   />
 
 
 ### validate
 
-<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, password: string) => boolean | string"   />
+<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, password: string) => boolean | string`}   />
 
 
 

+ 7 - 7
docs/docs/reference/typescript-api/auth/external-authentication-service.md

@@ -1,7 +1,7 @@
 ---
 title: "ExternalAuthenticationService"
 weight: 10
-date: 2023-07-21T15:46:16.842Z
+date: 2023-07-26T18:59:57.525Z
 showtoc: true
 generated: true
 ---
@@ -48,12 +48,12 @@ class ExternalAuthenticationService {
 
 ### constructor
 
-<MemberInfo kind="method" type="(connection: <a href='/reference/typescript-api/data-access/transactional-connection#transactionalconnection'>TransactionalConnection</a>, roleService: <a href='/reference/typescript-api/services/role-service#roleservice'>RoleService</a>, historyService: <a href='/reference/typescript-api/services/history-service#historyservice'>HistoryService</a>, customerService: <a href='/reference/typescript-api/services/customer-service#customerservice'>CustomerService</a>, administratorService: <a href='/reference/typescript-api/services/administrator-service#administratorservice'>AdministratorService</a>, channelService: <a href='/reference/typescript-api/services/channel-service#channelservice'>ChannelService</a>) => ExternalAuthenticationService"   />
+<MemberInfo kind="method" type={`(connection: <a href='/reference/typescript-api/data-access/transactional-connection#transactionalconnection'>TransactionalConnection</a>, roleService: <a href='/reference/typescript-api/services/role-service#roleservice'>RoleService</a>, historyService: <a href='/reference/typescript-api/services/history-service#historyservice'>HistoryService</a>, customerService: <a href='/reference/typescript-api/services/customer-service#customerservice'>CustomerService</a>, administratorService: <a href='/reference/typescript-api/services/administrator-service#administratorservice'>AdministratorService</a>, channelService: <a href='/reference/typescript-api/services/channel-service#channelservice'>ChannelService</a>) => ExternalAuthenticationService`}   />
 
 
 ### findCustomerUser
 
-<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, strategy: string, externalIdentifier: string, checkCurrentChannelOnly:  = true) => Promise&#60;<a href='/reference/typescript-api/entities/user#user'>User</a> | undefined&#62;"   />
+<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, strategy: string, externalIdentifier: string, checkCurrentChannelOnly:  = true) => Promise&#60;<a href='/reference/typescript-api/entities/user#user'>User</a> | undefined&#62;`}   />
 
 Looks up a User based on their identifier from an external authentication
 provider, ensuring this User is associated with a Customer account.
@@ -63,13 +63,13 @@ By passing `false` as the `checkCurrentChannelOnly` argument, _all_ channels
 will be checked.
 ### findAdministratorUser
 
-<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, strategy: string, externalIdentifier: string) => Promise&#60;<a href='/reference/typescript-api/entities/user#user'>User</a> | undefined&#62;"   />
+<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, strategy: string, externalIdentifier: string) => Promise&#60;<a href='/reference/typescript-api/entities/user#user'>User</a> | undefined&#62;`}   />
 
 Looks up a User based on their identifier from an external authentication
 provider, ensuring this User is associated with an Administrator account.
 ### createCustomerAndUser
 
-<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, config: {
             strategy: string;
             externalIdentifier: string;
             verified: boolean;
             emailAddress: string;
             firstName?: string;
             lastName?: string;
         }) => Promise&#60;<a href='/reference/typescript-api/entities/user#user'>User</a>&#62;"   />
+<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, config: {
             strategy: string;
             externalIdentifier: string;
             verified: boolean;
             emailAddress: string;
             firstName?: string;
             lastName?: string;
         }) => Promise&#60;<a href='/reference/typescript-api/entities/user#user'>User</a>&#62;`}   />
 
 If a customer has been successfully authenticated by an external authentication provider, yet cannot
 be found using `findCustomerUser`, then we need to create a new User and
@@ -77,14 +77,14 @@ Customer record in Vendure for that user. This method encapsulates that logic as
 housekeeping such as adding a record to the Customer's history.
 ### createAdministratorAndUser
 
-<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, config: {
             strategy: string;
             externalIdentifier: string;
             identifier: string;
             emailAddress?: string;
             firstName?: string;
             lastName?: string;
             roles: <a href='/reference/typescript-api/entities/role#role'>Role</a>[];
         }) => "   />
+<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, config: {
             strategy: string;
             externalIdentifier: string;
             identifier: string;
             emailAddress?: string;
             firstName?: string;
             lastName?: string;
             roles: <a href='/reference/typescript-api/entities/role#role'>Role</a>[];
         }) => `}   />
 
 If an administrator has been successfully authenticated by an external authentication provider, yet cannot
 be found using `findAdministratorUser`, then we need to create a new User and
 Administrator record in Vendure for that user.
 ### findUser
 
-<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, strategy: string, externalIdentifier: string) => Promise&#60;<a href='/reference/typescript-api/entities/user#user'>User</a> | undefined&#62;"   />
+<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, strategy: string, externalIdentifier: string) => Promise&#60;<a href='/reference/typescript-api/entities/user#user'>User</a> | undefined&#62;`}   />
 
 
 

+ 6 - 6
docs/docs/reference/typescript-api/auth/in-memory-session-cache-strategy.md

@@ -1,7 +1,7 @@
 ---
 title: "InMemorySessionCacheStrategy"
 weight: 10
-date: 2023-07-21T15:46:15.431Z
+date: 2023-07-26T18:59:55.081Z
 showtoc: true
 generated: true
 ---
@@ -41,27 +41,27 @@ class InMemorySessionCacheStrategy implements SessionCacheStrategy {
 
 ### constructor
 
-<MemberInfo kind="method" type="(cacheSize?: number) => InMemorySessionCacheStrategy"   />
+<MemberInfo kind="method" type={`(cacheSize?: number) => InMemorySessionCacheStrategy`}   />
 
 
 ### delete
 
-<MemberInfo kind="method" type="(sessionToken: string) => "   />
+<MemberInfo kind="method" type={`(sessionToken: string) => `}   />
 
 
 ### get
 
-<MemberInfo kind="method" type="(sessionToken: string) => "   />
+<MemberInfo kind="method" type={`(sessionToken: string) => `}   />
 
 
 ### set
 
-<MemberInfo kind="method" type="(session: <a href='/reference/typescript-api/auth/session-cache-strategy#cachedsession'>CachedSession</a>) => "   />
+<MemberInfo kind="method" type={`(session: <a href='/reference/typescript-api/auth/session-cache-strategy#cachedsession'>CachedSession</a>) => `}   />
 
 
 ### clear
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 

+ 6 - 6
docs/docs/reference/typescript-api/auth/native-authentication-strategy.md

@@ -1,7 +1,7 @@
 ---
 title: "NativeAuthenticationStrategy"
 weight: 10
-date: 2023-07-21T15:46:14.924Z
+date: 2023-07-26T18:59:54.237Z
 showtoc: true
 generated: true
 ---
@@ -36,27 +36,27 @@ class NativeAuthenticationStrategy implements AuthenticationStrategy<NativeAuthe
 
 ### name
 
-<MemberInfo kind="property" type=""   />
+<MemberInfo kind="property" type={``}   />
 
 
 ### init
 
-<MemberInfo kind="method" type="(injector: <a href='/reference/typescript-api/common/injector#injector'>Injector</a>) => "   />
+<MemberInfo kind="method" type={`(injector: <a href='/reference/typescript-api/common/injector#injector'>Injector</a>) => `}   />
 
 
 ### defineInputType
 
-<MemberInfo kind="method" type="() => DocumentNode"   />
+<MemberInfo kind="method" type={`() => DocumentNode`}   />
 
 
 ### authenticate
 
-<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, data: NativeAuthenticationData) => Promise&#60;<a href='/reference/typescript-api/entities/user#user'>User</a> | false&#62;"   />
+<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, data: NativeAuthenticationData) => Promise&#60;<a href='/reference/typescript-api/entities/user#user'>User</a> | false&#62;`}   />
 
 
 ### verifyUserPassword
 
-<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, userId: <a href='/reference/typescript-api/common/id#id'>ID</a>, password: string) => Promise&#60;boolean&#62;"   />
+<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, userId: <a href='/reference/typescript-api/common/id#id'>ID</a>, password: string) => Promise&#60;boolean&#62;`}   />
 
 
 

+ 5 - 5
docs/docs/reference/typescript-api/auth/noop-session-cache-strategy.md

@@ -1,7 +1,7 @@
 ---
 title: "NoopSessionCacheStrategy"
 weight: 10
-date: 2023-07-21T15:46:15.438Z
+date: 2023-07-26T18:59:55.090Z
 showtoc: true
 generated: true
 ---
@@ -34,22 +34,22 @@ class NoopSessionCacheStrategy implements SessionCacheStrategy {
 
 ### clear
 
-<MemberInfo kind="method" type="() => "   />
+<MemberInfo kind="method" type={`() => `}   />
 
 
 ### delete
 
-<MemberInfo kind="method" type="(sessionToken: string) => "   />
+<MemberInfo kind="method" type={`(sessionToken: string) => `}   />
 
 
 ### get
 
-<MemberInfo kind="method" type="(sessionToken: string) => "   />
+<MemberInfo kind="method" type={`(sessionToken: string) => `}   />
 
 
 ### set
 
-<MemberInfo kind="method" type="(session: <a href='/reference/typescript-api/auth/session-cache-strategy#cachedsession'>CachedSession</a>) => "   />
+<MemberInfo kind="method" type={`(session: <a href='/reference/typescript-api/auth/session-cache-strategy#cachedsession'>CachedSession</a>) => `}   />
 
 
 

+ 11 - 4
docs/docs/reference/typescript-api/auth/password-hashing-strategy.md

@@ -1,7 +1,7 @@
 ---
 title: "PasswordHashingStrategy"
 weight: 10
-date: 2023-07-21T15:46:14.933Z
+date: 2023-07-26T18:59:54.250Z
 showtoc: true
 generated: true
 ---
@@ -13,10 +13,17 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## PasswordHashingStrategy
 
-<GenerationInfo sourceFile="packages/core/src/config/auth/password-hashing-strategy.ts" sourceLine="10" packageName="@vendure/core" since="1.3.0" />
+<GenerationInfo sourceFile="packages/core/src/config/auth/password-hashing-strategy.ts" sourceLine="17" packageName="@vendure/core" since="1.3.0" />
 
 Defines how user passwords get hashed when using the <a href='/reference/typescript-api/auth/native-authentication-strategy#nativeauthenticationstrategy'>NativeAuthenticationStrategy</a>.
 
+:::info
+
+This is configured via the `authOptions.passwordHashingStrategy` property of
+your VendureConfig.
+
+:::
+
 ```ts title="Signature"
 interface PasswordHashingStrategy extends InjectableStrategy {
   hash(plaintext: string): Promise<string>;
@@ -31,12 +38,12 @@ interface PasswordHashingStrategy extends InjectableStrategy {
 
 ### hash
 
-<MemberInfo kind="method" type="(plaintext: string) => Promise&#60;string&#62;"   />
+<MemberInfo kind="method" type={`(plaintext: string) => Promise&#60;string&#62;`}   />
 
 
 ### check
 
-<MemberInfo kind="method" type="(plaintext: string, hash: string) => Promise&#60;boolean&#62;"   />
+<MemberInfo kind="method" type={`(plaintext: string, hash: string) => Promise&#60;boolean&#62;`}   />
 
 
 

+ 10 - 3
docs/docs/reference/typescript-api/auth/password-validation-strategy.md

@@ -1,7 +1,7 @@
 ---
 title: "PasswordValidationStrategy"
 weight: 10
-date: 2023-07-21T15:46:14.940Z
+date: 2023-07-26T18:59:54.258Z
 showtoc: true
 generated: true
 ---
@@ -13,11 +13,18 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## PasswordValidationStrategy
 
-<GenerationInfo sourceFile="packages/core/src/config/auth/password-validation-strategy.ts" sourceLine="12" packageName="@vendure/core" since="1.5.0" />
+<GenerationInfo sourceFile="packages/core/src/config/auth/password-validation-strategy.ts" sourceLine="19" packageName="@vendure/core" since="1.5.0" />
 
 Defines validation to apply to new password (when creating an account or updating an existing account's
 password when using the <a href='/reference/typescript-api/auth/native-authentication-strategy#nativeauthenticationstrategy'>NativeAuthenticationStrategy</a>.
 
+:::info
+
+This is configured via the `authOptions.passwordValidationStrategy` property of
+your VendureConfig.
+
+:::
+
 ```ts title="Signature"
 interface PasswordValidationStrategy extends InjectableStrategy {
   validate(ctx: RequestContext, password: string): Promise<boolean | string> | boolean | string;
@@ -31,7 +38,7 @@ interface PasswordValidationStrategy extends InjectableStrategy {
 
 ### validate
 
-<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, password: string) => Promise&#60;boolean | string&#62; | boolean | string"  since="1.5.0"  />
+<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, password: string) => Promise&#60;boolean | string&#62; | boolean | string`}  since="1.5.0"  />
 
 Validates a password submitted during account registration or when a customer updates their password.
 The method should resolve to `true` if the password is acceptable. If not, it should return `false` or

+ 12 - 12
docs/docs/reference/typescript-api/auth/permission-definition.md

@@ -1,7 +1,7 @@
 ---
 title: "PermissionDefinition"
 weight: 10
-date: 2023-07-21T15:46:14.818Z
+date: 2023-07-26T18:59:54.044Z
 showtoc: true
 generated: true
 ---
@@ -60,12 +60,12 @@ class PermissionDefinition {
 
 ### constructor
 
-<MemberInfo kind="method" type="(config: <a href='/reference/typescript-api/auth/permission-definition#permissiondefinitionconfig'>PermissionDefinitionConfig</a>) => PermissionDefinition"   />
+<MemberInfo kind="method" type={`(config: <a href='/reference/typescript-api/auth/permission-definition#permissiondefinitionconfig'>PermissionDefinitionConfig</a>) => PermissionDefinition`}   />
 
 
 ### Permission
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/common/permission#permission'>Permission</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/common/permission#permission'>Permission</a>`}   />
 
 Returns the permission defined by this definition, for use in the
 <a href='/reference/typescript-api/request/allow-decorator#allow'>Allow</a> decorator.
@@ -124,30 +124,30 @@ class CrudPermissionDefinition extends PermissionDefinition {
 
 ### constructor
 
-<MemberInfo kind="method" type="(name: string, descriptionFn?: (operation: 'create' | 'read' | 'update' | 'delete') =&#62; string) => CrudPermissionDefinition"   />
+<MemberInfo kind="method" type={`(name: string, descriptionFn?: (operation: 'create' | 'read' | 'update' | 'delete') =&#62; string) => CrudPermissionDefinition`}   />
 
 
 ### Create
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/common/permission#permission'>Permission</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/common/permission#permission'>Permission</a>`}   />
 
 Returns the 'Create' CRUD permission defined by this definition, for use in the
 <a href='/reference/typescript-api/request/allow-decorator#allow'>Allow</a> decorator.
 ### Read
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/common/permission#permission'>Permission</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/common/permission#permission'>Permission</a>`}   />
 
 Returns the 'Read' CRUD permission defined by this definition, for use in the
 <a href='/reference/typescript-api/request/allow-decorator#allow'>Allow</a> decorator.
 ### Update
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/common/permission#permission'>Permission</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/common/permission#permission'>Permission</a>`}   />
 
 Returns the 'Update' CRUD permission defined by this definition, for use in the
 <a href='/reference/typescript-api/request/allow-decorator#allow'>Allow</a> decorator.
 ### Delete
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/common/permission#permission'>Permission</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/common/permission#permission'>Permission</a>`}   />
 
 Returns the 'Delete' CRUD permission defined by this definition, for use in the
 <a href='/reference/typescript-api/request/allow-decorator#allow'>Allow</a> decorator.
@@ -175,24 +175,24 @@ interface PermissionDefinitionConfig {
 
 ### name
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 The name of the permission. By convention this should be
 UpperCamelCased.
 ### description
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 A description of the permission.
 ### assignable
 
-<MemberInfo kind="property" type="boolean" default="true"   />
+<MemberInfo kind="property" type={`boolean`} default="true"   />
 
 Whether this permission can be assigned to a Role. In general this
 should be left as the default `true` except in special cases.
 ### internal
 
-<MemberInfo kind="property" type="boolean" default="false"   />
+<MemberInfo kind="property" type={`boolean`} default="false"   />
 
 Internal permissions are not exposed via the API and are reserved for
 special use-cases such at the `Owner` or `Public` permissions.

+ 25 - 18
docs/docs/reference/typescript-api/auth/session-cache-strategy.md

@@ -1,7 +1,7 @@
 ---
 title: "SessionCacheStrategy"
 weight: 10
-date: 2023-07-21T15:46:15.445Z
+date: 2023-07-26T18:59:55.103Z
 showtoc: true
 generated: true
 ---
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
 
 ## SessionCacheStrategy
 
-<GenerationInfo sourceFile="packages/core/src/config/session-cache/session-cache-strategy.ts" sourceLine="147" packageName="@vendure/core" />
+<GenerationInfo sourceFile="packages/core/src/config/session-cache/session-cache-strategy.ts" sourceLine="154" packageName="@vendure/core" />
 
 This strategy defines how sessions get cached. Since most requests will need the Session
 object for permissions data, it can become a bottleneck to go to the database and do a multi-join
@@ -25,6 +25,13 @@ single-instance deployments. However, for multi-instance deployments (horizontal
 you will need to define a custom strategy that stores the session cache in a shared data store, such as in the
 DB or in Redis.
 
+:::info
+
+This is configured via the `authOptions.sessionCacheStrategy` property of
+your VendureConfig.
+
+:::
+
 Here's an example implementation using Redis. To use this, you need to add the
 [ioredis package](https://www.npmjs.com/package/ioredis) as a dependency.
 
@@ -127,24 +134,24 @@ interface SessionCacheStrategy extends InjectableStrategy {
 
 ### set
 
-<MemberInfo kind="method" type="(session: <a href='/reference/typescript-api/auth/session-cache-strategy#cachedsession'>CachedSession</a>) => void | Promise&#60;void&#62;"   />
+<MemberInfo kind="method" type={`(session: <a href='/reference/typescript-api/auth/session-cache-strategy#cachedsession'>CachedSession</a>) => void | Promise&#60;void&#62;`}   />
 
 Store the session in the cache. When caching a session, the data
 should not be modified apart from performing any transforms needed to
 get it into a state to be stored, e.g. JSON.stringify().
 ### get
 
-<MemberInfo kind="method" type="(sessionToken: string) => <a href='/reference/typescript-api/auth/session-cache-strategy#cachedsession'>CachedSession</a> | undefined | Promise&#60;<a href='/reference/typescript-api/auth/session-cache-strategy#cachedsession'>CachedSession</a> | undefined&#62;"   />
+<MemberInfo kind="method" type={`(sessionToken: string) => <a href='/reference/typescript-api/auth/session-cache-strategy#cachedsession'>CachedSession</a> | undefined | Promise&#60;<a href='/reference/typescript-api/auth/session-cache-strategy#cachedsession'>CachedSession</a> | undefined&#62;`}   />
 
 Retrieve the session from the cache
 ### delete
 
-<MemberInfo kind="method" type="(sessionToken: string) => void | Promise&#60;void&#62;"   />
+<MemberInfo kind="method" type={`(sessionToken: string) => void | Promise&#60;void&#62;`}   />
 
 Delete a session from the cache
 ### clear
 
-<MemberInfo kind="method" type="() => void | Promise&#60;void&#62;"   />
+<MemberInfo kind="method" type={`() => void | Promise&#60;void&#62;`}   />
 
 Clear the entire cache
 
@@ -172,22 +179,22 @@ type CachedSessionUser = {
 
 ### id
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/common/id#id'>ID</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/common/id#id'>ID</a>`}   />
 
 
 ### identifier
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### verified
 
-<MemberInfo kind="property" type="boolean"   />
+<MemberInfo kind="property" type={`boolean`}   />
 
 
 ### channelPermissions
 
-<MemberInfo kind="property" type="UserChannelPermissions[]"   />
+<MemberInfo kind="property" type={`UserChannelPermissions[]`}   />
 
 
 
@@ -219,44 +226,44 @@ type CachedSession = {
 
 ### cacheExpiry
 
-<MemberInfo kind="property" type="number"   />
+<MemberInfo kind="property" type={`number`}   />
 
 The timestamp after which this cache entry is considered stale and
 a fresh copy of the data will be set. Based on the `sessionCacheTTL`
 option.
 ### id
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/common/id#id'>ID</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/common/id#id'>ID</a>`}   />
 
 
 ### token
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### expires
 
-<MemberInfo kind="property" type="Date"   />
+<MemberInfo kind="property" type={`Date`}   />
 
 
 ### activeOrderId
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/common/id#id'>ID</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/common/id#id'>ID</a>`}   />
 
 
 ### authenticationStrategy
 
-<MemberInfo kind="property" type="string"   />
+<MemberInfo kind="property" type={`string`}   />
 
 
 ### user
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/auth/session-cache-strategy#cachedsessionuser'>CachedSessionUser</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/auth/session-cache-strategy#cachedsessionuser'>CachedSessionUser</a>`}   />
 
 
 ### activeChannelId
 
-<MemberInfo kind="property" type="<a href='/reference/typescript-api/common/id#id'>ID</a>"   />
+<MemberInfo kind="property" type={`<a href='/reference/typescript-api/common/id#id'>ID</a>`}   />
 
 
 

+ 3 - 3
docs/docs/reference/typescript-api/auth/superadmin-credentials.md

@@ -1,7 +1,7 @@
 ---
 title: "SuperadminCredentials"
 weight: 10
-date: 2023-07-21T15:46:15.639Z
+date: 2023-07-26T18:59:55.412Z
 showtoc: true
 generated: true
 ---
@@ -29,12 +29,12 @@ interface SuperadminCredentials {
 
 ### identifier
 
-<MemberInfo kind="property" type="string" default="'superadmin'"   />
+<MemberInfo kind="property" type={`string`} default="'superadmin'"   />
 
 The identifier to be used to create a superadmin account
 ### password
 
-<MemberInfo kind="property" type="string" default="'superadmin'"   />
+<MemberInfo kind="property" type={`string`} default="'superadmin'"   />
 
 The password to be used to create a superadmin account
 

+ 3 - 3
docs/docs/reference/typescript-api/common/async-queue.md

@@ -1,7 +1,7 @@
 ---
 title: "AsyncQueue"
 weight: 10
-date: 2023-07-21T15:46:14.734Z
+date: 2023-07-26T18:59:53.917Z
 showtoc: true
 generated: true
 ---
@@ -29,12 +29,12 @@ class AsyncQueue {
 
 ### constructor
 
-<MemberInfo kind="method" type="(label: string = 'default', concurrency: number = 1) => AsyncQueue"   />
+<MemberInfo kind="method" type={`(label: string = 'default', concurrency: number = 1) => AsyncQueue`}   />
 
 
 ### push
 
-<MemberInfo kind="method" type="(task: Task&#60;T&#62;) => Promise&#60;T&#62;"   />
+<MemberInfo kind="method" type={`(task: Task&#60;T&#62;) => Promise&#60;T&#62;`}   />
 
 Pushes a new task onto the queue, upon which the task will either execute immediately or
 (if the number of running tasks is equal to the concurrency limit) enqueue the task to

+ 2 - 2
docs/docs/reference/typescript-api/common/bootstrap.md

@@ -1,7 +1,7 @@
 ---
 title: "Bootstrap"
 weight: 10
-date: 2023-07-21T15:46:14.722Z
+date: 2023-07-26T18:59:53.897Z
 showtoc: true
 generated: true
 ---
@@ -35,5 +35,5 @@ Parameters
 
 ### userConfig
 
-<MemberInfo kind="parameter" type="Partial&#60;<a href='/reference/typescript-api/configuration/vendure-config#vendureconfig'>VendureConfig</a>&#62;" />
+<MemberInfo kind="parameter" type={`Partial&#60;<a href='/reference/typescript-api/configuration/vendure-config#vendureconfig'>VendureConfig</a>&#62;`} />
 

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно