@unchainedshop/api 4.8.26 → 4.8.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/lib/adminUiPlugins.d.ts +97 -0
  2. package/lib/adminUiPlugins.js +164 -0
  3. package/lib/auth.d.ts +36 -0
  4. package/lib/auth.js +167 -0
  5. package/lib/express/mountPluginRoutes.d.ts +3 -0
  6. package/lib/express/mountPluginRoutes.js +59 -0
  7. package/lib/express/mountRoutes.d.ts +3 -0
  8. package/lib/express/mountRoutes.js +57 -0
  9. package/lib/fastify/mountPluginRoutes.d.ts +3 -0
  10. package/lib/fastify/mountPluginRoutes.js +62 -0
  11. package/lib/fastify/mountRoutes.d.ts +3 -0
  12. package/lib/fastify/mountRoutes.js +60 -0
  13. package/lib/handlers/createBackchannelLogoutHandler.d.ts +4 -0
  14. package/lib/handlers/createBackchannelLogoutHandler.js +170 -0
  15. package/lib/middleware/createAuthMiddleware.d.ts +29 -0
  16. package/lib/middleware/createAuthMiddleware.js +91 -0
  17. package/lib/resolvers/mutations/accounts/logoutAllSessions.d.ts +6 -0
  18. package/lib/resolvers/mutations/accounts/logoutAllSessions.js +17 -0
  19. package/lib/resolvers/mutations/bulk/bulkAssignProductsToAssortment.d.ts +10 -0
  20. package/lib/resolvers/mutations/bulk/bulkAssignProductsToAssortment.js +18 -0
  21. package/lib/resolvers/mutations/bulk/bulkOperation.d.ts +12 -0
  22. package/lib/resolvers/mutations/bulk/bulkOperation.js +14 -0
  23. package/lib/resolvers/mutations/bulk/bulkRemoveAssortments.d.ts +9 -0
  24. package/lib/resolvers/mutations/bulk/bulkRemoveAssortments.js +7 -0
  25. package/lib/resolvers/mutations/bulk/bulkRemoveFilters.d.ts +9 -0
  26. package/lib/resolvers/mutations/bulk/bulkRemoveFilters.js +9 -0
  27. package/lib/resolvers/mutations/bulk/bulkRemoveProducts.d.ts +9 -0
  28. package/lib/resolvers/mutations/bulk/bulkRemoveProducts.js +9 -0
  29. package/lib/resolvers/mutations/bulk/bulkRemoveUsers.d.ts +9 -0
  30. package/lib/resolvers/mutations/bulk/bulkRemoveUsers.js +7 -0
  31. package/lib/resolvers/mutations/bulk/bulkSetAssortmentActive.d.ts +10 -0
  32. package/lib/resolvers/mutations/bulk/bulkSetAssortmentActive.js +9 -0
  33. package/lib/resolvers/mutations/bulk/bulkSetFilterActive.d.ts +10 -0
  34. package/lib/resolvers/mutations/bulk/bulkSetFilterActive.js +10 -0
  35. package/lib/resolvers/mutations/bulk/bulkSetProductStatus.d.ts +10 -0
  36. package/lib/resolvers/mutations/bulk/bulkSetProductStatus.js +17 -0
  37. package/lib/resolvers/mutations/bulk/bulkSetUserRoles.d.ts +10 -0
  38. package/lib/resolvers/mutations/bulk/bulkSetUserRoles.js +14 -0
  39. package/lib/resolvers/mutations/bulk/bulkUpdateAssortmentTags.d.ts +11 -0
  40. package/lib/resolvers/mutations/bulk/bulkUpdateAssortmentTags.js +10 -0
  41. package/lib/resolvers/mutations/bulk/bulkUpdateProductTags.d.ts +11 -0
  42. package/lib/resolvers/mutations/bulk/bulkUpdateProductTags.js +7 -0
  43. package/lib/resolvers/mutations/bulk/bulkUpdateUserTags.d.ts +11 -0
  44. package/lib/resolvers/mutations/bulk/bulkUpdateUserTags.js +7 -0
  45. package/lib/resolvers/queries/search/globalSearch.d.ts +36 -0
  46. package/lib/resolvers/queries/search/globalSearch.js +200 -0
  47. package/lib/resolvers/type/global-search-result-types.d.ts +3 -0
  48. package/lib/resolvers/type/global-search-result-types.js +15 -0
  49. package/lib/resolvers/type/order/order-payment-base.d.ts +7 -0
  50. package/lib/resolvers/type/order/order-payment-base.js +14 -0
  51. package/lib/schema/types/common.d.ts +2 -0
  52. package/lib/schema/types/common.js +19 -0
  53. package/lib/utils/mapServiceError.d.ts +1 -0
  54. package/lib/utils/mapServiceError.js +59 -0
  55. package/lib/utils/maskError.d.ts +1 -0
  56. package/lib/utils/maskError.js +22 -0
  57. package/package.json +24 -24
