alado 2.5.3 → 2.6.1

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/README.md CHANGED
@@ -1122,6 +1122,21 @@ public getAvatar(req: Request) {
1122
1122
  }
1123
1123
  ```
1124
1124
 
1125
+ ## XML Request Body (>=2.6.0)
1126
+
1127
+ When a request arrives with a `Content-Type` of `text/xml` or `application/xml`, Alado automatically parses the raw body into a plain JavaScript object before your handler runs — no configuration needed, and no external XML library involved. `req.body` behaves the same way it does for JSON requests.
1128
+
1129
+ ### How the conversion works
1130
+
1131
+ - **Elements become object keys.** Each XML tag becomes a key in the resulting object, with its children nested underneath.
1132
+ - **Repeated sibling tags collapse into an array.** `<item>a</item><item>b</item>` becomes `item: ['a', 'b']` rather than overwriting the key.
1133
+ - **Leaf elements become plain strings.** `<name>Daniel</name>` becomes `name: 'Daniel'` — no wrapper object, no type coercion (numeric-looking text like `"10000.00"` is kept exactly as written, since silently converting it to a JS number would lose precision on monetary values).
1134
+ - **Attributes are namespaced under `@attrs`.** An element like `<amount currency="USD">100</amount>` becomes `{ '@attrs': { currency: 'USD' }, '#text': '100' }`, keeping attribute data separate from element data and text content.
1135
+ - **CDATA sections are unwrapped automatically**, and their contents treated as plain text.
1136
+ - **Namespaces resolve to local names.** For SOAP envelopes or ISO 20022 style payment messages, elements are keyed by their local name regardless of which prefix the sender used (`soapenv:Body` and `soap:Body` parse identically if they share a namespace). Each element also carries an `@ns` field with its resolved namespace URI, so elements sharing a local name across different namespaces stay distinguishable.
1137
+
1138
+ Because the contract is identical to JSON, everything documented under [`defineRequest`](#definerequest) and [DTOs](#dtos) — `@validateProperty`, `@documentProperty`, `@transformProperty`, auto-generated OpenAPI schemas applies to XML bodies without any extra setup.
1139
+
1125
1140
  ---
1126
1141
 
1127
1142
  ## OpenAPI / Swagger
@@ -2,5 +2,7 @@ export declare enum ContentType {
2
2
  TEXT_PLAIN = "text/plain",
3
3
  JSON = "application/json",
4
4
  FORM_DATA = "multipart/form-data",
5
- X_WWW_FORM_URLENCODED = "application/x-www-form-urlencoded"
5
+ X_WWW_FORM_URLENCODED = "application/x-www-form-urlencoded",
6
+ XML = "application/xml",
7
+ TEXT_XML = "text/xml"
6
8
  }
@@ -7,5 +7,7 @@ var ContentType;
7
7
  ContentType["JSON"] = "application/json";
8
8
  ContentType["FORM_DATA"] = "multipart/form-data";
9
9
  ContentType["X_WWW_FORM_URLENCODED"] = "application/x-www-form-urlencoded";
10
+ ContentType["XML"] = "application/xml";
11
+ ContentType["TEXT_XML"] = "text/xml";
10
12
  })(ContentType || (exports.ContentType = ContentType = {}));
11
13
  //# sourceMappingURL=content-type.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"content-type.js","sourceRoot":"","sources":["../../src/constants/content-type.ts"],"names":[],"mappings":";;;AAAA,IAAY,WAKX;AALD,WAAY,WAAW;IACrB,wCAAyB,CAAA;IACzB,wCAAyB,CAAA;IACzB,gDAAiC,CAAA;IACjC,0EAA2D,CAAA;AAC7D,CAAC,EALW,WAAW,2BAAX,WAAW,QAKtB"}
1
+ {"version":3,"file":"content-type.js","sourceRoot":"","sources":["../../src/constants/content-type.ts"],"names":[],"mappings":";;;AAAA,IAAY,WAOX;AAPD,WAAY,WAAW;IACrB,wCAAyB,CAAA;IACzB,wCAAyB,CAAA;IACzB,gDAAiC,CAAA;IACjC,0EAA2D,CAAA;IAC3D,sCAAuB,CAAA;IACvB,oCAAqB,CAAA;AACvB,CAAC,EAPW,WAAW,2BAAX,WAAW,QAOtB"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.bodyParser = bodyParser;
4
4
  const _const_1 = require("../../constants");
5
5
  const stream_1 = require("stream");
6
+ const xml_parser_1 = require("./xml-parser");
6
7
  async function bodyParser(req, res, limit) {
7
8
  const contentType = req.headers['content-type'];
8
9
  const result = {
@@ -102,6 +103,17 @@ async function bodyParser(req, res, limit) {
102
103
  });
103
104
  resolve();
104
105
  }
106
+ else if ([
107
+ _const_1.ContentType.XML.toString(),
108
+ _const_1.ContentType.TEXT_XML.toString(),
109
+ ].includes(contentType)) {
110
+ try {
111
+ result.body = (0, xml_parser_1.xmlParser)(body);
112
+ }
113
+ catch (e) {
114
+ reject({ statusCode: 400, message: `Invalid XML body: ${e.message}` });
115
+ }
116
+ }
105
117
  else {
106
118
  result.body = body;
107
119
  resolve();
@@ -1 +1 @@
1
- {"version":3,"file":"body-parser.js","sourceRoot":"","sources":["../../../src/helpers/parser/body-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"body-parser.js","sourceRoot":"","sources":["../../../src/helpers/parser/body-parser.ts"],"names":[],"mappings":";;AAMA,gCAuHC;AA5HD,mCAAkG;AAClG,mCAAkC;AAElC,6CAAyC;AAElC,KAAK,UAAU,UAAU,CAAC,GAAoB,EAAE,GAAoB,EAAE,KAAa;IACxF,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAChD,MAAM,MAAM,GAAQ;QAClB,IAAI,EAAE,EAAE;QACR,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,EAAE;KACZ,CAAC;IACF,IAAI,IAAI,GAAW,EAAE,CAAC;IACtB,IAAI,WAAW,EAAE,UAAU,CAAC,oBAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QACnD,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC1B,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,cAAc,CAAW,CAAC,CAAC;QACnF,MAAM,QAAQ,GAAkB,aAAa,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAU,EAAE,EAAE;gBAC5B,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC3B,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;gBACtB,MAAM,QAAQ,GAAQ;oBACpB,KAAK,EAAE,EAAE;oBACT,MAAM,EAAE,EAAE;iBACX,CAAC;gBACF,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACtD,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;oBACxB,MAAM,OAAO,GAAQ,EAAE,CAAC;oBACxB,MAAM,CAAC,OAAO,CAAC,uBAAc,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;wBAC3C,MAAM,CACJ,GAAG,EACH,KAAK,EACN,GAAG,KAAK,CAAC;wBACV,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;wBAC3C,OAAO,CAAC,GAAG,CAAC,GAAG,gBAAgB,IAAI,gBAAgB,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;oBAChF,CAAC,CAAC,CAAC;oBACH,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;oBACpD,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBACpB,SAAS;oBACX,CAAC;oBACD,IAAI,QAAQ,EAAE,CAAC;wBACb,IAAI,CAAC,QAAQ,EAAE,CAAC;4BACd,SAAS;wBACX,CAAC;wBACD,MAAM,IAAI,GAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;wBACrC,IAAI,CAAC,MAAM,GAAG,IAAI,iBAAQ,EAAE,CAAC;wBAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;wBAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACvB,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC5B,CAAC;yBAAM,CAAC;wBACN,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;oBAChC,CAAC;gBACH,CAAC;gBACD,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;oBAClC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC1C,CAAC;gBACD,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAS,EAAE,EAAE;oBACnC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;oBACxC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAW,EAAE,EAAE,CAAC,CAAC;oBAC1C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;wBAClB,MAAM,EAAE,MAAM;wBACd,IAAI,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM;wBAClC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,oBAAW,EAAE,EAAE,CAAC;qBAC5C,CAAC;gBACJ,CAAC,CAAC,CAAC;gBACH,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAU,EAAE,EAAE;gBAC5B,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACzB,IAAI,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;oBACrD,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;oBAC/B,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;oBAC9B,MAAM,CAAC;wBACL,UAAU,EAAE,GAAG;wBACf,OAAO,EAAE,mBAAmB;qBACT,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;gBACtB,IAAI,WAAW,EAAE,UAAU,CAAC,oBAAW,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC9C,IAAI,CAAC;wBACH,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,EAAE,KAAK;4BACjD,IAAI,CAAC,uCAA8B,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gCAC9C,OAAO,KAAK,CAAC;4BACf,CAAC;wBACH,CAAC,CAAC,CAAC;wBACH,OAAO,EAAE,CAAC;oBACZ,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;oBAC5D,CAAC;gBACH,CAAC;qBAAM,IAAI,WAAW,EAAE,UAAU,CAAC,oBAAW,CAAC,qBAAqB,CAAC,EAAE,CAAC;oBACtE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,IAAY,EAAE,EAAE;wBACvC,MAAM,CACJ,GAAG,EACH,KAAK,EACN,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBACpB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;oBAC3B,CAAC,CAAC,CAAC;oBACH,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,IACL;oBACE,oBAAW,CAAC,GAAG,CAAC,QAAQ,EAAE;oBAC1B,oBAAW,CAAC,QAAQ,CAAC,QAAQ,EAAE;iBAChC,CAAC,QAAQ,CAAC,WAAW,CAAC,EACvB,CAAC;oBACD,IAAI,CAAC;wBACH,MAAM,CAAC,IAAI,GAAG,IAAA,sBAAS,EAAC,IAAI,CAAC,CAAC;oBAChC,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,MAAM,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,qBAAqB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACzE,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;oBACnB,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,6 @@
1
+ type XmlValue = string | XmlObject | XmlValue[];
2
+ type XmlObject = {
3
+ [key: string]: XmlValue;
4
+ };
5
+ export declare function xmlParser(xmlInput: string): XmlObject;
6
+ export {};
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.xmlParser = xmlParser;
4
+ function xmlParser(xmlInput) {
5
+ let xml = xmlInput;
6
+ let pos = 0;
7
+ xml = xml.replace(/<\?xml[^?]*\?>/g, '');
8
+ xml = xml.replace(/<!--[\s\S]*?-->/g, '');
9
+ xml = xml.trim();
10
+ if (!xml) {
11
+ return {};
12
+ }
13
+ function skipWhitespace() {
14
+ while (pos < xml.length && /\s/.test(xml[pos])) {
15
+ pos++;
16
+ }
17
+ }
18
+ function parseAttributes(tagContent) {
19
+ const attrs = {};
20
+ const attrRegex = /([a-zA-Z_:][\w:.-]*)\s*=\s*"([^"]*)"|([a-zA-Z_:][\w:.-]*)\s*=\s*'([^']*)'/g;
21
+ let match;
22
+ match = attrRegex.exec(tagContent);
23
+ while (match !== null) {
24
+ const name = match[1] || match[3];
25
+ const value = match[2] !== undefined ? match[2] : match[4];
26
+ attrs[name] = decodeEntities(value);
27
+ match = attrRegex.exec(tagContent);
28
+ }
29
+ return attrs;
30
+ }
31
+ function decodeEntities(str) {
32
+ return str
33
+ .replace(/<!\[CDATA\[([\s\S]*?)\]\]>/g, '$1')
34
+ .replace(/&lt;/g, '<')
35
+ .replace(/&gt;/g, '>')
36
+ .replace(/&quot;/g, '"')
37
+ .replace(/&apos;/g, "'")
38
+ .replace(/&amp;/g, '&');
39
+ }
40
+ function resolveScope(rawAttrs, parentScope) {
41
+ const scope = {
42
+ defaultUri: parentScope.defaultUri,
43
+ prefixes: { ...parentScope.prefixes },
44
+ };
45
+ const dataAttrs = {};
46
+ for (const [key, value,] of Object.entries(rawAttrs)) {
47
+ if (key === 'xmlns') {
48
+ scope.defaultUri = value;
49
+ }
50
+ else if (key.startsWith('xmlns:')) {
51
+ const prefix = key.slice('xmlns:'.length);
52
+ scope.prefixes[prefix] = value;
53
+ }
54
+ else {
55
+ dataAttrs[key] = value;
56
+ }
57
+ }
58
+ return { scope, dataAttrs };
59
+ }
60
+ function resolveTagNamespace(tagName, scope) {
61
+ const colonIndex = tagName.indexOf(':');
62
+ if (colonIndex === -1) {
63
+ return { localName: tagName, namespaceUri: scope.defaultUri };
64
+ }
65
+ const prefix = tagName.slice(0, colonIndex);
66
+ const localName = tagName.slice(colonIndex + 1);
67
+ const namespaceUri = scope.prefixes[prefix] ?? null;
68
+ return { localName, namespaceUri };
69
+ }
70
+ function addChild(parent, key, value) {
71
+ if (Object.prototype.hasOwnProperty.call(parent, key)) {
72
+ const existing = parent[key];
73
+ if (Array.isArray(existing)) {
74
+ existing.push(value);
75
+ }
76
+ else {
77
+ parent[key] = [
78
+ existing,
79
+ value,
80
+ ];
81
+ }
82
+ }
83
+ else {
84
+ parent[key] = value;
85
+ }
86
+ }
87
+ function parseElement(parentScope) {
88
+ skipWhitespace();
89
+ if (xml[pos] !== '<') {
90
+ return null;
91
+ }
92
+ const tagMatch = /^<([a-zA-Z_:][\w:.-]*)((?:\s+[^>]*?)?)(\/?)>/.exec(xml.slice(pos));
93
+ if (!tagMatch) {
94
+ throw new Error(`Malformed XML near position ${pos}: ${xml.slice(pos, pos + 40)}`);
95
+ }
96
+ const fullMatch = tagMatch[0];
97
+ const rawTagName = tagMatch[1];
98
+ const rawAttrsText = tagMatch[2];
99
+ const selfClosing = tagMatch[3];
100
+ pos += fullMatch.length;
101
+ const rawAttrs = parseAttributes(rawAttrsText);
102
+ const { scope, dataAttrs } = resolveScope(rawAttrs, parentScope);
103
+ const { localName, namespaceUri } = resolveTagNamespace(rawTagName, scope);
104
+ const hasAttrs = Object.keys(dataAttrs).length > 0;
105
+ if (selfClosing === '/') {
106
+ const value = { '@ns': namespaceUri };
107
+ if (hasAttrs) {
108
+ value['@attrs'] = dataAttrs;
109
+ }
110
+ return [
111
+ localName,
112
+ value,
113
+ ];
114
+ }
115
+ const children = {};
116
+ let textContent = '';
117
+ let sawChildElement = false;
118
+ while (pos < xml.length) {
119
+ skipWhitespace();
120
+ const closeMatch = new RegExp(`^</${rawTagName}\\s*>`).exec(xml.slice(pos));
121
+ if (closeMatch) {
122
+ pos += closeMatch[0].length;
123
+ break;
124
+ }
125
+ if (xml[pos] === '<') {
126
+ if (xml.slice(pos, pos + 9) === '<![CDATA[') {
127
+ const end = xml.indexOf(']]>', pos);
128
+ if (end === -1) {
129
+ throw new Error('Unterminated CDATA section');
130
+ }
131
+ textContent += xml.slice(pos + 9, end);
132
+ pos = end + 3;
133
+ continue;
134
+ }
135
+ const child = parseElement(scope);
136
+ if (child) {
137
+ const [childName, childValue,] = child;
138
+ sawChildElement = true;
139
+ addChild(children, childName, childValue);
140
+ }
141
+ }
142
+ else {
143
+ const nextTag = xml.indexOf('<', pos);
144
+ const end = nextTag === -1 ? xml.length : nextTag;
145
+ textContent += xml.slice(pos, end);
146
+ pos = end;
147
+ }
148
+ }
149
+ const trimmedText = decodeEntities(textContent.trim());
150
+ if (sawChildElement) {
151
+ children['@ns'] = namespaceUri;
152
+ if (hasAttrs) {
153
+ children['@attrs'] = dataAttrs;
154
+ }
155
+ return [
156
+ localName,
157
+ children,
158
+ ];
159
+ }
160
+ // Leaf node (no child elements). If there are no attributes, return a plain
161
+ // string for ergonomics — the common case for payment-message field values
162
+ // like <IBAN>...</IBAN> or <MsgId>...</MsgId>. Namespace on a plain-string
163
+ // leaf is recoverable from its parent's "@ns", since a leaf can't redeclare
164
+ // scope for anything beneath it (it has no children).
165
+ if (!hasAttrs) {
166
+ return [
167
+ localName,
168
+ trimmedText,
169
+ ];
170
+ }
171
+ const leaf = { '@ns': namespaceUri, '@attrs': dataAttrs };
172
+ if (trimmedText) {
173
+ leaf['#text'] = trimmedText;
174
+ }
175
+ return [
176
+ localName,
177
+ leaf,
178
+ ];
179
+ }
180
+ const rootScope = { defaultUri: null, prefixes: {} };
181
+ const root = {};
182
+ const rootElement = parseElement(rootScope);
183
+ if (rootElement) {
184
+ const [rootName, rootValue,] = rootElement;
185
+ root[rootName] = rootValue;
186
+ }
187
+ return root;
188
+ }
189
+ //# sourceMappingURL=xml-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml-parser.js","sourceRoot":"","sources":["../../../src/helpers/parser/xml-parser.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "alado",
3
- "version": "2.5.3",
3
+ "version": "2.6.1",
4
4
  "description": "Extremely fast, lightweight, robust framework for HTTP applications written in Node.js",
5
5
  "keywords": [
6
6
  "HTTP",
@@ -30,15 +30,15 @@
30
30
  "@eslint/js": "^10.0.1",
31
31
  "@types/node": "24.13.1",
32
32
  "@types/prettier": "3.0.0",
33
- "@typescript-eslint/eslint-plugin": "8.62.1",
34
- "@typescript-eslint/parser": "8.62.1",
35
- "eslint": "10.6.0",
33
+ "@typescript-eslint/eslint-plugin": "8.64.0",
34
+ "@typescript-eslint/parser": "8.64.0",
35
+ "eslint": "10.7.0",
36
36
  "husky": "9.1.7",
37
- "prettier": "3.9.4",
38
- "prettier-plugin-multiline-arrays": "4.1.9",
39
- "tsc-alias": "1.8.17",
37
+ "prettier": "3.9.5",
38
+ "prettier-plugin-multiline-arrays": "4.1.10",
39
+ "tsc-alias": "1.9.1",
40
40
  "typescript": "5.9.3",
41
- "typescript-eslint": "^8.62.1"
41
+ "typescript-eslint": "^8.64.0"
42
42
  },
43
43
  "repository": {
44
44
  "type": "git",