@pvh-afl/core 1.1.27 → 1.1.29
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.
- package/dist/common/config-assert.d.ts +11 -0
- package/dist/common/config-assert.d.ts.map +1 -0
- package/dist/common/config-assert.js +20 -0
- package/dist/common/config-assert.js.map +1 -0
- package/dist/config/config.service.d.ts +48 -0
- package/dist/config/config.service.d.ts.map +1 -1
- package/dist/config/config.service.js +70 -0
- package/dist/config/config.service.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/commerce/shopify-admin.service.d.ts.map +1 -1
- package/dist/integrations/commerce/shopify-admin.service.js +2 -24
- package/dist/integrations/commerce/shopify-admin.service.js.map +1 -1
- package/dist/integrations/commerce/shopify-customer.service.d.ts +15 -0
- package/dist/integrations/commerce/shopify-customer.service.d.ts.map +1 -1
- package/dist/integrations/commerce/shopify-customer.service.js +68 -0
- package/dist/integrations/commerce/shopify-customer.service.js.map +1 -1
- package/dist/integrations/commerce/shopify.service.d.ts.map +1 -1
- package/dist/integrations/commerce/shopify.service.js +15 -0
- package/dist/integrations/commerce/shopify.service.js.map +1 -1
- package/dist/integrations/loyalty/capillary-auth.service.d.ts.map +1 -1
- package/dist/integrations/loyalty/capillary-auth.service.js +7 -0
- package/dist/integrations/loyalty/capillary-auth.service.js.map +1 -1
- package/dist/integrations/loyalty/capillary-coupon.service.d.ts.map +1 -1
- package/dist/integrations/loyalty/capillary-coupon.service.js +7 -21
- package/dist/integrations/loyalty/capillary-coupon.service.js.map +1 -1
- package/dist/integrations/oms/omuni-auth.service.d.ts.map +1 -1
- package/dist/integrations/oms/omuni-auth.service.js +5 -0
- package/dist/integrations/oms/omuni-auth.service.js.map +1 -1
- package/dist/integrations/search/search.mapper.d.ts +1 -1
- package/dist/integrations/search/search.mapper.d.ts.map +1 -1
- package/dist/integrations/search/search.mapper.js +7 -1
- package/dist/integrations/search/search.mapper.js.map +1 -1
- package/dist/integrations/search/search.types.d.ts +14 -0
- package/dist/integrations/search/search.types.d.ts.map +1 -1
- package/dist/integrations/search/search.types.js.map +1 -1
- package/dist/integrations/search/wizzy.service.d.ts +12 -0
- package/dist/integrations/search/wizzy.service.d.ts.map +1 -1
- package/dist/integrations/search/wizzy.service.js +83 -31
- package/dist/integrations/search/wizzy.service.js.map +1 -1
- package/dist/integrations/search/wizzy.types.d.ts +52 -9
- package/dist/integrations/search/wizzy.types.d.ts.map +1 -1
- package/dist/queue/queue.service.d.ts +20 -1
- package/dist/queue/queue.service.d.ts.map +1 -1
- package/dist/queue/queue.service.js +59 -2
- package/dist/queue/queue.service.js.map +1 -1
- package/package.json +7 -3
|
@@ -7,7 +7,16 @@
|
|
|
7
7
|
export interface WizzySwatchRequest {
|
|
8
8
|
key: string;
|
|
9
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* Wizzy analytics `type` value, sent inside the `filters` object on
|
|
12
|
+
* /products/filter. Wizzy attributes each request to an analytics bucket
|
|
13
|
+
* keyed by this value; omitting it defaults to DEFAULT (search-results),
|
|
14
|
+
* which mis-files collection traffic as search traffic.
|
|
15
|
+
*/
|
|
16
|
+
export type WizzySearchType = 'DEFAULT' | 'CATEGORY_PAGE' | 'AUTOCOMPLETE_DEFAULT' | 'AUTOCOMPLETE_OPTION' | 'NO_RESULTS_FOUND';
|
|
10
17
|
export interface WizzyFilterRequest {
|
|
18
|
+
/** Keyword query; enables full-text search on the filter endpoint. */
|
|
19
|
+
q?: string;
|
|
11
20
|
categories?: string[];
|
|
12
21
|
brands?: string[];
|
|
13
22
|
genders?: string[];
|
|
@@ -24,6 +33,14 @@ export interface WizzyFilterRequest {
|
|
|
24
33
|
sort?: WizzySortOption[];
|
|
25
34
|
facets?: WizzyFacetRequest[];
|
|
26
35
|
swatch?: WizzySwatchRequest[];
|
|
36
|
+
/** Analytics bucket for this request (nested in `filters`, not a sibling field). */
|
|
37
|
+
type?: WizzySearchType;
|
|
38
|
+
/**
|
|
39
|
+
* Key minted by /products/search that keeps paging/sort/facet requests
|
|
40
|
+
* consistent with page 1. Echoed back on every following /products/filter
|
|
41
|
+
* for the same search or collection. Absent on the first request.
|
|
42
|
+
*/
|
|
43
|
+
searchedKey?: string;
|
|
27
44
|
}
|
|
28
45
|
export interface WizzyRangeFilter {
|
|
29
46
|
gte?: number;
|
|
@@ -36,23 +53,30 @@ export interface WizzySortOption {
|
|
|
36
53
|
export interface WizzyFacetRequest {
|
|
37
54
|
key: string;
|
|
38
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Keyword-search request for POST /products/search.
|
|
58
|
+
*
|
|
59
|
+
* This endpoint is the ONLY call Wizzy counts as a search hit, and it mints
|
|
60
|
+
* the `searchedKey` every following /products/filter request needs. It serves
|
|
61
|
+
* only the first, unfiltered page: it does NOT accept `page`, `type`, or any
|
|
62
|
+
* filter values (categories/attributes/sellingPrice/genders/sizes/...). To
|
|
63
|
+
* apply filters or a page number, call this first to register the hit and get
|
|
64
|
+
* the key, then follow with /products/filter (WizzyFilterRequest).
|
|
65
|
+
*/
|
|
39
66
|
export interface WizzySearchRequest {
|
|
40
67
|
q: string;
|
|
41
68
|
productsCount?: number;
|
|
42
|
-
page?: number;
|
|
43
69
|
sort?: WizzySortOption[];
|
|
44
70
|
facets?: WizzyFacetRequest[];
|
|
45
71
|
swatch?: WizzySwatchRequest[];
|
|
46
|
-
categories?: string[];
|
|
47
|
-
brands?: string[];
|
|
48
|
-
genders?: string[];
|
|
49
|
-
colors?: string[];
|
|
50
|
-
sizes?: string[];
|
|
51
|
-
inStock?: boolean[];
|
|
52
|
-
sellingPrice?: WizzyRangeFilter[];
|
|
53
72
|
}
|
|
54
73
|
export interface WizzyAutocompleteRequest {
|
|
55
74
|
q: string;
|
|
75
|
+
/**
|
|
76
|
+
* When > 0, /autocomplete returns top products alongside suggestions,
|
|
77
|
+
* removing the need for a separate /products/search call per keystroke.
|
|
78
|
+
*/
|
|
79
|
+
productsCount?: number;
|
|
56
80
|
}
|
|
57
81
|
export interface WizzyResponse<T> {
|
|
58
82
|
payload: T;
|
|
@@ -60,12 +84,24 @@ export interface WizzyResponse<T> {
|
|
|
60
84
|
statusCode: number;
|
|
61
85
|
message: string;
|
|
62
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* The `filters` object echoed back inside a products payload. Carries the
|
|
89
|
+
* `searchedKey` (also mirrored in the `wizzy-searchedKey` response header) plus
|
|
90
|
+
* the resolved request context (page, productsCount, q, type, ...).
|
|
91
|
+
*/
|
|
92
|
+
export interface WizzyPayloadFilters {
|
|
93
|
+
searchedKey?: string;
|
|
94
|
+
[key: string]: unknown;
|
|
95
|
+
}
|
|
63
96
|
export interface WizzyProductsPayload {
|
|
64
97
|
result: WizzyProduct[];
|
|
65
98
|
total: number;
|
|
66
99
|
pages: number;
|
|
67
100
|
hasExactMatch?: boolean;
|
|
68
|
-
facets
|
|
101
|
+
facets?: WizzyFacet[];
|
|
102
|
+
/** Present on /products/search and /products/filter; source of searchedKey. */
|
|
103
|
+
filters?: WizzyPayloadFilters;
|
|
104
|
+
configs?: unknown;
|
|
69
105
|
}
|
|
70
106
|
export interface WizzySwatchValue {
|
|
71
107
|
value: string;
|
|
@@ -154,6 +190,13 @@ export interface WizzyAutocompletePayload {
|
|
|
154
190
|
brands: WizzyAutocompleteSuggestion[];
|
|
155
191
|
others: WizzyAutocompleteSuggestion[];
|
|
156
192
|
pages: WizzyAutocompleteSuggestion[];
|
|
193
|
+
/**
|
|
194
|
+
* TRAP: despite Wizzy's OpenAPI spec declaring this an array of Product, it
|
|
195
|
+
* is a full products payload object — the product array is at
|
|
196
|
+
* `products.result` (and its searchedKey at `products.filters.searchedKey`).
|
|
197
|
+
* Only populated when the request sends `productsCount > 0`.
|
|
198
|
+
*/
|
|
199
|
+
products?: WizzyProductsPayload;
|
|
157
200
|
}
|
|
158
201
|
export interface WizzyAutocompleteSuggestion {
|
|
159
202
|
value: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wizzy.types.d.ts","sourceRoot":"","sources":["../../../src/integrations/search/wizzy.types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAClC,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC3B,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACxC,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,eAAe,EAAE,CAAC;IACzB,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC7B,MAAM,CAAC,EAAE,kBAAkB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"wizzy.types.d.ts","sourceRoot":"","sources":["../../../src/integrations/search/wizzy.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,9 +12,28 @@ export declare class QueueService implements OnModuleInit, OnModuleDestroy {
|
|
|
12
12
|
constructor(configService: ConfigService);
|
|
13
13
|
onModuleInit(): void;
|
|
14
14
|
onModuleDestroy(): Promise<void>;
|
|
15
|
-
push<T = Record<string, unknown>>(payload: T, queueName?: string
|
|
15
|
+
push<T = Record<string, unknown>>(payload: T, queueName?: string, opts?: {
|
|
16
|
+
maxLength?: number;
|
|
17
|
+
ttlSeconds?: number;
|
|
18
|
+
}): Promise<string | null>;
|
|
16
19
|
pop<T = Record<string, unknown>>(queueName?: string): Promise<QueueItem<T> | null>;
|
|
17
20
|
length(queueName?: string): Promise<number>;
|
|
21
|
+
/**
|
|
22
|
+
* Atomically claim a one-time key for idempotency (webhook replay dedup, #5).
|
|
23
|
+
*
|
|
24
|
+
* Uses Redis `SET key 1 NX EX ttl`: the write happens only if the key does not
|
|
25
|
+
* already exist. Returns `true` if THIS call created it (first time — safe to
|
|
26
|
+
* process), `false` if it already existed (a duplicate/replay — skip).
|
|
27
|
+
*
|
|
28
|
+
* Fails open: if Redis is unavailable it returns `true` so webhook processing
|
|
29
|
+
* is never blocked by a missing cache (HMAC still guarantees authenticity).
|
|
30
|
+
*/
|
|
31
|
+
claimOnce(key: string, ttlSeconds: number): Promise<boolean>;
|
|
32
|
+
/**
|
|
33
|
+
* Release a claim made by `claimOnce`, so a legitimate retry can reprocess
|
|
34
|
+
* after a processing failure (webhook replay dedup, #5).
|
|
35
|
+
*/
|
|
36
|
+
release(key: string): Promise<void>;
|
|
18
37
|
scanQueues(pattern: string): Promise<string[]>;
|
|
19
38
|
}
|
|
20
39
|
//# sourceMappingURL=queue.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.service.d.ts","sourceRoot":"","sources":["../../src/queue/queue.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACpD,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBACa,YAAa,YAAW,YAAY,EAAE,eAAe;IAIpD,OAAO,CAAC,QAAQ,CAAC,aAAa;IAH1C,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;gBAErB,aAAa,EAAE,aAAa;IAEzD,YAAY;IAoBN,eAAe;IAMf,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,OAAO,EAAE,CAAC,EACV,SAAS,SAAoB,
|
|
1
|
+
{"version":3,"file":"queue.service.d.ts","sourceRoot":"","sources":["../../src/queue/queue.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACpD,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBACa,YAAa,YAAW,YAAY,EAAE,eAAe;IAIpD,OAAO,CAAC,QAAQ,CAAC,aAAa;IAH1C,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;gBAErB,aAAa,EAAE,aAAa;IAEzD,YAAY;IAoBN,eAAe;IAMf,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,OAAO,EAAE,CAAC,EACV,SAAS,SAAoB,EAC7B,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,GACjD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAsCnB,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,SAAS,SAAoB,GAC5B,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAiBzB,MAAM,CAAC,SAAS,SAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;IAc5D;;;;;;;;;OASG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBlE;;;OAGG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAanC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CA4BrD"}
|
|
@@ -35,7 +35,7 @@ let QueueService = class QueueService {
|
|
|
35
35
|
await this.redis.quit();
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
async push(payload, queueName = this.defaultQueue) {
|
|
38
|
+
async push(payload, queueName = this.defaultQueue, opts) {
|
|
39
39
|
if (!this.redis) {
|
|
40
40
|
logger_1.logger.warn('Queue not available, payload not queued');
|
|
41
41
|
return null;
|
|
@@ -47,7 +47,18 @@ let QueueService = class QueueService {
|
|
|
47
47
|
};
|
|
48
48
|
try {
|
|
49
49
|
await this.redis.lpush(queueName, JSON.stringify(item));
|
|
50
|
-
|
|
50
|
+
// Bound externally-influenced queues so a flood of pushes cannot grow
|
|
51
|
+
// Redis without limit (AFL-SEC-06). LPUSH prepends, so 0..maxLength-1 are
|
|
52
|
+
// the newest items; older overflow is trimmed. An optional TTL bounds an
|
|
53
|
+
// abandoned queue in time as well.
|
|
54
|
+
if (opts?.maxLength && opts.maxLength > 0) {
|
|
55
|
+
await this.redis.ltrim(queueName, 0, opts.maxLength - 1);
|
|
56
|
+
}
|
|
57
|
+
if (opts?.ttlSeconds && opts.ttlSeconds > 0) {
|
|
58
|
+
await this.redis.expire(queueName, opts.ttlSeconds);
|
|
59
|
+
}
|
|
60
|
+
// Do not log the payload: it may carry untrusted or PII-bearing data.
|
|
61
|
+
logger_1.logger.info('Payload pushed to queue', { queueName, id: item.id });
|
|
51
62
|
return item.id;
|
|
52
63
|
}
|
|
53
64
|
catch (error) {
|
|
@@ -89,6 +100,52 @@ let QueueService = class QueueService {
|
|
|
89
100
|
return 0;
|
|
90
101
|
}
|
|
91
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Atomically claim a one-time key for idempotency (webhook replay dedup, #5).
|
|
105
|
+
*
|
|
106
|
+
* Uses Redis `SET key 1 NX EX ttl`: the write happens only if the key does not
|
|
107
|
+
* already exist. Returns `true` if THIS call created it (first time — safe to
|
|
108
|
+
* process), `false` if it already existed (a duplicate/replay — skip).
|
|
109
|
+
*
|
|
110
|
+
* Fails open: if Redis is unavailable it returns `true` so webhook processing
|
|
111
|
+
* is never blocked by a missing cache (HMAC still guarantees authenticity).
|
|
112
|
+
*/
|
|
113
|
+
async claimOnce(key, ttlSeconds) {
|
|
114
|
+
if (!this.redis) {
|
|
115
|
+
logger_1.logger.warn('Idempotency store unavailable, processing without dedup', {
|
|
116
|
+
key,
|
|
117
|
+
});
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
const result = await this.redis.set(key, '1', 'EX', ttlSeconds, 'NX');
|
|
122
|
+
return result === 'OK';
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
logger_1.logger.error('Failed to claim idempotency key', {
|
|
126
|
+
key,
|
|
127
|
+
error: error instanceof Error ? error.message : 'Unknown',
|
|
128
|
+
});
|
|
129
|
+
return true; // fail open
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Release a claim made by `claimOnce`, so a legitimate retry can reprocess
|
|
134
|
+
* after a processing failure (webhook replay dedup, #5).
|
|
135
|
+
*/
|
|
136
|
+
async release(key) {
|
|
137
|
+
if (!this.redis)
|
|
138
|
+
return;
|
|
139
|
+
try {
|
|
140
|
+
await this.redis.del(key);
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
logger_1.logger.error('Failed to release idempotency key', {
|
|
144
|
+
key,
|
|
145
|
+
error: error instanceof Error ? error.message : 'Unknown',
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
92
149
|
async scanQueues(pattern) {
|
|
93
150
|
if (!this.redis)
|
|
94
151
|
return [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.service.js","sourceRoot":"","sources":["../../src/queue/queue.service.ts"],"names":[],"mappings":";;;;AAAA,2CAA2E;AAC3E,qCAAgC;AAChC,6DAAyD;AACzD,6CAA0C;AASnC,IAAM,YAAY,GAAlB,MAAM,YAAY;IAIM;IAHrB,KAAK,GAAiB,IAAI,CAAC;IAClB,YAAY,GAAG,iBAAiB,CAAC;IAElD,YAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAE7D,YAAY;QACV,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;QAElD,IAAI,CAAC;YACH,IAAI,CAAC,KAAK,GAAG,IAAI,eAAK,CAAC,QAAQ,CAAC,CAAC;YAEjC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;gBAC5B,eAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;gBACpC,eAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5D,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE;gBACvC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;aAC1D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CACR,OAAU,EACV,SAAS,GAAG,IAAI,CAAC,YAAY;
|
|
1
|
+
{"version":3,"file":"queue.service.js","sourceRoot":"","sources":["../../src/queue/queue.service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pvh-afl/core",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.29",
|
|
4
4
|
"description": "AFL Core - Shared services for multi-brand commerce platform",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -21,7 +21,9 @@
|
|
|
21
21
|
"@nestjs/common": "^10.0.0",
|
|
22
22
|
"@nestjs/core": "^10.0.0",
|
|
23
23
|
"ioredis": "^5.0.0",
|
|
24
|
-
"rxjs": "^7.0.0"
|
|
24
|
+
"rxjs": "^7.0.0",
|
|
25
|
+
"@nestjs/graphql": "^12.0.0",
|
|
26
|
+
"@nestjs/jwt": "^11.0.0"
|
|
25
27
|
},
|
|
26
28
|
"dependencies": {
|
|
27
29
|
"@azure/storage-blob": "^12.33.0",
|
|
@@ -39,7 +41,9 @@
|
|
|
39
41
|
"rimraf": "^5.0.0",
|
|
40
42
|
"rxjs": "^7.8.1",
|
|
41
43
|
"ts-jest": "^29.2.0",
|
|
42
|
-
"typescript": "^5.6.0"
|
|
44
|
+
"typescript": "^5.6.0",
|
|
45
|
+
"@nestjs/graphql": "^12.2.0",
|
|
46
|
+
"@nestjs/jwt": "^11.0.2"
|
|
43
47
|
},
|
|
44
48
|
"repository": {
|
|
45
49
|
"type": "git",
|