Skip to content

Commit

Permalink
docs: Fix broken links & a couple of typos
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelbromley committed Jan 22, 2025
1 parent 7e90ddc commit 0e542a9
Show file tree
Hide file tree
Showing 12 changed files with 73 additions and 46 deletions.
7 changes: 4 additions & 3 deletions docs/docs/guides/developer-guide/channel-aware/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ showtoc: true

## Defining channel-aware entities

Making an entity channel-aware means that it can be associated with a specific [Channel](/reference/typescript-api/channel/).
Making an entity channel-aware means that it can be associated with a specific [Channel](/reference/typescript-api/entities/channel).
This is useful when you want to have different data or features for different channels. First you will have to create
an entity ([Define a database entity](/guides/developer-guide/database-entity/)) that implements the `ChannelAware` interface.
This interface requires the entity to provide a `channels` property
Expand All @@ -29,11 +29,12 @@ class ProductRequest extends VendureEntity implements ChannelAware {

@Column()
text: string;
// highlight-start

// highlight-start
@ManyToMany(() => Channel)
@JoinTable()
channels: Channel[];
// highlight-end
// highlight-end
}
```

Expand Down
13 changes: 10 additions & 3 deletions docs/docs/guides/developer-guide/dataloaders/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,12 @@ title: "GraphQL Dataloaders"
showtoc: true
---

[Dataloaders](https://github.com/graphql/dataloader) are used in GraphQL to solve the so called N+1 problem.
[Dataloaders](https://github.com/graphql/dataloader) are used in GraphQL to solve the so called N+1 problem. This is an advanced performance optimization technique you may
want to use in your application if you find certain custom queries are slow or inefficient.

## N+1 problem

Imagine a cart with 20 items. Your implementation requires you to perform an `async` calculation `isSubscription` for each cart item whih executes one or more queries each time it is called and it takes pretty long on each execution. It works fine for a cart with 1 or 2 items. But with more than 15 items, suddenly the cart takes a **lot** longer to load. Especially when the site is busy.
Imagine a cart with 20 items. Your implementation requires you to perform an `async` calculation `isSubscription` for each cart item which executes one or more queries each time it is called, and it takes pretty long on each execution. It works fine for a cart with 1 or 2 items. But with more than 15 items, suddenly the cart takes a **lot** longer to load. Especially when the site is busy.

The reason: the N+1 problem. Your cart is firing of 20 or more queries almost at the same time, adding **significantly** to the GraphQL request. It's like going to the McDonald's drive-in to get 10 hamburgers and getting in line 10 times to get 1 hamburger at a time. It's not efficient.

Expand All @@ -17,7 +18,7 @@ Dataloaders allow you to say: instead of loading each field in the `grapqhl` tre

Dataloaders are generally used on `fieldResolver`s. Often, you will need a specific dataloader for each field resolver.

A Dataloader can return anything: `boolean`, `ProductVariant`, `string`, etc
A Dataloader can return anything: `boolean`, `ProductVariant`, `string`, etc.

## Performance implications

Expand All @@ -42,6 +43,12 @@ export const shopApiExtensions = gql`
`
```

This next part import the `dataloader` package, which you can install with

```sh
npm install dataloader
```

**Dataloader skeleton**