@@ -0,0 +1,11 @@
1
+ import type { Context } from '../../../context.ts';
2
+ export default function bulkUpdateProductTags(root: never, { productIds, add, remove }: {
3
+ productIds: string[];
4
+ add?: string[];
5
+ remove?: string[];
6
+ }, { modules, userId }: Context): Promise<{
7
+ successIds: string[];
8
+ successCount: number;
9
+ failedIds: string[];
10
+ failedCount: number;
11
+ }>;
@@ -0,0 +1,7 @@
1
+ import { log } from '@unchainedshop/logger';
2
+ import { createBulkOperationResult, normalizeBulkIds } from "./bulkOperation.js";
3
+ export default async function bulkUpdateProductTags(root, { productIds, add, remove }, { modules, userId }) {
4
+ log(`mutation bulkUpdateProductTags for ${productIds.length} products`, { userId });
5
+ const result = await modules.products.bulkUpdateTags(normalizeBulkIds(productIds), { add, remove });
6
+ return createBulkOperationResult(result);
7
+ }
@@ -0,0 +1,11 @@
1
+ import type { Context } from '../../../context.ts';
2
+ export default function bulkUpdateUserTags(root: never, { userIds, add, remove }: {
3
+ userIds: string[];
4
+ add?: string[];
5
+ remove?: string[];
6
+ }, { modules, userId }: Context): Promise<{
7
+ successIds: string[];
8
+ successCount: number;
9
+ failedIds: string[];
10
+ failedCount: number;
11
+ }>;
@@ -0,0 +1,7 @@
1
+ import { log } from '@unchainedshop/logger';
2
+ import { createBulkOperationResult, normalizeBulkIds } from "./bulkOperation.js";
3
+ export default async function bulkUpdateUserTags(root, { userIds, add, remove }, { modules, userId }) {
4
+ log(`mutation bulkUpdateUserTags for ${userIds.length} users`, { userId });
5
+ const result = await modules.users.bulkUpdateTags(normalizeBulkIds(userIds), { add, remove });
6
+ return createBulkOperationResult(result);
7
+ }
@@ -0,0 +1,36 @@
1
+ import type { Context } from '../../../context.ts';
2
+ import type { Product } from '@unchainedshop/core-products';
3
+ import type { User } from '@unchainedshop/core-users';
4
+ import type { Order } from '@unchainedshop/core-orders';
5
+ import type { Assortment } from '@unchainedshop/core-assortments';
6
+ import type { Filter } from '@unchainedshop/core-filters';
7
+ import type { Enrollment } from '@unchainedshop/core-enrollments';
8
+ import type { Quotation } from '@unchainedshop/core-quotations';
9
+ import type { Work } from '@unchainedshop/core-worker';
10
+ type SearchableEntity = 'PRODUCT' | 'USER' | 'ORDER' | 'ASSORTMENT' | 'FILTER' | 'ENROLLMENT' | 'QUOTATION' | 'WORK';
11
+ interface TypeLimitInput {
12
+ type: SearchableEntity;
13
+ limit: number;
14
+ }
15
+ type SearchResultItem = (Product | User | Order | Assortment | Filter | Enrollment | Quotation | Work) & {
16
+ __typename: string;
17
+ };
18
+ export default function globalSearch(root: never, params: {
19
+ query: string;
20
+ types?: SearchableEntity[];
21
+ limit?: number;
22
+ typeLimits?: TypeLimitInput[];
23
+ includeDraftProducts?: boolean;
24
+ includeInactiveAssortments?: boolean;
25
+ includeInactiveFilters?: boolean;
26
+ includeGuestUsers?: boolean;
27
+ includeCarts?: boolean;
28
+ }, context: Context): Promise<{
29
+ results: SearchResultItem[];
30
+ counts: {
31
+ type: SearchableEntity;
32
+ totalCount: number;
33
+ authorized: boolean;
34
+ }[];
35
+ }>;
36
+ export {};
@@ -0,0 +1,200 @@
1
+ import { log } from '@unchainedshop/logger';
2
+ import { checkAction } from "../../../acl.js";
3
+ import { actions } from "../../../roles/index.js";
4
+ const ALL_TYPES = [
5
+ 'PRODUCT',
6
+ 'USER',
7
+ 'ORDER',
8
+ 'ASSORTMENT',
9
+ 'FILTER',
10
+ 'ENROLLMENT',
11
+ 'QUOTATION',
12
+ 'WORK',
13
+ ];
14
+ const DEFAULT_LIMIT = 5;
15
+ const MAX_LIMIT = 50;
16
+ const typeActionMap = {
17
+ PRODUCT: actions.viewProducts,
18
+ USER: actions.viewUsers,
19
+ ORDER: actions.viewOrders,
20
+ ASSORTMENT: actions.viewAssortments,
21
+ FILTER: actions.viewFilters,
22
+ ENROLLMENT: actions.viewEnrollments,
23
+ QUOTATION: actions.viewQuotations,
24
+ WORK: actions.viewWorkQueue,
25
+ };
26
+ function getLimitForType(type, defaultLimit, typeLimits) {
27
+ const requestedLimit = typeLimits?.find((typeLimit) => typeLimit.type === type)?.limit ?? defaultLimit;
28
+ return Math.min(MAX_LIMIT, Math.max(1, requestedLimit));
29
+ }
30
+ function getSearchParams(type, queryString, limit, options) {
31
+ switch (type) {
32
+ case 'PRODUCT':
33
+ return {
34
+ queryString,
35
+ limit,
36
+ offset: 0,
37
+ includeDrafts: options.includeDraftProducts,
38
+ };
39
+ case 'USER':
40
+ return {
41
+ queryString,
42
+ limit,
43
+ offset: 0,
44
+ includeGuests: options.includeGuestUsers,
45
+ };
46
+ case 'ORDER':
47
+ return {
48
+ queryString,
49
+ limit,
50
+ offset: 0,
51
+ includeCarts: options.includeCarts,
52
+ };
53
+ case 'ASSORTMENT':
54
+ return {
55
+ queryString,
56
+ limit,
57
+ offset: 0,
58
+ includeInactive: options.includeInactiveAssortments,
59
+ };
60
+ case 'FILTER':
61
+ return {
62
+ queryString,
63
+ limit,
64
+ offset: 0,
65
+ includeInactive: options.includeInactiveFilters,
66
+ };
67
+ case 'ENROLLMENT':
68
+ case 'QUOTATION':
69
+ return { queryString, limit, offset: 0 };
70
+ case 'WORK':
71
+ return { queryString, limit, skip: 0 };
72
+ }
73
+ }
74
+ const typeNameMap = {
75
+ PRODUCT: 'Product',
76
+ USER: 'User',
77
+ ORDER: 'Order',
78
+ ASSORTMENT: 'Assortment',
79
+ FILTER: 'Filter',
80
+ ENROLLMENT: 'Enrollment',
81
+ QUOTATION: 'Quotation',
82
+ WORK: 'Work',
83
+ };
84
+ async function searchType(type, queryString, limit, modules, options) {
85
+ let results;
86
+ switch (type) {
87
+ case 'PRODUCT':
88
+ results = await modules.products.findProducts({
89
+ queryString,
90
+ limit,
91
+ offset: 0,
92
+ includeDrafts: options.includeDraftProducts,
93
+ });
94
+ break;
95
+ case 'USER':
96
+ results = await modules.users.findUsers({
97
+ queryString,
98
+ limit,
99
+ offset: 0,
100
+ includeGuests: options.includeGuestUsers,
101
+ });
102
+ break;
103
+ case 'ORDER':
104
+ results = await modules.orders.findOrders({
105
+ queryString,
106
+ limit,
107
+ offset: 0,
108
+ includeCarts: options.includeCarts,
109
+ });
110
+ break;
111
+ case 'ASSORTMENT':
112
+ results = await modules.assortments.findAssortments({
113
+ queryString,
114
+ limit,
115
+ offset: 0,
116
+ includeInactive: options.includeInactiveAssortments,
117
+ });
118
+ break;
119
+ case 'FILTER':
120
+ results = await modules.filters.findFilters({
121
+ queryString,
122
+ limit,
123
+ offset: 0,
124
+ includeInactive: options.includeInactiveFilters,
125
+ });
126
+ break;
127
+ case 'ENROLLMENT':
128
+ results = await modules.enrollments.findEnrollments({ queryString, limit, offset: 0 });
129
+ break;
130
+ case 'QUOTATION':
131
+ results = await modules.quotations.findQuotations({ queryString, limit, offset: 0 });
132
+ break;
133
+ case 'WORK':
134
+ results = await modules.worker.findWorkQueue({ queryString, limit, skip: 0 });
135
+ break;
136
+ default:
137
+ return [];
138
+ }
139
+ const __typename = typeNameMap[type];
140
+ return results.map((r) => ({ ...r, __typename }));
141
+ }
142
+ async function countType(type, queryString, modules, options) {
143
+ switch (type) {
144
+ case 'PRODUCT':
145
+ return modules.products.count({ queryString, includeDrafts: options.includeDraftProducts });
146
+ case 'USER':
147
+ return modules.users.count({ queryString, includeGuests: options.includeGuestUsers });
148
+ case 'ORDER':
149
+ return modules.orders.count({ queryString, includeCarts: options.includeCarts });
150
+ case 'ASSORTMENT':
151
+ return modules.assortments.count({
152
+ queryString,
153
+ includeInactive: options.includeInactiveAssortments,
154
+ });
155
+ case 'FILTER':
156
+ return modules.filters.count({ queryString, includeInactive: options.includeInactiveFilters });
157
+ case 'ENROLLMENT':
158
+ return modules.enrollments.count({ queryString });
159
+ case 'QUOTATION':
160
+ return modules.quotations.count({ queryString });
161
+ case 'WORK':
162
+ return modules.worker.count({ queryString });
163
+ default:
164
+ return 0;
165
+ }
166
+ }
167
+ async function checkTypeAuthorization(context, root, types, queryString, defaultLimit, typeLimits, options) {
168
+ await Promise.all(types.map((type) => checkAction(context, typeActionMap[type], [
169
+ root,
170
+ getSearchParams(type, queryString, getLimitForType(type, defaultLimit, typeLimits), options),
171
+ ])));
172
+ }
173
+ export default async function globalSearch(root, params, context) {
174
+ const { query: queryString, types, limit = DEFAULT_LIMIT, typeLimits, includeDraftProducts = true, includeInactiveAssortments = true, includeInactiveFilters = true, includeGuestUsers = false, includeCarts = false, } = params;
175
+ const { modules, userId } = context;
176
+ const sanitizedQuery = queryString?.trim().slice(0, 200) || '';
177
+ const requestedTypes = [...new Set(types?.length ? types : ALL_TYPES)];
178
+ const searchOptions = {
179
+ includeDraftProducts,
180
+ includeInactiveAssortments,
181
+ includeInactiveFilters,
182
+ includeGuestUsers,
183
+ includeCarts,
184
+ };
185
+ await checkTypeAuthorization(context, root, requestedTypes, sanitizedQuery, limit, typeLimits, searchOptions);
186
+ if (!sanitizedQuery)
187
+ return { results: [], counts: [] };
188
+ log(`query globalSearch: "${sanitizedQuery}" types: ${requestedTypes.join(',')}`, { userId });
189
+ const [resultsByType, countsByType] = await Promise.all([
190
+ Promise.all(requestedTypes.map((type) => searchType(type, sanitizedQuery, getLimitForType(type, limit, typeLimits), modules, searchOptions))),
191
+ Promise.all(requestedTypes.map((type) => countType(type, sanitizedQuery, modules, searchOptions))),
192
+ ]);
193
+ const results = resultsByType.flat();
194
+ const counts = requestedTypes.map((type, i) => ({
195
+ type,
196
+ totalCount: countsByType[i],
197
+ authorized: true,
198
+ }));
199
+ return { results, counts };
200
+ }
@@ -0,0 +1,3 @@
1
+ export declare const GlobalSearchResult: {
2
+ __resolveType(obj: Record<string, any>): string;
3
+ };
@@ -0,0 +1,15 @@
1
+ import { ProductType } from '@unchainedshop/core-products';
2
+ const productTypeMap = {
3
+ [ProductType.CONFIGURABLE_PRODUCT]: 'ConfigurableProduct',
4
+ [ProductType.BUNDLE_PRODUCT]: 'BundleProduct',
5
+ [ProductType.PLAN_PRODUCT]: 'PlanProduct',
6
+ [ProductType.TOKENIZED_PRODUCT]: 'TokenizedProduct',
7
+ };
8
+ export const GlobalSearchResult = {
9
+ __resolveType(obj) {
10
+ if (obj.__typename === 'Product') {
11
+ return productTypeMap[obj.type] || 'SimpleProduct';
12
+ }
13
+ return obj.__typename;
14
+ },
15
+ };
@@ -0,0 +1,7 @@
1
+ import type { OrderPayment } from '@unchainedshop/core-orders';
2
+ import type { Context } from '../../../context.ts';
3
+ export declare const OrderPaymentBase: {
4
+ status(obj: OrderPayment, _: never, { modules }: Context): import("@unchainedshop/core-orders").OrderPaymentStatus;
5
+ provider(obj: OrderPayment, _: never, { loaders }: Context): Promise<import("@unchainedshop/core-payment").PaymentProvider>;
6
+ discounts(obj: OrderPayment, _: never, { loaders, services }: Context): Promise<import("@unchainedshop/core/lib/services/getPaymentDiscounts.js").PaymentDiscountPrice[]>;
7
+ };
@@ -0,0 +1,14 @@
1
+ export const OrderPaymentBase = {
2
+ status(obj, _, { modules }) {
3
+ return modules.orders.payments.normalizedStatus(obj);
4
+ },
5
+ async provider(obj, _, { loaders }) {
6
+ return loaders.paymentProviderLoader.load({
7
+ paymentProviderId: obj.paymentProviderId,
8
+ });
9
+ },
10
+ async discounts(obj, _, { loaders, services }) {
11
+ const order = await loaders.orderLoader.load({ orderId: obj.orderId });
12
+ return services.payment.getPaymentDiscounts(obj, order.currencyCode);
13
+ },
14
+ };
@@ -0,0 +1,2 @@
1
+ declare const _default: string[];
2
+ export default _default;
@@ -0,0 +1,19 @@
1
+ export default [
2
+ `
3
+ type SuccessResponse @cacheControl(maxAge: 0, scope: PRIVATE) {
4
+ success: Boolean
5
+ }
6
+
7
+ type BulkOperationResult @cacheControl(maxAge: 0, scope: PRIVATE) {
8
+ successIds: [ID!]!
9
+ successCount: Int!
10
+ failedCount: Int!
11
+ failedIds: [ID!]!
12
+ }
13
+
14
+ enum SortDirection {
15
+ ASC
16
+ DESC
17
+ }
18
+ `,
19
+ ];
@@ -0,0 +1 @@
1
+ export declare function mapServiceError(error: unknown): never;
@@ -0,0 +1,59 @@
1
+ import { GraphQLError } from 'graphql';
2
+ import * as errors from "../errors.js";
3
+ const errorMap = {
4
+ ProductNotFoundError: errors.ProductNotFoundError,
5
+ ProductWrongStatusError: errors.ProductWrongStatusError,
6
+ ProductWrongTypeError: errors.ProductWrongTypeError,
7
+ CyclicProductBundlingNotSupportedError: errors.CyclicProductBundlingNotSupportedError,
8
+ ProductVariationInfinityLoop: errors.ProductVariationInfinityLoop,
9
+ ProductVariationVectorInvalid: errors.ProductVariationVectorInvalid,
10
+ ProductVariationVectorAlreadySet: errors.ProductVariationVectorAlreadySet,
11
+ ProductLinkedToActiveBundleError: errors.ProductLinkedToActiveBundleError,
12
+ ProductLinkedToActiveVariationError: errors.ProductLinkedToActiveVariationError,
13
+ ProductLinkedToQuotationError: errors.ProductLinkedToQuotationError,
14
+ ProductLinkedToEnrollmentError: errors.ProductLinkedToEnrollmentError,
15
+ EnrollmentNotFoundError: errors.EnrollmentNotFoundError,
16
+ EnrollmentWrongStatusError: errors.EnrollmentWrongStatusError,
17
+ EnrollmentPlanUpdateNotAllowedError: errors.EnrollmentWrongStatusError,
18
+ OrderNotFoundError: errors.OrderNotFoundError,
19
+ OrderWrongStatusError: errors.OrderWrongStatusError,
20
+ OrderItemNotFoundError: errors.OrderItemNotFoundError,
21
+ OrderQuantityTooLowError: errors.OrderQuantityTooLowError,
22
+ OrderPaymentNotFoundError: errors.OrderPaymentNotFoundError,
23
+ OrderWrongPaymentStatusError: errors.OrderWrongPaymentStatusError,
24
+ OrderDeliveryNotFoundError: errors.OrderDeliveryNotFoundError,
25
+ OrderWrongDeliveryStatusError: errors.OrderWrongDeliveryStatusError,
26
+ QuotationNotFoundError: errors.QuotationNotFoundError,
27
+ QuotationWrongStatusError: errors.QuotationWrongStatusError,
28
+ QuotationItemConfigurationError: errors.QuotationItemConfigurationError,
29
+ BookmarkNotFoundError: errors.BookmarkNotFoundError,
30
+ MultipleBookmarksFound: errors.MultipleBookmarksFound,
31
+ BookmarkAlreadyExistsError: errors.BookmarkAlreadyExistsError,
32
+ OrderDiscountCodeAlreadyPresentError: errors.OrderDiscountCodeAlreadyPresentError,
33
+ OrderDiscountCodeNotValidError: errors.OrderDiscountCodeNotValidError,
34
+ UserNotFoundError: errors.UserNotFoundError,
35
+ ImpersonatingAdminUserError: errors.ImpersonatingAdminUserError,
36
+ InvalidEmailVerificationTokenError: errors.InvalidEmailVerificationTokenError,
37
+ UsernameOrEmailRequiredError: errors.UsernameOrEmailRequiredError,
38
+ PasswordOrWebAuthnPublicKeyRequiredError: errors.PasswordOrWebAuthnPublicKeyRequiredError,
39
+ EmailAlreadyExistsError: errors.EmailAlreadyExistsError,
40
+ UsernameAlreadyExistsError: errors.UsernameAlreadyExistsError,
41
+ PasswordInvalidError: errors.PasswordInvalidError,
42
+ WebAuthnVerificationFailedError: errors.WebAuthnVerificationFailedError,
43
+ AuthOperationFailedError: errors.AuthOperationFailedError,
44
+ InvalidCredentialsError: errors.InvalidCredentialsError,
45
+ InvalidResetTokenError: errors.InvalidResetTokenError,
46
+ InvalidIdError: errors.InvalidIdError,
47
+ ProviderConfigurationInvalid: errors.ProviderConfigurationInvalid,
48
+ };
49
+ export function mapServiceError(error) {
50
+ if (error instanceof GraphQLError) {
51
+ throw error;
52
+ }
53
+ const serviceError = error;
54
+ const ErrorClass = serviceError.code ? errorMap[serviceError.code] : undefined;
55
+ if (ErrorClass) {
56
+ throw new ErrorClass(serviceError.data);
57
+ }
58
+ throw error;
59
+ }
@@ -0,0 +1 @@
1
+ export declare function createMaskError(isDev: boolean): (error: unknown, message: string) => Error;
@@ -0,0 +1,22 @@
1
+ import { GraphQLError } from 'graphql';
2
+ import { maskError as yogaMaskError } from 'graphql-yoga';
3
+ function isKnownError(error) {
4
+ return error instanceof Error && 'code' in error && typeof error.code === 'string';
5
+ }
6
+ export function createMaskError(isDev) {
7
+ return function maskError(error, message) {
8
+ const originalError = error instanceof GraphQLError ? error.originalError || error : error;
9
+ if (error instanceof GraphQLError && error.extensions?.code) {
10
+ return error;
11
+ }
12
+ if (isKnownError(originalError)) {
13
+ return new GraphQLError(originalError.message, {
14
+ extensions: {
15
+ code: originalError.code,
16
+ ...(originalError.data || {}),
17
+ },
18
+ });
19
+ }
20
+ return yogaMaskError(error, message, isDev);
21
+ };
22
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@unchainedshop/api",
3
3
  "description": "GraphQL API layer for the Unchained Engine with Express/Fastify adapters and MCP server",
4
- "version": "4.8.26",
4
+ "version": "4.8.27",
5
5
  "main": "lib/api-index.js",
6
6
  "types": "lib/api-index.d.ts",
7
7
  "type": "module",
@@ -125,29 +125,29 @@
125
125
  },
