@cyberskill/shared 2.15.0 → 2.16.0

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.
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("@apollo/client/core"),p=require("@apollo/client/link"),w=require("@apollo/client/link/error"),h=require("@apollo/client/link/remove-typename"),y=require("@apollo/client/link/subscriptions"),_=require("apollo-upload-client/createUploadLink.mjs"),q=require("graphql"),b=require("graphql-ws"),c=require("react"),v=require("rxjs"),m=require("./apollo-client.constant.cjs"),E=require("../apollo-error/apollo-error.util.cjs"),l=require("../log/log.util.cjs"),f=require("react-hot-toast");var P=Object.defineProperty,g=Object.getOwnPropertySymbols,A=Object.prototype.hasOwnProperty,O=Object.prototype.propertyIsEnumerable,L=(e,r,o)=>r in e?P(e,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[r]=o,T=(e,r)=>{for(var o in r||(r={}))A.call(r,o)&&L(e,o,r[o]);if(g)for(var o of g(r))O.call(r,o)&&L(e,o,r[o]);return e};const C=new p.ApolloLink((e,r)=>(e.setContext({start:new Date}),r(e).pipe(v.tap(()=>{const o=new Date().getTime()-e.getContext().start;l.log.info(`Operation ${e.operationName} took ${o}ms to complete`)})))),S=new w.ErrorLink(({error:e,operation:r})=>{const o=(r==null?void 0:r.operationName)||"Unknown";let t="";a.CombinedGraphQLErrors.is(e)?e.errors.forEach(({message:n,locations:i,path:s},u)=>{u===0&&(t=n),l.log.error(`[GraphQL error] ${o}: ${n}, Location: ${JSON.stringify(i,null,4)}, Path: ${s}`)}):a.CombinedProtocolErrors.is(e)?e.errors.forEach(({message:n,extensions:i},s)=>{s===0&&(t=n),l.log.error(`[Protocol error]: ${n}, Extensions: ${JSON.stringify(i,null,4)}`)}):a.ServerError.is(e)?(t=e.message,l.log.error(`[Server error]: ${e.message}`)):(t=e.message,l.log.error(`[Network error]: ${e.message}`)),e&&t&&typeof window!="undefined"&&f.toast.error(n=>c.createElement(c.Fragment,null,t," ",c.createElement("button",{type:"button",className:"text-blue-500 hover:text-blue-700",onClick:()=>{setTimeout(()=>{E.showGlobalApolloError(e)},0),f.toast.dismiss(n.id)}},"Show Details")))});function k(e){const{uri:r,wsUrl:o,customLinks:t}=e,n=new h.RemoveTypenameFromVariablesLink;r||l.log.warn(`[Apollo] No GraphQL URI provided — using "${m.GRAPHQL_URI_DEFAULT}" as default`);const i=_({uri:r!=null?r:m.GRAPHQL_URI_DEFAULT,credentials:"include",headers:{"apollo-require-preflight":"true"}}),s=o?new y.GraphQLWsLink(b.createClient({url:o})):p.ApolloLink.empty(),u=o?p.ApolloLink.split(({operationType:d})=>d===q.OperationTypeNode.SUBSCRIPTION,s,i):i;return o&&u===i&&l.log.warn("[Apollo] WS URL is set, but subscriptions fallback to HTTP. Check your wsLink config."),[C,S,n,...t!=null?t:[],u]}function $(e){const r=p.ApolloLink.from(k(e));return new a.ApolloClient(T({link:r,cache:new a.InMemoryCache},e))}exports.createApolloLinks=k;exports.getClient=$;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("@apollo/client/core"),p=require("@apollo/client/link"),w=require("@apollo/client/link/error"),h=require("@apollo/client/link/remove-typename"),y=require("@apollo/client/link/subscriptions"),_=require("graphql"),q=require("graphql-ws"),c=require("react"),b=require("rxjs"),m=require("./apollo-client.constant.cjs"),v=require("./links/upload.cjs"),E=require("../apollo-error/apollo-error.util.cjs"),l=require("../log/log.util.cjs"),f=require("react-hot-toast");var P=Object.defineProperty,g=Object.getOwnPropertySymbols,A=Object.prototype.hasOwnProperty,O=Object.prototype.propertyIsEnumerable,L=(e,r,o)=>r in e?P(e,r,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[r]=o,T=(e,r)=>{for(var o in r||(r={}))A.call(r,o)&&L(e,o,r[o]);if(g)for(var o of g(r))O.call(r,o)&&L(e,o,r[o]);return e};const C=new p.ApolloLink((e,r)=>(e.setContext({start:new Date}),r(e).pipe(b.tap(()=>{const o=new Date().getTime()-e.getContext().start;l.log.info(`Operation ${e.operationName} took ${o}ms to complete`)})))),S=new w.ErrorLink(({error:e,operation:r})=>{const o=(r==null?void 0:r.operationName)||"Unknown";let t="";a.CombinedGraphQLErrors.is(e)?e.errors.forEach(({message:n,locations:i,path:s},u)=>{u===0&&(t=n),l.log.error(`[GraphQL error] ${o}: ${n}, Location: ${JSON.stringify(i,null,4)}, Path: ${s}`)}):a.CombinedProtocolErrors.is(e)?e.errors.forEach(({message:n,extensions:i},s)=>{s===0&&(t=n),l.log.error(`[Protocol error]: ${n}, Extensions: ${JSON.stringify(i,null,4)}`)}):a.ServerError.is(e)?(t=e.message,l.log.error(`[Server error]: ${e.message}`)):(t=e.message,l.log.error(`[Network error]: ${e.message}`)),e&&t&&typeof window!="undefined"&&f.toast.error(n=>c.createElement(c.Fragment,null,t," ",c.createElement("button",{type:"button",className:"text-blue-500 hover:text-blue-700",onClick:()=>{setTimeout(()=>{E.showGlobalApolloError(e)},0),f.toast.dismiss(n.id)}},"Show Details")))});function d(e){const{uri:r,wsUrl:o,customLinks:t}=e,n=new h.RemoveTypenameFromVariablesLink;r||l.log.warn(`[Apollo] No GraphQL URI provided — using "${m.GRAPHQL_URI_DEFAULT}" as default`);const i=v.createUploadLink({uri:r!=null?r:m.GRAPHQL_URI_DEFAULT,credentials:"include",headers:{"apollo-require-preflight":"true"}}),s=o?new y.GraphQLWsLink(q.createClient({url:o})):p.ApolloLink.empty(),u=o?p.ApolloLink.split(({operationType:k})=>k===_.OperationTypeNode.SUBSCRIPTION,s,i):i;return o&&u===i&&l.log.warn("[Apollo] WS URL is set, but subscriptions fallback to HTTP. Check your wsLink config."),[C,S,n,...t!=null?t:[],u]}function $(e){const r=p.ApolloLink.from(d(e));return new a.ApolloClient(T({link:r,cache:new a.InMemoryCache},e))}exports.createApolloLinks=d;exports.getClient=$;
@@ -3,12 +3,12 @@ import { ApolloLink as m } from "@apollo/client/link";
3
3
  import { ErrorLink as v } from "@apollo/client/link/error";
4
4
  import { RemoveTypenameFromVariablesLink as _ } from "@apollo/client/link/remove-typename";
5
5
  import { GraphQLWsLink as b } from "@apollo/client/link/subscriptions";
6
- import E from "apollo-upload-client/createUploadLink.mjs";
7
- import { OperationTypeNode as O } from "graphql";
8
- import { createClient as P } from "graphql-ws";
6
+ import { OperationTypeNode as E } from "graphql";
7
+ import { createClient as O } from "graphql-ws";
9
8
  import p from "react";
10
- import { tap as C } from "rxjs";
9
+ import { tap as P } from "rxjs";
11
10
  import { GRAPHQL_URI_DEFAULT as f } from "./apollo-client.constant.js";
11
+ import { createUploadLink as C } from "./links/upload.js";
12
12
  import { showGlobalApolloError as N } from "../apollo-error/apollo-error.util.js";
13
13
  import { log as l } from "../log/log.util.js";
14
14
  import { toast as c } from "react-hot-toast";
@@ -21,7 +21,7 @@ var $ = Object.defineProperty, u = Object.getOwnPropertySymbols, S = Object.prot
21
21
  return r;
22
22
  };
23
23
  const U = new m((r, e) => (r.setContext({ start: /* @__PURE__ */ new Date() }), e(r).pipe(
24
- C(() => {
24
+ P(() => {
25
25
  const o = (/* @__PURE__ */ new Date()).getTime() - r.getContext().start;
26
26
  l.info(`Operation ${r.operationName} took ${o}ms to complete`);
27
27
  })
@@ -53,14 +53,14 @@ const U = new m((r, e) => (r.setContext({ start: /* @__PURE__ */ new Date() }),
53
53
  function R(r) {
54
54
  const { uri: e, wsUrl: o, customLinks: t } = r, n = new _();
55
55
  e || l.warn(`[Apollo] No GraphQL URI provided — using "${f}" as default`);
56
- const i = E({
56
+ const i = C({
57
57
  uri: e != null ? e : f,
58
58
  credentials: "include",
59
59
  headers: {
60
60
  "apollo-require-preflight": "true"
61
61
  }
62
- }), s = o ? new b(P({ url: o })) : m.empty(), a = o ? m.split(
63
- ({ operationType: d }) => d === O.SUBSCRIPTION,
62
+ }), s = o ? new b(O({ url: o })) : m.empty(), a = o ? m.split(
63
+ ({ operationType: d }) => d === E.SUBSCRIPTION,
64
64
  s,
65
65
  i
66
66
  ) : i;
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./upload.cjs");exports.createUploadLink=e.createUploadLink;
@@ -0,0 +1 @@
1
+ export * from './upload.js';
@@ -0,0 +1,4 @@
1
+ import { createUploadLink as r } from "./upload.js";
2
+ export {
3
+ r as createUploadLink
4
+ };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const L=require("@apollo/client/link"),c=require("@apollo/client/link/http"),w=require("@apollo/client/utilities"),T=require("extract-files/extractFiles.mjs"),j=require("extract-files/isExtractableFile.mjs");var G=Object.defineProperty,_=Object.getOwnPropertySymbols,H=Object.prototype.hasOwnProperty,J=Object.prototype.propertyIsEnumerable,E=(n,e,t)=>e in n?G(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,h=(n,e)=>{for(var t in e||(e={}))H.call(e,t)&&E(n,t,e[t]);if(_)for(var t of _(e))J.call(e,t)&&E(n,t,e[t]);return n};function N(){if(typeof AbortController=="undefined")return{controller:!1,signal:!1};const n=new AbortController,e=n.signal;return{controller:n,signal:e}}function z(n,e,t){"name"in t?n.append(e,t,t.name):n.append(e,t)}function B({uri:n="/graphql",useGETForQueries:e,isExtractableFile:t=j,FormData:v,formDataAppendFile:F=z,print:S=c.defaultPrinter,fetch:q,fetchOptions:x,credentials:P,headers:A,includeExtensions:C}={}){const I={http:{includeExtensions:C},options:x,credentials:P,headers:A};return new L.ApolloLink(l=>{const p=l.getContext(),{clientAwareness:{name:g,version:m}={},headers:k}=p,U={http:p.http,options:p.fetchOptions,credentials:p.credentials,headers:h(h(h({},g&&{"apollographql-client-name":g}),m&&{"apollographql-client-version":m}),k)},{options:o,body:b}=c.selectHttpOptionsAndBodyInternal(l,S,c.fallbackHttpConfig,I,U),{clone:y,files:f}=T(b,t,"");let u=c.selectURI(l,n);if(f.size){o.headers&&delete o.headers["content-type"];const a=v||FormData,i=new a;i.append("operations",JSON.stringify(y));const r={};let d=0;f.forEach(O=>{r[++d]=O}),i.append("map",JSON.stringify(r)),d=0,f.forEach((O,R)=>{F(i,String(++d),R)}),o.body=i}else if(e&&!l.query.definitions.some(a=>a.kind==="OperationDefinition"&&a.operation==="mutation")&&(o.method="GET"),o.method==="GET"){const{newURI:a,parseError:i}=c.rewriteURIForGET(u,b);if(i)return new w.Observable(r=>{r.error(i)});u=a}else o.body=JSON.stringify(y);const{controller:s}=N();typeof s!="boolean"&&(o.signal&&(o.signal.aborted?s.abort():o.signal.addEventListener("abort",()=>{s.abort()},{once:!0})),o.signal=s.signal);const D=q||fetch;return new w.Observable(a=>{let i;return D(u,o).then(r=>(l.setContext({response:r}),r)).then(c.parseAndCheckHttpResponse(l)).then(r=>{a.next(r),a.complete()}).catch(r=>{i||(r.result&&r.result.errors&&r.result.data&&a.next(r.result),a.error(r))}),()=>{i=!0,typeof s!="boolean"&&s.abort()}})})}exports.createUploadLink=B;
@@ -0,0 +1,76 @@
1
+ import { BaseHttpLink } from '@apollo/client/link/http';
2
+ import { ExtractableFile } from 'extract-files/isExtractableFile.mjs';
3
+ import { ApolloLink } from '@apollo/client/link';
4
+ /**
5
+ * Creates a
6
+ * [terminating Apollo Link](https://www.apollographql.com/docs/react/api/link/introduction/#the-terminating-link)
7
+ * for [Apollo Client](https://www.apollographql.com/docs/react) that fetches a
8
+ * [GraphQL multipart request](https://github.com/jaydenseric/graphql-multipart-request-spec)
9
+ * if the GraphQL variables contain files (by default
10
+ * [`FileList`](https://developer.mozilla.org/en-US/docs/Web/API/FileList),
11
+ * [`File`](https://developer.mozilla.org/en-US/docs/Web/API/File), or
12
+ * [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob) instances),
13
+ * or else fetches a regular
14
+ * [GraphQL POST or GET request](https://www.apollographql.com/docs/apollo-server/workflow/requests)
15
+ * (depending on the config and GraphQL operation).
16
+ *
17
+ * Some of the options are similar to the
18
+ * [`createHttpLink` options](https://www.apollographql.com/docs/react/api/link/apollo-link-http/#httplink-constructor-options).
19
+ * @see [GraphQL multipart request spec](https://github.com/jaydenseric/graphql-multipart-request-spec).
20
+ * @param {object} options Options.
21
+ * @param {Parameters<typeof selectURI>[1]} [options.uri] GraphQL endpoint URI.
22
+ * Defaults to `"/graphql"`.
23
+ * @param {boolean} [options.useGETForQueries] Should GET be used to fetch
24
+ * queries, if there are no files to upload.
25
+ * @param {ExtractableFileMatcher} [options.isExtractableFile] Matches
26
+ * extractable files in the GraphQL operation. Defaults to
27
+ * {@linkcode isExtractableFile}.
28
+ * @param {typeof FormData} [options.FormData]
29
+ * [`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData)
30
+ * class. Defaults to the {@linkcode FormData} global.
31
+ * @param {FormDataFileAppender} [options.formDataAppendFile]
32
+ * Customizes how extracted files are appended to the
33
+ * [`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData)
34
+ * instance. Defaults to {@linkcode formDataAppendFile}.
35
+ * @param {import("@apollo/client/link/http/selectHttpOptionsAndBody.js").Printer} [options.print]
36
+ * Prints the GraphQL query or mutation AST to a string for transport.
37
+ * Defaults to {@linkcode defaultPrinter}.
38
+ * @param {typeof fetch} [options.fetch] [`fetch`](https://fetch.spec.whatwg.org)
39
+ * implementation. Defaults to the {@linkcode fetch} global.
40
+ * @param {RequestInit} [options.fetchOptions] `fetch` options; overridden by
41
+ * upload requirements.
42
+ * @param {string} [options.credentials] Overrides
43
+ * {@linkcode RequestInit.credentials credentials} in
44
+ * {@linkcode fetchOptions}.
45
+ * @param {{ [headerName: string]: string }} [options.headers] Merges with and
46
+ * overrides {@linkcode RequestInit.headers headers} in
47
+ * {@linkcode fetchOptions}.
48
+ * @param {boolean} [options.includeExtensions] Toggles sending `extensions`
49
+ * fields to the GraphQL server. Defaults to `false`.
50
+ * @returns A [terminating Apollo Link](https://www.apollographql.com/docs/react/api/link/introduction/#the-terminating-link).
51
+ * @example
52
+ * A basic Apollo Client setup:
53
+ *
54
+ * ```js
55
+ * import { ApolloClient, InMemoryCache } from "@apollo/client";
56
+ * import createUploadLink from "apollo-upload-client/createUploadLink.mjs";
57
+ *
58
+ * const client = new ApolloClient({
59
+ * cache: new InMemoryCache(),
60
+ * link: createUploadLink(),
61
+ * });
62
+ * ```
63
+ */
64
+ export declare function createUploadLink({ uri: fetchUri, useGETForQueries, isExtractableFile: customIsExtractableFile, FormData: CustomFormData, formDataAppendFile: customFormDataAppendFile, print, fetch: customFetch, fetchOptions, credentials, headers, includeExtensions, }?: {
65
+ uri?: string;
66
+ useGETForQueries?: boolean;
67
+ isExtractableFile?: (value: unknown) => value is ExtractableFile;
68
+ FormData?: typeof FormData;
69
+ formDataAppendFile?: (formData: FormData, fieldName: string, file: ExtractableFile) => void;
70
+ print?: BaseHttpLink.Printer;
71
+ fetch?: typeof fetch;
72
+ fetchOptions?: RequestInit;
73
+ credentials?: RequestCredentials;
74
+ headers?: Record<string, string>;
75
+ includeExtensions?: boolean;
76
+ }): ApolloLink;
@@ -0,0 +1,111 @@
1
+ import { ApolloLink as q } from "@apollo/client/link";
2
+ import { selectHttpOptionsAndBodyInternal as G, defaultPrinter as H, fallbackHttpConfig as J, selectURI as L, rewriteURIForGET as N, parseAndCheckHttpResponse as T } from "@apollo/client/link/http";
3
+ import { Observable as O } from "@apollo/client/utilities";
4
+ import j from "extract-files/extractFiles.mjs";
5
+ import z from "extract-files/isExtractableFile.mjs";
6
+ var B = Object.defineProperty, w = Object.getOwnPropertySymbols, V = Object.prototype.hasOwnProperty, K = Object.prototype.propertyIsEnumerable, _ = (n, t, e) => t in n ? B(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e, m = (n, t) => {
7
+ for (var e in t || (t = {}))
8
+ V.call(t, e) && _(n, e, t[e]);
9
+ if (w)
10
+ for (var e of w(t))
11
+ K.call(t, e) && _(n, e, t[e]);
12
+ return n;
13
+ };
14
+ function M() {
15
+ if (typeof AbortController == "undefined")
16
+ return { controller: !1, signal: !1 };
17
+ const n = new AbortController(), t = n.signal;
18
+ return { controller: n, signal: t };
19
+ }
20
+ function Q(n, t, e) {
21
+ "name" in e ? n.append(t, e, e.name) : n.append(t, e);
22
+ }
23
+ function tt({
24
+ uri: n = "/graphql",
25
+ useGETForQueries: t,
26
+ isExtractableFile: e = z,
27
+ FormData: E,
28
+ formDataAppendFile: x = Q,
29
+ print: F = H,
30
+ fetch: v,
31
+ fetchOptions: A,
32
+ credentials: C,
33
+ headers: P,
34
+ includeExtensions: S
35
+ } = {}) {
36
+ const I = {
37
+ http: { includeExtensions: S },
38
+ options: A,
39
+ credentials: C,
40
+ headers: P
41
+ };
42
+ return new q((l) => {
43
+ const p = l.getContext(), {
44
+ // Apollo Studio client awareness `name` and `version` can be configured
45
+ // via `ApolloClient` constructor options:
46
+ // https://www.apollographql.com/docs/graphos/metrics/client-awareness/#setup
47
+ clientAwareness: { name: u, version: h } = {},
48
+ headers: D
49
+ } = p, R = {
50
+ http: p.http,
51
+ options: p.fetchOptions,
52
+ credentials: p.credentials,
53
+ headers: m(m(m({}, u && { "apollographql-client-name": u }), h && { "apollographql-client-version": h }), D)
54
+ }, { options: o, body: g } = G(
55
+ l,
56
+ F,
57
+ J,
58
+ I,
59
+ R
60
+ ), { clone: y, files: c } = j(g, e, "");
61
+ let f = L(l, n);
62
+ if (c.size) {
63
+ o.headers && delete o.headers["content-type"];
64
+ const a = E || FormData, i = new a();
65
+ i.append("operations", JSON.stringify(y));
66
+ const r = {};
67
+ let d = 0;
68
+ c.forEach((b) => {
69
+ r[++d] = b;
70
+ }), i.append("map", JSON.stringify(r)), d = 0, c.forEach((b, k) => {
71
+ x(i, String(++d), k);
72
+ }), o.body = i;
73
+ } else if (t && !l.query.definitions.some(
74
+ (a) => a.kind === "OperationDefinition" && a.operation === "mutation"
75
+ ) && (o.method = "GET"), o.method === "GET") {
76
+ const { newURI: a, parseError: i } = N(f, g);
77
+ if (i)
78
+ return new O((r) => {
79
+ r.error(i);
80
+ });
81
+ f = a;
82
+ } else
83
+ o.body = JSON.stringify(y);
84
+ const { controller: s } = M();
85
+ typeof s != "boolean" && (o.signal && (o.signal.aborted ? s.abort() : o.signal.addEventListener(
86
+ "abort",
87
+ () => {
88
+ s.abort();
89
+ },
90
+ {
91
+ // Prevent a memory leak if the user configured abort controller
92
+ // is long lasting, or controls multiple things.
93
+ once: !0
94
+ }
95
+ )), o.signal = s.signal);
96
+ const U = v || fetch;
97
+ return new O((a) => {
98
+ let i;
99
+ return U(f, o).then((r) => (l.setContext({ response: r }), r)).then(T(l)).then((r) => {
100
+ a.next(r), a.complete();
101
+ }).catch((r) => {
102
+ i || (r.result && r.result.errors && r.result.data && a.next(r.result), a.error(r));
103
+ }), () => {
104
+ i = !0, typeof s != "boolean" && s.abort();
105
+ };
106
+ });
107
+ });
108
+ }
109
+ export {
110
+ tt as createUploadLink
111
+ };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cyberskill/shared",
3
3
  "type": "module",
4
- "version": "2.15.0",
4
+ "version": "2.16.0",
5
5
  "description": "CyberSkill Shared",
6
6
  "author": "Stephen Cheng",
7
7
  "license": "MIT",
@@ -221,7 +221,6 @@
221
221
  "@nestjs/core": "11.1.6",
222
222
  "@userback/widget": "0.3.11",
223
223
  "@vitejs/plugin-react-swc": "4.0.1",
224
- "apollo-upload-client": "18.0.1",
225
224
  "body-parser": "2.2.0",
226
225
  "chalk": "5.6.0",
227
226
  "clsx": "2.1.1",
@@ -238,6 +237,7 @@
238
237
  "express": "5.1.0",
239
238
  "express-session": "1.18.2",
240
239
  "express-useragent": "1.0.15",
240
+ "extract-files": "13.0.0",
241
241
  "fs-extra": "11.3.1",
242
242
  "globals": "16.3.0",
243
243
  "graphql": "16.11.0",
@@ -275,7 +275,6 @@
275
275
  "@next/eslint-plugin-next": "15.5.0",
276
276
  "@testing-library/jest-dom": "6.8.0",
277
277
  "@testing-library/react": "16.3.0",
278
- "@types/apollo-upload-client": "18.0.0",
279
278
  "@types/body-parser": "1.19.6",
280
279
  "@types/compression": "1.8.1",
281
280
  "@types/cookie-parser": "1.4.9",
@@ -284,6 +283,7 @@
284
283
  "@types/express": "5.0.3",
285
284
  "@types/express-session": "1.18.2",
286
285
  "@types/express-useragent": "1.0.5",
286
+ "@types/extract-files": "13.0.1",
287
287
  "@types/fs-extra": "11.0.4",
288
288
  "@types/graphql-upload": "17.0.0",
289
289
  "@types/lodash-es": "4.17.12",