```ts title="src/plugins/my-plugin/api/datalaoder.ts"
Expand Down
58 changes: 38 additions & 20 deletions docs/docs/reference/graphql-api/admin/input-types.md
Original file line number Diff line number Diff line change
Expand Up @@ -1127,6 +1127,8 @@ import MemberDescription from '@site/src/components/MemberDescription';

<div class="graphql-code-line ">price: <a href="/reference/graphql-api/admin/object-types#money">Money</a></div>

<div class="graphql-code-line ">prices: [<a href="/reference/graphql-api/admin/input-types#createproductvariantpriceinput">CreateProductVariantPriceInput</a>]</div>

<div class="graphql-code-line ">taxCategoryId: <a href="/reference/graphql-api/admin/object-types#id">ID</a></div>

<div class="graphql-code-line ">optionIds: [<a href="/reference/graphql-api/admin/object-types#id">ID</a>!]</div>
Expand Down Expand Up @@ -1162,6 +1164,20 @@ import MemberDescription from '@site/src/components/MemberDescription';
<div class="graphql-code-line ">translations: [<a href="/reference/graphql-api/admin/input-types#productoptiontranslationinput">ProductOptionTranslationInput</a>!]!</div>


<div class="graphql-code-line top-level">&#125;</div>
</div>

## CreateProductVariantPriceInput

<div class="graphql-code-block">
<div class="graphql-code-line top-level">input <span class="graphql-code-identifier">CreateProductVariantPriceInput</span> &#123;</div>
<div class="graphql-code-line ">currencyCode: <a href="/reference/graphql-api/admin/enums#currencycode">CurrencyCode</a>!</div>

<div class="graphql-code-line ">price: <a href="/reference/graphql-api/admin/object-types#money">Money</a>!</div>

<div class="graphql-code-line ">customFields: <a href="/reference/graphql-api/admin/object-types#json">JSON</a></div>


<div class="graphql-code-line top-level">&#125;</div>
</div>

Expand Down Expand Up @@ -2629,25 +2645,6 @@ import MemberDescription from '@site/src/components/MemberDescription';
<div class="graphql-code-line ">filterOperator: <a href="/reference/graphql-api/admin/enums#logicaloperator">LogicalOperator</a></div>


<div class="graphql-code-line top-level">&#125;</div>
</div>

## ProductVariantPriceInput

<div class="graphql-code-block">
<div class="graphql-code-line top-level comment">"""</div>
<div class="graphql-code-line top-level comment">Used to set up update the price of a ProductVariant in a particular Channel.</div>

<div class="graphql-code-line top-level comment">If the <code>delete</code> flag is `true`, the price will be deleted for the given Channel.</div>
<div class="graphql-code-line top-level comment">"""</div>
<div class="graphql-code-line top-level">input <span class="graphql-code-identifier">ProductVariantPriceInput</span> &#123;</div>
<div class="graphql-code-line ">currencyCode: <a href="/reference/graphql-api/admin/enums#currencycode">CurrencyCode</a>!</div>

<div class="graphql-code-line ">price: <a href="/reference/graphql-api/admin/object-types#money">Money</a>!</div>

<div class="graphql-code-line ">delete: <a href="/reference/graphql-api/admin/object-types#boolean">Boolean</a></div>


<div class="graphql-code-line top-level">&#125;</div>
</div>

Expand Down Expand Up @@ -4216,7 +4213,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
<div class="graphql-code-line comment">"""</div>
<div class="graphql-code-line comment">Allows multiple prices to be set for the ProductVariant in different currencies.</div>
<div class="graphql-code-line comment">"""</div>
<div class="graphql-code-line ">prices: [<a href="/reference/graphql-api/admin/input-types#productvariantpriceinput">ProductVariantPriceInput</a>!]</div>
<div class="graphql-code-line ">prices: [<a href="/reference/graphql-api/admin/input-types#updateproductvariantpriceinput">UpdateProductVariantPriceInput</a>!]</div>

<div class="graphql-code-line ">featuredAssetId: <a href="/reference/graphql-api/admin/object-types#id">ID</a></div>

Expand All @@ -4235,6 +4232,27 @@ import MemberDescription from '@site/src/components/MemberDescription';
<div class="graphql-code-line ">customFields: <a href="/reference/graphql-api/admin/object-types#json">JSON</a></div>


<div class="graphql-code-line top-level">&#125;</div>
</div>

## UpdateProductVariantPriceInput

<div class="graphql-code-block">
<div class="graphql-code-line top-level comment">"""</div>
<div class="graphql-code-line top-level comment">Used to set up update the price of a ProductVariant in a particular Channel.</div>

<div class="graphql-code-line top-level comment">If the <code>delete</code> flag is `true`, the price will be deleted for the given Channel.</div>
<div class="graphql-code-line top-level comment">"""</div>
<div class="graphql-code-line top-level">input <span class="graphql-code-identifier">UpdateProductVariantPriceInput</span> &#123;</div>
<div class="graphql-code-line ">currencyCode: <a href="/reference/graphql-api/admin/enums#currencycode">CurrencyCode</a>!</div>

<div class="graphql-code-line ">price: <a href="/reference/graphql-api/admin/object-types#money">Money</a>!</div>

<div class="graphql-code-line ">delete: <a href="/reference/graphql-api/admin/object-types#boolean">Boolean</a></div>

<div class="graphql-code-line ">customFields: <a href="/reference/graphql-api/admin/object-types#json">JSON</a></div>


<div class="graphql-code-line top-level">&#125;</div>
</div>

Expand Down
2 changes: 1 addition & 1 deletion docs/docs/reference/typescript-api/common/currency-code.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';

## CurrencyCode

<GenerationInfo sourceFile="packages/common/src/generated-types.ts" sourceLine="994" packageName="@vendure/common" />
<GenerationInfo sourceFile="packages/common/src/generated-types.ts" sourceLine="1001" packageName="@vendure/common" />

ISO 4217 currency code

Expand Down
2 changes: 1 addition & 1 deletion docs/docs/reference/typescript-api/common/job-state.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';

## JobState

<GenerationInfo sourceFile="packages/common/src/generated-types.ts" sourceLine="2238" packageName="@vendure/common" />
<GenerationInfo sourceFile="packages/common/src/generated-types.ts" sourceLine="2245" packageName="@vendure/common" />

The state of a Job in the JobQueue

Expand Down
2 changes: 1 addition & 1 deletion docs/docs/reference/typescript-api/common/language-code.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';

## LanguageCode

<GenerationInfo sourceFile="packages/common/src/generated-types.ts" sourceLine="2256" packageName="@vendure/common" />
<GenerationInfo sourceFile="packages/common/src/generated-types.ts" sourceLine="2263" packageName="@vendure/common" />

Languages in the form of a ISO 639-1 language code with optional
region or script modifier (e.g. de_AT). The selection available is based
Expand Down
2 changes: 1 addition & 1 deletion docs/docs/reference/typescript-api/common/permission.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';

## Permission

<GenerationInfo sourceFile="packages/common/src/generated-types.ts" sourceLine="4422" packageName="@vendure/common" />
<GenerationInfo sourceFile="packages/common/src/generated-types.ts" sourceLine="4429" packageName="@vendure/common" />

Permissions for administrators and customers. Used to control access to
GraphQL resolvers via the <a href='/reference/typescript-api/request/allow-decorator#allow'>Allow</a> decorator.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,15 @@ type DefaultFormConfigHash = {
'product-selector-form-input': Record<string, never>;
'relation-form-input': Record<string, never>;
'rich-text-form-input': Record<string, never>;
'select-form-input': {
options?: Array<{ value: string; label?: Array<Omit<LocalizedString, '__typename'>> }>;
'select-form-input': {
options?: Array<{ value: string; label?: Array<Omit<LocalizedString, '__typename'>> }>;
};
'text-form-input': { prefix?: string; suffix?: string };
'textarea-form-input': {
spellcheck?: boolean;
'textarea-form-input': {
spellcheck?: boolean;
};
'product-multi-form-input': {
selectionMode?: 'product' | 'variant';
'product-multi-form-input': {
selectionMode?: 'product' | 'variant';
};
'combination-mode-form-input': Record<string, never>;
'struct-form-input': Record<string, never>;
Expand Down Expand Up @@ -108,7 +108,7 @@ type DefaultFormConfigHash = {
### 'select-form-input'
<MemberInfo kind="property" type={`{ options?: Array&#60;{ value: string; label?: Array&#60;Omit&#60;LocalizedString, '__typename'&#62;&#62; }&#62;; }`} />
<MemberInfo kind="property" type={`{ options?: Array&#60;{ value: string; label?: Array&#60;Omit&#60;LocalizedString, '__typename'&#62;&#62; }&#62;; }`} />
### 'text-form-input'
Expand All @@ -118,12 +118,12 @@ type DefaultFormConfigHash = {
### 'textarea-form-input'
<MemberInfo kind="property" type={`{ spellcheck?: boolean; }`} />
<MemberInfo kind="property" type={`{ spellcheck?: boolean; }`} />
### 'product-multi-form-input'
<MemberInfo kind="property" type={`{ selectionMode?: 'product' | 'variant'; }`} />
<MemberInfo kind="property" type={`{ selectionMode?: 'product' | 'variant'; }`} />
### 'combination-mode-form-input'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ datetime | datetime (m,s), timestamp (p) | DateTime
struct | json (m), jsonb (p), text (s) | JSON
relation | many-to-one / many-to-many relation | As specified in config

Additionally, the CustomFieldType also dictates which [configuration options](/reference/typescript-api/custom-fields/#custom-field-config-properties)
Additionally, the CustomFieldType also dictates which [configuration options](/guides/developer-guide/custom-fields/#custom-field-config-properties)
are available for that custom field.

```ts title="Signature"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,13 @@ class ChannelService {
<MemberInfo kind="method" type={`(entity: T, ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>) => Promise&#60;T&#62;`} />

Assigns a ChannelAware entity to the default Channel as well as any channel
specified in the RequestContext.
specified in the RequestContext. This method will not save the entity to the database, but
assigns the `channels` property of the entity.
### assignToChannels

<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, entityType: Type&#60;T&#62;, entityId: <a href='/reference/typescript-api/common/id#id'>ID</a>, channelIds: <a href='/reference/typescript-api/common/id#id'>ID</a>[]) => Promise&#60;T&#62;`} />

Assigns the entity to the given Channels and saves.
Assigns the entity to the given Channels and saves all changes to the database.
### removeFromChannels

<MemberInfo kind="method" type={`(ctx: <a href='/reference/typescript-api/request/request-context#requestcontext'>RequestContext</a>, entityType: Type&#60;T&#62;, entityId: <a href='/reference/typescript-api/common/id#id'>ID</a>, channelIds: <a href='/reference/typescript-api/common/id#id'>ID</a>[]) => Promise&#60;T | undefined&#62;`} />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import MemberDescription from '@site/src/components/MemberDescription';

## ProductVariantService

<GenerationInfo sourceFile="packages/core/src/service/services/product-variant.service.ts" sourceLine="68" packageName="@vendure/core" />
<GenerationInfo sourceFile="packages/core/src/service/services/product-variant.service.ts" sourceLine="69" packageName="@vendure/core" />

Contains methods relating to <a href='/reference/typescript-api/entities/product-variant#productvariant'>ProductVariant</a> entities.

Expand All @@ -34,7 +34,7 @@ class ProductVariantService {
getFulfillableStockLevel(ctx: RequestContext, variant: ProductVariant) => Promise<number>;
create(ctx: RequestContext, input: CreateProductVariantInput[]) => Promise<Array<Translated<ProductVariant>>>;
update(ctx: RequestContext, input: UpdateProductVariantInput[]) => Promise<Array<Translated<ProductVariant>>>;
createOrUpdateProductVariantPrice(ctx: RequestContext, productVariantId: ID, price: number, channelId: ID, currencyCode?: CurrencyCode) => Promise<ProductVariantPrice>;
createOrUpdateProductVariantPrice(ctx: RequestContext, productVariantId: ID, price: number, channelId: ID, currencyCode?: CurrencyCode, customFields?: CustomFieldsObject) => Promise<ProductVariantPrice>;
deleteProductVariantPrice(ctx: RequestContext, variantId: ID, channelId: ID, currencyCode: CurrencyCode) => ;
softDelete(ctx: RequestContext, id: ID | ID[]) => Promise<DeletionResponse>;
hydratePriceFields(ctx: RequestContext, variant: ProductVariant, priceField: F) => Promise<ProductVariant[F]>;
Expand Down Expand Up @@ -139,7 +139,7 @@ for those variants which are tracking inventory.

### 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;`} />
<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>, customFields?: CustomFieldsObject) => 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.
Expand Down
2 changes: 1 addition & 1 deletion packages/common/src/shared-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ export type ID = string | number;
* struct | json (m), jsonb (p), text (s) | JSON
* relation | many-to-one / many-to-many relation | As specified in config
*
* Additionally, the CustomFieldType also dictates which [configuration options](/reference/typescript-api/custom-fields/#custom-field-config-properties)
* Additionally, the CustomFieldType also dictates which [configuration options](/guides/developer-guide/custom-fields/#custom-field-config-properties)
* are available for that custom field.
*
* @docsCategory custom-fields
Expand Down

0 comments on commit 0e542a9

Please sign in to comment.