Pārlūkot izejas kodu

docs: More fixes

Michael Bromley 2 gadi atpakaļ
vecāks
revīzija
9dd7ef6f3a
52 mainītis faili ar 2546 papildinājumiem un 0 dzēšanām
  1. 14 0
      docs/docs/reference/admin-ui-api/directives/index.md
  2. 14 0
      docs/docs/reference/admin-ui-api/list-detail-views/index.md
  3. 14 0
      docs/docs/reference/admin-ui-api/nav-menu/index.md
  4. 14 0
      docs/docs/reference/admin-ui-api/pipes/index.md
  5. 14 0
      docs/docs/reference/admin-ui-api/providers/index.md
  6. 14 0
      docs/docs/reference/admin-ui-api/tabs/index.md
  7. 14 0
      docs/docs/reference/admin-ui-api/ui-devkit/index.md
  8. 14 0
      docs/docs/reference/typescript-api/assets/index.md
  9. 14 0
      docs/docs/reference/typescript-api/auth/index.md
  10. 14 0
      docs/docs/reference/typescript-api/common/index.md
  11. 155 0
      docs/docs/reference/typescript-api/configurable-operation-def/index.md
  12. 14 0
      docs/docs/reference/typescript-api/configuration/index.md
  13. 94 0
      docs/docs/reference/typescript-api/core-plugins/admin-ui-plugin/index.md
  14. 158 0
      docs/docs/reference/typescript-api/core-plugins/asset-server-plugin/index.md
  15. 70 0
      docs/docs/reference/typescript-api/core-plugins/default-search-plugin/index.md
  16. 197 0
      docs/docs/reference/typescript-api/core-plugins/elasticsearch-plugin/index.md
  17. 283 0
      docs/docs/reference/typescript-api/core-plugins/email-plugin/index.md
  18. 175 0
      docs/docs/reference/typescript-api/core-plugins/harden-plugin/index.md
  19. 14 0
      docs/docs/reference/typescript-api/core-plugins/index.md
  20. 14 0
      docs/docs/reference/typescript-api/core-plugins/job-queue-plugin/index.md
  21. 14 0
      docs/docs/reference/typescript-api/core-plugins/payments-plugin/index.md
  22. 273 0
      docs/docs/reference/typescript-api/custom-fields/index.md
  23. 14 0
      docs/docs/reference/typescript-api/data-access/index.md
  24. 14 0
      docs/docs/reference/typescript-api/entities/index.md
  25. 14 0
      docs/docs/reference/typescript-api/errors/index.md
  26. 14 0
      docs/docs/reference/typescript-api/events/index.md
  27. 14 0
      docs/docs/reference/typescript-api/fulfillment/index.md
  28. 14 0
      docs/docs/reference/typescript-api/health-check/index.md
  29. 14 0
      docs/docs/reference/typescript-api/import-export/index.md
  30. 90 0
      docs/docs/reference/typescript-api/job-queue/index.md
  31. 126 0
      docs/docs/reference/typescript-api/logger/index.md
  32. 14 0
      docs/docs/reference/typescript-api/migration/index.md
  33. 29 0
      docs/docs/reference/typescript-api/money/index.md
  34. 14 0
      docs/docs/reference/typescript-api/orders/index.md
  35. 14 0
      docs/docs/reference/typescript-api/payment/index.md
  36. 14 0
      docs/docs/reference/typescript-api/plugin/index.md
  37. 14 0
      docs/docs/reference/typescript-api/products-stock/index.md
  38. 14 0
      docs/docs/reference/typescript-api/promotions/index.md
  39. 14 0
      docs/docs/reference/typescript-api/request/index.md
  40. 14 0
      docs/docs/reference/typescript-api/service-helpers/index.md
  41. 14 0
      docs/docs/reference/typescript-api/services/index.md
  42. 179 0
      docs/docs/reference/typescript-api/services/product-variant-service.md
  43. 14 0
      docs/docs/reference/typescript-api/shipping/index.md
  44. 14 0
      docs/docs/reference/typescript-api/state-machine/index.md
  45. 14 0
      docs/docs/reference/typescript-api/tax/index.md
  46. 14 0
      docs/docs/reference/typescript-api/testing/index.md
  47. 66 0
      docs/docs/reference/typescript-api/testing/test-server.md
  48. 14 0
      docs/docs/reference/typescript-api/worker/index.md
  49. 49 0
      docs/scraper/config.json
  50. 31 0
      docs/src/components/GenerationInfo/styles.module.css
  51. 70 0
      docs/src/components/HomepageFeatures/index.tsx
  52. 11 0
      docs/src/components/HomepageFeatures/styles.module.css

+ 14 - 0
docs/docs/reference/admin-ui-api/directives/index.md

@@ -0,0 +1,14 @@
+---
+title: "Directives"
+weight: 10
+date: 2023-07-21T15:46:19.478Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# directives

+ 14 - 0
docs/docs/reference/admin-ui-api/list-detail-views/index.md

@@ -0,0 +1,14 @@
+---
+title: "List Detail Views"
+weight: 10
+date: 2023-07-21T15:46:18.950Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# list-detail-views

+ 14 - 0
docs/docs/reference/admin-ui-api/nav-menu/index.md

@@ -0,0 +1,14 @@
+---
+title: "Nav Menu"
+weight: 10
+date: 2023-07-21T15:46:19.118Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# nav-menu

+ 14 - 0
docs/docs/reference/admin-ui-api/pipes/index.md

@@ -0,0 +1,14 @@
+---
+title: "Pipes"
+weight: 10
+date: 2023-07-21T15:46:19.571Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# pipes

+ 14 - 0
docs/docs/reference/admin-ui-api/providers/index.md

@@ -0,0 +1,14 @@
+---
+title: "Providers"
+weight: 10
+date: 2023-07-21T15:46:19.042Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# providers

+ 14 - 0
docs/docs/reference/admin-ui-api/tabs/index.md

@@ -0,0 +1,14 @@
+---
+title: "Tabs"
+weight: 10
+date: 2023-07-21T15:46:19.201Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# tabs

+ 14 - 0
docs/docs/reference/admin-ui-api/ui-devkit/index.md

@@ -0,0 +1,14 @@
+---
+title: "Ui Devkit"
+weight: 10
+date: 2023-07-21T15:46:19.614Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# ui-devkit

+ 14 - 0
docs/docs/reference/typescript-api/assets/index.md

@@ -0,0 +1,14 @@
+---
+title: "Assets"
+weight: 10
+date: 2023-07-21T15:46:14.876Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# assets

+ 14 - 0
docs/docs/reference/typescript-api/auth/index.md

@@ -0,0 +1,14 @@
+---
+title: "Auth"
+weight: 10
+date: 2023-07-21T15:46:14.834Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# auth

+ 14 - 0
docs/docs/reference/typescript-api/common/index.md

@@ -0,0 +1,14 @@
+---
+title: "Common"
+weight: 10
+date: 2023-07-21T15:46:14.725Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# common

+ 155 - 0
docs/docs/reference/typescript-api/configurable-operation-def/index.md

@@ -0,0 +1,155 @@
+---
+title: "ConfigurableOperationDef"
+weight: 10
+date: 2023-07-21T15:46:14.754Z
+showtoc: true
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+## ConfigurableOperationDef
+
+<GenerationInfo sourceFile="packages/core/src/common/configurable-operation.ts" sourceLine="335" packageName="@vendure/core" />
+
+A ConfigurableOperationDef is a special type of object used extensively by Vendure to define
+code blocks which have arguments which are configurable at run-time by the administrator.
+
+This is the mechanism used by:
+
+* <a href='/reference/typescript-api/configuration/collection-filter#collectionfilter'>CollectionFilter</a>
+* <a href='/reference/typescript-api/payment/payment-method-handler#paymentmethodhandler'>PaymentMethodHandler</a>
+* <a href='/reference/typescript-api/promotions/promotion-action#promotionaction'>PromotionAction</a>
+* <a href='/reference/typescript-api/promotions/promotion-condition#promotioncondition'>PromotionCondition</a>
+* <a href='/reference/typescript-api/shipping/shipping-calculator#shippingcalculator'>ShippingCalculator</a>
+* <a href='/reference/typescript-api/shipping/shipping-eligibility-checker#shippingeligibilitychecker'>ShippingEligibilityChecker</a>
+
+Any class which extends ConfigurableOperationDef works in the same way: it takes a
+config object as the constructor argument. That config object extends the <a href='/reference/typescript-api/configurable-operation-def/configurable-operation-def-options#configurableoperationdefoptions'>ConfigurableOperationDefOptions</a>
+interface and typically adds some kind of business logic function to it.
+
+For example, in the case of `ShippingEligibilityChecker`,
+it adds the `check()` function to the config object which defines the logic for checking whether an Order is eligible
+for a particular ShippingMethod.
+
+## The `args` property
+
+The key feature of the ConfigurableOperationDef is the `args` property. This is where we define those
+arguments that are exposed via the Admin UI as data input components. This allows their values to
+be set at run-time by the Administrator. Those values can then be accessed in the business logic
+of the operation.
+
+The data type of the args can be one of <a href='/reference/typescript-api/configurable-operation-def/config-arg-type#configargtype'>ConfigArgType</a>, and the configuration is further explained in
+the docs of <a href='/reference/typescript-api/configurable-operation-def/config-args#configargs'>ConfigArgs</a>.
+
+## Dependency Injection
+If your business logic relies on injectable providers, such as the `TransactionalConnection` object, or any of the
+internal Vendure services or those defined in a plugin, you can inject them by using the config object's
+`init()` method, which exposes the <a href='/reference/typescript-api/common/injector#injector'>Injector</a>.
+
+Here's an example of a ShippingCalculator that injects a service which has been defined in a plugin:
+
+*Example*
+
+```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,
+    };
+  },
+});
+```
+
+```ts title="Signature"
+class ConfigurableOperationDef<T extends ConfigArgs = ConfigArgs> {
+  code: string
+  args: T
+  description: LocalizedStringArray
+  constructor(options: ConfigurableOperationDefOptions<T>)
+  async init(injector: Injector) => ;
+  async destroy() => ;
+  toGraphQlType(ctx: RequestContext) => ConfigurableOperationDefinition;
+  protected argsArrayToHash(args: ConfigArg[]) => ConfigArgValues<T>;
+}
+```
+
+<div className="members-wrapper">
+
+### code
+
+<MemberInfo kind="property" type="string"   />
+
+
+### args
+
+<MemberInfo kind="property" type="T"   />
+
+
+### description
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/configurable-operation-def/localized-string-array#localizedstringarray'>LocalizedStringArray</a>"   />
+
+
+### constructor
+
+<MemberInfo kind="method" type="(options: <a href='/reference/typescript-api/configurable-operation-def/configurable-operation-def-options#configurableoperationdefoptions'>ConfigurableOperationDefOptions</a>&#60;T&#62;) => ConfigurableOperationDef"   />
+
+
+### init
+
+<MemberInfo kind="method" type="(injector: <a href='/reference/typescript-api/common/injector#injector'>Injector</a>) => "   />
+
+
+### destroy
+
+<MemberInfo kind="method" type="() => "   />
+
+
+### toGraphQlType
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>) => ConfigurableOperationDefinition"   />
+
+Convert a ConfigurableOperationDef into a ConfigurableOperationDefinition object, typically
+so that it can be sent via the API.
+### argsArrayToHash
+
+<MemberInfo kind="method" type="(args: ConfigArg[]) => ConfigArgValues&#60;T&#62;"   />
+
+Coverts an array of ConfigArgs into a hash object:
+
+from:
+`[{ name: 'foo', type: 'string', value: 'bar'}]`
+
+to:
+`{ foo: 'bar' }`
+
+
+</div>

