@pallasoft/ps-utilities 2.15.0 → 2.17.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.
@@ -0,0 +1,4 @@
1
+ export declare class Base64Service {
2
+ static encode(bytes: Uint8Array): string;
3
+ static decode(value: string): Uint8Array<ArrayBuffer>;
4
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Base64Service = void 0;
4
+ var Base64Service = /** @class */ (function () {
5
+ function Base64Service() {
6
+ }
7
+ Base64Service.encode = function (bytes) {
8
+ var binary = '';
9
+ for (var index = 0; index < bytes.length; index += 1) {
10
+ binary += String.fromCharCode(bytes[index]);
11
+ }
12
+ return btoa(binary);
13
+ };
14
+ Base64Service.decode = function (value) {
15
+ var binary = atob(value.trim());
16
+ var bytes = new Uint8Array(new ArrayBuffer(binary.length));
17
+ for (var index = 0; index < binary.length; index += 1) {
18
+ bytes[index] = binary.charCodeAt(index);
19
+ }
20
+ return bytes;
21
+ };
22
+ return Base64Service;
23
+ }());
24
+ exports.Base64Service = Base64Service;
@@ -0,0 +1,3 @@
1
+ export declare const HttpAuthScheme: {
2
+ readonly bearerPrefix: "Bearer ";
3
+ };
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HttpAuthScheme = void 0;
4
+ exports.HttpAuthScheme = {
5
+ bearerPrefix: 'Bearer ',
6
+ };
@@ -11,8 +11,11 @@ export declare const HttpHeader: {
11
11
  readonly cookie: "Cookie";
12
12
  readonly forwardedFor: "X-Forwarded-For";
13
13
  readonly frameOptions: "X-Frame-Options";
14
+ readonly idempotencyKey: "Idempotency-Key";
14
15
  readonly location: "Location";
16
+ readonly prefer: "Prefer";
15
17
  readonly realIp: "X-Real-IP";
18
+ readonly retryAfter: "Retry-After";
16
19
  readonly robotsTag: "X-Robots-Tag";
17
20
  readonly setCookie: "Set-Cookie";
18
21
  readonly strictTransportSecurity: "Strict-Transport-Security";
@@ -14,8 +14,11 @@ exports.HttpHeader = {
14
14
  cookie: 'Cookie',
15
15
  forwardedFor: 'X-Forwarded-For',
16
16
  frameOptions: 'X-Frame-Options',
17
+ idempotencyKey: 'Idempotency-Key',
17
18
  location: 'Location',
19
+ prefer: 'Prefer',
18
20
  realIp: 'X-Real-IP',
21
+ retryAfter: 'Retry-After',
19
22
  robotsTag: 'X-Robots-Tag',
20
23
  setCookie: 'Set-Cookie',
21
24
  strictTransportSecurity: 'Strict-Transport-Security',
@@ -10,8 +10,10 @@ export * from './socket-token-config';
10
10
  export * from './user-agent-config';
11
11
  export * from './amount-direction';
12
12
  export * from './error-response-config';
13
+ export * from './http-auth-scheme';
13
14
  export * from './http-content-type';
14
15
  export * from './http-header';
15
16
  export * from './http-method';
16
17
  export * from './relative-time-config';
17
18
  export * from './request-client-config';
19
+ export * from './portable-text-config';
@@ -26,8 +26,10 @@ __exportStar(require("./socket-token-config"), exports);
26
26
  __exportStar(require("./user-agent-config"), exports);
27
27
  __exportStar(require("./amount-direction"), exports);
28
28
  __exportStar(require("./error-response-config"), exports);
29
+ __exportStar(require("./http-auth-scheme"), exports);
29
30
  __exportStar(require("./http-content-type"), exports);
30
31
  __exportStar(require("./http-header"), exports);
31
32
  __exportStar(require("./http-method"), exports);
32
33
  __exportStar(require("./relative-time-config"), exports);
33
34
  __exportStar(require("./request-client-config"), exports);
35
+ __exportStar(require("./portable-text-config"), exports);
@@ -0,0 +1,19 @@
1
+ export declare const PortableTextConfig: {
2
+ readonly linkRel: "noopener noreferrer";
3
+ readonly linkTarget: "_blank";
4
+ readonly paragraphSeparator: "\n\n";
5
+ readonly lineSeparator: "\n";
6
+ readonly paragraphSplitPattern: RegExp;
7
+ readonly lineBreakPattern: RegExp;
8
+ readonly bulletPrefix: "- ";
9
+ readonly quotePrefix: "> ";
10
+ readonly numberSuffix: ". ";
11
+ readonly keyPrefix: {
12
+ readonly block: "b";
13
+ readonly span: "s";
14
+ };
15
+ readonly normalStyle: "normal";
16
+ readonly quoteStyle: "blockquote";
17
+ readonly bulletItem: "bullet";
18
+ readonly numberItem: "number";
19
+ };
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PortableTextConfig = void 0;
4
+ var ps_models_1 = require("@pallasoft/ps-models");
5
+ exports.PortableTextConfig = {
6
+ linkRel: 'noopener noreferrer',
7
+ linkTarget: '_blank',
8
+ paragraphSeparator: '\n\n',
9
+ lineSeparator: '\n',
10
+ paragraphSplitPattern: /\n[ \t]*\n/,
11
+ lineBreakPattern: /\r\n?/g,
12
+ bulletPrefix: '- ',
13
+ quotePrefix: '> ',
14
+ numberSuffix: '. ',
15
+ keyPrefix: { block: 'b', span: 's' },
16
+ normalStyle: ps_models_1.Common.PortableTextConfig.styles[0],
17
+ quoteStyle: ps_models_1.Common.PortableTextConfig.styles[1],
18
+ bulletItem: ps_models_1.Common.PortableTextConfig.listItems[0],
19
+ numberItem: ps_models_1.Common.PortableTextConfig.listItems[1],
20
+ };
@@ -11,8 +11,6 @@ export declare class CryptoService {
11
11
  private static _dataKeyLength;
12
12
  private static _payloadAlgorithm;
13
13
  private static _aad;
14
- private static _toBase64;
15
- private static _fromBase64;
16
14
  private static _getAdditionalData;
17
15
  private static _parsePayload;
18
16
  private static _deriveKey;
@@ -37,24 +37,10 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.CryptoService = void 0;
40
+ var base64_service_1 = require("./base64-service");
40
41
  var CryptoService = /** @class */ (function () {
41
42
  function CryptoService() {
42
43
  }
43
- CryptoService._toBase64 = function (bytes) {
44
- var binary = '';
45
- for (var index = 0; index < bytes.length; index += 1) {
46
- binary += String.fromCharCode(bytes[index]);
47
- }
48
- return btoa(binary);
49
- };
50
- CryptoService._fromBase64 = function (value) {
51
- var binary = atob(value);
52
- var bytes = new Uint8Array(binary.length);
53
- for (var index = 0; index < binary.length; index += 1) {
54
- bytes[index] = binary.charCodeAt(index);
55
- }
56
- return bytes;
57
- };
58
44
  CryptoService._getAdditionalData = function () {
59
45
  return this._textEncoder.encode(this._aad);
60
46
  };
@@ -113,9 +99,9 @@ var CryptoService = /** @class */ (function () {
113
99
  serializedPayload = {
114
100
  v: this._payloadVersion,
115
101
  alg: this._payloadAlgorithm,
116
- iv: this._toBase64(iv),
117
- salt: this._toBase64(salt),
118
- ciphertext: this._toBase64(new Uint8Array(encryptedBuffer)),
102
+ iv: base64_service_1.Base64Service.encode(iv),
103
+ salt: base64_service_1.Base64Service.encode(salt),
104
+ ciphertext: base64_service_1.Base64Service.encode(new Uint8Array(encryptedBuffer)),
119
105
  };
120
106
  return [2 /*return*/, JSON.stringify(serializedPayload)];
121
107
  }
@@ -126,14 +112,14 @@ var CryptoService = /** @class */ (function () {
126
112
  return __awaiter(this, void 0, void 0, function () {
127
113
  return __generator(this, function (_a) {
128
114
  switch (_a.label) {
129
- case 0: return [4 /*yield*/, crypto.subtle.importKey('raw', this._fromBase64(dataKey), { name: this._algorithm, length: this._keyLength }, false, ['encrypt', 'decrypt'])];
115
+ case 0: return [4 /*yield*/, crypto.subtle.importKey('raw', base64_service_1.Base64Service.decode(dataKey), { name: this._algorithm, length: this._keyLength }, false, ['encrypt', 'decrypt'])];
130
116
  case 1: return [2 /*return*/, _a.sent()];
131
117
  }
132
118
  });
133
119
  });
134
120
  };
135
121
  CryptoService.generateDataKey = function () {
136
- return this._toBase64(crypto.getRandomValues(new Uint8Array(this._dataKeyLength)));
122
+ return base64_service_1.Base64Service.encode(crypto.getRandomValues(new Uint8Array(this._dataKeyLength)));
137
123
  };
138
124
  CryptoService.encryptPayloadWithDataKey = function (payload, dataKey) {
139
125
  return __awaiter(this, void 0, void 0, function () {
@@ -151,8 +137,8 @@ var CryptoService = /** @class */ (function () {
151
137
  return [2 /*return*/, JSON.stringify({
152
138
  v: this._dataKeyPayloadVersion,
153
139
  alg: this._payloadAlgorithm,
154
- iv: this._toBase64(iv),
155
- ciphertext: this._toBase64(new Uint8Array(encryptedBuffer)),
140
+ iv: base64_service_1.Base64Service.encode(iv),
141
+ ciphertext: base64_service_1.Base64Service.encode(new Uint8Array(encryptedBuffer)),
156
142
  })];
157
143
  }
158
144
  });
@@ -168,11 +154,11 @@ var CryptoService = /** @class */ (function () {
168
154
  _b = (_a = crypto.subtle).decrypt;
169
155
  _c = [{
170
156
  name: this._algorithm,
171
- iv: this._fromBase64(payload.iv),
157
+ iv: base64_service_1.Base64Service.decode(payload.iv),
172
158
  additionalData: this._getAdditionalData(),
173
159
  }];
174
160
  return [4 /*yield*/, this._importDataKey(dataKey)];
175
- case 1: return [4 /*yield*/, _b.apply(_a, _c.concat([_d.sent(), this._fromBase64(payload.ciphertext)]))];
161
+ case 1: return [4 /*yield*/, _b.apply(_a, _c.concat([_d.sent(), base64_service_1.Base64Service.decode(payload.ciphertext)]))];
176
162
  case 2:
177
163
  decryptedBuffer = _d.sent();
178
164
  return [2 /*return*/, JSON.parse(this._textDecoder.decode(decryptedBuffer))];
@@ -242,14 +228,14 @@ var CryptoService = /** @class */ (function () {
242
228
  switch (_a.label) {
243
229
  case 0:
244
230
  payload = this._parsePayload(encryptedPayload);
245
- return [4 /*yield*/, this._deriveKey(cryptoKey, this._fromBase64(payload.salt))];
231
+ return [4 /*yield*/, this._deriveKey(cryptoKey, base64_service_1.Base64Service.decode(payload.salt))];
246
232
  case 1:
247
233
  key = _a.sent();
248
234
  return [4 /*yield*/, crypto.subtle.decrypt({
249
235
  name: this._algorithm,
250
- iv: this._fromBase64(payload.iv),
236
+ iv: base64_service_1.Base64Service.decode(payload.iv),
251
237
  additionalData: this._getAdditionalData(),
252
- }, key, this._fromBase64(payload.ciphertext))];
238
+ }, key, base64_service_1.Base64Service.decode(payload.ciphertext))];
253
239
  case 2:
254
240
  decryptedBuffer = _a.sent();
255
241
  return [2 /*return*/, JSON.parse(this._textDecoder.decode(decryptedBuffer))];
@@ -1,4 +1,5 @@
1
1
  export * from './amount-service';
2
+ export * from './base64-service';
2
3
  export * from './color-service';
3
4
  export * from './constants';
4
5
  export * from './crypto-service';
@@ -23,3 +24,4 @@ export * from './error-response-service';
23
24
  export * from './relative-time-service';
24
25
  export * from './request-client-service';
25
26
  export * from './json-service';
27
+ export * from './portable-text-service';
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./amount-service"), exports);
18
+ __exportStar(require("./base64-service"), exports);
18
19
  __exportStar(require("./color-service"), exports);
19
20
  __exportStar(require("./constants"), exports);
20
21
  __exportStar(require("./crypto-service"), exports);
@@ -39,3 +40,4 @@ __exportStar(require("./error-response-service"), exports);
39
40
  __exportStar(require("./relative-time-service"), exports);
40
41
  __exportStar(require("./request-client-service"), exports);
41
42
  __exportStar(require("./json-service"), exports);
43
+ __exportStar(require("./portable-text-service"), exports);
@@ -0,0 +1,9 @@
1
+ import type { PortableTextBlock } from '@portabletext/types';
2
+ export declare class PortableTextService {
3
+ static toPlainText(blocks: PortableTextBlock[]): string;
4
+ static fromPlainText(text: string): PortableTextBlock[];
5
+ static isEmpty(blocks: PortableTextBlock[] | null | undefined): boolean;
6
+ static toHtml(blocks: PortableTextBlock[]): string;
7
+ private static blockText;
8
+ private static isSafeLink;
9
+ }
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PortableTextService = void 0;
4
+ var ps_models_1 = require("@pallasoft/ps-models");
5
+ var to_html_1 = require("@portabletext/to-html");
6
+ var portable_text_config_1 = require("./constants/portable-text-config");
7
+ var PortableTextService = /** @class */ (function () {
8
+ function PortableTextService() {
9
+ }
10
+ PortableTextService.toPlainText = function (blocks) {
11
+ var _this = this;
12
+ var lines = [];
13
+ var counters = {};
14
+ var previousWasList = false;
15
+ blocks.forEach(function (block) {
16
+ if (block._type !== ps_models_1.Common.PortableTextConfig.blockType)
17
+ return;
18
+ var text = _this.blockText(block);
19
+ var level = typeof block.level === 'number' ? block.level : 1;
20
+ var isNumber = block.listItem === portable_text_config_1.PortableTextConfig.numberItem;
21
+ var isBullet = block.listItem === portable_text_config_1.PortableTextConfig.bulletItem;
22
+ var isList = isNumber || isBullet;
23
+ if (!isList) {
24
+ counters[level] = 0;
25
+ if (lines.length > 0)
26
+ lines.push(portable_text_config_1.PortableTextConfig.paragraphSeparator);
27
+ lines.push(block.style === portable_text_config_1.PortableTextConfig.quoteStyle
28
+ ? portable_text_config_1.PortableTextConfig.quotePrefix + text
29
+ : text);
30
+ previousWasList = false;
31
+ return;
32
+ }
33
+ counters[level] = isNumber
34
+ ? (typeof counters[level] === 'number' ? counters[level] : 0) + 1
35
+ : 0;
36
+ var prefix = isNumber
37
+ ? "".concat(counters[level]).concat(portable_text_config_1.PortableTextConfig.numberSuffix)
38
+ : portable_text_config_1.PortableTextConfig.bulletPrefix;
39
+ var indent = ' '.repeat(level - 1);
40
+ if (lines.length > 0)
41
+ lines.push(previousWasList ? portable_text_config_1.PortableTextConfig.lineSeparator : portable_text_config_1.PortableTextConfig.paragraphSeparator);
42
+ lines.push(indent + prefix + text);
43
+ previousWasList = true;
44
+ });
45
+ return lines.join('');
46
+ };
47
+ PortableTextService.fromPlainText = function (text) {
48
+ return text
49
+ .replace(portable_text_config_1.PortableTextConfig.lineBreakPattern, portable_text_config_1.PortableTextConfig.lineSeparator)
50
+ .split(portable_text_config_1.PortableTextConfig.paragraphSplitPattern)
51
+ .map(function (paragraph) { return paragraph.trim(); })
52
+ .filter(function (paragraph) { return paragraph.length > 0; })
53
+ .map(function (paragraph, index) { return ({
54
+ _type: ps_models_1.Common.PortableTextConfig.blockType,
55
+ _key: "".concat(portable_text_config_1.PortableTextConfig.keyPrefix.block).concat(index),
56
+ style: portable_text_config_1.PortableTextConfig.normalStyle,
57
+ markDefs: [],
58
+ children: [
59
+ {
60
+ _type: ps_models_1.Common.PortableTextConfig.spanType,
61
+ _key: "".concat(portable_text_config_1.PortableTextConfig.keyPrefix.span).concat(index),
62
+ text: paragraph,
63
+ marks: [],
64
+ },
65
+ ],
66
+ }); });
67
+ };
68
+ PortableTextService.isEmpty = function (blocks) {
69
+ var _this = this;
70
+ return (!Array.isArray(blocks) || blocks.every(function (block) { return _this.blockText(block).trim().length === 0; }));
71
+ };
72
+ PortableTextService.toHtml = function (blocks) {
73
+ var _this = this;
74
+ return (0, to_html_1.toHTML)(blocks, {
75
+ onMissingComponent: false,
76
+ components: {
77
+ marks: {
78
+ link: function (_a) {
79
+ var children = _a.children, value = _a.value;
80
+ var href = typeof (value === null || value === void 0 ? void 0 : value.href) === 'string' ? value.href : '';
81
+ return _this.isSafeLink(href)
82
+ ? "<a href=\"".concat((0, to_html_1.escapeHTML)(href), "\" rel=\"").concat(portable_text_config_1.PortableTextConfig.linkRel, "\" target=\"").concat(portable_text_config_1.PortableTextConfig.linkTarget, "\">").concat(children, "</a>")
83
+ : children;
84
+ },
85
+ },
86
+ },
87
+ });
88
+ };
89
+ PortableTextService.blockText = function (block) {
90
+ return Array.isArray(block.children)
91
+ ? block.children
92
+ .map(function (child) {
93
+ return child._type === ps_models_1.Common.PortableTextConfig.spanType && typeof child.text === 'string'
94
+ ? child.text
95
+ : '';
96
+ })
97
+ .join('')
98
+ : '';
99
+ };
100
+ PortableTextService.isSafeLink = function (href) {
101
+ try {
102
+ return ps_models_1.Common.PortableTextConfig.linkProtocols.includes(new URL(href).protocol);
103
+ }
104
+ catch (_a) {
105
+ return false;
106
+ }
107
+ };
108
+ return PortableTextService;
109
+ }());
110
+ exports.PortableTextService = PortableTextService;
@@ -12,8 +12,6 @@ export declare class SignedTokenService {
12
12
  private static _remember;
13
13
  private static _encodeJson;
14
14
  private static _decodeJson;
15
- private static _toBase64;
16
- private static _fromBase64;
17
15
  private static _toBase64Url;
18
16
  private static _fromBase64Url;
19
17
  }
@@ -37,6 +37,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.SignedTokenService = void 0;
40
+ var base64_service_1 = require("./base64-service");
40
41
  var signed_token_config_1 = require("./constants/signed-token-config");
41
42
  var SignedTokenService = /** @class */ (function () {
42
43
  function SignedTokenService() {
@@ -59,8 +60,8 @@ var SignedTokenService = /** @class */ (function () {
59
60
  case 3:
60
61
  publicKey = _a.sent();
61
62
  return [2 /*return*/, {
62
- privateKey: this._toBase64(new Uint8Array(privateKey)),
63
- publicKey: this._toBase64(new Uint8Array(publicKey)),
63
+ privateKey: base64_service_1.Base64Service.encode(new Uint8Array(privateKey)),
64
+ publicKey: base64_service_1.Base64Service.encode(new Uint8Array(publicKey)),
64
65
  }];
65
66
  }
66
67
  });
@@ -142,7 +143,7 @@ var SignedTokenService = /** @class */ (function () {
142
143
  cached = this._privateKeys.get(privateKey);
143
144
  if (cached !== undefined)
144
145
  return [2 /*return*/, cached];
145
- return [4 /*yield*/, crypto.subtle.importKey(signed_token_config_1.SignedTokenConfig.privateKeyFormat, this._fromBase64(privateKey), signed_token_config_1.SignedTokenConfig.keyAlgorithm, false, ['sign'])];
146
+ return [4 /*yield*/, crypto.subtle.importKey(signed_token_config_1.SignedTokenConfig.privateKeyFormat, base64_service_1.Base64Service.decode(privateKey), signed_token_config_1.SignedTokenConfig.keyAlgorithm, false, ['sign'])];
146
147
  case 1:
147
148
  key = _a.sent();
148
149
  this._remember(this._privateKeys, privateKey, key);
@@ -160,7 +161,7 @@ var SignedTokenService = /** @class */ (function () {
160
161
  cached = this._publicKeys.get(publicKey);
161
162
  if (cached !== undefined)
162
163
  return [2 /*return*/, cached];
163
- return [4 /*yield*/, crypto.subtle.importKey(signed_token_config_1.SignedTokenConfig.publicKeyFormat, this._fromBase64(publicKey), signed_token_config_1.SignedTokenConfig.keyAlgorithm, false, ['verify'])];
164
+ return [4 /*yield*/, crypto.subtle.importKey(signed_token_config_1.SignedTokenConfig.publicKeyFormat, base64_service_1.Base64Service.decode(publicKey), signed_token_config_1.SignedTokenConfig.keyAlgorithm, false, ['verify'])];
164
165
  case 1:
165
166
  key = _a.sent();
166
167
  this._remember(this._publicKeys, publicKey, key);
@@ -194,23 +195,8 @@ var SignedTokenService = /** @class */ (function () {
194
195
  return null;
195
196
  }
196
197
  };
197
- SignedTokenService._toBase64 = function (bytes) {
198
- var binary = '';
199
- for (var index = 0; index < bytes.length; index += 1) {
200
- binary += String.fromCharCode(bytes[index]);
201
- }
202
- return btoa(binary);
203
- };
204
- SignedTokenService._fromBase64 = function (value) {
205
- var binary = atob(value.trim());
206
- var bytes = new Uint8Array(binary.length);
207
- for (var index = 0; index < binary.length; index += 1) {
208
- bytes[index] = binary.charCodeAt(index);
209
- }
210
- return bytes;
211
- };
212
198
  SignedTokenService._toBase64Url = function (bytes) {
213
- return this._toBase64(bytes).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
199
+ return base64_service_1.Base64Service.encode(bytes).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
214
200
  };
215
201
  SignedTokenService._fromBase64Url = function (value) {
216
202
  if (!/^[A-Za-z0-9_-]*$/.test(value))
@@ -218,7 +204,7 @@ var SignedTokenService = /** @class */ (function () {
218
204
  var base64 = value.replace(/-/g, '+').replace(/_/g, '/');
219
205
  var padding = base64.length % 4 === 0 ? '' : '='.repeat(4 - (base64.length % 4));
220
206
  try {
221
- return this._fromBase64("".concat(base64).concat(padding));
207
+ return base64_service_1.Base64Service.decode("".concat(base64).concat(padding));
222
208
  }
223
209
  catch (_a) {
224
210
  return null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pallasoft/ps-utilities",
3
- "version": "2.15.0",
3
+ "version": "2.17.0",
4
4
  "private": false,
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -77,6 +77,8 @@
77
77
  },
78
78
  "dependencies": {
79
79
  "@esbuild-plugins/tsconfig-paths": "^0.1.2",
80
+ "@pallasoft/ps-models": "^1.4.0",
81
+ "@portabletext/to-html": "^4.0.1",
80
82
  "dayjs": "^1.11.19",
81
83
  "esbuild": "^0.27.0",
82
84
  "libphonenumber-js": "^1.13.14"