126
126
  "dependencies": {
127
127
  "@envelop/core": "^5.6.0",
128
- "@unchainedshop/core": "^4.8.12",
129
- "@unchainedshop/core-assortments": "^4.8.12",
130
- "@unchainedshop/core-bookmarks": "^4.8.12",
131
- "@unchainedshop/core-countries": "^4.8.12",
132
- "@unchainedshop/core-currencies": "^4.8.12",
133
- "@unchainedshop/core-delivery": "^4.8.12",
134
- "@unchainedshop/core-enrollments": "^4.8.12",
135
- "@unchainedshop/core-events": "^4.8.12",
136
- "@unchainedshop/core-files": "^4.8.12",
137
- "@unchainedshop/core-filters": "^4.8.12",
138
- "@unchainedshop/core-languages": "^4.8.12",
139
- "@unchainedshop/core-orders": "^4.8.12",
140
- "@unchainedshop/core-payment": "^4.8.12",
141
- "@unchainedshop/core-products": "^4.8.12",
142
- "@unchainedshop/core-quotations": "^4.8.12",
143
- "@unchainedshop/core-users": "^4.8.12",
144
- "@unchainedshop/core-warehousing": "^4.8.12",
145
- "@unchainedshop/core-worker": "^4.8.12",
146
- "@unchainedshop/events": "^4.8.12",
147
- "@unchainedshop/logger": "^4.8.12",
148
- "@unchainedshop/mongodb": "^4.8.12",
149
- "@unchainedshop/roles": "^4.8.12",
150
- "@unchainedshop/utils": "^4.8.12",
128
+ "@unchainedshop/core": "^4.8.27",
129
+ "@unchainedshop/core-assortments": "^4.8.27",
130
+ "@unchainedshop/core-bookmarks": "^4.8.27",
131
+ "@unchainedshop/core-countries": "^4.8.27",
132
+ "@unchainedshop/core-currencies": "^4.8.27",
133
+ "@unchainedshop/core-delivery": "^4.8.27",
134
+ "@unchainedshop/core-enrollments": "^4.8.27",
135
+ "@unchainedshop/core-events": "^4.8.27",
136
+ "@unchainedshop/core-files": "^4.8.27",
137
+ "@unchainedshop/core-filters": "^4.8.27",
138
+ "@unchainedshop/core-languages": "^4.8.27",
139
+ "@unchainedshop/core-orders": "^4.8.27",
140
+ "@unchainedshop/core-payment": "^4.8.27",
141
+ "@unchainedshop/core-products": "^4.8.27",
142
+ "@unchainedshop/core-quotations": "^4.8.27",
143
+ "@unchainedshop/core-users": "^4.8.27",
144
+ "@unchainedshop/core-warehousing": "^4.8.27",
145
+ "@unchainedshop/core-worker": "^4.8.27",
146
+ "@unchainedshop/events": "^4.8.27",
147
+ "@unchainedshop/logger": "^4.8.27",
148
+ "@unchainedshop/mongodb": "^4.8.27",
149
+ "@unchainedshop/roles": "^4.8.27",
150
+ "@unchainedshop/utils": "^4.8.27",
151
151
  "dataloader": "^2.2.3",
152
152
  "graphql-scalars": "^2.0.0",
153
153
  "mime": ">= 4 < 5",