+ 14 - 0
docs/docs/reference/typescript-api/configuration/index.md

@@ -0,0 +1,14 @@
+---
+title: "Configuration"
+weight: 10
+date: 2023-07-21T15:46:14.951Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# configuration

+ 94 - 0
docs/docs/reference/typescript-api/core-plugins/admin-ui-plugin/index.md

@@ -0,0 +1,94 @@
+---
+title: "AdminUiPlugin"
+weight: 10
+date: 2023-07-21T15:46:17.913Z
+showtoc: true
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+## AdminUiPlugin
+
+<GenerationInfo sourceFile="packages/admin-ui-plugin/src/plugin.ts" sourceLine="125" packageName="@vendure/admin-ui-plugin" />
+
+This plugin starts a static server for the Admin UI app, and proxies it via the `/admin/` path of the main Vendure server.
+
+The Admin UI allows you to administer all aspects of your store, from inventory management to order tracking. It is the tool used by
+store administrators on a day-to-day basis for the management of the store.
+
+## Installation
+
+`yarn add @vendure/admin-ui-plugin`
+
+or
+
+`npm install @vendure/admin-ui-plugin`
+
+*Example*
+
+```ts
+import { AdminUiPlugin } from '@vendure/admin-ui-plugin';
+
+const config: VendureConfig = {
+  // Add an instance of the plugin to the plugins array
+  plugins: [
+    AdminUiPlugin.init({ port: 3002 }),
+  ],
+};
+```
+
+## Metrics
+
+This plugin also defines a `metricSummary` query which is used by the Admin UI to display the order metrics on the dashboard.
+
+If you are building a stand-alone version of the Admin UI app, and therefore don't need this plugin to server the Admin UI,
+you can still use the `metricSummary` query by adding the `AdminUiPlugin` to the `plugins` array, but without calling the `init()` method:
+
+*Example*
+
+```ts
+import { AdminUiPlugin } from '@vendure/admin-ui-plugin';
+
+const config: VendureConfig = {
+  plugins: [
+    AdminUiPlugin, // <-- no call to .init()
+  ],
+  // ...
+};
+```
+
+```ts title="Signature"
+class AdminUiPlugin implements NestModule {
+  constructor(configService: ConfigService, processContext: ProcessContext)
+  static init(options: AdminUiPluginOptions) => Type<AdminUiPlugin>;
+  async configure(consumer: MiddlewareConsumer) => ;
+}
+```
+* Implements: <code>NestModule</code>
+
+
+
+<div className="members-wrapper">
+
+### constructor
+
+<MemberInfo kind="method" type="(configService: ConfigService, processContext: <a href='/reference/typescript-api/common/process-context#processcontext'>ProcessContext</a>) => AdminUiPlugin"   />
+
+
+### init
+
+<MemberInfo kind="method" type="(options: <a href='/reference/typescript-api/core-plugins/admin-ui-plugin/admin-ui-plugin-options#adminuipluginoptions'>AdminUiPluginOptions</a>) => Type&#60;<a href='/reference/typescript-api/core-plugins/admin-ui-plugin/#adminuiplugin'>AdminUiPlugin</a>&#62;"   />
+
+Set the plugin options
+### configure
+
+<MemberInfo kind="method" type="(consumer: MiddlewareConsumer) => "   />
+
+
+
+
+</div>

+ 158 - 0
docs/docs/reference/typescript-api/core-plugins/asset-server-plugin/index.md

@@ -0,0 +1,158 @@
+---
+title: "AssetServerPlugin"
+weight: 10
+date: 2023-07-21T15:46:17.951Z
+showtoc: true
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+## AssetServerPlugin
+
+<GenerationInfo sourceFile="packages/asset-server-plugin/src/plugin.ts" sourceLine="139" packageName="@vendure/asset-server-plugin" />
+
+The `AssetServerPlugin` serves assets (images and other files) from the local file system, and can also be configured to use
+other storage strategies (e.g. <a href='/reference/typescript-api/core-plugins/asset-server-plugin/s3asset-storage-strategy#s3assetstoragestrategy'>S3AssetStorageStrategy</a>. It can also perform on-the-fly image transformations
+and caches the results for subsequent calls.
+
+## Installation
+
+`yarn add @vendure/asset-server-plugin`
+
+or
+
+`npm install @vendure/asset-server-plugin`
+
+*Example*
+
+```ts
+import { AssetServerPlugin } from '@vendure/asset-server-plugin';
+
+const config: VendureConfig = {
+  // Add an instance of the plugin to the plugins array
+  plugins: [
+    AssetServerPlugin.init({
+      route: 'assets',
+      assetUploadDir: path.join(__dirname, 'assets'),
+    }),
+  ],
+};
+```
+
+The full configuration is documented at [AssetServerOptions]({{< relref "asset-server-options" >}})
+
+## Image transformation
+
+Asset preview images can be transformed (resized & cropped) on the fly by appending query parameters to the url:
+
+`http://localhost:3000/assets/some-asset.jpg?w=500&h=300&mode=resize`
+
+The above URL will return `some-asset.jpg`, resized to fit in the bounds of a 500px x 300px rectangle.
+
+### Preview mode
+
+The `mode` parameter can be either `crop` or `resize`. See the [ImageTransformMode]({{< relref "image-transform-mode" >}}) docs for details.
+
+### Focal point
+
+When cropping an image (`mode=crop`), Vendure will attempt to keep the most "interesting" area of the image in the cropped frame. It does this
+by finding the area of the image with highest entropy (the busiest area of the image). However, sometimes this does not yield a satisfactory
+result - part or all of the main subject may still be cropped out.
+
+This is where specifying the focal point can help. The focal point of the image may be specified by passing the `fpx` and `fpy` query parameters.
+These are normalized coordinates (i.e. a number between 0 and 1), so the `fpx=0&fpy=0` corresponds to the top left of the image.
+
+For example, let's say there is a very wide landscape image which we want to crop to be square. The main subject is a house to the far left of the
+image. The following query would crop it to a square with the house centered:
+
+`http://localhost:3000/assets/landscape.jpg?w=150&h=150&mode=crop&fpx=0.2&fpy=0.7`
+
+### Format
+
+Since v1.7.0, the image format can be specified by adding the `format` query parameter:
+
+`http://localhost:3000/assets/some-asset.jpg?format=webp`
+
+This means that, no matter the format of your original asset files, you can use more modern formats in your storefront if the browser
+supports them. Supported values for `format` are:
+
+* `jpeg` or `jpg`
+* `png`
+* `webp`
+* `avif`
+
+The `format` parameter can also be combined with presets (see below).
+
+### Transform presets
+
+Presets can be defined which allow a single preset name to be used instead of specifying the width, height and mode. Presets are
+configured via the AssetServerOptions [presets property]({{< relref "asset-server-options" >}}#presets).
+
+For example, defining the following preset:
+
+```ts
+AssetServerPlugin.init({
+  // ...
+  presets: [
+    { name: 'my-preset', width: 85, height: 85, mode: 'crop' },
+  ],
+}),
+```
+
+means that a request to:
+
+`http://localhost:3000/assets/some-asset.jpg?preset=my-preset`
+
+is equivalent to:
+
+`http://localhost:3000/assets/some-asset.jpg?w=85&h=85&mode=crop`
+
+The AssetServerPlugin comes pre-configured with the following presets:
+
+name | width | height | mode
+-----|-------|--------|-----
+tiny | 50px | 50px | crop
+thumb | 150px | 150px | crop
+small | 300px | 300px | resize
+medium | 500px | 500px | resize
+large | 800px | 800px | resize
+
+### Caching
+By default, the AssetServerPlugin will cache every transformed image, so that the transformation only needs to be performed a single time for
+a given configuration. Caching can be disabled per-request by setting the `?cache=false` query parameter.
+
+```ts title="Signature"
+class AssetServerPlugin implements NestModule, OnApplicationBootstrap {
+  static init(options: AssetServerOptions) => Type<AssetServerPlugin>;
+  constructor(processContext: ProcessContext)
+  configure(consumer: MiddlewareConsumer) => ;
+}
+```
+* Implements: <code>NestModule</code>, <code>OnApplicationBootstrap</code>
+
+
+
+<div className="members-wrapper">
+
+### init
+
+<MemberInfo kind="method" type="(options: <a href='/reference/typescript-api/core-plugins/asset-server-plugin/asset-server-options#assetserveroptions'>AssetServerOptions</a>) => Type&#60;<a href='/reference/typescript-api/core-plugins/asset-server-plugin/#assetserverplugin'>AssetServerPlugin</a>&#62;"   />
+
+Set the plugin options.
+### constructor
+
+<MemberInfo kind="method" type="(processContext: <a href='/reference/typescript-api/common/process-context#processcontext'>ProcessContext</a>) => AssetServerPlugin"   />
+
+
+### configure
+
+<MemberInfo kind="method" type="(consumer: MiddlewareConsumer) => "   />
+
+
+
+
+</div>

+ 70 - 0
docs/docs/reference/typescript-api/core-plugins/default-search-plugin/index.md

@@ -0,0 +1,70 @@
+---
+title: "DefaultSearchPlugin"
+weight: 10
+date: 2023-07-21T15:46:16.776Z
+showtoc: true
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+## DefaultSearchPlugin
+
+<GenerationInfo sourceFile="packages/core/src/plugin/default-search-plugin/default-search-plugin.ts" sourceLine="69" packageName="@vendure/core" />
+
+The DefaultSearchPlugin provides a full-text Product search based on the full-text searching capabilities of the
+underlying database.
+
+The DefaultSearchPlugin is bundled with the `@vendure/core` package. If you are not using an alternative search
+plugin, then make sure this one is used, otherwise you will not be able to search products via the
+[`search` query](/reference/graphql-api/shop/queries#search).
+
+{{% alert "warning" %}}
+Note that the quality of the fulltext search capabilities varies depending on the underlying database being used. For example,
+the MySQL & Postgres implementations will typically yield better results than the SQLite implementation.
+{{% /alert %}}
+
+*Example*
+
+```ts
+import { DefaultSearchPlugin, VendureConfig } from '@vendure/core';
+
+export const config: VendureConfig = {
+  // Add an instance of the plugin to the plugins array
+  plugins: [
+    DefaultSearchPlugin.init({
+      indexStockStatus: true,
+      bufferUpdates: true,
+    }),
+  ],
+};
+```
+
+```ts title="Signature"
+class DefaultSearchPlugin implements OnApplicationBootstrap, OnApplicationShutdown {
+  static static options: DefaultSearchPluginInitOptions = {};
+  static init(options: DefaultSearchPluginInitOptions) => Type<DefaultSearchPlugin>;
+}
+```
+* Implements: <code>OnApplicationBootstrap</code>, <code>OnApplicationShutdown</code>
+
+
+
+<div className="members-wrapper">
+
+### options
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/core-plugins/default-search-plugin/default-search-plugin-init-options#defaultsearchplugininitoptions'>DefaultSearchPluginInitOptions</a>"   />
+
+
+### init
+
+<MemberInfo kind="method" type="(options: <a href='/reference/typescript-api/core-plugins/default-search-plugin/default-search-plugin-init-options#defaultsearchplugininitoptions'>DefaultSearchPluginInitOptions</a>) => Type&#60;<a href='/reference/typescript-api/core-plugins/default-search-plugin/#defaultsearchplugin'>DefaultSearchPlugin</a>&#62;"   />
+
+
+
+
+</div>

+ 197 - 0
docs/docs/reference/typescript-api/core-plugins/elasticsearch-plugin/index.md

@@ -0,0 +1,197 @@
+---
+title: "ElasticsearchPlugin"
+weight: 10
+date: 2023-07-21T15:46:18.184Z
+showtoc: true
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+## ElasticsearchPlugin
+
+<GenerationInfo sourceFile="packages/elasticsearch-plugin/src/plugin.ts" sourceLine="222" packageName="@vendure/elasticsearch-plugin" />
+
+This plugin allows your product search to be powered by [Elasticsearch](https://github.com/elastic/elasticsearch) - a powerful Open Source search
+engine. This is a drop-in replacement for the DefaultSearchPlugin which exposes many powerful configuration options enabling your storefront
+to support a wide range of use-cases such as indexing of custom properties, fine control over search index configuration, and to leverage
+advanced Elasticsearch features like spacial search.
+
+## Installation
+
+**Requires Elasticsearch v7.0 < required Elasticsearch version < 7.10 **
+Elasticsearch version 7.10.2 will throw error due to incompatibility with elasticsearch-js client.
+[Check here for more info](https://github.com/elastic/elasticsearch-js/issues/1519)
+`yarn add @elastic/elasticsearch @vendure/elasticsearch-plugin`
+
+or
+
+`npm install @elastic/elasticsearch @vendure/elasticsearch-plugin`
+
+Make sure to remove the `DefaultSearchPlugin` if it is still in the VendureConfig plugins array.
+
+Then add the `ElasticsearchPlugin`, calling the `.init()` method with <a href='/reference/typescript-api/core-plugins/elasticsearch-plugin/elasticsearch-options#elasticsearchoptions'>ElasticsearchOptions</a>:
+
+*Example*
+
+```ts
+import { ElasticsearchPlugin } from '@vendure/elasticsearch-plugin';
+
+const config: VendureConfig = {
+  // Add an instance of the plugin to the plugins array
+  plugins: [
+    ElasticsearchPlugin.init({
+      host: 'http://localhost',
+      port: 9200,
+    }),
+  ],
+};
+```
+
+## Search API Extensions
+This plugin extends the default search query of the Shop API, allowing richer querying of your product data.
+
+The [SearchResponse](/reference/graphql-api/admin/object-types/#searchresponse) type is extended with information
+about price ranges in the result set:
+```SDL
+extend type SearchResponse {
+    prices: SearchResponsePriceData!
+}
+
+type SearchResponsePriceData {
+    range: PriceRange!
+    rangeWithTax: PriceRange!
+    buckets: [PriceRangeBucket!]!
+    bucketsWithTax: [PriceRangeBucket!]!
+}
+
+type PriceRangeBucket {
+    to: Int!
+    count: Int!
+}
+
+extend input SearchInput {
+    priceRange: PriceRangeInput
+    priceRangeWithTax: PriceRangeInput
+}
+
+input PriceRangeInput {
+    min: Int!
+    max: Int!
+}
+```
+
+This `SearchResponsePriceData` type allows you to query data about the range of prices in the result set.
+
+## Example Request & Response
+
+```SDL
+{
+  search (input: {
+    term: "table easel"
+    groupByProduct: true
+    priceRange: {
+      min: 500
+      max: 7000
+    }
+  }) {
+    totalItems
+    prices {
+      range {
+        min
+        max
+      }
+      buckets {
+        to
+        count
+      }
+    }
+    items {
+      productName
+      score
+      price {
+        ...on PriceRange {
+          min
+          max
+        }
+      }
+    }
+  }
+}
+```
+
+```JSON
+{
+ "data": {
+   "search": {
+     "totalItems": 9,
+     "prices": {
+       "range": {
+         "min": 999,
+         "max": 6396,
+       },
+       "buckets": [
+         {
+           "to": 1000,
+           "count": 1
+         },
+         {
+           "to": 2000,
+           "count": 2
+         },
+         {
+           "to": 3000,
+           "count": 3
+         },
+         {
+           "to": 4000,
+           "count": 1
+         },
+         {
+           "to": 5000,
+           "count": 1
+         },
+         {
+           "to": 7000,
+           "count": 1
+         }
+       ]
+     },
+     "items": [
+       {
+         "productName": "Loxley Yorkshire Table Easel",
+         "score": 30.58831,
+         "price": {
+           "min": 4984,
+           "max": 4984
+         }
+       },
+       // ... truncated
+     ]
+   }
+ }
+}
+```
+
+```ts title="Signature"
+class ElasticsearchPlugin implements OnApplicationBootstrap {
+  static init(options: ElasticsearchOptions) => Type<ElasticsearchPlugin>;
+}
+```
+* Implements: <code>OnApplicationBootstrap</code>
+
+
+
+<div className="members-wrapper">
+
+### init
+
+<MemberInfo kind="method" type="(options: <a href='/reference/typescript-api/core-plugins/elasticsearch-plugin/elasticsearch-options#elasticsearchoptions'>ElasticsearchOptions</a>) => Type&#60;<a href='/reference/typescript-api/core-plugins/elasticsearch-plugin/#elasticsearchplugin'>ElasticsearchPlugin</a>&#62;"   />
+
+
+
+
+</div>

+ 283 - 0
docs/docs/reference/typescript-api/core-plugins/email-plugin/index.md

@@ -0,0 +1,283 @@
+---
+title: "EmailPlugin"
+weight: 10
+date: 2023-07-21T15:46:18.079Z
+showtoc: true
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+## EmailPlugin
+
+<GenerationInfo sourceFile="packages/email-plugin/src/plugin.ts" sourceLine="277" packageName="@vendure/email-plugin" />
+
+The EmailPlugin creates and sends transactional emails based on Vendure events. By default, it uses an [MJML](https://mjml.io/)-based
+email generator to generate the email body and [Nodemailer](https://nodemailer.com/about/) to send the emails.
+
+## High-level description
+Vendure has an internal events system (see <a href='/reference/typescript-api/events/event-bus#eventbus'>EventBus</a>) that allows plugins to subscribe to events. The EmailPlugin is configured with
+<a href='/reference/typescript-api/core-plugins/email-plugin/email-event-handler#emaileventhandler'>EmailEventHandler</a>s that listen for a specific event and when it is published, the handler defines which template to use to generate
+the resulting email.
+
+The plugin comes with a set of default handlers for the following events:
+- Order confirmation
+- New customer email address verification
+- Password reset request
+- Email address change request
+
+You can also create your own handlers and register them with the plugin - see the <a href='/reference/typescript-api/core-plugins/email-plugin/email-event-handler#emaileventhandler'>EmailEventHandler</a> docs for more details.
+
+## Installation
+
+`yarn add @vendure/email-plugin`
+
+or
+
+`npm install @vendure/email-plugin`
+
+*Example*
+
+```ts
+import { defaultEmailHandlers, EmailPlugin } from '@vendure/email-plugin';
+
+const config: VendureConfig = {
+  // Add an instance of the plugin to the plugins array
+  plugins: [
+    EmailPlugin.init({
+      handlers: defaultEmailHandlers,
+      templatePath: path.join(__dirname, 'static/email/templates'),
+      transport: {
+        type: 'smtp',
+        host: 'smtp.example.com',
+        port: 587,
+        auth: {
+          user: 'username',
+          pass: 'password',
+        }
+      },
+    }),
+  ],
+};
+```
+
+## Email templates
+
+In the example above, the plugin has been configured to look in `<app-root>/static/email/templates`
+for the email template files. If you used `@vendure/create` to create your application, the templates will have
+been copied to that location during setup.
+
+If you are installing the EmailPlugin separately, then you'll need to copy the templates manually from
+`node_modules/@vendure/email-plugin/templates` to a location of your choice, and then point the `templatePath` config
+property at that directory.
+
+* ### Dynamic Email Templates
+Instead of passing a static value to `templatePath`, use `templateLoader` to define a template path.
+```ts
+  EmailPlugin.init({
+   ...,
+   templateLoader: new FileBasedTemplateLoader(my/order-confirmation/templates)
+  })
+```
+## Customizing templates
+
+Emails are generated from templates which use [MJML](https://mjml.io/) syntax. MJML is an open-source HTML-like markup
+language which makes the task of creating responsive email markup simple. By default, the templates are installed to
+`<project root>/vendure/email/templates` and can be freely edited.
+
+Dynamic data such as the recipient's name or order items are specified using [Handlebars syntax](https://handlebarsjs.com/):
+
+```HTML
+<p>Dear {{ order.customer.firstName }} {{ order.customer.lastName }},</p>
+
+<p>Thank you for your order!</p>
+
+<mj-table cellpadding="6px">
+  {{#each order.lines }}
+    <tr class="order-row">
+      <td>{{ quantity }} x {{ productVariant.name }}</td>
+      <td>{{ productVariant.quantity }}</td>
+      <td>{{ formatMoney totalPrice }}</td>
+    </tr>
+  {{/each}}
+</mj-table>
+```
+
+### Handlebars helpers
+
+The following helper functions are available for use in email templates:
+
+* `formatMoney`: Formats an amount of money (which are always stored as integers in Vendure) as a decimal, e.g. `123` => `1.23`
+* `formatDate`: Formats a Date value with the [dateformat](https://www.npmjs.com/package/dateformat) package.
+
+## Extending the default email handlers
+
+The `defaultEmailHandlers` array defines the default handlers such as for handling new account registration, order confirmation, password reset
+etc. These defaults can be extended by adding custom templates for languages other than the default, or even completely new types of emails
+which respond to any of the available [VendureEvents](/reference/typescript-api/events/).
+
+A good way to learn how to create your own email handlers is to take a look at the
+[source code of the default handlers](https://github.com/vendure-ecommerce/vendure/blob/master/packages/email-plugin/src/default-email-handlers.ts).
+New handlers are defined in exactly the same way.
+
+It is also possible to modify the default handlers:
+
+```ts
+// Rather than importing `defaultEmailHandlers`, you can
+// import the handlers individually
+import {
+  orderConfirmationHandler,
+  emailVerificationHandler,
+  passwordResetHandler,
+  emailAddressChangeHandler,
+} from '@vendure/email-plugin';
+import { CustomerService } from '@vendure/core';
+
+// This allows you to then customize each handler to your needs.
+// For example, let's set a new subject line to the order confirmation:
+orderConfirmationHandler
+  .setSubject(`We received your order!`);
+
+// Another example: loading additional data and setting new
+// template variables.
+passwordResetHandler
+  .loadData(async ({ event, injector }) => {
+    const customerService = injector.get(CustomerService);
+    const customer = await customerService.findOneByUserId(event.ctx, event.user.id);
+    return { customer };
+  })
+  .setTemplateVars(event => ({
+    passwordResetToken: event.user.getNativeAuthenticationMethod().passwordResetToken,
+    customer: event.data.customer,
+  }));
+
+// Then you pass the handlers to the EmailPlugin init method
+// individually
+EmailPlugin.init({
+  handlers: [
+    orderConfirmationHandler,
+    emailVerificationHandler,
+    passwordResetHandler,
+    emailAddressChangeHandler,
+  ],
+  // ...
+}),
+```
+
+For all available methods of extending a handler, see the <a href='/reference/typescript-api/core-plugins/email-plugin/email-event-handler#emaileventhandler'>EmailEventHandler</a> documentation.
+
+## Dynamic SMTP settings
+
+Instead of defining static transport settings, you can also provide a function that dynamically resolves
+channel aware transport settings.
+
+*Example*
+
+```ts
+import { defaultEmailHandlers, EmailPlugin } from '@vendure/email-plugin';
+import { MyTransportService } from './transport.services.ts';
+const config: VendureConfig = {
+  plugins: [
+    EmailPlugin.init({
+      handlers: defaultEmailHandlers,
+      templatePath: path.join(__dirname, 'static/email/templates'),
+      transport: (injector, ctx) => {
+        if (ctx) {
+          return injector.get(MyTransportService).getSettings(ctx);
+        } else {
+          return {
+             type: 'smtp',
+             host: 'smtp.example.com',
+             // ... etc.
+           }
+        }
+      }
+    }),
+  ],
+};
+```
+
+## Dev mode
+
+For development, the `transport` option can be replaced by `devMode: true`. Doing so configures Vendure to use the
+file transport (See <a href='/reference/typescript-api/core-plugins/email-plugin/transport-options#filetransportoptions'>FileTransportOptions</a>) and outputs emails as rendered HTML files in the directory specified by the
+`outputPath` property.
+
+```ts
+EmailPlugin.init({
+  devMode: true,
+  route: 'mailbox',
+  handlers: defaultEmailHandlers,
+  templatePath: path.join(__dirname, 'vendure/email/templates'),
+  outputPath: path.join(__dirname, 'test-emails'),
+})
+```
+
+### Dev mailbox
+
+In dev mode, a webmail-like interface available at the `/mailbox` path, e.g.
+http://localhost:3000/mailbox. This is a simple way to view the output of all emails generated by the EmailPlugin while in dev mode.
+
+## Troubleshooting SMTP Connections
+
+If you are having trouble sending email over and SMTP connection, set the `logging` and `debug` options to `true`. This will
+send detailed information from the SMTP transporter to the configured logger (defaults to console). For maximum detail combine
+this with a detail log level in the configured VendureLogger:
+
+```ts
+const config: VendureConfig = {
+  logger: new DefaultLogger({ level: LogLevel.Debug })
+  // ...
+  plugins: [
+    EmailPlugin.init({
+      // ...
+      transport: {
+        type: 'smtp',
+        host: 'smtp.example.com',
+        port: 587,
+        auth: {
+          user: 'username',
+          pass: 'password',
+        },
+        logging: true,
+        debug: true,
+      },
+    }),
+  ],
+};
+```
+
+```ts title="Signature"
+class EmailPlugin implements OnApplicationBootstrap, OnApplicationShutdown, NestModule {
+  static init(options: EmailPluginOptions | EmailPluginDevModeOptions) => Type<EmailPlugin>;
+  async onApplicationShutdown() => ;
+  configure(consumer: MiddlewareConsumer) => ;
+}
+```
+* Implements: <code>OnApplicationBootstrap</code>, <code>OnApplicationShutdown</code>, <code>NestModule</code>
+
+
+
+<div className="members-wrapper">
+
+### init
+
+<MemberInfo kind="method" type="(options: <a href='/reference/typescript-api/core-plugins/email-plugin/email-plugin-options#emailpluginoptions'>EmailPluginOptions</a> | <a href='/reference/typescript-api/core-plugins/email-plugin/email-plugin-options#emailplugindevmodeoptions'>EmailPluginDevModeOptions</a>) => Type&#60;<a href='/reference/typescript-api/core-plugins/email-plugin/#emailplugin'>EmailPlugin</a>&#62;"   />
+
+
+### onApplicationShutdown
+
+<MemberInfo kind="method" type="() => "   />
+
+
+### configure
+
+<MemberInfo kind="method" type="(consumer: MiddlewareConsumer) => "   />
+
+
+
+
+</div>

+ 175 - 0
docs/docs/reference/typescript-api/core-plugins/harden-plugin/index.md

@@ -0,0 +1,175 @@
+---
+title: "HardenPlugin"
+weight: 10
+date: 2023-07-21T15:46:18.322Z
+showtoc: true
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+## HardenPlugin
+
+<GenerationInfo sourceFile="packages/harden-plugin/src/harden.plugin.ts" sourceLine="146" packageName="@vendure/harden-plugin" />
+
+The HardenPlugin hardens the Shop and Admin GraphQL APIs against attacks and abuse.
+
+- It analyzes the complexity on incoming graphql queries and rejects queries that are too complex and
+  could be used to overload the resources of the server.
+- It disables dev-mode API features such as introspection and the GraphQL playground app.
+- It removes field name suggestions to prevent trial-and-error schema sniffing.
+
+It is a recommended plugin for all production configurations.
+
+## Installation
+
+`yarn add @vendure/harden-plugin`
+
+or
+
+`npm install @vendure/harden-plugin`
+
+Then add the `HardenPlugin`, calling the `.init()` method with <a href='/reference/typescript-api/core-plugins/harden-plugin/harden-plugin-options#hardenpluginoptions'>HardenPluginOptions</a>:
+
+*Example*
+
+```ts
+import { HardenPlugin } from '@vendure/harden-plugin';
+
+const config: VendureConfig = {
+  // Add an instance of the plugin to the plugins array
+  plugins: [
+     HardenPlugin.init({
+       maxQueryComplexity: 650,
+       apiMode: process.env.APP_ENV === 'dev' ? 'dev' : 'prod',
+     }),
+  ],
+};
+```
+
+## Setting the max query complexity
+
+The `maxQueryComplexity` option determines how complex a query can be. The complexity of a query relates to how many, and how
+deeply-nested are the fields being selected, and is intended to roughly correspond to the amount of server resources that would
+be required to resolve that query.
+
+The goal of this setting is to prevent attacks in which a malicious actor crafts a very complex query in order to overwhelm your
+server resources. Here's an example of a request which would likely overwhelm a Vendure server:
+
+```GraphQL
+query EvilQuery {
+  products {
+    items {
+      collections {
+        productVariants {
+          items {
+            product {
+              collections {
+                productVariants {
+                  items {
+                    product {
+                      variants {
+                        name
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+```
+
+This evil query has a complexity score of 2,443,203 - much greater than the default of 1,000!
+
+The complexity score is calculated by the [graphql-query-complexity library](https://www.npmjs.com/package/graphql-query-complexity),
+and by default uses the <a href='/reference/typescript-api/core-plugins/harden-plugin/default-vendure-complexity-estimator#defaultvendurecomplexityestimator'>defaultVendureComplexityEstimator</a>, which is tuned specifically to the Vendure Shop API.
+
+{{% alert "warning" %}}
+Note: By default, if the "take" argument is omitted from a list query (e.g. the `products` or `collections` query), a default factor of 1000 is applied.
+{{% /alert %}}
+
+The optimal max complexity score will vary depending on:
+
+- The requirements of your storefront and other clients using the Shop API
+- The resources available to your server
+
+You should aim to set the maximum as low as possible while still being able to service all the requests required.
+This will take some manual tuning.
+While tuning the max, you can turn on the `logComplexityScore` to get a detailed breakdown of the complexity of each query, as well as how
+that total score is derived from its child fields:
+
+*Example*
+
+```ts
+import { HardenPlugin } from '@vendure/harden-plugin';
+
+const config: VendureConfig = {
+  // A detailed summary is logged at the "debug" level
+  logger: new DefaultLogger({ level: LogLevel.Debug }),
+  plugins: [
+     HardenPlugin.init({
+       maxQueryComplexity: 650,
+       logComplexityScore: true,
+     }),
+  ],
+};
+```
+
+With logging configured as above, the following query:
+
+```GraphQL
+query ProductList {
+  products(options: { take: 5 }) {
+    items {
+      id
+      name
+      featuredAsset {
+        preview
+      }
+    }
+  }
+}
+```
+will log the following breakdown:
+
+```sh
+debug 16/12/22, 14:12 - [HardenPlugin] Calculating complexity of [ProductList]
+debug 16/12/22, 14:12 - [HardenPlugin] Product.id: ID!     childComplexity: 0, score: 1
+debug 16/12/22, 14:12 - [HardenPlugin] Product.name: String!       childComplexity: 0, score: 1
+debug 16/12/22, 14:12 - [HardenPlugin] Asset.preview: String!      childComplexity: 0, score: 1
+debug 16/12/22, 14:12 - [HardenPlugin] Product.featuredAsset: Asset        childComplexity: 1, score: 2
+debug 16/12/22, 14:12 - [HardenPlugin] ProductList.items: [Product!]!      childComplexity: 4, score: 20
+debug 16/12/22, 14:12 - [HardenPlugin] Query.products: ProductList!        childComplexity: 20, score: 35
+verbose 16/12/22, 14:12 - [HardenPlugin] Query complexity [ProductList]: 35
+```
+
+```ts title="Signature"
+class HardenPlugin {
+  static static options: HardenPluginOptions;
+  static init(options: HardenPluginOptions) => ;
+}
+```
+
+<div className="members-wrapper">
+
+### options
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/core-plugins/harden-plugin/harden-plugin-options#hardenpluginoptions'>HardenPluginOptions</a>"   />
+
+
+### init
+
+<MemberInfo kind="method" type="(options: <a href='/reference/typescript-api/core-plugins/harden-plugin/harden-plugin-options#hardenpluginoptions'>HardenPluginOptions</a>) => "   />
+
+
+
+
+</div>

+ 14 - 0
docs/docs/reference/typescript-api/core-plugins/index.md

@@ -0,0 +1,14 @@
+---
+title: "Core Plugins"
+weight: 10
+date: 2023-07-21T15:46:16.781Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# core-plugins

+ 14 - 0
docs/docs/reference/typescript-api/core-plugins/job-queue-plugin/index.md

@@ -0,0 +1,14 @@
+---
+title: "Job Queue Plugin"
+weight: 10
+date: 2023-07-21T15:46:18.204Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# job-queue-plugin

+ 14 - 0
docs/docs/reference/typescript-api/core-plugins/payments-plugin/index.md

@@ -0,0 +1,14 @@
+---
+title: "Payments Plugin"
+weight: 10
+date: 2023-07-21T15:46:18.227Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# payments-plugin

+ 273 - 0
docs/docs/reference/typescript-api/custom-fields/index.md

@@ -0,0 +1,273 @@
+---
+title: "CustomFields"
+weight: 10
+date: 2023-07-21T15:46:15.023Z
+showtoc: true
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+## CustomFields
+
+<GenerationInfo sourceFile="packages/core/src/config/custom-field/custom-field-types.ts" sourceLine="205" packageName="@vendure/core" />
+
+Most entities can have additional fields added to them by defining an array of <a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>
+objects on against the corresponding key.
+
+### Configuration options
+
+All custom fields share some common properties:
+
+* `name: string`: The name of the field.
+* `type: string`: A string of type <a href='/reference/typescript-api/custom-fields/custom-field-type#customfieldtype'>CustomFieldType</a>.
+* `list: boolean`: If set to `true`, then the field will be an array of the specified type.
+* `label?: LocalizedString[]`: An array of localized labels for the field.
+* `description?: LocalizedString[]`: An array of localized descriptions for the field.
+* `public?: boolean`: Whether or not the custom field is available via the Shop API. Defaults to `true`.
+* `readonly?: boolean`: Whether or not the custom field can be updated via the GraphQL APIs. Defaults to `false`.
+* `internal?: boolean`: Whether or not the custom field is exposed at all via the GraphQL APIs. Defaults to `false`.
+* `defaultValue?: any`: The default value when an Entity is created with this field.
+* `nullable?: boolean`: Whether the field is nullable in the database. If set to `false`, then a `defaultValue` should be provided.
+* `unique?: 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`.
+* `validate?: (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.
+
+The `LocalizedString` type looks like this:
+
+```ts
+type LocalizedString = {
+  languageCode: LanguageCode;
+  value: string;
+};
+```
+
+In addition to the common properties, the following field types have some type-specific properties:
+
+#### `string` type
+
+* `pattern?: string`: A regex pattern which the field value must match
+* `options?: { value: string; label?: LocalizedString[]; };`: An array of pre-defined options for the field.
+* `length?: number`: The max length of the varchar created in the database. Defaults to 255. Maximum is 65,535.
+
+#### `localeString` type
+
+* `pattern?: string`: A regex pattern which the field value must match
+* `length?: number`: The max length of the varchar created in the database. Defaults to 255. Maximum is 65,535.
+
+#### `int` & `float` type
+
+* `min?: number`: The minimum permitted value
+* `max?: number`: The maximum permitted value
+* `step?: number`: The step value
+
+#### `datetime` type
+
+The min, max & step properties for datetime fields are intended to be used as described in
+[the datetime-local docs](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local#Additional_attributes)
+
+* `min?: string`: The earliest permitted date
+* `max?: string`: The latest permitted date
+* `step?: string`: The step value
+
+#### `relation` type
+
+* `entity: VendureEntity`: The entity which this custom field is referencing
+* `eager?: boolean`: Whether to [eagerly load](https://typeorm.io/#/eager-and-lazy-relations) the relation. Defaults to false.
+* `graphQLType?: string`: The name of the GraphQL type that corresponds to the entity.
+    Can be omitted if it is the same, which is usually the case.
+
+*Example*
+
+```ts
+bootstrap({
+    // ...
+    customFields: {
+        Product: [
+            { name: 'infoUrl', type: 'string' },
+            { name: 'downloadable', type: 'boolean', defaultValue: false },
+            { name: 'shortName', type: 'localeString' },
+        ],
+        User: [
+            { name: 'socialLoginToken', type: 'string', public: false },
+        ],
+    },
+})
+```
+
+```ts title="Signature"
+interface CustomFields {
+  Address?: CustomFieldConfig[];
+  Administrator?: CustomFieldConfig[];
+  Asset?: CustomFieldConfig[];
+  Channel?: CustomFieldConfig[];
+  Collection?: CustomFieldConfig[];
+  Customer?: CustomFieldConfig[];
+  CustomerGroup?: CustomFieldConfig[];
+  Facet?: CustomFieldConfig[];
+  FacetValue?: CustomFieldConfig[];
+  Fulfillment?: CustomFieldConfig[];
+  GlobalSettings?: CustomFieldConfig[];
+  Order?: CustomFieldConfig[];
+  OrderLine?: CustomFieldConfig[];
+  PaymentMethod?: CustomFieldConfig[];
+  Product?: CustomFieldConfig[];
+  ProductOption?: CustomFieldConfig[];
+  ProductOptionGroup?: CustomFieldConfig[];
+  ProductVariant?: CustomFieldConfig[];
+  Promotion?: CustomFieldConfig[];
+  Region?: CustomFieldConfig[];
+  Seller?: CustomFieldConfig[];
+  ShippingMethod?: CustomFieldConfig[];
+  StockLocation?: CustomFieldConfig[];
+  TaxCategory?: CustomFieldConfig[];
+  TaxRate?: CustomFieldConfig[];
+  User?: CustomFieldConfig[];
+  Zone?: CustomFieldConfig[];
+}
+```
+
+<div className="members-wrapper">
+
+### Address
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### Administrator
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### Asset
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### Channel
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### Collection
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### Customer
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### CustomerGroup
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### Facet
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### FacetValue
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### Fulfillment
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### GlobalSettings
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### Order
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### OrderLine
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### PaymentMethod
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### Product
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### ProductOption
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### ProductOptionGroup
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### ProductVariant
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### Promotion
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### Region
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### Seller
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### ShippingMethod
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### StockLocation
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### TaxCategory
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### TaxRate
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### User
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+### Zone
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/custom-fields/custom-field-config#customfieldconfig'>CustomFieldConfig</a>[]"   />
+
+
+
+
+</div>

+ 14 - 0
docs/docs/reference/typescript-api/data-access/index.md

@@ -0,0 +1,14 @@
+---
+title: "Data Access"
+weight: 10
+date: 2023-07-21T15:46:14.742Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# data-access

+ 14 - 0
docs/docs/reference/typescript-api/entities/index.md

@@ -0,0 +1,14 @@
+---
+title: "Entities"
+weight: 10
+date: 2023-07-21T15:46:14.847Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# entities

+ 14 - 0
docs/docs/reference/typescript-api/errors/index.md

@@ -0,0 +1,14 @@
+---
+title: "Errors"
+weight: 10
+date: 2023-07-21T15:46:14.779Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# errors

+ 14 - 0
docs/docs/reference/typescript-api/events/index.md

@@ -0,0 +1,14 @@
+---
+title: "Events"
+weight: 10
+date: 2023-07-21T15:46:16.409Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# events

+ 14 - 0
docs/docs/reference/typescript-api/fulfillment/index.md

@@ -0,0 +1,14 @@
+---
+title: "Fulfillment"
+weight: 10
+date: 2023-07-21T15:46:15.092Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# fulfillment

+ 14 - 0
docs/docs/reference/typescript-api/health-check/index.md

@@ -0,0 +1,14 @@
+---
+title: "Health Check"
+weight: 10
+date: 2023-07-21T15:46:15.497Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# health-check

+ 14 - 0
docs/docs/reference/typescript-api/import-export/index.md

@@ -0,0 +1,14 @@
+---
+title: "Import Export"
+weight: 10
+date: 2023-07-21T15:46:14.732Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# import-export

+ 90 - 0
docs/docs/reference/typescript-api/job-queue/index.md

@@ -0,0 +1,90 @@
+---
+title: "JobQueue"
+weight: 10
+date: 2023-07-21T15:46:16.667Z
+showtoc: true
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+## JobQueue
+
+<GenerationInfo sourceFile="packages/core/src/job-queue/job-queue.ts" sourceLine="25" packageName="@vendure/core" />
+
+A JobQueue is used to process <a href='/reference/typescript-api/job-queue/job#job'>Job</a>s. A job is added to the queue via the
+`.add()` method, and the configured <a href='/reference/typescript-api/job-queue/job-queue-strategy#jobqueuestrategy'>JobQueueStrategy</a> will check for new jobs and process each
+according to the defined `process` function.
+
+*Note*: JobQueue instances should not be directly instantiated. Rather, the
+<a href='/reference/typescript-api/job-queue/job-queue-service#jobqueueservice'>JobQueueService</a> `createQueue()` method should be used (see that service
+for example usage).
+
+```ts title="Signature"
+class JobQueue<Data extends JobData<Data> = object> {
+  name: string
+  started: boolean
+  constructor(options: CreateQueueOptions<Data>, jobQueueStrategy: JobQueueStrategy, jobBufferService: JobBufferService)
+  async add(data: Data, options?: Pick<JobConfig<Data>, 'retries'>) => Promise<SubscribableJob<Data>>;
+}
+```
+
+<div className="members-wrapper">
+
+### name
+
+<MemberInfo kind="property" type="string"   />
+
+
+### started
+
+<MemberInfo kind="property" type="boolean"   />
+
+
+### constructor
+
+<MemberInfo kind="method" type="(options: <a href='/reference/typescript-api/job-queue/types#createqueueoptions'>CreateQueueOptions</a>&#60;Data&#62;, jobQueueStrategy: <a href='/reference/typescript-api/job-queue/job-queue-strategy#jobqueuestrategy'>JobQueueStrategy</a>, jobBufferService: JobBufferService) => JobQueue"   />
+
+
+### add
+
+<MemberInfo kind="method" type="(data: Data, options?: Pick&#60;<a href='/reference/typescript-api/job-queue/types#jobconfig'>JobConfig</a>&#60;Data&#62;, 'retries'&#62;) => Promise&#60;<a href='/reference/typescript-api/job-queue/subscribable-job#subscribablejob'>SubscribableJob</a>&#60;Data&#62;&#62;"   />
+
+Adds a new <a href='/reference/typescript-api/job-queue/job#job'>Job</a> to the queue. The resolved <a href='/reference/typescript-api/job-queue/subscribable-job#subscribablejob'>SubscribableJob</a> allows the
+calling code to subscribe to updates to the Job:
+
+*Example*
+
+```ts
+const job = await this.myQueue.add({ intervalMs, shouldFail }, { retries: 2 });
+return job.updates().pipe(
+  map(update => {
+    // The returned Observable will emit a value for every update to the job
+    // such as when the `progress` or `status` value changes.
+    Logger.info(`Job ${update.id}: progress: ${update.progress}`);
+    if (update.state === JobState.COMPLETED) {
+      Logger.info(`COMPLETED ${update.id}: ${update.result}`);
+    }
+    return update.result;
+  }),
+  catchError(err => of(err.message)),
+);
+```
+
+Alternatively, if you aren't interested in the intermediate
+`progress` changes, you can convert to a Promise like this:
+
+*Example*
+
+```ts
+const job = await this.myQueue.add({ intervalMs, shouldFail }, { retries: 2 });
+return job.updates().toPromise()
+  .then(update => update.result),
+  .catch(err => err.message);
+```
+
+
+</div>

+ 126 - 0
docs/docs/reference/typescript-api/logger/index.md

@@ -0,0 +1,126 @@
+---
+title: "Logger"
+weight: 10
+date: 2023-07-21T15:46:15.156Z
+showtoc: true
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+## Logger
+
+<GenerationInfo sourceFile="packages/core/src/config/logger/vendure-logger.ts" sourceLine="136" packageName="@vendure/core" />
+
+The Logger is responsible for all logging in a Vendure application.
+
+It is intended to be used as a static class:
+
+*Example*
+
+```ts
+import { Logger } from '@vendure/core';
+
+Logger.info(`Some log message`, 'My Vendure Plugin');
+```
+
+The actual implementation - where the logs are written to - is defined by the <a href='/reference/typescript-api/logger/vendure-logger#vendurelogger'>VendureLogger</a>
+instance configured in the <a href='/reference/typescript-api/configuration/vendure-config#vendureconfig'>VendureConfig</a>. By default, the <a href='/reference/typescript-api/logger/default-logger#defaultlogger'>DefaultLogger</a> is used, which
+logs to the console.
+
+## Implementing a custom logger
+
+A custom logger can be passed to the `logger` config option by creating a class which implements the
+<a href='/reference/typescript-api/logger/vendure-logger#vendurelogger'>VendureLogger</a> interface. For example, here is how you might go about implementing a logger which
+logs to a file:
+
+*Example*
+
+```ts
+import { VendureLogger } from '@vendure/core';
+import fs from 'fs';
+
+// A simple custom logger which writes all logs to a file.
+export class SimpleFileLogger implements VendureLogger {
+    private logfile: fs.WriteStream;
+
+    constructor(logfileLocation: string) {
+        this.logfile = fs.createWriteStream(logfileLocation, { flags: 'w' });
+    }
+
+    error(message: string, context?: string) {
+        this.logfile.write(`ERROR: [${context}] ${message}\n`);
+    }
+    warn(message: string, context?: string) {
+        this.logfile.write(`WARN: [${context}] ${message}\n`);
+    }
+    info(message: string, context?: string) {
+        this.logfile.write(`INFO: [${context}] ${message}\n`);
+    }
+    verbose(message: string, context?: string) {
+        this.logfile.write(`VERBOSE: [${context}] ${message}\n`);
+    }
+    debug(message: string, context?: string) {
+        this.logfile.write(`DEBUG: [${context}] ${message}\n`);
+    }
+}
+
+// in the VendureConfig
+export const config = {
+    // ...
+    logger: new SimpleFileLogger('server.log'),
+}
+```
+
+```ts title="Signature"
+class Logger implements LoggerService {
+  static logger: VendureLogger
+  static error(message: string, context?: string, trace?: string) => void;
+  static warn(message: string, context?: string) => void;
+  static info(message: string, context?: string) => void;
+  static verbose(message: string, context?: string) => void;
+  static debug(message: string, context?: string) => void;
+}
+```
+* Implements: <code>LoggerService</code>
+
+
+
+<div className="members-wrapper">
+
+### logger
+
+<MemberInfo kind="property" type="<a href='/reference/typescript-api/logger/vendure-logger#vendurelogger'>VendureLogger</a>"   />
+
+
+### error
+
+<MemberInfo kind="method" type="(message: string, context?: string, trace?: string) => void"   />
+
+
+### warn
+
+<MemberInfo kind="method" type="(message: string, context?: string) => void"   />
+
+
+### info
+
+<MemberInfo kind="method" type="(message: string, context?: string) => void"   />
+
+
+### verbose
+
+<MemberInfo kind="method" type="(message: string, context?: string) => void"   />
+
+
+### debug
+
+<MemberInfo kind="method" type="(message: string, context?: string) => void"   />
+
+
+
+
+</div>

+ 14 - 0
docs/docs/reference/typescript-api/migration/index.md

@@ -0,0 +1,14 @@
+---
+title: "Migration"
+weight: 10
+date: 2023-07-21T15:46:16.743Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# migration

+ 29 - 0
docs/docs/reference/typescript-api/money/index.md

@@ -0,0 +1,29 @@
+---
+title: "Money"
+weight: 10
+date: 2023-07-21T15:46:16.034Z
+showtoc: true
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+## Money
+
+<GenerationInfo sourceFile="packages/core/src/entity/money.decorator.ts" sourceLine="29" packageName="@vendure/core" since="2.0.0" />
+
+Use this decorator for any entity field that is storing a monetary value.
+This allows the column type to be defined by the configured <a href='/reference/typescript-api/money/money-strategy#moneystrategy'>MoneyStrategy</a>.
+
+```ts title="Signature"
+function Money(options?: MoneyColumnOptions): void
+```
+Parameters
+
+### options
+
+<MemberInfo kind="parameter" type="MoneyColumnOptions" />
+

+ 14 - 0
docs/docs/reference/typescript-api/orders/index.md

@@ -0,0 +1,14 @@
+---
+title: "Orders"
+weight: 10
+date: 2023-07-21T15:46:15.177Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# orders

+ 14 - 0
docs/docs/reference/typescript-api/payment/index.md

@@ -0,0 +1,14 @@
+---
+title: "Payment"
+weight: 10
+date: 2023-07-21T15:46:15.336Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# payment

+ 14 - 0
docs/docs/reference/typescript-api/plugin/index.md

@@ -0,0 +1,14 @@
+---
+title: "Plugin"
+weight: 10
+date: 2023-07-21T15:46:16.794Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# plugin

+ 14 - 0
docs/docs/reference/typescript-api/products-stock/index.md

@@ -0,0 +1,14 @@
+---
+title: "Products Stock"
+weight: 10
+date: 2023-07-21T15:46:14.958Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# products-stock

+ 14 - 0
docs/docs/reference/typescript-api/promotions/index.md

@@ -0,0 +1,14 @@
+---
+title: "Promotions"
+weight: 10
+date: 2023-07-21T15:46:15.412Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# promotions

+ 14 - 0
docs/docs/reference/typescript-api/request/index.md

@@ -0,0 +1,14 @@
+---
+title: "Request"
+weight: 10
+date: 2023-07-21T15:46:14.611Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# request

+ 14 - 0
docs/docs/reference/typescript-api/service-helpers/index.md

@@ -0,0 +1,14 @@
+---
+title: "Service Helpers"
+weight: 10
+date: 2023-07-21T15:46:16.885Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# service-helpers

+ 14 - 0
docs/docs/reference/typescript-api/services/index.md

@@ -0,0 +1,14 @@
+---
+title: "Services"
+weight: 10
+date: 2023-07-21T15:46:16.970Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# services

+ 179 - 0
docs/docs/reference/typescript-api/services/product-variant-service.md

@@ -0,0 +1,179 @@
+---
+title: "ProductVariantService"
+weight: 10
+date: 2023-07-21T15:46:17.475Z
+showtoc: true
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+## ProductVariantService
+
+<GenerationInfo sourceFile="packages/core/src/service/services/product-variant.service.ts" sourceLine="67" packageName="@vendure/core" />
+
+Contains methods relating to <a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a> entities.
+
+```ts title="Signature"
+class ProductVariantService {
+  constructor(connection: TransactionalConnection, configService: ConfigService, taxCategoryService: TaxCategoryService, facetValueService: FacetValueService, assetService: AssetService, translatableSaver: TranslatableSaver, eventBus: EventBus, listQueryBuilder: ListQueryBuilder, globalSettingsService: GlobalSettingsService, stockMovementService: StockMovementService, stockLevelService: StockLevelService, channelService: ChannelService, roleService: RoleService, customFieldRelationService: CustomFieldRelationService, requestCache: RequestContextCacheService, productPriceApplicator: ProductPriceApplicator, translator: TranslatorService)
+  async findAll(ctx: RequestContext, options?: ListQueryOptions<ProductVariant>) => Promise<PaginatedList<Translated<ProductVariant>>>;
+  findOne(ctx: RequestContext, productVariantId: ID, relations?: RelationPaths<ProductVariant>) => Promise<Translated<ProductVariant> | undefined>;
+  findByIds(ctx: RequestContext, ids: ID[]) => Promise<Array<Translated<ProductVariant>>>;
+  getVariantsByProductId(ctx: RequestContext, productId: ID, options: ListQueryOptions<ProductVariant> = {}, relations?: RelationPaths<ProductVariant>) => Promise<PaginatedList<Translated<ProductVariant>>>;
+  getVariantsByCollectionId(ctx: RequestContext, collectionId: ID, options: ListQueryOptions<ProductVariant>, relations: RelationPaths<ProductVariant> = []) => Promise<PaginatedList<Translated<ProductVariant>>>;
+  async getProductVariantChannels(ctx: RequestContext, productVariantId: ID) => Promise<Channel[]>;
+  async getProductVariantPrices(ctx: RequestContext, productVariantId: ID) => Promise<ProductVariantPrice[]>;
+  async getVariantByOrderLineId(ctx: RequestContext, orderLineId: ID) => Promise<Translated<ProductVariant>>;
+  getOptionsForVariant(ctx: RequestContext, variantId: ID) => Promise<Array<Translated<ProductOption>>>;
+  getFacetValuesForVariant(ctx: RequestContext, variantId: ID) => Promise<Array<Translated<FacetValue>>>;
+  async getProductForVariant(ctx: RequestContext, variant: ProductVariant) => Promise<Translated<Product>>;
+  async getSaleableStockLevel(ctx: RequestContext, variant: ProductVariant) => Promise<number>;
+  async getDisplayStockLevel(ctx: RequestContext, variant: ProductVariant) => Promise<string>;
+  async getFulfillableStockLevel(ctx: RequestContext, variant: ProductVariant) => Promise<number>;
+  async create(ctx: RequestContext, input: CreateProductVariantInput[]) => Promise<Array<Translated<ProductVariant>>>;
+  async update(ctx: RequestContext, input: UpdateProductVariantInput[]) => Promise<Array<Translated<ProductVariant>>>;
+  async createOrUpdateProductVariantPrice(ctx: RequestContext, productVariantId: ID, price: number, channelId: ID, currencyCode?: CurrencyCode) => Promise<ProductVariantPrice>;
+  async softDelete(ctx: RequestContext, id: ID | ID[]) => Promise<DeletionResponse>;
+  async hydratePriceFields(ctx: RequestContext, variant: ProductVariant, priceField: F) => Promise<ProductVariant[F]>;
+  async applyChannelPriceAndTax(variant: ProductVariant, ctx: RequestContext, order?: Order) => Promise<ProductVariant>;
+  async assignProductVariantsToChannel(ctx: RequestContext, input: AssignProductVariantsToChannelInput) => Promise<Array<Translated<ProductVariant>>>;
+  async removeProductVariantsFromChannel(ctx: RequestContext, input: RemoveProductVariantsFromChannelInput) => Promise<Array<Translated<ProductVariant>>>;
+}
+```
+
+<div className="members-wrapper">
+
+### constructor
+
+<MemberInfo kind="method" type="(connection: <a href='/reference/typescript-api/data-access/transactional-connection#transactionalconnection'>TransactionalConnection</a>, configService: ConfigService, taxCategoryService: <a href='/reference/typescript-api/services/tax-category-service#taxcategoryservice'>TaxCategoryService</a>, facetValueService: <a href='/reference/typescript-api/services/facet-value-service#facetvalueservice'>FacetValueService</a>, assetService: <a href='/reference/typescript-api/services/asset-service#assetservice'>AssetService</a>, translatableSaver: <a href='/reference/typescript-api/service-helpers/translatable-saver#translatablesaver'>TranslatableSaver</a>, eventBus: <a href='/reference/typescript-api/events/event-bus#eventbus'>EventBus</a>, listQueryBuilder: <a href='/reference/typescript-api/data-access/list-query-builder#listquerybuilder'>ListQueryBuilder</a>, globalSettingsService: <a href='/reference/typescript-api/services/global-settings-service#globalsettingsservice'>GlobalSettingsService</a>, stockMovementService: <a href='/reference/typescript-api/services/stock-movement-service#stockmovementservice'>StockMovementService</a>, stockLevelService: <a href='/reference/typescript-api/services/stock-level-service#stocklevelservice'>StockLevelService</a>, channelService: <a href='/reference/typescript-api/services/channel-service#channelservice'>ChannelService</a>, roleService: <a href='/reference/typescript-api/services/role-service#roleservice'>RoleService</a>, customFieldRelationService: CustomFieldRelationService, requestCache: RequestContextCacheService, productPriceApplicator: <a href='/reference/typescript-api/service-helpers/product-price-applicator#productpriceapplicator'>ProductPriceApplicator</a>, translator: TranslatorService) => ProductVariantService"   />
+
+
+### findAll
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, options?: ListQueryOptions&#60;<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>&#62;) => Promise&#60;<a href='/reference/typescript-api/common/paginated-list#paginatedlist'>PaginatedList</a>&#60;Translated&#60;<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>&#62;&#62;&#62;"   />
+
+
+### findOne
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, productVariantId: <a href='/reference/typescript-api/common/id#id'>ID</a>, relations?: RelationPaths&#60;<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>&#62;) => Promise&#60;Translated&#60;<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>&#62; | undefined&#62;"   />
+
+
+### findByIds
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, ids: <a href='/reference/typescript-api/common/id#id'>ID</a>[]) => Promise&#60;Array&#60;Translated&#60;<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>&#62;&#62;&#62;"   />
+
+
+### getVariantsByProductId
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, productId: <a href='/reference/typescript-api/common/id#id'>ID</a>, options: ListQueryOptions&#60;<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>&#62; = {}, relations?: RelationPaths&#60;<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>&#62;) => Promise&#60;<a href='/reference/typescript-api/common/paginated-list#paginatedlist'>PaginatedList</a>&#60;Translated&#60;<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>&#62;&#62;&#62;"   />
+
+
+### getVariantsByCollectionId
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, collectionId: <a href='/reference/typescript-api/common/id#id'>ID</a>, options: ListQueryOptions&#60;<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>&#62;, relations: RelationPaths&#60;<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>&#62; = []) => Promise&#60;<a href='/reference/typescript-api/common/paginated-list#paginatedlist'>PaginatedList</a>&#60;Translated&#60;<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>&#62;&#62;&#62;"   />
+
+Returns a <a href='/reference/typescript-api/common/paginated-list#paginatedlist'>PaginatedList</a> of all ProductVariants associated with the given Collection.
+### getProductVariantChannels
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, productVariantId: <a href='/reference/typescript-api/common/id#id'>ID</a>) => Promise&#60;<a href='/reference/typescript-api/entities/channel#channel'>Channel</a>[]&#62;"   />
+
+Returns all Channels to which the ProductVariant is assigned.
+### getProductVariantPrices
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, productVariantId: <a href='/reference/typescript-api/common/id#id'>ID</a>) => Promise&#60;<a href='/reference/typescript-api/entities/product-variant-price#productvariantprice'>ProductVariantPrice</a>[]&#62;"   />
+
+
+### getVariantByOrderLineId
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, orderLineId: <a href='/reference/typescript-api/common/id#id'>ID</a>) => Promise&#60;Translated&#60;<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>&#62;&#62;"   />
+
+Returns the ProductVariant associated with the given <a href='/reference/typescript-api/entities/order-line#orderline'>OrderLine</a>.
+### getOptionsForVariant
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, variantId: <a href='/reference/typescript-api/common/id#id'>ID</a>) => Promise&#60;Array&#60;Translated&#60;<a href='/reference/typescript-api/entities/product-option#productoption'>ProductOption</a>&#62;&#62;&#62;"   />
+
+Returns the <a href='/reference/typescript-api/entities/product-option#productoption'>ProductOption</a>s for the given ProductVariant.
+### getFacetValuesForVariant
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, variantId: <a href='/reference/typescript-api/common/id#id'>ID</a>) => Promise&#60;Array&#60;Translated&#60;<a href='/reference/typescript-api/entities/facet-value#facetvalue'>FacetValue</a>&#62;&#62;&#62;"   />
+
+
+### getProductForVariant
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, variant: <a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>) => Promise&#60;Translated&#60;<a href='/reference/typescript-api/entities/product#product'>Product</a>&#62;&#62;"   />
+
+Returns the Product associated with the ProductVariant. Whereas the `ProductService.findOne()`
+method performs a large multi-table join with all the typical data needed for a "product detail"
+page, this method returns only the Product itself.
+### getSaleableStockLevel
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, variant: <a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>) => Promise&#60;number&#62;"   />
+
+Returns the number of saleable units of the ProductVariant, i.e. how many are available
+for purchase by Customers. This is determined by the ProductVariant's `stockOnHand` value,
+as well as the local and global `outOfStockThreshold` settings.
+### getDisplayStockLevel
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, variant: <a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>) => Promise&#60;string&#62;"   />
+
+Returns the stockLevel to display to the customer, as specified by the configured
+<a href='/reference/typescript-api/products-stock/stock-display-strategy#stockdisplaystrategy'>StockDisplayStrategy</a>.
+### getFulfillableStockLevel
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, variant: <a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>) => Promise&#60;number&#62;"   />
+
+Returns the number of fulfillable units of the ProductVariant, equivalent to stockOnHand
+for those variants which are tracking inventory.
+### create
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, input: CreateProductVariantInput[]) => Promise&#60;Array&#60;Translated&#60;<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>&#62;&#62;&#62;"   />
+
+
+### update
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, input: UpdateProductVariantInput[]) => Promise&#60;Array&#60;Translated&#60;<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>&#62;&#62;&#62;"   />
+
+
+### createOrUpdateProductVariantPrice
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, productVariantId: <a href='/reference/typescript-api/common/id#id'>ID</a>, price: number, channelId: <a href='/reference/typescript-api/common/id#id'>ID</a>, currencyCode?: <a href='/reference/typescript-api/common/currency-code#currencycode'>CurrencyCode</a>) => Promise&#60;<a href='/reference/typescript-api/entities/product-variant-price#productvariantprice'>ProductVariantPrice</a>&#62;"   />
+
+Creates a <a href='/reference/typescript-api/entities/product-variant-price#productvariantprice'>ProductVariantPrice</a> for the given ProductVariant/Channel combination.
+If the `currencyCode` is not specified, the default currency of the Channel will be used.
+### softDelete
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, id: <a href='/reference/typescript-api/common/id#id'>ID</a> | <a href='/reference/typescript-api/common/id#id'>ID</a>[]) => Promise&#60;DeletionResponse&#62;"   />
+
+
+### hydratePriceFields
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, variant: <a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>, priceField: F) => Promise&#60;<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>[F]&#62;"   />
+
+This method is intended to be used by the ProductVariant GraphQL entity resolver to resolve the
+price-related fields which need to be populated at run-time using the `applyChannelPriceAndTax`
+method.
+
+Is optimized to make as few DB calls as possible using caching based on the open request.
+### applyChannelPriceAndTax
+
+<MemberInfo kind="method" type="(variant: <a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>, ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, order?: <a href='/reference/typescript-api/entities/order#order'>Order</a>) => Promise&#60;<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>&#62;"   />
+
+Populates the `price` field with the price for the specified channel.
+### assignProductVariantsToChannel
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, input: AssignProductVariantsToChannelInput) => Promise&#60;Array&#60;Translated&#60;<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>&#62;&#62;&#62;"   />
+
+Assigns the specified ProductVariants to the specified Channel. In doing so, it will create a new
+<a href='/reference/typescript-api/entities/product-variant-price#productvariantprice'>ProductVariantPrice</a> and also assign the associated Product and any Assets to the Channel too.
+### removeProductVariantsFromChannel
+
+<MemberInfo kind="method" type="(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, input: RemoveProductVariantsFromChannelInput) => Promise&#60;Array&#60;Translated&#60;<a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a>&#62;&#62;&#62;"   />
+
+
+
+
+</div>

+ 14 - 0
docs/docs/reference/typescript-api/shipping/index.md

@@ -0,0 +1,14 @@
+---
+title: "Shipping"
+weight: 10
+date: 2023-07-21T15:46:15.469Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# shipping

+ 14 - 0
docs/docs/reference/typescript-api/state-machine/index.md

@@ -0,0 +1,14 @@
+---
+title: "State Machine"
+weight: 10
+date: 2023-07-21T15:46:14.795Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# state-machine

+ 14 - 0
docs/docs/reference/typescript-api/tax/index.md

@@ -0,0 +1,14 @@
+---
+title: "Tax"
+weight: 10
+date: 2023-07-21T15:46:15.501Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# tax

+ 14 - 0
docs/docs/reference/typescript-api/testing/index.md

@@ -0,0 +1,14 @@
+---
+title: "Testing"
+weight: 10
+date: 2023-07-21T15:46:18.246Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# testing

+ 66 - 0
docs/docs/reference/typescript-api/testing/test-server.md

@@ -0,0 +1,66 @@
+---
+title: "TestServer"
+weight: 10
+date: 2023-07-21T15:46:18.290Z
+showtoc: true
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+## TestServer
+
+<GenerationInfo sourceFile="packages/testing/src/test-server.ts" sourceLine="18" packageName="@vendure/testing" />
+
+A real Vendure server against which the e2e tests should be run.
+
+```ts title="Signature"
+class TestServer {
+  public public app: INestApplication;
+  constructor(vendureConfig: Required<VendureConfig>)
+  async init(options: TestServerOptions) => Promise<void>;
+  async bootstrap() => ;
+  async destroy() => ;
+}
+```
+
+<div className="members-wrapper">
+
+### app
+
+<MemberInfo kind="property" type="INestApplication"   />
+
+
+### constructor
+
+<MemberInfo kind="method" type="(vendureConfig: Required&#60;<a href='/reference/typescript-api/configuration/vendure-config#vendureconfig'>VendureConfig</a>&#62;) => TestServer"   />
+
+
+### init
+
+<MemberInfo kind="method" type="(options: <a href='/reference/typescript-api/testing/test-server-options#testserveroptions'>TestServerOptions</a>) => Promise&#60;void&#62;"   />
+
+Bootstraps an instance of Vendure server and populates the database according to the options
+passed in. Should be called in the `beforeAll` function.
+
+The populated data is saved into an .sqlite file for each test file. On subsequent runs, this file
+is loaded so that the populate step can be skipped, which speeds up the tests significantly.
+### bootstrap
+
+<MemberInfo kind="method" type="() => "   />
+
+Bootstraps a Vendure server instance. Generally the `.init()` method should be used, as that will also
+populate the test data. However, the `bootstrap()` method is sometimes useful in tests which need to
+start and stop a Vendure instance multiple times without re-populating data.
+### destroy
+
+<MemberInfo kind="method" type="() => "   />
+
+Destroy the Vendure server instance and clean up all resources.
+Should be called after all tests have run, e.g. in an `afterAll` function.
+
+
+</div>

+ 14 - 0
docs/docs/reference/typescript-api/worker/index.md

@@ -0,0 +1,14 @@
+---
+title: "Worker"
+weight: 10
+date: 2023-07-21T15:46:14.728Z
+showtoc: false
+generated: true
+---
+<!-- This file was generated from the Vendure source. Do not modify. Instead, re-run the "docs:build" script -->
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+# worker

+ 49 - 0
docs/scraper/config.json

@@ -0,0 +1,49 @@
+{
+  "index_name": "vendure-docs",
+  "start_urls": [
+    "http://host.docker.internal:3000/"
+  ],
+  "sitemap_urls": [
+    "http://host.docker.internal:3000/sitemap.xml"
+  ],
+  "allowed_domains":["host.docker.internal"],
+  "sitemap_alternate_links": true,
+  "stop_urls": [],
+  "selectors": {
+    "lvl0": {
+      "selector": "(//ul[contains(@class,'menu__list')]//a[contains(@class, 'menu__link menu__link--sublist menu__link--active')]/text() | //nav[contains(@class, 'navbar')]//a[contains(@class, 'navbar__link--active')]/text())[last()]",
+      "type": "xpath",
+      "global": true,
+      "default_value": "Documentation"
+    },
+    "lvl1": "article h1, header h1",
+    "lvl2": "article h2",
+    "lvl3": "article h3",
+    "lvl4": "article h4",
+    "lvl5": "article h5, article td:first-child",
+    "lvl6": "article h6",
+    "text": "article p, article li, article td:last-child"
+  },
+  "strip_chars": " .,;:#",
+  "custom_settings": {
+    "separatorsToIndex": "_",
+    "attributesForFaceting": [
+      "language",
+      "version",
+      "type",
+      "docusaurus_tag"
+    ],
+    "attributesToRetrieve": [
+      "hierarchy",
+      "content",
+      "anchor",
+      "url",
+      "url_without_anchor",
+      "type"
+    ]
+  },
+  "conversation_id": [
+    "833762294"
+  ],
+  "nb_hits": 0
+}

+ 31 - 0
docs/src/components/GenerationInfo/styles.module.css

@@ -0,0 +1,31 @@
+.wrapper {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 4px 12px;
+    margin-top: -12px;
+    margin-bottom: 22px;
+}
+
+:root {
+    --color-generation-label-bg: var(--ifm-color-secondary);
+}
+[data-theme='dark'] {
+    --color-generation-label-bg: #444;
+}
+
+.label {
+    display: inline-flex;
+    align-items: center;
+    gap: 6px;
+    border-radius: var(--ifm-badge-border-radius);
+    background-color: var(--color-generation-label-bg);
+    font-size: 75%;
+    font-weight: var(--ifm-font-weight-bold);
+    line-height: 1;
+    padding: var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal);
+}
+
+a.label:hover {
+    text-decoration: none;
+    background-color: var(--color-generation-label-bg);
+}

+ 70 - 0
docs/src/components/HomepageFeatures/index.tsx

@@ -0,0 +1,70 @@
+import React from 'react';
+import clsx from 'clsx';
+import styles from './styles.module.css';
+
+type FeatureItem = {
+  title: string;
+  Svg: React.ComponentType<React.ComponentProps<'svg'>>;
+  description: JSX.Element;
+};
+
+const FeatureList: FeatureItem[] = [
+  {
+    title: 'Easy to Use',
+    Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default,
+    description: (
+      <>
+        Docusaurus was designed from the ground up to be easily installed and
+        used to get your website up and running quickly.
+      </>
+    ),
+  },
+  {
+    title: 'Focus on What Matters',
+    Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default,
+    description: (
+      <>
+        Docusaurus lets you focus on your docs, and we&apos;ll do the chores. Go
+        ahead and move your docs into the <code>docs</code> directory.
+      </>
+    ),
+  },
+  {
+    title: 'Powered by React',
+    Svg: require('@site/static/img/undraw_docusaurus_react.svg').default,
+    description: (
+      <>
+        Extend or customize your website layout by reusing React. Docusaurus can
+        be extended while reusing the same header and footer.
+      </>
+    ),
+  },
+];
+
+function Feature({title, Svg, description}: FeatureItem) {
+  return (
+    <div className={clsx('col col--4')}>
+      <div className="text--center">
+        <Svg className={styles.featureSvg} role="img" />
+      </div>
+      <div className="text--center padding-horiz--md">
+        <h3>{title}</h3>
+        <p>{description}</p>
+      </div>
+    </div>
+  );
+}
+
+export default function HomepageFeatures(): JSX.Element {
+  return (
+    <section className={styles.features}>
+      <div className="container">
+        <div className="row">
+          {FeatureList.map((props, idx) => (
+            <Feature key={idx} {...props} />
+          ))}
+        </div>
+      </div>
+    </section>
+  );
+}

+ 11 - 0
docs/src/components/HomepageFeatures/styles.module.css

@@ -0,0 +1,11 @@
+.features {
+  display: flex;
+  align-items: center;
+  padding: 2rem 0;
+  width: 100%;
+}
+
+.featureSvg {
+  height: 200px;
+  width: 200px;
+}