coyotte508 HF staff commited on
Commit
142fc6a
1 Parent(s): 149a65c

♻️ Migrate pictures to Object Storage

Browse files
.env CHANGED
@@ -1,2 +1,7 @@
1
  MONGODB_URL=mongodb://localhost:27017/admin
2
- MAILGUN_API_KEY=
 
 
 
 
 
 
1
  MONGODB_URL=mongodb://localhost:27017/admin
2
+ MAILGUN_API_KEY=
3
+ S3_BUCKET=
4
+ S3_ENDPOINT_URL=
5
+ S3_REGION=
6
+ S3_KEY=
7
+ S3_SECRET=
package.json CHANGED
@@ -21,6 +21,7 @@
21
  "@types/busboy": "^1.5.0",
22
  "@types/lodash": "^4.14.188",
23
  "@types/marked": "^4.0.7",
 
24
  "@types/sharp": "^0.31.0",
25
  "@typescript-eslint/eslint-plugin": "^5.27.0",
26
  "@typescript-eslint/parser": "^5.27.0",
@@ -43,6 +44,8 @@
43
  },
44
  "type": "module",
45
  "dependencies": {
 
 
46
  "bcryptjs": "^2.4.3",
47
  "busboy": "^1.6.0",
48
  "date-fns": "^2.29.3",
@@ -50,6 +53,7 @@
50
  "lodash": "^4.17.21",
51
  "mailgun.js": "^8.0.2",
52
  "marked": "^4.2.2",
 
53
  "mongodb": "^4.11.0",
54
  "nanoid": "^4.0.0",
55
  "sharp": "^0.31.2"
 
21
  "@types/busboy": "^1.5.0",
22
  "@types/lodash": "^4.14.188",
23
  "@types/marked": "^4.0.7",
24
+ "@types/mime-types": "^2.1.1",
25
  "@types/sharp": "^0.31.0",
26
  "@typescript-eslint/eslint-plugin": "^5.27.0",
27
  "@typescript-eslint/parser": "^5.27.0",
 
44
  },
45
  "type": "module",
46
  "dependencies": {
47
+ "@aws-sdk/client-s3": "^3.354.0",
48
+ "@aws-sdk/s3-request-presigner": "^3.354.0",
49
  "bcryptjs": "^2.4.3",
50
  "busboy": "^1.6.0",
51
  "date-fns": "^2.29.3",
 
53
  "lodash": "^4.17.21",
54
  "mailgun.js": "^8.0.2",
55
  "marked": "^4.2.2",
56
+ "mime-types": "^2.1.35",
57
  "mongodb": "^4.11.0",
58
  "nanoid": "^4.0.0",
59
  "sharp": "^0.31.2"
pnpm-lock.yaml CHANGED
@@ -1,6 +1,8 @@
1
  lockfileVersion: 5.4
2
 
3
  specifiers:
 
 
4
  '@iconify-json/ant-design': ^1.1.3
5
  '@iconify-json/il': ^1.1.2
6
  '@sveltejs/adapter-node': ^1.1.4
@@ -9,6 +11,7 @@ specifiers:
9
  '@types/busboy': ^1.5.0
10
  '@types/lodash': ^4.14.188
11
  '@types/marked': ^4.0.7
 
12
  '@types/sharp': ^0.31.0
13
  '@typescript-eslint/eslint-plugin': ^5.27.0
14
  '@typescript-eslint/parser': ^5.27.0
@@ -25,6 +28,7 @@ specifiers:
25
  lodash: ^4.17.21
26
  mailgun.js: ^8.0.2
27
  marked: ^4.2.2
 
28
  mongodb: ^4.11.0
29
  nanoid: ^4.0.0
30
  prettier: ^2.8.3
@@ -40,6 +44,8 @@ specifiers:
40
  vite: ^4.0.4
41
 
42
  dependencies:
 
 
43
  bcryptjs: 2.4.3
44
  busboy: 1.6.0
45
  date-fns: 2.29.3
@@ -47,6 +53,7 @@ dependencies:
47
  lodash: 4.17.21
48
  mailgun.js: 8.0.2
49
  marked: 4.2.2
 
50
  mongodb: 4.11.0
51
  nanoid: 4.0.0
52
  sharp: 0.31.2
@@ -60,6 +67,7 @@ devDependencies:
60
  '@types/busboy': 1.5.0
61
  '@types/lodash': 4.14.188
62
  '@types/marked': 4.0.7
 
63
  '@types/sharp': 0.31.0
64
  '@typescript-eslint/eslint-plugin': 5.42.0_maf6oeqzrvvbbdpgg7uzhystc4
65
  '@typescript-eslint/parser': 5.42.0_wjftjwwutwf6hy45blo2onh3s4
@@ -105,6 +113,22 @@ packages:
105
  resolution: {integrity: sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==}
106
  dev: true
107
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
  /@aws-crypto/ie11-detection/2.0.2:
109
  resolution: {integrity: sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==}
110
  dependencies:
@@ -112,6 +136,24 @@ packages:
112
  dev: false
113
  optional: true
114
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
  /@aws-crypto/sha256-browser/2.0.0:
116
  resolution: {integrity: sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==}
117
  dependencies:
@@ -126,6 +168,19 @@ packages:
126
  dev: false
127
  optional: true
128
 
 
 
 
 
 
 
 
 
 
 
 
 
 
129
  /@aws-crypto/sha256-js/2.0.0:
130
  resolution: {integrity: sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==}
131
  dependencies:
@@ -135,6 +190,14 @@ packages:
135
  dev: false
136
  optional: true
137
 
 
 
 
 
 
 
 
 
138
  /@aws-crypto/supports-web-crypto/2.0.2:
139
  resolution: {integrity: sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==}
140
  dependencies:
@@ -142,6 +205,12 @@ packages:
142
  dev: false
143
  optional: true
144
 
 
 
 
 
 
 
145
  /@aws-crypto/util/2.0.2:
146
  resolution: {integrity: sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==}
147
  dependencies:
@@ -151,6 +220,14 @@ packages:
151
  dev: false
152
  optional: true
153
 
 
 
 
 
 
 
 
 
154
  /@aws-sdk/abort-controller/3.201.0:
155
  resolution: {integrity: sha512-xJ984k+CKlGjBmvNarzM8Y+b6X4L1Zt0TycQmVBJq7fAr/ju9l13pQIoXR5WlDIW1FkGeVczF5Nu6fN46SCORQ==}
156
  engines: {node: '>=14.0.0'}
@@ -160,6 +237,20 @@ packages:
160
  dev: false
161
  optional: true
162
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
  /@aws-sdk/client-cognito-identity/3.204.0:
164
  resolution: {integrity: sha512-uftJkNKYcZ8bXVwcpOn5ZUjUX0IRto0ZrTO8DBdS9b7PJu2Y84eSy46LsAYuRDC0PZreQxy8nOH5HmI86/W8xQ==}
165
  engines: {node: '>=14.0.0'}
@@ -206,6 +297,111 @@ packages:
206
  dev: false
207
  optional: true
208
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
209
  /@aws-sdk/client-sso/3.204.0:
210
  resolution: {integrity: sha512-AECcNrcAQxV/Jlu8ogshRaYwt2jayx0omQJs/SXj70mWxmbk4MQnb+DqJIpPpOKBHaza/xlC2TKS1RzkiuZxyw==}
211
  engines: {node: '>=14.0.0'}
@@ -249,6 +445,47 @@ packages:
249
  dev: false
250
  optional: true
251
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
252
  /@aws-sdk/client-sts/3.204.0:
253
  resolution: {integrity: sha512-Tp6FqENRw31XK5r5hul1JXnQgHBhbbXhoMebyFih6/zjpATaqg0bnV6tpww4yPi3uc+yDGXKw2/tDroSsyTsRA==}
254
  engines: {node: '>=14.0.0'}
@@ -296,6 +533,51 @@ packages:
296
  dev: false
297
  optional: true
298
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
299
  /@aws-sdk/config-resolver/3.201.0:
300
  resolution: {integrity: sha512-6YLIel7OGMGi+r8XC1A54cQJRIpx/NJ4fBALy44zFpQ+fdJUEmw4daUf1LECmAQiPA2Pr/hD0nBtX+wiiTf5/g==}
301
  engines: {node: '>=14.0.0'}
@@ -308,6 +590,16 @@ packages:
308
  dev: false
309
  optional: true
310
 
 
 
 
 
 
 
 
 
 
 
311
  /@aws-sdk/credential-provider-cognito-identity/3.204.0:
312
  resolution: {integrity: sha512-DmiGXe7pXWuJiAGphzY5cRaphRiU5DJ6Tcg/88Td3wnj22As5DCELetb7E2YC9DfwmKiWcGAKQaYQqWe5AzSqw==}
313
  engines: {node: '>=14.0.0'}
@@ -331,6 +623,15 @@ packages:
331
  dev: false
332
  optional: true
333
 
 
 
 
 
 
 
 
 
 
334
  /@aws-sdk/credential-provider-imds/3.201.0:
335
  resolution: {integrity: sha512-i8U2k3/L3iUWJJ1GSlwVBMfLQ2OTUT97E8yJi/xz5GavYuPOsUQWQe4fp7WGQivxh+AqybXAGFUCYub6zfUqag==}
336
  engines: {node: '>=14.0.0'}
@@ -343,6 +644,17 @@ packages:
343
  dev: false
344
  optional: true
345
 
 
 
 
 
 
 
 
 
 
 
 
346
  /@aws-sdk/credential-provider-ini/3.204.0:
347
  resolution: {integrity: sha512-ddtaS0ya5lgZZwfuJ/FuniroreLJ6yDgPAasol/rla9U5EU0qUEK1+6PX463exghUGjYfTqxdrKXhGYZfuEoIw==}
348
  engines: {node: '>=14.0.0'}
@@ -360,6 +672,23 @@ packages:
360
  dev: false
361
  optional: true
362
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
363
  /@aws-sdk/credential-provider-node/3.204.0:
364
  resolution: {integrity: sha512-kGbR5JE90zBGDS4cIz7tlUklMMeOm5oc5ES74YStLUacpQKwzVcHmDG8aT2DCONS/wEYysOIs5LygHurOJ/+Ww==}
365
  engines: {node: '>=14.0.0'}
@@ -379,6 +708,24 @@ packages:
379
  dev: false
380
  optional: true
381
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
382
  /@aws-sdk/credential-provider-process/3.201.0:
383
  resolution: {integrity: sha512-jTK3HSZgNj/hVrWb0wuF/cPUWSJYoRI/80fnN55o6QLS8WWIgOI8o2PNeVTAT5OrKioSoN4fgKTeUm3DZy3npQ==}
384
  engines: {node: '>=14.0.0'}
@@ -390,6 +737,16 @@ packages:
390
  dev: false
391
  optional: true
392
 
 
 
 
 
 
 
 
 
 
 
393
  /@aws-sdk/credential-provider-sso/3.204.0:
394
  resolution: {integrity: sha512-iS884Gda99x4zmdCK3XxFcceve4wB+wudpeTUm2wwX9AGrSzoUnLWqNXv/R8UAMAsKANaWMBkqv/bsHpsEitZw==}
395
  engines: {node: '>=14.0.0'}
@@ -404,6 +761,20 @@ packages:
404
  dev: false
405
  optional: true
406
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
407
  /@aws-sdk/credential-provider-web-identity/3.201.0:
408
  resolution: {integrity: sha512-U54bqhYaClPVZfswgknhlICp3BAtKXpOgHQCUF8cko5xUgbL4lVgd1rC3lWviGFMQAaTIF3QOXyEouemxr3VXw==}
409
  engines: {node: '>=14.0.0'}
@@ -414,6 +785,15 @@ packages:
414
  dev: false
415
  optional: true
416
 
 
 
 
 
 
 
 
 
 
417
  /@aws-sdk/credential-providers/3.204.0:
418
  resolution: {integrity: sha512-XlVfSWoXAiuQb5Q053McnmqSvllojKAc8ecQiLgLXstXXcHrI36E4XH7VkMaNV8JPPdLQhmLxrj01vzUyoT47Q==}
419
  engines: {node: '>=14.0.0'}
@@ -439,6 +819,50 @@ packages:
439
  dev: false
440
  optional: true
441
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
442
  /@aws-sdk/fetch-http-handler/3.204.0:
443
  resolution: {integrity: sha512-TfIhWYQ4CTjrD+FSuBcKMSVrqq8GCwqCfUyalWmSKo4JIFhN5OxUnOFb1/ecE/TJX+YgZ65w4qhVJVHHmh229Q==}
444
  dependencies:
@@ -450,6 +874,24 @@ packages:
450
  dev: false
451
  optional: true
452
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
453
  /@aws-sdk/hash-node/3.201.0:
454
  resolution: {integrity: sha512-WJsMZg5/TMoWnLM+0NuwLwFzHsi89Bi9J1Dt7JdJHXFLoEZV54FEz1PK/Sq5NOldhVljpXQwWOB2dHA2wxFztg==}
455
  engines: {node: '>=14.0.0'}
@@ -460,6 +902,25 @@ packages:
460
  dev: false
461
  optional: true
462
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
463
  /@aws-sdk/invalid-dependency/3.201.0:
464
  resolution: {integrity: sha512-f/zgntOfIozNyKSaG9dvHjjBaR3y20kYNswMYkSuCM2NIT5LpyHiiq5I11TwaocatUFcDztWpcsv7vHpIgI5Ig==}
465
  dependencies:
@@ -468,6 +929,13 @@ packages:
468
  dev: false
469
  optional: true
470
 
 
 
 
 
 
 
 
471
  /@aws-sdk/is-array-buffer/3.201.0:
472
  resolution: {integrity: sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==}
473
  engines: {node: '>=14.0.0'}
@@ -476,6 +944,32 @@ packages:
476
  dev: false
477
  optional: true
478
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
479
  /@aws-sdk/middleware-content-length/3.201.0:
480
  resolution: {integrity: sha512-p4G9AtdrKO8A3Z4RyZiy0isEYwuge7bQRBS7UzcGkcIOhJONq2pcM+gRZYz+NWvfYYNWUg5uODsFQfU8342yKg==}
481
  engines: {node: '>=14.0.0'}
@@ -486,6 +980,15 @@ packages:
486
  dev: false
487
  optional: true
488
 
 
 
 
 
 
 
 
 
 
489
  /@aws-sdk/middleware-endpoint/3.201.0:
490
  resolution: {integrity: sha512-F3JlXo5GusbeZR956hA9VxmDxUeg77Xh6o8fveAE2+G4Bjcb1iq9jPNlw6A14vDj3oTKenv2LLnjL2OIfl6hRA==}
491
  engines: {node: '>=14.0.0'}
@@ -501,6 +1004,39 @@ packages:
501
  dev: false
502
  optional: true
503
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
504
  /@aws-sdk/middleware-host-header/3.201.0:
505
  resolution: {integrity: sha512-7KNzdV7nFcKAoahvgGAlzsOq9FFDsU5h3w2iPtVdJhz6ZRDH/2v6WFeUCji+UNZip36gFfMPivoO8Y5smb5r/A==}
506
  engines: {node: '>=14.0.0'}
@@ -511,6 +1047,23 @@ packages:
511
  dev: false
512
  optional: true
513
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
514
  /@aws-sdk/middleware-logger/3.201.0:
515
  resolution: {integrity: sha512-kYLsa9x3oUJxYU7V5KOO50Kl7b0kk+I4ltkrdarLvvXcVI7ZXmWHzHLT2dkUhj8S0ceVdi0FYHVPJ3GoE8re4A==}
516
  engines: {node: '>=14.0.0'}
@@ -520,6 +1073,14 @@ packages:
520
  dev: false
521
  optional: true
522
 
 
 
 
 
 
 
 
 
523
  /@aws-sdk/middleware-recursion-detection/3.201.0:
524
  resolution: {integrity: sha512-NGOr+n559ZcJLdFoJR8LNGdrOJFIp2BTuWEDYeicNdNb0bETTXrkzcfT1BRhV9CWqCDmjFvjdrzbhS0cw/UUGA==}
525
  engines: {node: '>=14.0.0'}
@@ -530,6 +1091,15 @@ packages:
530
  dev: false
531
  optional: true
532
 
 
 
 
 
 
 
 
 
 
533
  /@aws-sdk/middleware-retry/3.201.0:
534
  resolution: {integrity: sha512-4jQjSKCpSc4oB1X9nNq4FbIAwQrr+mvmUSmg/oe2Llf42Ak1G9gg3rNTtQdfzA/wNMlL4ZFfF5Br+uz06e1hnQ==}
535
  engines: {node: '>=14.0.0'}
@@ -543,6 +1113,29 @@ packages:
543
  dev: false
544
  optional: true
545
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
546
  /@aws-sdk/middleware-sdk-sts/3.201.0:
547
  resolution: {integrity: sha512-clZuXcoN0mAP4JH5C6pW5+0tdF25+fpFJqE7GNRjjH/NYNk6ImVI0Kq2espEWwVBuaS0/chTDK3b+pK8YOWdhw==}
548
  engines: {node: '>=14.0.0'}
@@ -556,6 +1149,15 @@ packages:
556
  dev: false
557
  optional: true
558
 
 
 
 
 
 
 
 
 
 
559
  /@aws-sdk/middleware-serde/3.201.0:
560
  resolution: {integrity: sha512-Z7AzIuqEDvsZmp80zeT1oYxsoB8uQZby20Z8kF6/vNoq3sIzaGf/wHeNn0p+Vgo2auGSbZcVUZKoDptQLSLwIQ==}
561
  engines: {node: '>=14.0.0'}
@@ -565,6 +1167,14 @@ packages:
565
  dev: false
566
  optional: true
567
 
 
 
 
 
 
 
 
 
568
  /@aws-sdk/middleware-signing/3.201.0:
569
  resolution: {integrity: sha512-08ri5+mB28tva9RjVIXFcUP5lRTx+Pj8C2HYqF2GL5H3uAo+h3RQ++fEG1uwUMLf7tCEFivcw6SHA1KmCnB7+w==}
570
  engines: {node: '>=14.0.0'}
@@ -578,6 +1188,26 @@ packages:
578
  dev: false
579
  optional: true
580
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
581
  /@aws-sdk/middleware-stack/3.201.0:
582
  resolution: {integrity: sha512-lqHYSBP5FBxzA5w5XiYYYpfXabFzleXonqRkqZts1tapNJ4sOd+itiKG8JoNP7LDOwJ8qxNW/a33/gQeh3wkwQ==}
583
  engines: {node: '>=14.0.0'}
@@ -586,6 +1216,13 @@ packages:
586
  dev: false
587
  optional: true
588
 
 
 
 
 
 
 
 
589
  /@aws-sdk/middleware-user-agent/3.201.0:
590
  resolution: {integrity: sha512-/rYZ93WN1gDJudXis/0382CEoTqRa4qZJA608u2EPWs5aiMocUrm7pjH5XvKm2OYX8K/lyaMSBvL2OTIMzXGaQ==}
591
  engines: {node: '>=14.0.0'}
@@ -596,6 +1233,16 @@ packages:
596
  dev: false
597
  optional: true
598
 
 
 
 
 
 
 
 
 
 
 
599
  /@aws-sdk/node-config-provider/3.201.0:
600
  resolution: {integrity: sha512-JO0K2qPTYn+pPC7g8rWr1oueg9CqGCkYbINuAuz79vjToOLUQnZT9GiFm7QADe6J6RT1oGEKRQabNaJnp8cFpQ==}
601
  engines: {node: '>=14.0.0'}
@@ -607,6 +1254,16 @@ packages:
607
  dev: false
608
  optional: true
609
 
 
 
 
 
 
 
 
 
 
 
610
  /@aws-sdk/node-http-handler/3.201.0:
611
  resolution: {integrity: sha512-bWjXBd4WCiQcV4PwY+eFnlz9tZ4UiqfiJteav4MDt8YWkVlsVnR8RutmVSm3KZZjO2tJNSrla0ZWBebkNnI/Xg==}
612
  engines: {node: '>=14.0.0'}
@@ -619,6 +1276,17 @@ packages:
619
  dev: false
620
  optional: true
621
 
 
 
 
 
 
 
 
 
 
 
 
622
  /@aws-sdk/property-provider/3.201.0:
623
  resolution: {integrity: sha512-lVMP75VsYHIW04uYbkjA0I8Bb7b+aEj6PBBLdFoA22S0uCeJOD42OSr2Gtg2fToDGO7LQJw/K2D+LMCYKfZ3vQ==}
624
  engines: {node: '>=14.0.0'}
@@ -628,6 +1296,14 @@ packages:
628
  dev: false
629
  optional: true
630
 
 
 
 
 
 
 
 
 
631
  /@aws-sdk/protocol-http/3.201.0:
632
  resolution: {integrity: sha512-RdOc1elWFpj8MogxG87nkhtylw0a+OD7W8WFM+Gw4yJMkl7cwW42VIBFfb0+KCGZfIQltIeSLRvfe3WvVPyo7Q==}
633
  engines: {node: '>=14.0.0'}
@@ -637,6 +1313,14 @@ packages:
637
  dev: false
638
  optional: true
639
 
 
 
 
 
 
 
 
 
640
  /@aws-sdk/querystring-builder/3.201.0:
641
  resolution: {integrity: sha512-FgQnVHpYR19w/HmHEgWpykCn9tdogW0n45Ins6LBCo2aImDf9kBATD4xgN/F2rtogGuLGgu5LIIMHIOj1Tzs/w==}
642
  engines: {node: '>=14.0.0'}
@@ -647,6 +1331,15 @@ packages:
647
  dev: false
648
  optional: true
649
 
 
 
 
 
 
 
 
 
 
650
  /@aws-sdk/querystring-parser/3.201.0:
651
  resolution: {integrity: sha512-vS9Ljbqrwi0sIKYxgyZYJUN1AcE291hvuqwty9etgD2w/26SbWiMhjIW/fXJUOZjUvGKkYCpbivJYSzAGAuWfQ==}
652
  engines: {node: '>=14.0.0'}
@@ -656,12 +1349,40 @@ packages:
656
  dev: false
657
  optional: true
658
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
659
  /@aws-sdk/service-error-classification/3.201.0:
660
  resolution: {integrity: sha512-Pfcfmurgq8UpM0rXco6FVblcruqN4Mo3TW8/yaXrbctWpmdNT/8v19fffQIIgk94TU8Vf/nPJ7E5DXL7MZr4Fw==}
661
  engines: {node: '>=14.0.0'}
662
  dev: false
663
  optional: true
664
 
 
 
 
 
 
665
  /@aws-sdk/shared-ini-file-loader/3.201.0:
666
  resolution: {integrity: sha512-Pbxk0TXep0yI8MnK7Prly6JuBm5Me9AITav8/zPEgTZ3fMhXhQhhiuQcuTCI9GeosSzoiu8VvK53oPtBZZFnXQ==}
667
  engines: {node: '>=14.0.0'}
@@ -671,6 +1392,29 @@ packages:
671
  dev: false
672
  optional: true
673
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
674
  /@aws-sdk/signature-v4/3.201.0:
675
  resolution: {integrity: sha512-zEHoG1/hzJq169slggkPy1SN9YPWI78Bbe/MvHGYmCmQDspblu60JSBIbAatNqAxAmcWKc2HqpyGKjCkMG94ZA==}
676
  engines: {node: '>=14.0.0'}
@@ -684,6 +1428,20 @@ packages:
684
  dev: false
685
  optional: true
686
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
687
  /@aws-sdk/smithy-client/3.201.0:
688
  resolution: {integrity: sha512-cL87Jgxczee8YFkWGWKQ2Ze0vjn4+eCa1kDvEYMCOQvNujTuFgatXLgije5a7nVkSnL9WLoIP7Y7fsBGrKfMnQ==}
689
  engines: {node: '>=14.0.0'}
@@ -694,12 +1452,41 @@ packages:
694
  dev: false
695
  optional: true
696
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
697
  /@aws-sdk/types/3.201.0:
698
  resolution: {integrity: sha512-RCQj2pQyHD330Jd4c5CHJ87k2ZqC3Mmtl6nhwH1dy3vbnGUpc3q+3yinOKoTAY934kIa7ia32Y/2EjuyHxaj1A==}
699
  engines: {node: '>=14.0.0'}
700
  dev: false
701
  optional: true
702
 
 
 
 
 
 
 
 
703
  /@aws-sdk/url-parser/3.201.0:
704
  resolution: {integrity: sha512-V15aqj0tj4Y79VpuIdHUvX4Nvn4hYPB0RAn/qg5CCComIl0doLOirAQtW1MOBOyctdRlD9Uv7d1QdPLzJZMHjQ==}
705
  dependencies:
@@ -709,6 +1496,21 @@ packages:
709
  dev: false
710
  optional: true
711
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
712
  /@aws-sdk/util-base64-browser/3.188.0:
713
  resolution: {integrity: sha512-qlH+5NZBLiyKziL335BEPedYxX6j+p7KFRWXvDQox9S+s+gLCayednpK+fteOhBenCcR9fUZOVuAPScy1I8qCg==}
714
  dependencies:
@@ -734,6 +1536,14 @@ packages:
734
  dev: false
735
  optional: true
736
 
 
 
 
 
 
 
 
 
737
  /@aws-sdk/util-body-length-browser/3.188.0:
738
  resolution: {integrity: sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==}
739
  dependencies:
@@ -741,6 +1551,12 @@ packages:
741
  dev: false
742
  optional: true
743
 
 
 
 
 
 
 
744
  /@aws-sdk/util-body-length-node/3.201.0:
745
  resolution: {integrity: sha512-q+gwQoLn/DOwirb2hgZJeEwo1D3vLhoD6FfSV42Ecfvtb4jHnWReWMHguujfCubuDgZCrMEvYQzuocS75HHsbA==}
746
  engines: {node: '>=14.0.0'}
@@ -749,6 +1565,13 @@ packages:
749
  dev: false
750
  optional: true
751
 
 
 
 
 
 
 
 
752
  /@aws-sdk/util-buffer-from/3.201.0:
753
  resolution: {integrity: sha512-s6Wjltd9vU+vR3n0pqSPmNDcrrkrVTdV4t7x2zz3nDsFKTI77iVNafDmuaUlOA/bIlpjCJqaWecoVrZmEKeR7A==}
754
  engines: {node: '>=14.0.0'}
@@ -758,6 +1581,14 @@ packages:
758
  dev: false
759
  optional: true
760
 
 
 
 
 
 
 
 
 
761
  /@aws-sdk/util-config-provider/3.201.0:
762
  resolution: {integrity: sha512-cCRJlnRRP8vrLJomzJRBIyiyohsjJKmnIaQ9t0tAhGCywZbyjx6TlpYRZYfVWo+MwdF1Pi8ZScTrFPW0JuBOIQ==}
763
  engines: {node: '>=14.0.0'}
@@ -766,6 +1597,13 @@ packages:
766
  dev: false
767
  optional: true
768
 
 
 
 
 
 
 
 
769
  /@aws-sdk/util-defaults-mode-browser/3.201.0:
770
  resolution: {integrity: sha512-skRMAM+xrV/sDvvtHC81ExEKQEiZFaRrRdUT39fBX1SpGnFTo2wpv7XK+rAW2XopGgnLPytXLQD97Kub79o4zA==}
771
  engines: {node: '>= 10.0.0'}
@@ -777,6 +1615,16 @@ packages:
777
  dev: false
778
  optional: true
779
 
 
 
 
 
 
 
 
 
 
 
780
  /@aws-sdk/util-defaults-mode-node/3.201.0:
781
  resolution: {integrity: sha512-9N5LXRhxigbkbEcjQ4nNXHuQxp0VFlbc2/5wbcuPjIKX/OROiQI4mYQ6nuSKk7eku5sNFb9FtEHeD/RZo8od6Q==}
782
  engines: {node: '>= 10.0.0'}
@@ -790,6 +1638,18 @@ packages:
790
  dev: false
791
  optional: true
792
 
 
 
 
 
 
 
 
 
 
 
 
 
793
  /@aws-sdk/util-endpoints/3.202.0:
794
  resolution: {integrity: sha512-sNees5uDp7nfEbvzaA1DAHqoEvEb9ZOkdNH5gcj/FMBETbr00YtsuXsTZogTHQsX/otRTiudZBE3iH7R4SLSAQ==}
795
  engines: {node: '>=14.0.0'}
@@ -799,6 +1659,23 @@ packages:
799
  dev: false
800
  optional: true
801
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
802
  /@aws-sdk/util-hex-encoding/3.201.0:
803
  resolution: {integrity: sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==}
804
  engines: {node: '>=14.0.0'}
@@ -807,13 +1684,19 @@ packages:
807
  dev: false
808
  optional: true
809
 
 
 
 
 
 
 
 
810
  /@aws-sdk/util-locate-window/3.201.0:
811
  resolution: {integrity: sha512-hPJgifWh/rADabLAk1C9xXA2B3O4NUmbU58KgBRgC1HksiiHGFVZObB5fkBH8US/XV2jwORkpSf4OhretXQuKg==}
812
  engines: {node: '>=14.0.0'}
813
  dependencies:
814
  tslib: 2.4.1
815
  dev: false
816
- optional: true
817
 
818
  /@aws-sdk/util-middleware/3.201.0:
819
  resolution: {integrity: sha512-iAitcEZo17IyKn4ku1IBgtomr25esu5OuSRjw5Or4bNOeqXB0w50cItf/9qft8LIhbvBEAUtNAYXvqNzvhTZdQ==}
@@ -823,6 +1706,42 @@ packages:
823
  dev: false
824
  optional: true
825
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
826
  /@aws-sdk/util-uri-escape/3.201.0:
827
  resolution: {integrity: sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==}
828
  engines: {node: '>=14.0.0'}
@@ -831,6 +1750,13 @@ packages:
831
  dev: false
832
  optional: true
833
 
 
 
 
 
 
 
 
834
  /@aws-sdk/util-user-agent-browser/3.201.0:
835
  resolution: {integrity: sha512-iL2gyz7GuUVtZcMZpqvfxdFrl9hc28qpagymmJ/w2yhN86YNPHdK8Sx1Yo6VxNGVDCCWGb7tHXf7VP+U4Yv/Lg==}
836
  dependencies:
@@ -840,6 +1766,14 @@ packages:
840
  dev: false
841
  optional: true
842
 
 
 
 
 
 
 
 
 
843
  /@aws-sdk/util-user-agent-node/3.201.0:
844
  resolution: {integrity: sha512-6lhhvwB3AZSISnYQpDGdlyTrzfYK2P9QYjy7vZEBRd9TSOaggiFICXe03ZvZfVOSeg0EInlMKn1fIHzPUHRuHQ==}
845
  engines: {node: '>=14.0.0'}
@@ -855,12 +1789,25 @@ packages:
855
  dev: false
856
  optional: true
857
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
858
  /@aws-sdk/util-utf8-browser/3.188.0:
859
  resolution: {integrity: sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==}
860
  dependencies:
861
  tslib: 2.4.1
862
  dev: false
863
- optional: true
864
 
865
  /@aws-sdk/util-utf8-node/3.201.0:
866
  resolution: {integrity: sha512-A+bJFR/1rHYOJg137E69L1sX0I+LH+xf9ZjMXG9BVO0hSo7yDPoJVpHrzTJyOc3tuRITjIGBv9Qi4TKcoOSi1A==}
@@ -871,6 +1818,30 @@ packages:
871
  dev: false
872
  optional: true
873
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
874
  /@esbuild/android-arm/0.16.17:
875
  resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==}
876
  engines: {node: '>=12'}
@@ -1280,6 +2251,21 @@ packages:
1280
  rollup: 3.10.1
1281
  dev: true
1282
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1283
  /@sveltejs/adapter-node/1.1.4_@sveltejs+kit@1.5.6:
1284
  resolution: {integrity: sha512-3iEBqi1fXLXP9YIbVuz2LXajoebRJCmAFEQbN40DlxAnA7G+InxUgnqFun3q9gBMz2Qvd99K51g/HxWetXRe8Q==}
1285
  peerDependencies:
@@ -1369,6 +2355,10 @@ packages:
1369
  resolution: {integrity: sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw==}
1370
  dev: true
1371
 
 
 
 
 
1372
  /@types/node/18.11.9:
1373
  resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==}
1374
 
@@ -1827,7 +2817,6 @@ packages:
1827
  /bowser/2.11.0:
1828
  resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==}
1829
  dev: false
1830
- optional: true
1831
 
1832
  /brace-expansion/1.1.11:
1833
  resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
@@ -2317,6 +3306,13 @@ packages:
2317
  dev: false
2318
  optional: true
2319
 
 
 
 
 
 
 
 
2320
  /fastq/1.13.0:
2321
  resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==}
2322
  dependencies:
@@ -3285,7 +4281,6 @@ packages:
3285
  /strnum/1.0.5:
3286
  resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==}
3287
  dev: false
3288
- optional: true
3289
 
3290
  /supports-color/7.2.0:
3291
  resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
@@ -3494,6 +4489,10 @@ packages:
3494
  /tslib/2.4.1:
3495
  resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==}
3496
 
 
 
 
 
3497
  /tsutils/3.21.0_typescript@5.0.3:
3498
  resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
3499
  engines: {node: '>= 6'}
@@ -3610,7 +4609,6 @@ packages:
3610
  resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
3611
  hasBin: true
3612
  dev: false
3613
- optional: true
3614
 
3615
  /vite/4.0.4:
3616
  resolution: {integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==}
 
1
  lockfileVersion: 5.4
2
 
3
  specifiers:
4
+ '@aws-sdk/client-s3': ^3.354.0
5
+ '@aws-sdk/s3-request-presigner': ^3.354.0
6
  '@iconify-json/ant-design': ^1.1.3
7
  '@iconify-json/il': ^1.1.2
8
  '@sveltejs/adapter-node': ^1.1.4
 
11
  '@types/busboy': ^1.5.0
12
  '@types/lodash': ^4.14.188
13
  '@types/marked': ^4.0.7
14
+ '@types/mime-types': ^2.1.1
15
  '@types/sharp': ^0.31.0
16
  '@typescript-eslint/eslint-plugin': ^5.27.0
17
  '@typescript-eslint/parser': ^5.27.0
 
28
  lodash: ^4.17.21
29
  mailgun.js: ^8.0.2
30
  marked: ^4.2.2
31
+ mime-types: ^2.1.35
32
  mongodb: ^4.11.0
33
  nanoid: ^4.0.0
34
  prettier: ^2.8.3
 
44
  vite: ^4.0.4
45
 
46
  dependencies:
47
+ '@aws-sdk/client-s3': 3.354.0
48
+ '@aws-sdk/s3-request-presigner': 3.354.0
49
  bcryptjs: 2.4.3
50
  busboy: 1.6.0
51
  date-fns: 2.29.3
 
53
  lodash: 4.17.21
54
  mailgun.js: 8.0.2
55
  marked: 4.2.2
56
+ mime-types: 2.1.35
57
  mongodb: 4.11.0
58
  nanoid: 4.0.0
59
  sharp: 0.31.2
 
67
  '@types/busboy': 1.5.0
68
  '@types/lodash': 4.14.188
69
  '@types/marked': 4.0.7
70
+ '@types/mime-types': 2.1.1
71
  '@types/sharp': 0.31.0
72
  '@typescript-eslint/eslint-plugin': 5.42.0_maf6oeqzrvvbbdpgg7uzhystc4
73
  '@typescript-eslint/parser': 5.42.0_wjftjwwutwf6hy45blo2onh3s4
 
113
  resolution: {integrity: sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==}
114
  dev: true
115
 
116
+ /@aws-crypto/crc32/3.0.0:
117
+ resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==}
118
+ dependencies:
119
+ '@aws-crypto/util': 3.0.0
120
+ '@aws-sdk/types': 3.347.0
121
+ tslib: 1.14.1
122
+ dev: false
123
+
124
+ /@aws-crypto/crc32c/3.0.0:
125
+ resolution: {integrity: sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==}
126
+ dependencies:
127
+ '@aws-crypto/util': 3.0.0
128
+ '@aws-sdk/types': 3.347.0
129
+ tslib: 1.14.1
130
+ dev: false
131
+
132
  /@aws-crypto/ie11-detection/2.0.2:
133
  resolution: {integrity: sha512-5XDMQY98gMAf/WRTic5G++jfmS/VLM0rwpiOpaainKi4L0nqWMSB1SzsrEG5rjFZGYN6ZAefO+/Yta2dFM0kMw==}
134
  dependencies:
 
136
  dev: false
137
  optional: true
138
 
139
+ /@aws-crypto/ie11-detection/3.0.0:
140
+ resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==}
141
+ dependencies:
142
+ tslib: 1.14.1
143
+ dev: false
144
+
145
+ /@aws-crypto/sha1-browser/3.0.0:
146
+ resolution: {integrity: sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==}
147
+ dependencies:
148
+ '@aws-crypto/ie11-detection': 3.0.0
149
+ '@aws-crypto/supports-web-crypto': 3.0.0
150
+ '@aws-crypto/util': 3.0.0
151
+ '@aws-sdk/types': 3.347.0
152
+ '@aws-sdk/util-locate-window': 3.201.0
153
+ '@aws-sdk/util-utf8-browser': 3.188.0
154
+ tslib: 1.14.1
155
+ dev: false
156
+
157
  /@aws-crypto/sha256-browser/2.0.0:
158
  resolution: {integrity: sha512-rYXOQ8BFOaqMEHJrLHul/25ckWH6GTJtdLSajhlqGMx0PmSueAuvboCuZCTqEKlxR8CQOwRarxYMZZSYlhRA1A==}
159
  dependencies:
 
168
  dev: false
169
  optional: true
170
 
171
+ /@aws-crypto/sha256-browser/3.0.0:
172
+ resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==}
173
+ dependencies:
174
+ '@aws-crypto/ie11-detection': 3.0.0
175
+ '@aws-crypto/sha256-js': 3.0.0
176
+ '@aws-crypto/supports-web-crypto': 3.0.0
177
+ '@aws-crypto/util': 3.0.0
178
+ '@aws-sdk/types': 3.347.0
179
+ '@aws-sdk/util-locate-window': 3.201.0
180
+ '@aws-sdk/util-utf8-browser': 3.188.0
181
+ tslib: 1.14.1
182
+ dev: false
183
+
184
  /@aws-crypto/sha256-js/2.0.0:
185
  resolution: {integrity: sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig==}
186
  dependencies:
 
190
  dev: false
191
  optional: true
192
 
193
+ /@aws-crypto/sha256-js/3.0.0:
194
+ resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==}
195
+ dependencies:
196
+ '@aws-crypto/util': 3.0.0
197
+ '@aws-sdk/types': 3.347.0
198
+ tslib: 1.14.1
199
+ dev: false
200
+
201
  /@aws-crypto/supports-web-crypto/2.0.2:
202
  resolution: {integrity: sha512-6mbSsLHwZ99CTOOswvCRP3C+VCWnzBf+1SnbWxzzJ9lR0mA0JnY2JEAhp8rqmTE0GPFy88rrM27ffgp62oErMQ==}
203
  dependencies:
 
205
  dev: false
206
  optional: true
207
 
208
+ /@aws-crypto/supports-web-crypto/3.0.0:
209
+ resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==}
210
+ dependencies:
211
+ tslib: 1.14.1
212
+ dev: false
213
+
214
  /@aws-crypto/util/2.0.2:
215
  resolution: {integrity: sha512-Lgu5v/0e/BcrZ5m/IWqzPUf3UYFTy/PpeED+uc9SWUR1iZQL8XXbGQg10UfllwwBryO3hFF5dizK+78aoXC1eA==}
216
  dependencies:
 
220
  dev: false
221
  optional: true
222
 
223
+ /@aws-crypto/util/3.0.0:
224
+ resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==}
225
+ dependencies:
226
+ '@aws-sdk/types': 3.347.0
227
+ '@aws-sdk/util-utf8-browser': 3.188.0
228
+ tslib: 1.14.1
229
+ dev: false
230
+
231
  /@aws-sdk/abort-controller/3.201.0:
232
  resolution: {integrity: sha512-xJ984k+CKlGjBmvNarzM8Y+b6X4L1Zt0TycQmVBJq7fAr/ju9l13pQIoXR5WlDIW1FkGeVczF5Nu6fN46SCORQ==}
233
  engines: {node: '>=14.0.0'}
 
237
  dev: false
238
  optional: true
239
 
240
+ /@aws-sdk/abort-controller/3.347.0:
241
+ resolution: {integrity: sha512-P/2qE6ntYEmYG4Ez535nJWZbXqgbkJx8CMz7ChEuEg3Gp3dvVYEKg+iEUEvlqQ2U5dWP5J3ehw5po9t86IsVPQ==}
242
+ engines: {node: '>=14.0.0'}
243
+ dependencies:
244
+ '@aws-sdk/types': 3.347.0
245
+ tslib: 2.5.3
246
+ dev: false
247
+
248
+ /@aws-sdk/chunked-blob-reader/3.310.0:
249
+ resolution: {integrity: sha512-CrJS3exo4mWaLnWxfCH+w88Ou0IcAZSIkk4QbmxiHl/5Dq705OLoxf4385MVyExpqpeVJYOYQ2WaD8i/pQZ2fg==}
250
+ dependencies:
251
+ tslib: 2.5.3
252
+ dev: false
253
+
254
  /@aws-sdk/client-cognito-identity/3.204.0:
255
  resolution: {integrity: sha512-uftJkNKYcZ8bXVwcpOn5ZUjUX0IRto0ZrTO8DBdS9b7PJu2Y84eSy46LsAYuRDC0PZreQxy8nOH5HmI86/W8xQ==}
256
  engines: {node: '>=14.0.0'}
 
297
  dev: false
298
  optional: true
299
 
300
+ /@aws-sdk/client-s3/3.354.0:
301
+ resolution: {integrity: sha512-AEvHJipD/YhHRbS3l6uyLc6yNHF7vtmInwlQC+v4r61DeqnkHetboam2lMx5WsEJLBkKwfdsFkIEGVjI6OrjpQ==}
302
+ engines: {node: '>=14.0.0'}
303
+ dependencies:
304
+ '@aws-crypto/sha1-browser': 3.0.0
305
+ '@aws-crypto/sha256-browser': 3.0.0
306
+ '@aws-crypto/sha256-js': 3.0.0
307
+ '@aws-sdk/client-sts': 3.354.0
308
+ '@aws-sdk/config-resolver': 3.354.0
309
+ '@aws-sdk/credential-provider-node': 3.354.0
310
+ '@aws-sdk/eventstream-serde-browser': 3.347.0
311
+ '@aws-sdk/eventstream-serde-config-resolver': 3.347.0
312
+ '@aws-sdk/eventstream-serde-node': 3.347.0
313
+ '@aws-sdk/fetch-http-handler': 3.353.0
314
+ '@aws-sdk/hash-blob-browser': 3.353.0
315
+ '@aws-sdk/hash-node': 3.347.0
316
+ '@aws-sdk/hash-stream-node': 3.347.0
317
+ '@aws-sdk/invalid-dependency': 3.347.0
318
+ '@aws-sdk/md5-js': 3.347.0
319
+ '@aws-sdk/middleware-bucket-endpoint': 3.354.0
320
+ '@aws-sdk/middleware-content-length': 3.347.0
321
+ '@aws-sdk/middleware-endpoint': 3.347.0
322
+ '@aws-sdk/middleware-expect-continue': 3.347.0
323
+ '@aws-sdk/middleware-flexible-checksums': 3.347.0
324
+ '@aws-sdk/middleware-host-header': 3.347.0
325
+ '@aws-sdk/middleware-location-constraint': 3.347.0
326
+ '@aws-sdk/middleware-logger': 3.347.0
327
+ '@aws-sdk/middleware-recursion-detection': 3.347.0
328
+ '@aws-sdk/middleware-retry': 3.354.0
329
+ '@aws-sdk/middleware-sdk-s3': 3.347.0
330
+ '@aws-sdk/middleware-serde': 3.347.0
331
+ '@aws-sdk/middleware-signing': 3.354.0
332
+ '@aws-sdk/middleware-ssec': 3.347.0
333
+ '@aws-sdk/middleware-stack': 3.347.0
334
+ '@aws-sdk/middleware-user-agent': 3.352.0
335
+ '@aws-sdk/node-config-provider': 3.354.0
336
+ '@aws-sdk/node-http-handler': 3.350.0
337
+ '@aws-sdk/signature-v4-multi-region': 3.354.0
338
+ '@aws-sdk/smithy-client': 3.347.0
339
+ '@aws-sdk/types': 3.347.0
340
+ '@aws-sdk/url-parser': 3.347.0
341
+ '@aws-sdk/util-base64': 3.310.0
342
+ '@aws-sdk/util-body-length-browser': 3.310.0
343
+ '@aws-sdk/util-body-length-node': 3.310.0
344
+ '@aws-sdk/util-defaults-mode-browser': 3.353.0
345
+ '@aws-sdk/util-defaults-mode-node': 3.354.0
346
+ '@aws-sdk/util-endpoints': 3.352.0
347
+ '@aws-sdk/util-retry': 3.347.0
348
+ '@aws-sdk/util-stream-browser': 3.353.0
349
+ '@aws-sdk/util-stream-node': 3.350.0
350
+ '@aws-sdk/util-user-agent-browser': 3.347.0
351
+ '@aws-sdk/util-user-agent-node': 3.354.0
352
+ '@aws-sdk/util-utf8': 3.310.0
353
+ '@aws-sdk/util-waiter': 3.347.0
354
+ '@aws-sdk/xml-builder': 3.310.0
355
+ '@smithy/protocol-http': 1.0.1
356
+ '@smithy/types': 1.0.0
357
+ fast-xml-parser: 4.2.4
358
+ tslib: 2.5.3
359
+ transitivePeerDependencies:
360
+ - '@aws-sdk/signature-v4-crt'
361
+ - aws-crt
362
+ dev: false
363
+
364
+ /@aws-sdk/client-sso-oidc/3.354.0:
365
+ resolution: {integrity: sha512-XZcg4s2zKb4S8ltluiw5yxpm974uZqzo2HTECt1lbzUJgVgLsMAh/nPJ1fLqg4jadT+rf8Lq2FEFqOM/vxWT8A==}
366
+ engines: {node: '>=14.0.0'}
367
+ dependencies:
368
+ '@aws-crypto/sha256-browser': 3.0.0
369
+ '@aws-crypto/sha256-js': 3.0.0
370
+ '@aws-sdk/config-resolver': 3.354.0
371
+ '@aws-sdk/fetch-http-handler': 3.353.0
372
+ '@aws-sdk/hash-node': 3.347.0
373
+ '@aws-sdk/invalid-dependency': 3.347.0
374
+ '@aws-sdk/middleware-content-length': 3.347.0
375
+ '@aws-sdk/middleware-endpoint': 3.347.0
376
+ '@aws-sdk/middleware-host-header': 3.347.0
377
+ '@aws-sdk/middleware-logger': 3.347.0
378
+ '@aws-sdk/middleware-recursion-detection': 3.347.0
379
+ '@aws-sdk/middleware-retry': 3.354.0
380
+ '@aws-sdk/middleware-serde': 3.347.0
381
+ '@aws-sdk/middleware-stack': 3.347.0
382
+ '@aws-sdk/middleware-user-agent': 3.352.0
383
+ '@aws-sdk/node-config-provider': 3.354.0
384
+ '@aws-sdk/node-http-handler': 3.350.0
385
+ '@aws-sdk/smithy-client': 3.347.0
386
+ '@aws-sdk/types': 3.347.0
387
+ '@aws-sdk/url-parser': 3.347.0
388
+ '@aws-sdk/util-base64': 3.310.0
389
+ '@aws-sdk/util-body-length-browser': 3.310.0
390
+ '@aws-sdk/util-body-length-node': 3.310.0
391
+ '@aws-sdk/util-defaults-mode-browser': 3.353.0
392
+ '@aws-sdk/util-defaults-mode-node': 3.354.0
393
+ '@aws-sdk/util-endpoints': 3.352.0
394
+ '@aws-sdk/util-retry': 3.347.0
395
+ '@aws-sdk/util-user-agent-browser': 3.347.0
396
+ '@aws-sdk/util-user-agent-node': 3.354.0
397
+ '@aws-sdk/util-utf8': 3.310.0
398
+ '@smithy/protocol-http': 1.0.1
399
+ '@smithy/types': 1.0.0
400
+ tslib: 2.5.3
401
+ transitivePeerDependencies:
402
+ - aws-crt
403
+ dev: false
404
+
405
  /@aws-sdk/client-sso/3.204.0:
406
  resolution: {integrity: sha512-AECcNrcAQxV/Jlu8ogshRaYwt2jayx0omQJs/SXj70mWxmbk4MQnb+DqJIpPpOKBHaza/xlC2TKS1RzkiuZxyw==}
407
  engines: {node: '>=14.0.0'}
 
445
  dev: false
446
  optional: true
447
 
448
+ /@aws-sdk/client-sso/3.354.0:
449
+ resolution: {integrity: sha512-4jmvjJYDaaPmm1n2TG4LYfTEnHLKcJmImgBqhgzhMgaypb4u/k1iw0INV2r/afYPL/FsrLFwc46RM3HYx3nc4A==}
450
+ engines: {node: '>=14.0.0'}
451
+ dependencies:
452
+ '@aws-crypto/sha256-browser': 3.0.0
453
+ '@aws-crypto/sha256-js': 3.0.0
454
+ '@aws-sdk/config-resolver': 3.354.0
455
+ '@aws-sdk/fetch-http-handler': 3.353.0
456
+ '@aws-sdk/hash-node': 3.347.0
457
+ '@aws-sdk/invalid-dependency': 3.347.0
458
+ '@aws-sdk/middleware-content-length': 3.347.0
459
+ '@aws-sdk/middleware-endpoint': 3.347.0
460
+ '@aws-sdk/middleware-host-header': 3.347.0
461
+ '@aws-sdk/middleware-logger': 3.347.0
462
+ '@aws-sdk/middleware-recursion-detection': 3.347.0
463
+ '@aws-sdk/middleware-retry': 3.354.0
464
+ '@aws-sdk/middleware-serde': 3.347.0
465
+ '@aws-sdk/middleware-stack': 3.347.0
466
+ '@aws-sdk/middleware-user-agent': 3.352.0
467
+ '@aws-sdk/node-config-provider': 3.354.0
468
+ '@aws-sdk/node-http-handler': 3.350.0
469
+ '@aws-sdk/smithy-client': 3.347.0
470
+ '@aws-sdk/types': 3.347.0
471
+ '@aws-sdk/url-parser': 3.347.0
472
+ '@aws-sdk/util-base64': 3.310.0
473
+ '@aws-sdk/util-body-length-browser': 3.310.0
474
+ '@aws-sdk/util-body-length-node': 3.310.0
475
+ '@aws-sdk/util-defaults-mode-browser': 3.353.0
476
+ '@aws-sdk/util-defaults-mode-node': 3.354.0
477
+ '@aws-sdk/util-endpoints': 3.352.0
478
+ '@aws-sdk/util-retry': 3.347.0
479
+ '@aws-sdk/util-user-agent-browser': 3.347.0
480
+ '@aws-sdk/util-user-agent-node': 3.354.0
481
+ '@aws-sdk/util-utf8': 3.310.0
482
+ '@smithy/protocol-http': 1.0.1
483
+ '@smithy/types': 1.0.0
484
+ tslib: 2.5.3
485
+ transitivePeerDependencies:
486
+ - aws-crt
487
+ dev: false
488
+
489
  /@aws-sdk/client-sts/3.204.0:
490
  resolution: {integrity: sha512-Tp6FqENRw31XK5r5hul1JXnQgHBhbbXhoMebyFih6/zjpATaqg0bnV6tpww4yPi3uc+yDGXKw2/tDroSsyTsRA==}
491
  engines: {node: '>=14.0.0'}
 
533
  dev: false
534
  optional: true
535
 
536
+ /@aws-sdk/client-sts/3.354.0:
537
+ resolution: {integrity: sha512-l9Ar/C/3PNlToM1ukHVfBtp4plbRUxLMYY2DOTMI0nb3jzfcvETBcdEGCP51fX4uAfJ2vc4g5qBF/qXKX0LMWA==}
538
+ engines: {node: '>=14.0.0'}
539
+ dependencies:
540
+ '@aws-crypto/sha256-browser': 3.0.0
541
+ '@aws-crypto/sha256-js': 3.0.0
542
+ '@aws-sdk/config-resolver': 3.354.0
543
+ '@aws-sdk/credential-provider-node': 3.354.0
544
+ '@aws-sdk/fetch-http-handler': 3.353.0
545
+ '@aws-sdk/hash-node': 3.347.0
546
+ '@aws-sdk/invalid-dependency': 3.347.0
547
+ '@aws-sdk/middleware-content-length': 3.347.0
548
+ '@aws-sdk/middleware-endpoint': 3.347.0
549
+ '@aws-sdk/middleware-host-header': 3.347.0
550
+ '@aws-sdk/middleware-logger': 3.347.0
551
+ '@aws-sdk/middleware-recursion-detection': 3.347.0
552
+ '@aws-sdk/middleware-retry': 3.354.0
553
+ '@aws-sdk/middleware-sdk-sts': 3.354.0
554
+ '@aws-sdk/middleware-serde': 3.347.0
555
+ '@aws-sdk/middleware-signing': 3.354.0
556
+ '@aws-sdk/middleware-stack': 3.347.0
557
+ '@aws-sdk/middleware-user-agent': 3.352.0
558
+ '@aws-sdk/node-config-provider': 3.354.0
559
+ '@aws-sdk/node-http-handler': 3.350.0
560
+ '@aws-sdk/smithy-client': 3.347.0
561
+ '@aws-sdk/types': 3.347.0
562
+ '@aws-sdk/url-parser': 3.347.0
563
+ '@aws-sdk/util-base64': 3.310.0
564
+ '@aws-sdk/util-body-length-browser': 3.310.0
565
+ '@aws-sdk/util-body-length-node': 3.310.0
566
+ '@aws-sdk/util-defaults-mode-browser': 3.353.0
567
+ '@aws-sdk/util-defaults-mode-node': 3.354.0
568
+ '@aws-sdk/util-endpoints': 3.352.0
569
+ '@aws-sdk/util-retry': 3.347.0
570
+ '@aws-sdk/util-user-agent-browser': 3.347.0
571
+ '@aws-sdk/util-user-agent-node': 3.354.0
572
+ '@aws-sdk/util-utf8': 3.310.0
573
+ '@smithy/protocol-http': 1.0.1
574
+ '@smithy/types': 1.0.0
575
+ fast-xml-parser: 4.2.4
576
+ tslib: 2.5.3
577
+ transitivePeerDependencies:
578
+ - aws-crt
579
+ dev: false
580
+
581
  /@aws-sdk/config-resolver/3.201.0:
582
  resolution: {integrity: sha512-6YLIel7OGMGi+r8XC1A54cQJRIpx/NJ4fBALy44zFpQ+fdJUEmw4daUf1LECmAQiPA2Pr/hD0nBtX+wiiTf5/g==}
583
  engines: {node: '>=14.0.0'}
 
590
  dev: false
591
  optional: true
592
 
593
+ /@aws-sdk/config-resolver/3.354.0:
594
+ resolution: {integrity: sha512-K4XWie8yJPT8bpYVX54VJMQhiJRTw8PrjEs9QrKqvwoCcZ3G4qEt40tIu33XksuokXxk8rrVH5d7odOPBsAtdg==}
595
+ engines: {node: '>=14.0.0'}
596
+ dependencies:
597
+ '@aws-sdk/types': 3.347.0
598
+ '@aws-sdk/util-config-provider': 3.310.0
599
+ '@aws-sdk/util-middleware': 3.347.0
600
+ tslib: 2.5.3
601
+ dev: false
602
+
603
  /@aws-sdk/credential-provider-cognito-identity/3.204.0:
604
  resolution: {integrity: sha512-DmiGXe7pXWuJiAGphzY5cRaphRiU5DJ6Tcg/88Td3wnj22As5DCELetb7E2YC9DfwmKiWcGAKQaYQqWe5AzSqw==}
605
  engines: {node: '>=14.0.0'}
 
623
  dev: false
624
  optional: true
625
 
626
+ /@aws-sdk/credential-provider-env/3.353.0:
627
+ resolution: {integrity: sha512-Y4VsNS8O1FAD5J7S5itOhnOghQ5LIXlZ44t35nF8cbcF+JPvY3ToKzYpjYN1jM7DXKqU4shtqgYpzSqxlvEgKQ==}
628
+ engines: {node: '>=14.0.0'}
629
+ dependencies:
630
+ '@aws-sdk/property-provider': 3.353.0
631
+ '@aws-sdk/types': 3.347.0
632
+ tslib: 2.5.3
633
+ dev: false
634
+
635
  /@aws-sdk/credential-provider-imds/3.201.0:
636
  resolution: {integrity: sha512-i8U2k3/L3iUWJJ1GSlwVBMfLQ2OTUT97E8yJi/xz5GavYuPOsUQWQe4fp7WGQivxh+AqybXAGFUCYub6zfUqag==}
637
  engines: {node: '>=14.0.0'}
 
644
  dev: false
645
  optional: true
646
 
647
+ /@aws-sdk/credential-provider-imds/3.354.0:
648
+ resolution: {integrity: sha512-AB+PuDd1jX6qgz+JYvIyOn8Kz9/lQ60KuY1TFb7g3S8zURw+DSeMJNR1jzEsorWICTzhxXmyasHVMa4Eo4Uq+Q==}
649
+ engines: {node: '>=14.0.0'}
650
+ dependencies:
651
+ '@aws-sdk/node-config-provider': 3.354.0
652
+ '@aws-sdk/property-provider': 3.353.0
653
+ '@aws-sdk/types': 3.347.0
654
+ '@aws-sdk/url-parser': 3.347.0
655
+ tslib: 2.5.3
656
+ dev: false
657
+
658
  /@aws-sdk/credential-provider-ini/3.204.0:
659
  resolution: {integrity: sha512-ddtaS0ya5lgZZwfuJ/FuniroreLJ6yDgPAasol/rla9U5EU0qUEK1+6PX463exghUGjYfTqxdrKXhGYZfuEoIw==}
660
  engines: {node: '>=14.0.0'}
 
672
  dev: false
673
  optional: true
674
 
675
+ /@aws-sdk/credential-provider-ini/3.354.0:
676
+ resolution: {integrity: sha512-bn2ifrRsxWpxzwXa25jRdUECQ1dC+NB3YlRYnGdIaIQLF559N2jnfCabYzqyfKI++WU7aQeMofPe2PxVGlbv9Q==}
677
+ engines: {node: '>=14.0.0'}
678
+ dependencies:
679
+ '@aws-sdk/credential-provider-env': 3.353.0
680
+ '@aws-sdk/credential-provider-imds': 3.354.0
681
+ '@aws-sdk/credential-provider-process': 3.354.0
682
+ '@aws-sdk/credential-provider-sso': 3.354.0
683
+ '@aws-sdk/credential-provider-web-identity': 3.354.0
684
+ '@aws-sdk/property-provider': 3.353.0
685
+ '@aws-sdk/shared-ini-file-loader': 3.354.0
686
+ '@aws-sdk/types': 3.347.0
687
+ tslib: 2.5.3
688
+ transitivePeerDependencies:
689
+ - aws-crt
690
+ dev: false
691
+
692
  /@aws-sdk/credential-provider-node/3.204.0:
693
  resolution: {integrity: sha512-kGbR5JE90zBGDS4cIz7tlUklMMeOm5oc5ES74YStLUacpQKwzVcHmDG8aT2DCONS/wEYysOIs5LygHurOJ/+Ww==}
694
  engines: {node: '>=14.0.0'}
 
708
  dev: false
709
  optional: true
710
 
711
+ /@aws-sdk/credential-provider-node/3.354.0:
712
+ resolution: {integrity: sha512-ltKiRtHfqDaCcrb44DIoSHQ9MposFl/aDtNdu5OdQv/2Q1r7M/r2fQdq9DHOrxeQQjaUH4C6k6fGTsxALTHyNA==}
713
+ engines: {node: '>=14.0.0'}
714
+ dependencies:
715
+ '@aws-sdk/credential-provider-env': 3.353.0
716
+ '@aws-sdk/credential-provider-imds': 3.354.0
717
+ '@aws-sdk/credential-provider-ini': 3.354.0
718
+ '@aws-sdk/credential-provider-process': 3.354.0
719
+ '@aws-sdk/credential-provider-sso': 3.354.0
720
+ '@aws-sdk/credential-provider-web-identity': 3.354.0
721
+ '@aws-sdk/property-provider': 3.353.0
722
+ '@aws-sdk/shared-ini-file-loader': 3.354.0
723
+ '@aws-sdk/types': 3.347.0
724
+ tslib: 2.5.3
725
+ transitivePeerDependencies:
726
+ - aws-crt
727
+ dev: false
728
+
729
  /@aws-sdk/credential-provider-process/3.201.0:
730
  resolution: {integrity: sha512-jTK3HSZgNj/hVrWb0wuF/cPUWSJYoRI/80fnN55o6QLS8WWIgOI8o2PNeVTAT5OrKioSoN4fgKTeUm3DZy3npQ==}
731
  engines: {node: '>=14.0.0'}
 
737
  dev: false
738
  optional: true
739
 
740
+ /@aws-sdk/credential-provider-process/3.354.0:
741
+ resolution: {integrity: sha512-AxpASm+tS8V1PY4PLfG9dtqa96lzBJ3niTQb+RAm4uYCddW7gxNDkGB+jSCzVdUPVa3xA2ITBS/ka3C5yM8YWg==}
742
+ engines: {node: '>=14.0.0'}
743
+ dependencies:
744
+ '@aws-sdk/property-provider': 3.353.0
745
+ '@aws-sdk/shared-ini-file-loader': 3.354.0
746
+ '@aws-sdk/types': 3.347.0
747
+ tslib: 2.5.3
748
+ dev: false
749
+
750
  /@aws-sdk/credential-provider-sso/3.204.0:
751
  resolution: {integrity: sha512-iS884Gda99x4zmdCK3XxFcceve4wB+wudpeTUm2wwX9AGrSzoUnLWqNXv/R8UAMAsKANaWMBkqv/bsHpsEitZw==}
752
  engines: {node: '>=14.0.0'}
 
761
  dev: false
762
  optional: true
763
 
764
+ /@aws-sdk/credential-provider-sso/3.354.0:
765
+ resolution: {integrity: sha512-ihiaUxh8V/nQgTOgQZxWQcbckXhM+J6Wdc4F0z9soi48iSOqzRpzPw5E14wSZScEZjNY/gKEDz8gCt8WkT/G0w==}
766
+ engines: {node: '>=14.0.0'}
767
+ dependencies:
768
+ '@aws-sdk/client-sso': 3.354.0
769
+ '@aws-sdk/property-provider': 3.353.0
770
+ '@aws-sdk/shared-ini-file-loader': 3.354.0
771
+ '@aws-sdk/token-providers': 3.354.0
772
+ '@aws-sdk/types': 3.347.0
773
+ tslib: 2.5.3
774
+ transitivePeerDependencies:
775
+ - aws-crt
776
+ dev: false
777
+
778
  /@aws-sdk/credential-provider-web-identity/3.201.0:
779
  resolution: {integrity: sha512-U54bqhYaClPVZfswgknhlICp3BAtKXpOgHQCUF8cko5xUgbL4lVgd1rC3lWviGFMQAaTIF3QOXyEouemxr3VXw==}
780
  engines: {node: '>=14.0.0'}
 
785
  dev: false
786
  optional: true
787
 
788
+ /@aws-sdk/credential-provider-web-identity/3.354.0:
789
+ resolution: {integrity: sha512-scx9mAf4m3Hc3uMX2Vh8GciEcC/5GqeDI8qc0zBj+UF/5c/GtihZA4WoCV3Sg3jMPDUKY81DiFCtcKHhtUqKfg==}
790
+ engines: {node: '>=14.0.0'}
791
+ dependencies:
792
+ '@aws-sdk/property-provider': 3.353.0
793
+ '@aws-sdk/types': 3.347.0
794
+ tslib: 2.5.3
795
+ dev: false
796
+
797
  /@aws-sdk/credential-providers/3.204.0:
798
  resolution: {integrity: sha512-XlVfSWoXAiuQb5Q053McnmqSvllojKAc8ecQiLgLXstXXcHrI36E4XH7VkMaNV8JPPdLQhmLxrj01vzUyoT47Q==}
799
  engines: {node: '>=14.0.0'}
 
819
  dev: false
820
  optional: true
821
 
822
+ /@aws-sdk/eventstream-codec/3.347.0:
823
+ resolution: {integrity: sha512-61q+SyspjsaQ4sdgjizMyRgVph2CiW4aAtfpoH69EJFJfTxTR/OqnZ9Jx/3YiYi0ksrvDenJddYodfWWJqD8/w==}
824
+ dependencies:
825
+ '@aws-crypto/crc32': 3.0.0
826
+ '@aws-sdk/types': 3.347.0
827
+ '@aws-sdk/util-hex-encoding': 3.310.0
828
+ tslib: 2.5.3
829
+ dev: false
830
+
831
+ /@aws-sdk/eventstream-serde-browser/3.347.0:
832
+ resolution: {integrity: sha512-9BLVTHWgpiTo/hl+k7qt7E9iYu43zVwJN+4TEwA9ZZB3p12068t1Hay6HgCcgJC3+LWMtw/OhvypV6vQAG4UBg==}
833
+ engines: {node: '>=14.0.0'}
834
+ dependencies:
835
+ '@aws-sdk/eventstream-serde-universal': 3.347.0
836
+ '@aws-sdk/types': 3.347.0
837
+ tslib: 2.5.3
838
+ dev: false
839
+
840
+ /@aws-sdk/eventstream-serde-config-resolver/3.347.0:
841
+ resolution: {integrity: sha512-RcXQbNVq0PFmDqfn6+MnjCUWbbobcYVxpimaF6pMDav04o6Mcle+G2Hrefp5NlFr/lZbHW2eUKYsp1sXPaxVlQ==}
842
+ engines: {node: '>=14.0.0'}
843
+ dependencies:
844
+ '@aws-sdk/types': 3.347.0
845
+ tslib: 2.5.3
846
+ dev: false
847
+
848
+ /@aws-sdk/eventstream-serde-node/3.347.0:
849
+ resolution: {integrity: sha512-pgQCWH0PkHjcHs04JE7FoGAD3Ww45ffV8Op0MSLUhg9OpGa6EDoO3EOpWi9l/TALtH4f0KRV35PVyUyHJ/wEkA==}
850
+ engines: {node: '>=14.0.0'}
851
+ dependencies:
852
+ '@aws-sdk/eventstream-serde-universal': 3.347.0
853
+ '@aws-sdk/types': 3.347.0
854
+ tslib: 2.5.3
855
+ dev: false
856
+
857
+ /@aws-sdk/eventstream-serde-universal/3.347.0:
858
+ resolution: {integrity: sha512-4wWj6bz6lOyDIO/dCCjwaLwRz648xzQQnf89R29sLoEqvAPP5XOB7HL+uFaQ/f5tPNh49gL6huNFSVwDm62n4Q==}
859
+ engines: {node: '>=14.0.0'}
860
+ dependencies:
861
+ '@aws-sdk/eventstream-codec': 3.347.0
862
+ '@aws-sdk/types': 3.347.0
863
+ tslib: 2.5.3
864
+ dev: false
865
+
866
  /@aws-sdk/fetch-http-handler/3.204.0:
867
  resolution: {integrity: sha512-TfIhWYQ4CTjrD+FSuBcKMSVrqq8GCwqCfUyalWmSKo4JIFhN5OxUnOFb1/ecE/TJX+YgZ65w4qhVJVHHmh229Q==}
868
  dependencies:
 
874
  dev: false
875
  optional: true
876
 
877
+ /@aws-sdk/fetch-http-handler/3.353.0:
878
+ resolution: {integrity: sha512-8ic2+4E6jzfDevd++QS1rOR05QFkAhEFbi5Ja3/Zzp7TkWIS8wv5wwMATjNkbbdsXYuB5Lhl/OsjfZmIv5aqRw==}
879
+ dependencies:
880
+ '@aws-sdk/protocol-http': 3.347.0
881
+ '@aws-sdk/querystring-builder': 3.347.0
882
+ '@aws-sdk/types': 3.347.0
883
+ '@aws-sdk/util-base64': 3.310.0
884
+ tslib: 2.5.3
885
+ dev: false
886
+
887
+ /@aws-sdk/hash-blob-browser/3.353.0:
888
+ resolution: {integrity: sha512-YO/38oTbTY5URjmYLU5YDh1VmHndWT7h3a0T5vM9K7AAoqdVbGXP1Di9zpEmteH4rurZNEqLGuLw9/p9dTre6Q==}
889
+ dependencies:
890
+ '@aws-sdk/chunked-blob-reader': 3.310.0
891
+ '@aws-sdk/types': 3.347.0
892
+ tslib: 2.5.3
893
+ dev: false
894
+
895
  /@aws-sdk/hash-node/3.201.0:
896
  resolution: {integrity: sha512-WJsMZg5/TMoWnLM+0NuwLwFzHsi89Bi9J1Dt7JdJHXFLoEZV54FEz1PK/Sq5NOldhVljpXQwWOB2dHA2wxFztg==}
897
  engines: {node: '>=14.0.0'}
 
902
  dev: false
903
  optional: true
904
 
905
+ /@aws-sdk/hash-node/3.347.0:
906
+ resolution: {integrity: sha512-96+ml/4EaUaVpzBdOLGOxdoXOjkPgkoJp/0i1fxOJEvl8wdAQSwc3IugVK9wZkCxy2DlENtgOe6DfIOhfffm/g==}
907
+ engines: {node: '>=14.0.0'}
908
+ dependencies:
909
+ '@aws-sdk/types': 3.347.0
910
+ '@aws-sdk/util-buffer-from': 3.310.0
911
+ '@aws-sdk/util-utf8': 3.310.0
912
+ tslib: 2.5.3
913
+ dev: false
914
+
915
+ /@aws-sdk/hash-stream-node/3.347.0:
916
+ resolution: {integrity: sha512-tOBfcvELyt1GVuAlQ4d0mvm3QxoSSmvhH15SWIubM9RP4JWytBVzaFAn/aC02DBAWyvp0acMZ5J+47mxrWJElg==}
917
+ engines: {node: '>=14.0.0'}
918
+ dependencies:
919
+ '@aws-sdk/types': 3.347.0
920
+ '@aws-sdk/util-utf8': 3.310.0
921
+ tslib: 2.5.3
922
+ dev: false
923
+
924
  /@aws-sdk/invalid-dependency/3.201.0:
925
  resolution: {integrity: sha512-f/zgntOfIozNyKSaG9dvHjjBaR3y20kYNswMYkSuCM2NIT5LpyHiiq5I11TwaocatUFcDztWpcsv7vHpIgI5Ig==}
926
  dependencies:
 
929
  dev: false
930
  optional: true
931
 
932
+ /@aws-sdk/invalid-dependency/3.347.0:
933
+ resolution: {integrity: sha512-8imQcwLwqZ/wTJXZqzXT9pGLIksTRckhGLZaXT60tiBOPKuerTsus2L59UstLs5LP8TKaVZKFFSsjRIn9dQdmQ==}
934
+ dependencies:
935
+ '@aws-sdk/types': 3.347.0
936
+ tslib: 2.5.3
937
+ dev: false
938
+
939
  /@aws-sdk/is-array-buffer/3.201.0:
940
  resolution: {integrity: sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==}
941
  engines: {node: '>=14.0.0'}
 
944
  dev: false
945
  optional: true
946
 
947
+ /@aws-sdk/is-array-buffer/3.310.0:
948
+ resolution: {integrity: sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==}
949
+ engines: {node: '>=14.0.0'}
950
+ dependencies:
951
+ tslib: 2.5.3
952
+ dev: false
953
+
954
+ /@aws-sdk/md5-js/3.347.0:
955
+ resolution: {integrity: sha512-mChE+7DByTY9H4cQ6fnWp2x5jf8e6OZN+AdLp6WQ+W99z35zBeqBxVmgm8ziJwkMIrkSTv9j3Y7T9Ve3RIcSfg==}
956
+ dependencies:
957
+ '@aws-sdk/types': 3.347.0
958
+ '@aws-sdk/util-utf8': 3.310.0
959
+ tslib: 2.5.3
960
+ dev: false
961
+
962
+ /@aws-sdk/middleware-bucket-endpoint/3.354.0:
963
+ resolution: {integrity: sha512-CU1RIwY8dqoPm+TixXHu4p0XziT6kXps1ip+hauxUC/BNalu2Cln8QwukDtYhN0IF9s82NhrDlDkI6RIzfGn2Q==}
964
+ engines: {node: '>=14.0.0'}
965
+ dependencies:
966
+ '@aws-sdk/protocol-http': 3.347.0
967
+ '@aws-sdk/types': 3.347.0
968
+ '@aws-sdk/util-arn-parser': 3.310.0
969
+ '@aws-sdk/util-config-provider': 3.310.0
970
+ tslib: 2.5.3
971
+ dev: false
972
+
973
  /@aws-sdk/middleware-content-length/3.201.0:
974
  resolution: {integrity: sha512-p4G9AtdrKO8A3Z4RyZiy0isEYwuge7bQRBS7UzcGkcIOhJONq2pcM+gRZYz+NWvfYYNWUg5uODsFQfU8342yKg==}
975
  engines: {node: '>=14.0.0'}
 
980
  dev: false
981
  optional: true
982
 
983
+ /@aws-sdk/middleware-content-length/3.347.0:
984
+ resolution: {integrity: sha512-i4qtWTDImMaDUtwKQPbaZpXsReiwiBomM1cWymCU4bhz81HL01oIxOxOBuiM+3NlDoCSPr3KI6txZSz/8cqXCQ==}
985
+ engines: {node: '>=14.0.0'}
986
+ dependencies:
987
+ '@aws-sdk/protocol-http': 3.347.0
988
+ '@aws-sdk/types': 3.347.0
989
+ tslib: 2.5.3
990
+ dev: false
991
+
992
  /@aws-sdk/middleware-endpoint/3.201.0:
993
  resolution: {integrity: sha512-F3JlXo5GusbeZR956hA9VxmDxUeg77Xh6o8fveAE2+G4Bjcb1iq9jPNlw6A14vDj3oTKenv2LLnjL2OIfl6hRA==}
994
  engines: {node: '>=14.0.0'}
 
1004
  dev: false
1005
  optional: true
1006
 
1007
+ /@aws-sdk/middleware-endpoint/3.347.0:
1008
+ resolution: {integrity: sha512-unF0c6dMaUL1ffU+37Ugty43DgMnzPWXr/Jup/8GbK5fzzWT5NQq6dj9KHPubMbWeEjQbmczvhv25JuJdK8gNQ==}
1009
+ engines: {node: '>=14.0.0'}
1010
+ dependencies:
1011
+ '@aws-sdk/middleware-serde': 3.347.0
1012
+ '@aws-sdk/types': 3.347.0
1013
+ '@aws-sdk/url-parser': 3.347.0
1014
+ '@aws-sdk/util-middleware': 3.347.0
1015
+ tslib: 2.5.3
1016
+ dev: false
1017
+
1018
+ /@aws-sdk/middleware-expect-continue/3.347.0:
1019
+ resolution: {integrity: sha512-95M1unD1ENL0tx35dfyenSfx0QuXBSKtOi/qJja6LfX5771C5fm5ZTOrsrzPFJvRg/wj8pCOVWRZk+d5+jvfOQ==}
1020
+ engines: {node: '>=14.0.0'}
1021
+ dependencies:
1022
+ '@aws-sdk/protocol-http': 3.347.0
1023
+ '@aws-sdk/types': 3.347.0
1024
+ tslib: 2.5.3
1025
+ dev: false
1026
+
1027
+ /@aws-sdk/middleware-flexible-checksums/3.347.0:
1028
+ resolution: {integrity: sha512-Pda7VMAIyeHw9nMp29rxdFft3EF4KP/tz/vLB6bqVoBNbLujo5rxn3SGOgStgIz7fuMLQQfoWIsmvxUm+Fp+Dw==}
1029
+ engines: {node: '>=14.0.0'}
1030
+ dependencies:
1031
+ '@aws-crypto/crc32': 3.0.0
1032
+ '@aws-crypto/crc32c': 3.0.0
1033
+ '@aws-sdk/is-array-buffer': 3.310.0
1034
+ '@aws-sdk/protocol-http': 3.347.0
1035
+ '@aws-sdk/types': 3.347.0
1036
+ '@aws-sdk/util-utf8': 3.310.0
1037
+ tslib: 2.5.3
1038
+ dev: false
1039
+
1040
  /@aws-sdk/middleware-host-header/3.201.0:
1041
  resolution: {integrity: sha512-7KNzdV7nFcKAoahvgGAlzsOq9FFDsU5h3w2iPtVdJhz6ZRDH/2v6WFeUCji+UNZip36gFfMPivoO8Y5smb5r/A==}
1042
  engines: {node: '>=14.0.0'}
 
1047
  dev: false
1048
  optional: true
1049
 
1050
+ /@aws-sdk/middleware-host-header/3.347.0:
1051
+ resolution: {integrity: sha512-kpKmR9OvMlnReqp5sKcJkozbj1wmlblbVSbnQAIkzeQj2xD5dnVR3Nn2ogQKxSmU1Fv7dEroBtrruJ1o3fY38A==}
1052
+ engines: {node: '>=14.0.0'}
1053
+ dependencies:
1054
+ '@aws-sdk/protocol-http': 3.347.0
1055
+ '@aws-sdk/types': 3.347.0
1056
+ tslib: 2.5.3
1057
+ dev: false
1058
+
1059
+ /@aws-sdk/middleware-location-constraint/3.347.0:
1060
+ resolution: {integrity: sha512-x5fcEV7q8fQ0OmUO+cLhN5iPqGoLWtC3+aKHIfRRb2BpOO1khyc1FKzsIAdeQz2hfktq4j+WsrmcPvFKv51pSg==}
1061
+ engines: {node: '>=14.0.0'}
1062
+ dependencies:
1063
+ '@aws-sdk/types': 3.347.0
1064
+ tslib: 2.5.3
1065
+ dev: false
1066
+
1067
  /@aws-sdk/middleware-logger/3.201.0:
1068
  resolution: {integrity: sha512-kYLsa9x3oUJxYU7V5KOO50Kl7b0kk+I4ltkrdarLvvXcVI7ZXmWHzHLT2dkUhj8S0ceVdi0FYHVPJ3GoE8re4A==}
1069
  engines: {node: '>=14.0.0'}
 
1073
  dev: false
1074
  optional: true
1075
 
1076
+ /@aws-sdk/middleware-logger/3.347.0:
1077
+ resolution: {integrity: sha512-NYC+Id5UCkVn+3P1t/YtmHt75uED06vwaKyxDy0UmB2K66PZLVtwWbLpVWrhbroaw1bvUHYcRyQ9NIfnVcXQjA==}
1078
+ engines: {node: '>=14.0.0'}
1079
+ dependencies:
1080
+ '@aws-sdk/types': 3.347.0
1081
+ tslib: 2.5.3
1082
+ dev: false
1083
+
1084
  /@aws-sdk/middleware-recursion-detection/3.201.0:
1085
  resolution: {integrity: sha512-NGOr+n559ZcJLdFoJR8LNGdrOJFIp2BTuWEDYeicNdNb0bETTXrkzcfT1BRhV9CWqCDmjFvjdrzbhS0cw/UUGA==}
1086
  engines: {node: '>=14.0.0'}
 
1091
  dev: false
1092
  optional: true
1093
 
1094
+ /@aws-sdk/middleware-recursion-detection/3.347.0:
1095
+ resolution: {integrity: sha512-qfnSvkFKCAMjMHR31NdsT0gv5Sq/ZHTUD4yQsSLpbVQ6iYAS834lrzXt41iyEHt57Y514uG7F/Xfvude3u4icQ==}
1096
+ engines: {node: '>=14.0.0'}
1097
+ dependencies:
1098
+ '@aws-sdk/protocol-http': 3.347.0
1099
+ '@aws-sdk/types': 3.347.0
1100
+ tslib: 2.5.3
1101
+ dev: false
1102
+
1103
  /@aws-sdk/middleware-retry/3.201.0:
1104
  resolution: {integrity: sha512-4jQjSKCpSc4oB1X9nNq4FbIAwQrr+mvmUSmg/oe2Llf42Ak1G9gg3rNTtQdfzA/wNMlL4ZFfF5Br+uz06e1hnQ==}
1105
  engines: {node: '>=14.0.0'}
 
1113
  dev: false
1114
  optional: true
1115
 
1116
+ /@aws-sdk/middleware-retry/3.354.0:
1117
+ resolution: {integrity: sha512-dnG5Nd/mobbhcWCM71DQWI9+f6b6fDSzALXftFIP/8lsXKRcWDSQuYjrnVST2wZzk/QmdF8TnVD0C1xL14K6CQ==}
1118
+ engines: {node: '>=14.0.0'}
1119
+ dependencies:
1120
+ '@aws-sdk/protocol-http': 3.347.0
1121
+ '@aws-sdk/service-error-classification': 3.347.0
1122
+ '@aws-sdk/types': 3.347.0
1123
+ '@aws-sdk/util-middleware': 3.347.0
1124
+ '@aws-sdk/util-retry': 3.347.0
1125
+ tslib: 2.5.3
1126
+ uuid: 8.3.2
1127
+ dev: false
1128
+
1129
+ /@aws-sdk/middleware-sdk-s3/3.347.0:
1130
+ resolution: {integrity: sha512-TLr92+HMvamrhJJ0VDhA/PiUh4rTNQz38B9dB9ikohTaRgm+duP+mRiIv16tNPZPGl8v82Thn7Ogk2qPByNDtg==}
1131
+ engines: {node: '>=14.0.0'}
1132
+ dependencies:
1133
+ '@aws-sdk/protocol-http': 3.347.0
1134
+ '@aws-sdk/types': 3.347.0
1135
+ '@aws-sdk/util-arn-parser': 3.310.0
1136
+ tslib: 2.5.3
1137
+ dev: false
1138
+
1139
  /@aws-sdk/middleware-sdk-sts/3.201.0:
1140
  resolution: {integrity: sha512-clZuXcoN0mAP4JH5C6pW5+0tdF25+fpFJqE7GNRjjH/NYNk6ImVI0Kq2espEWwVBuaS0/chTDK3b+pK8YOWdhw==}
1141
  engines: {node: '>=14.0.0'}
 
1149
  dev: false
1150
  optional: true
1151
 
1152
+ /@aws-sdk/middleware-sdk-sts/3.354.0:
1153
+ resolution: {integrity: sha512-L6vyAwYrdcOoB4YgCqNJNr+ZZtLHEF2Ym3CTfmFm2srXHqHuRB+mBu0NLV/grz77znIArK1H1ZL/ZaH2I5hclA==}
1154
+ engines: {node: '>=14.0.0'}
1155
+ dependencies:
1156
+ '@aws-sdk/middleware-signing': 3.354.0
1157
+ '@aws-sdk/types': 3.347.0
1158
+ tslib: 2.5.3
1159
+ dev: false
1160
+
1161
  /@aws-sdk/middleware-serde/3.201.0:
1162
  resolution: {integrity: sha512-Z7AzIuqEDvsZmp80zeT1oYxsoB8uQZby20Z8kF6/vNoq3sIzaGf/wHeNn0p+Vgo2auGSbZcVUZKoDptQLSLwIQ==}
1163
  engines: {node: '>=14.0.0'}
 
1167
  dev: false
1168
  optional: true
1169
 
1170
+ /@aws-sdk/middleware-serde/3.347.0:
1171
+ resolution: {integrity: sha512-x5Foi7jRbVJXDu9bHfyCbhYDH5pKK+31MmsSJ3k8rY8keXLBxm2XEEg/AIoV9/TUF9EeVvZ7F1/RmMpJnWQsEg==}
1172
+ engines: {node: '>=14.0.0'}
1173
+ dependencies:
1174
+ '@aws-sdk/types': 3.347.0
1175
+ tslib: 2.5.3
1176
+ dev: false
1177
+
1178
  /@aws-sdk/middleware-signing/3.201.0:
1179
  resolution: {integrity: sha512-08ri5+mB28tva9RjVIXFcUP5lRTx+Pj8C2HYqF2GL5H3uAo+h3RQ++fEG1uwUMLf7tCEFivcw6SHA1KmCnB7+w==}
1180
  engines: {node: '>=14.0.0'}
 
1188
  dev: false
1189
  optional: true
1190
 
1191
+ /@aws-sdk/middleware-signing/3.354.0:
1192
+ resolution: {integrity: sha512-Dd+vIhJL0VqqKWqlTKlKC5jkCaEIk73ZEXNfv44XbsI25a0vXbatHp1M8jB/cgkJC/Mri1TX9dmckP/C0FDEwA==}
1193
+ engines: {node: '>=14.0.0'}
1194
+ dependencies:
1195
+ '@aws-sdk/property-provider': 3.353.0
1196
+ '@aws-sdk/protocol-http': 3.347.0
1197
+ '@aws-sdk/signature-v4': 3.354.0
1198
+ '@aws-sdk/types': 3.347.0
1199
+ '@aws-sdk/util-middleware': 3.347.0
1200
+ tslib: 2.5.3
1201
+ dev: false
1202
+
1203
+ /@aws-sdk/middleware-ssec/3.347.0:
1204
+ resolution: {integrity: sha512-467VEi2elPmUGcHAgTmzhguZ3lwTpwK+3s+pk312uZtVsS9rP1MAknYhpS3ZvssiqBUVPx8m29cLcC6Tx5nOJg==}
1205
+ engines: {node: '>=14.0.0'}
1206
+ dependencies:
1207
+ '@aws-sdk/types': 3.347.0
1208
+ tslib: 2.5.3
1209
+ dev: false
1210
+
1211
  /@aws-sdk/middleware-stack/3.201.0:
1212
  resolution: {integrity: sha512-lqHYSBP5FBxzA5w5XiYYYpfXabFzleXonqRkqZts1tapNJ4sOd+itiKG8JoNP7LDOwJ8qxNW/a33/gQeh3wkwQ==}
1213
  engines: {node: '>=14.0.0'}
 
1216
  dev: false
1217
  optional: true
1218
 
1219
+ /@aws-sdk/middleware-stack/3.347.0:
1220
+ resolution: {integrity: sha512-Izidg4rqtYMcKuvn2UzgEpPLSmyd8ub9+LQ2oIzG3mpIzCBITq7wp40jN1iNkMg+X6KEnX9vdMJIYZsPYMCYuQ==}
1221
+ engines: {node: '>=14.0.0'}
1222
+ dependencies:
1223
+ tslib: 2.5.3
1224
+ dev: false
1225
+
1226
  /@aws-sdk/middleware-user-agent/3.201.0:
1227
  resolution: {integrity: sha512-/rYZ93WN1gDJudXis/0382CEoTqRa4qZJA608u2EPWs5aiMocUrm7pjH5XvKm2OYX8K/lyaMSBvL2OTIMzXGaQ==}
1228
  engines: {node: '>=14.0.0'}
 
1233
  dev: false
1234
  optional: true
1235
 
1236
+ /@aws-sdk/middleware-user-agent/3.352.0:
1237
+ resolution: {integrity: sha512-QGqblMTsVDqeomy22KPm9LUW8PHZXBA2Hjk9Hcw8U1uFS8IKYJrewInG3ae2+9FAcTyug4LFWDf8CRr9YH2B3Q==}
1238
+ engines: {node: '>=14.0.0'}
1239
+ dependencies:
1240
+ '@aws-sdk/protocol-http': 3.347.0
1241
+ '@aws-sdk/types': 3.347.0
1242
+ '@aws-sdk/util-endpoints': 3.352.0
1243
+ tslib: 2.5.3
1244
+ dev: false
1245
+
1246
  /@aws-sdk/node-config-provider/3.201.0:
1247
  resolution: {integrity: sha512-JO0K2qPTYn+pPC7g8rWr1oueg9CqGCkYbINuAuz79vjToOLUQnZT9GiFm7QADe6J6RT1oGEKRQabNaJnp8cFpQ==}
1248
  engines: {node: '>=14.0.0'}
 
1254
  dev: false
1255
  optional: true
1256
 
1257
+ /@aws-sdk/node-config-provider/3.354.0:
1258
+ resolution: {integrity: sha512-pF1ZGWWvmwbrloNHYF3EDqCb9hq5wfZwDqAwAPhWkYnUYKkR7E7MZVuTwUDU48io8k6Z5pM52l/54w8e8aedTw==}
1259
+ engines: {node: '>=14.0.0'}
1260
+ dependencies:
1261
+ '@aws-sdk/property-provider': 3.353.0
1262
+ '@aws-sdk/shared-ini-file-loader': 3.354.0
1263
+ '@aws-sdk/types': 3.347.0
1264
+ tslib: 2.5.3
1265
+ dev: false
1266
+
1267
  /@aws-sdk/node-http-handler/3.201.0:
1268
  resolution: {integrity: sha512-bWjXBd4WCiQcV4PwY+eFnlz9tZ4UiqfiJteav4MDt8YWkVlsVnR8RutmVSm3KZZjO2tJNSrla0ZWBebkNnI/Xg==}
1269
  engines: {node: '>=14.0.0'}
 
1276
  dev: false
1277
  optional: true
1278
 
1279
+ /@aws-sdk/node-http-handler/3.350.0:
1280
+ resolution: {integrity: sha512-oD96GAlmpzYilCdC8wwyURM5lNfNHZCjm/kxBkQulHKa2kRbIrnD9GfDqdCkWA5cTpjh1NzGLT4D6e6UFDjt9w==}
1281
+ engines: {node: '>=14.0.0'}
1282
+ dependencies:
1283
+ '@aws-sdk/abort-controller': 3.347.0
1284
+ '@aws-sdk/protocol-http': 3.347.0
1285
+ '@aws-sdk/querystring-builder': 3.347.0
1286
+ '@aws-sdk/types': 3.347.0
1287
+ tslib: 2.5.3
1288
+ dev: false
1289
+
1290
  /@aws-sdk/property-provider/3.201.0:
1291
  resolution: {integrity: sha512-lVMP75VsYHIW04uYbkjA0I8Bb7b+aEj6PBBLdFoA22S0uCeJOD42OSr2Gtg2fToDGO7LQJw/K2D+LMCYKfZ3vQ==}
1292
  engines: {node: '>=14.0.0'}
 
1296
  dev: false
1297
  optional: true
1298
 
1299
+ /@aws-sdk/property-provider/3.353.0:
1300
+ resolution: {integrity: sha512-Iu6J59hncaew7eBKroTcLjZ8cgrom0IWyZZ09rsow3rZDHVtw7LQSrUyuqsSbKGY9eRtL7Wa6ZtYHnXFiAE2kg==}
1301
+ engines: {node: '>=14.0.0'}
1302
+ dependencies:
1303
+ '@aws-sdk/types': 3.347.0
1304
+ tslib: 2.5.3
1305
+ dev: false
1306
+
1307
  /@aws-sdk/protocol-http/3.201.0:
1308
  resolution: {integrity: sha512-RdOc1elWFpj8MogxG87nkhtylw0a+OD7W8WFM+Gw4yJMkl7cwW42VIBFfb0+KCGZfIQltIeSLRvfe3WvVPyo7Q==}
1309
  engines: {node: '>=14.0.0'}
 
1313
  dev: false
1314
  optional: true
1315
 
1316
+ /@aws-sdk/protocol-http/3.347.0:
1317
+ resolution: {integrity: sha512-2YdBhc02Wvy03YjhGwUxF0UQgrPWEy8Iq75pfS42N+/0B/+eWX1aQgfjFxIpLg7YSjT5eKtYOQGlYd4MFTgj9g==}
1318
+ engines: {node: '>=14.0.0'}
1319
+ dependencies:
1320
+ '@aws-sdk/types': 3.347.0
1321
+ tslib: 2.5.3
1322
+ dev: false
1323
+
1324
  /@aws-sdk/querystring-builder/3.201.0:
1325
  resolution: {integrity: sha512-FgQnVHpYR19w/HmHEgWpykCn9tdogW0n45Ins6LBCo2aImDf9kBATD4xgN/F2rtogGuLGgu5LIIMHIOj1Tzs/w==}
1326
  engines: {node: '>=14.0.0'}
 
1331
  dev: false
1332
  optional: true
1333
 
1334
+ /@aws-sdk/querystring-builder/3.347.0:
1335
+ resolution: {integrity: sha512-phtKTe6FXoV02MoPkIVV6owXI8Mwr5IBN3bPoxhcPvJG2AjEmnetSIrhb8kwc4oNhlwfZwH6Jo5ARW/VEWbZtg==}
1336
+ engines: {node: '>=14.0.0'}
1337
+ dependencies:
1338
+ '@aws-sdk/types': 3.347.0
1339
+ '@aws-sdk/util-uri-escape': 3.310.0
1340
+ tslib: 2.5.3
1341
+ dev: false
1342
+
1343
  /@aws-sdk/querystring-parser/3.201.0:
1344
  resolution: {integrity: sha512-vS9Ljbqrwi0sIKYxgyZYJUN1AcE291hvuqwty9etgD2w/26SbWiMhjIW/fXJUOZjUvGKkYCpbivJYSzAGAuWfQ==}
1345
  engines: {node: '>=14.0.0'}
 
1349
  dev: false
1350
  optional: true
1351
 
1352
+ /@aws-sdk/querystring-parser/3.347.0:
1353
+ resolution: {integrity: sha512-5VXOhfZz78T2W7SuXf2avfjKglx1VZgZgp9Zfhrt/Rq+MTu2D+PZc5zmJHhYigD7x83jLSLogpuInQpFMA9LgA==}
1354
+ engines: {node: '>=14.0.0'}
1355
+ dependencies:
1356
+ '@aws-sdk/types': 3.347.0
1357
+ tslib: 2.5.3
1358
+ dev: false
1359
+
1360
+ /@aws-sdk/s3-request-presigner/3.354.0:
1361
+ resolution: {integrity: sha512-da+VbCd1RB6aZIsKrGvdmKprB4wdjY+caDL8PPzuyImsnCvj8wA8E2wiaqtX8qEhysr6JVn8fhftiKl4c7az8A==}
1362
+ engines: {node: '>=14.0.0'}
1363
+ dependencies:
1364
+ '@aws-sdk/middleware-endpoint': 3.347.0
1365
+ '@aws-sdk/protocol-http': 3.347.0
1366
+ '@aws-sdk/signature-v4-multi-region': 3.354.0
1367
+ '@aws-sdk/smithy-client': 3.347.0
1368
+ '@aws-sdk/types': 3.347.0
1369
+ '@aws-sdk/util-format-url': 3.347.0
1370
+ tslib: 2.5.3
1371
+ transitivePeerDependencies:
1372
+ - '@aws-sdk/signature-v4-crt'
1373
+ dev: false
1374
+
1375
  /@aws-sdk/service-error-classification/3.201.0:
1376
  resolution: {integrity: sha512-Pfcfmurgq8UpM0rXco6FVblcruqN4Mo3TW8/yaXrbctWpmdNT/8v19fffQIIgk94TU8Vf/nPJ7E5DXL7MZr4Fw==}
1377
  engines: {node: '>=14.0.0'}
1378
  dev: false
1379
  optional: true
1380
 
1381
+ /@aws-sdk/service-error-classification/3.347.0:
1382
+ resolution: {integrity: sha512-xZ3MqSY81Oy2gh5g0fCtooAbahqh9VhsF8vcKjVX8+XPbGC8y+kej82+MsMg4gYL8gRFB9u4hgYbNgIS6JTAvg==}
1383
+ engines: {node: '>=14.0.0'}
1384
+ dev: false
1385
+
1386
  /@aws-sdk/shared-ini-file-loader/3.201.0:
1387
  resolution: {integrity: sha512-Pbxk0TXep0yI8MnK7Prly6JuBm5Me9AITav8/zPEgTZ3fMhXhQhhiuQcuTCI9GeosSzoiu8VvK53oPtBZZFnXQ==}
1388
  engines: {node: '>=14.0.0'}
 
1392
  dev: false
1393
  optional: true
1394
 
1395
+ /@aws-sdk/shared-ini-file-loader/3.354.0:
1396
+ resolution: {integrity: sha512-UL9loGEsdzpHBu/PtlwUvkl/yRdmWXkySp22jUaeeRtBhiGAnyeYhxJLIt+u+UkX7Mwz+810SaZJqA9ptOXNAg==}
1397
+ engines: {node: '>=14.0.0'}
1398
+ dependencies:
1399
+ '@aws-sdk/types': 3.347.0
1400
+ tslib: 2.5.3
1401
+ dev: false
1402
+
1403
+ /@aws-sdk/signature-v4-multi-region/3.354.0:
1404
+ resolution: {integrity: sha512-/g/3rQH8lomtUEYMuhZi9RER1+dZtl0U8mtdNJKSJtdYT5Ftk3GXS82uDdgpg1jyeP8TCR2Stl2fWZH2Jed1vA==}
1405
+ engines: {node: '>=14.0.0'}
1406
+ peerDependencies:
1407
+ '@aws-sdk/signature-v4-crt': ^3.118.0
1408
+ peerDependenciesMeta:
1409
+ '@aws-sdk/signature-v4-crt':
1410
+ optional: true
1411
+ dependencies:
1412
+ '@aws-sdk/protocol-http': 3.347.0
1413
+ '@aws-sdk/signature-v4': 3.354.0
1414
+ '@aws-sdk/types': 3.347.0
1415
+ tslib: 2.5.3
1416
+ dev: false
1417
+
1418
  /@aws-sdk/signature-v4/3.201.0:
1419
  resolution: {integrity: sha512-zEHoG1/hzJq169slggkPy1SN9YPWI78Bbe/MvHGYmCmQDspblu60JSBIbAatNqAxAmcWKc2HqpyGKjCkMG94ZA==}
1420
  engines: {node: '>=14.0.0'}
 
1428
  dev: false
1429
  optional: true
1430
 
1431
+ /@aws-sdk/signature-v4/3.354.0:
1432
+ resolution: {integrity: sha512-bDp43P5NkwwznpZqmsr78DuyqNcjtS4mriuajb8XPhFNo8DrMXUrdrKJ+5aNABW7YG8uK8PSKBpq88ado692/w==}
1433
+ engines: {node: '>=14.0.0'}
1434
+ dependencies:
1435
+ '@aws-sdk/eventstream-codec': 3.347.0
1436
+ '@aws-sdk/is-array-buffer': 3.310.0
1437
+ '@aws-sdk/types': 3.347.0
1438
+ '@aws-sdk/util-hex-encoding': 3.310.0
1439
+ '@aws-sdk/util-middleware': 3.347.0
1440
+ '@aws-sdk/util-uri-escape': 3.310.0
1441
+ '@aws-sdk/util-utf8': 3.310.0
1442
+ tslib: 2.5.3
1443
+ dev: false
1444
+
1445
  /@aws-sdk/smithy-client/3.201.0:
1446
  resolution: {integrity: sha512-cL87Jgxczee8YFkWGWKQ2Ze0vjn4+eCa1kDvEYMCOQvNujTuFgatXLgije5a7nVkSnL9WLoIP7Y7fsBGrKfMnQ==}
1447
  engines: {node: '>=14.0.0'}
 
1452
  dev: false
1453
  optional: true
1454
 
1455
+ /@aws-sdk/smithy-client/3.347.0:
1456
+ resolution: {integrity: sha512-PaGTDsJLGK0sTjA6YdYQzILRlPRN3uVFyqeBUkfltXssvUzkm8z2t1lz2H4VyJLAhwnG5ZuZTNEV/2mcWrU7JQ==}
1457
+ engines: {node: '>=14.0.0'}
1458
+ dependencies:
1459
+ '@aws-sdk/middleware-stack': 3.347.0
1460
+ '@aws-sdk/types': 3.347.0
1461
+ tslib: 2.5.3
1462
+ dev: false
1463
+
1464
+ /@aws-sdk/token-providers/3.354.0:
1465
+ resolution: {integrity: sha512-KcijiySy0oIyafKQagcwgu0fo35mK+2K8pwxRU1WfXqe80Gn1qGceeWcG4iW+t/rUaxa/LVo857N0LcagxCrZA==}
1466
+ engines: {node: '>=14.0.0'}
1467
+ dependencies:
1468
+ '@aws-sdk/client-sso-oidc': 3.354.0
1469
+ '@aws-sdk/property-provider': 3.353.0
1470
+ '@aws-sdk/shared-ini-file-loader': 3.354.0
1471
+ '@aws-sdk/types': 3.347.0
1472
+ tslib: 2.5.3
1473
+ transitivePeerDependencies:
1474
+ - aws-crt
1475
+ dev: false
1476
+
1477
  /@aws-sdk/types/3.201.0:
1478
  resolution: {integrity: sha512-RCQj2pQyHD330Jd4c5CHJ87k2ZqC3Mmtl6nhwH1dy3vbnGUpc3q+3yinOKoTAY934kIa7ia32Y/2EjuyHxaj1A==}
1479
  engines: {node: '>=14.0.0'}
1480
  dev: false
1481
  optional: true
1482
 
1483
+ /@aws-sdk/types/3.347.0:
1484
+ resolution: {integrity: sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==}
1485
+ engines: {node: '>=14.0.0'}
1486
+ dependencies:
1487
+ tslib: 2.5.3
1488
+ dev: false
1489
+
1490
  /@aws-sdk/url-parser/3.201.0:
1491
  resolution: {integrity: sha512-V15aqj0tj4Y79VpuIdHUvX4Nvn4hYPB0RAn/qg5CCComIl0doLOirAQtW1MOBOyctdRlD9Uv7d1QdPLzJZMHjQ==}
1492
  dependencies:
 
1496
  dev: false
1497
  optional: true
1498
 
1499
+ /@aws-sdk/url-parser/3.347.0:
1500
+ resolution: {integrity: sha512-lhrnVjxdV7hl+yCnJfDZOaVLSqKjxN20MIOiijRiqaWGLGEAiSqBreMhL89X1WKCifxAs4zZf9YB9SbdziRpAA==}
1501
+ dependencies:
1502
+ '@aws-sdk/querystring-parser': 3.347.0
1503
+ '@aws-sdk/types': 3.347.0
1504
+ tslib: 2.5.3
1505
+ dev: false
1506
+
1507
+ /@aws-sdk/util-arn-parser/3.310.0:
1508
+ resolution: {integrity: sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==}
1509
+ engines: {node: '>=14.0.0'}
1510
+ dependencies:
1511
+ tslib: 2.5.3
1512
+ dev: false
1513
+
1514
  /@aws-sdk/util-base64-browser/3.188.0:
1515
  resolution: {integrity: sha512-qlH+5NZBLiyKziL335BEPedYxX6j+p7KFRWXvDQox9S+s+gLCayednpK+fteOhBenCcR9fUZOVuAPScy1I8qCg==}
1516
  dependencies:
 
1536
  dev: false
1537
  optional: true
1538
 
1539
+ /@aws-sdk/util-base64/3.310.0:
1540
+ resolution: {integrity: sha512-v3+HBKQvqgdzcbL+pFswlx5HQsd9L6ZTlyPVL2LS9nNXnCcR3XgGz9jRskikRUuUvUXtkSG1J88GAOnJ/apTPg==}
1541
+ engines: {node: '>=14.0.0'}
1542
+ dependencies:
1543
+ '@aws-sdk/util-buffer-from': 3.310.0
1544
+ tslib: 2.5.3
1545
+ dev: false
1546
+
1547
  /@aws-sdk/util-body-length-browser/3.188.0:
1548
  resolution: {integrity: sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==}
1549
  dependencies:
 
1551
  dev: false
1552
  optional: true
1553
 
1554
+ /@aws-sdk/util-body-length-browser/3.310.0:
1555
+ resolution: {integrity: sha512-sxsC3lPBGfpHtNTUoGXMQXLwjmR0zVpx0rSvzTPAuoVILVsp5AU/w5FphNPxD5OVIjNbZv9KsKTuvNTiZjDp9g==}
1556
+ dependencies:
1557
+ tslib: 2.5.3
1558
+ dev: false
1559
+
1560
  /@aws-sdk/util-body-length-node/3.201.0:
1561
  resolution: {integrity: sha512-q+gwQoLn/DOwirb2hgZJeEwo1D3vLhoD6FfSV42Ecfvtb4jHnWReWMHguujfCubuDgZCrMEvYQzuocS75HHsbA==}
1562
  engines: {node: '>=14.0.0'}
 
1565
  dev: false
1566
  optional: true
1567
 
1568
+ /@aws-sdk/util-body-length-node/3.310.0:
1569
+ resolution: {integrity: sha512-2tqGXdyKhyA6w4zz7UPoS8Ip+7sayOg9BwHNidiGm2ikbDxm1YrCfYXvCBdwaJxa4hJfRVz+aL9e+d3GqPI9pQ==}
1570
+ engines: {node: '>=14.0.0'}
1571
+ dependencies:
1572
+ tslib: 2.5.3
1573
+ dev: false
1574
+
1575
  /@aws-sdk/util-buffer-from/3.201.0:
1576
  resolution: {integrity: sha512-s6Wjltd9vU+vR3n0pqSPmNDcrrkrVTdV4t7x2zz3nDsFKTI77iVNafDmuaUlOA/bIlpjCJqaWecoVrZmEKeR7A==}
1577
  engines: {node: '>=14.0.0'}
 
1581
  dev: false
1582
  optional: true
1583
 
1584
+ /@aws-sdk/util-buffer-from/3.310.0:
1585
+ resolution: {integrity: sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw==}
1586
+ engines: {node: '>=14.0.0'}
1587
+ dependencies:
1588
+ '@aws-sdk/is-array-buffer': 3.310.0
1589
+ tslib: 2.5.3
1590
+ dev: false
1591
+
1592
  /@aws-sdk/util-config-provider/3.201.0:
1593
  resolution: {integrity: sha512-cCRJlnRRP8vrLJomzJRBIyiyohsjJKmnIaQ9t0tAhGCywZbyjx6TlpYRZYfVWo+MwdF1Pi8ZScTrFPW0JuBOIQ==}
1594
  engines: {node: '>=14.0.0'}
 
1597
  dev: false
1598
  optional: true
1599
 
1600
+ /@aws-sdk/util-config-provider/3.310.0:
1601
+ resolution: {integrity: sha512-xIBaYo8dwiojCw8vnUcIL4Z5tyfb1v3yjqyJKJWV/dqKUFOOS0U591plmXbM+M/QkXyML3ypon1f8+BoaDExrg==}
1602
+ engines: {node: '>=14.0.0'}
1603
+ dependencies:
1604
+ tslib: 2.5.3
1605
+ dev: false
1606
+
1607
  /@aws-sdk/util-defaults-mode-browser/3.201.0:
1608
  resolution: {integrity: sha512-skRMAM+xrV/sDvvtHC81ExEKQEiZFaRrRdUT39fBX1SpGnFTo2wpv7XK+rAW2XopGgnLPytXLQD97Kub79o4zA==}
1609
  engines: {node: '>= 10.0.0'}
 
1615
  dev: false
1616
  optional: true
1617
 
1618
+ /@aws-sdk/util-defaults-mode-browser/3.353.0:
1619
+ resolution: {integrity: sha512-ushvOQKJIH7S6E//xMDPyf2/Bbu0K2A0GJRB88qQV6VKRBo4PEbeHTb6BbzPhYVX0IbY3uR/X7+Xwk4FeEkMWg==}
1620
+ engines: {node: '>= 10.0.0'}
1621
+ dependencies:
1622
+ '@aws-sdk/property-provider': 3.353.0
1623
+ '@aws-sdk/types': 3.347.0
1624
+ bowser: 2.11.0
1625
+ tslib: 2.5.3
1626
+ dev: false
1627
+
1628
  /@aws-sdk/util-defaults-mode-node/3.201.0:
1629
  resolution: {integrity: sha512-9N5LXRhxigbkbEcjQ4nNXHuQxp0VFlbc2/5wbcuPjIKX/OROiQI4mYQ6nuSKk7eku5sNFb9FtEHeD/RZo8od6Q==}
1630
  engines: {node: '>= 10.0.0'}
 
1638
  dev: false
1639
  optional: true
1640
 
1641
+ /@aws-sdk/util-defaults-mode-node/3.354.0:
1642
+ resolution: {integrity: sha512-CaaRVBdOYX4wZadj+CDUxpO+4RjyYJcSv71A60jV6CZ/ya1+oYfmPbG5QZ4AlV6crdev2B+aUoR2LPIYqn/GnQ==}
1643
+ engines: {node: '>= 10.0.0'}
1644
+ dependencies:
1645
+ '@aws-sdk/config-resolver': 3.354.0
1646
+ '@aws-sdk/credential-provider-imds': 3.354.0
1647
+ '@aws-sdk/node-config-provider': 3.354.0
1648
+ '@aws-sdk/property-provider': 3.353.0
1649
+ '@aws-sdk/types': 3.347.0
1650
+ tslib: 2.5.3
1651
+ dev: false
1652
+
1653
  /@aws-sdk/util-endpoints/3.202.0:
1654
  resolution: {integrity: sha512-sNees5uDp7nfEbvzaA1DAHqoEvEb9ZOkdNH5gcj/FMBETbr00YtsuXsTZogTHQsX/otRTiudZBE3iH7R4SLSAQ==}
1655
  engines: {node: '>=14.0.0'}
 
1659
  dev: false
1660
  optional: true
1661
 
1662
+ /@aws-sdk/util-endpoints/3.352.0:
1663
+ resolution: {integrity: sha512-PjWMPdoIUWfBPgAWLyOrWFbdSS/3DJtc0OmFb/JrE8C8rKFYl+VGW5f1p0cVdRWiDR0xCGr0s67p8itAakVqjw==}
1664
+ engines: {node: '>=14.0.0'}
1665
+ dependencies:
1666
+ '@aws-sdk/types': 3.347.0
1667
+ tslib: 2.5.3
1668
+ dev: false
1669
+
1670
+ /@aws-sdk/util-format-url/3.347.0:
1671
+ resolution: {integrity: sha512-y9UUEmWu0IBoMZ25NVjCCOwvAEa+xJ54WfiCsgwKeFyTHWYY2wZqJfARJtme/ezqrRa8neOcBJSVxjfJJegW+w==}
1672
+ engines: {node: '>=14.0.0'}
1673
+ dependencies:
1674
+ '@aws-sdk/querystring-builder': 3.347.0
1675
+ '@aws-sdk/types': 3.347.0
1676
+ tslib: 2.5.3
1677
+ dev: false
1678
+
1679
  /@aws-sdk/util-hex-encoding/3.201.0:
1680
  resolution: {integrity: sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==}
1681
  engines: {node: '>=14.0.0'}
 
1684
  dev: false
1685
  optional: true
1686
 
1687
+ /@aws-sdk/util-hex-encoding/3.310.0:
1688
+ resolution: {integrity: sha512-sVN7mcCCDSJ67pI1ZMtk84SKGqyix6/0A1Ab163YKn+lFBQRMKexleZzpYzNGxYzmQS6VanP/cfU7NiLQOaSfA==}
1689
+ engines: {node: '>=14.0.0'}
1690
+ dependencies:
1691
+ tslib: 2.5.3
1692
+ dev: false
1693
+
1694
  /@aws-sdk/util-locate-window/3.201.0:
1695
  resolution: {integrity: sha512-hPJgifWh/rADabLAk1C9xXA2B3O4NUmbU58KgBRgC1HksiiHGFVZObB5fkBH8US/XV2jwORkpSf4OhretXQuKg==}
1696
  engines: {node: '>=14.0.0'}
1697
  dependencies:
1698
  tslib: 2.4.1
1699
  dev: false
 
1700
 
1701
  /@aws-sdk/util-middleware/3.201.0:
1702
  resolution: {integrity: sha512-iAitcEZo17IyKn4ku1IBgtomr25esu5OuSRjw5Or4bNOeqXB0w50cItf/9qft8LIhbvBEAUtNAYXvqNzvhTZdQ==}
 
1706
  dev: false
1707
  optional: true
1708
 
1709
+ /@aws-sdk/util-middleware/3.347.0:
1710
+ resolution: {integrity: sha512-8owqUA3ePufeYTUvlzdJ7Z0miLorTwx+rNol5lourGQZ9JXsVMo23+yGA7nOlFuXSGkoKpMOtn6S0BT2bcfeiw==}
1711
+ engines: {node: '>=14.0.0'}
1712
+ dependencies:
1713
+ tslib: 2.5.3
1714
+ dev: false
1715
+
1716
+ /@aws-sdk/util-retry/3.347.0:
1717
+ resolution: {integrity: sha512-NxnQA0/FHFxriQAeEgBonA43Q9/VPFQa8cfJDuT2A1YZruMasgjcltoZszi1dvoIRWSZsFTW42eY2gdOd0nffQ==}
1718
+ engines: {node: '>= 14.0.0'}
1719
+ dependencies:
1720
+ '@aws-sdk/service-error-classification': 3.347.0
1721
+ tslib: 2.5.3
1722
+ dev: false
1723
+
1724
+ /@aws-sdk/util-stream-browser/3.353.0:
1725
+ resolution: {integrity: sha512-2EBLrnjdBiMwupdPlztUjTk7T/6LX//8ppudPJvaFDyXuPYV6pDR4L5CDvrPZQTdzfbzAJKb5MVG1OxTn+aF8g==}
1726
+ dependencies:
1727
+ '@aws-sdk/fetch-http-handler': 3.353.0
1728
+ '@aws-sdk/types': 3.347.0
1729
+ '@aws-sdk/util-base64': 3.310.0
1730
+ '@aws-sdk/util-hex-encoding': 3.310.0
1731
+ '@aws-sdk/util-utf8': 3.310.0
1732
+ tslib: 2.5.3
1733
+ dev: false
1734
+
1735
+ /@aws-sdk/util-stream-node/3.350.0:
1736
+ resolution: {integrity: sha512-qhcmYEAVMJPjCepog3WTFBaeP3XCkLBbUrM5/+LaB/FASKk+JeV8qBQyjYUd8EVb6Gsk7+y9SE3Tj+ChyHB4WA==}
1737
+ engines: {node: '>=14.0.0'}
1738
+ dependencies:
1739
+ '@aws-sdk/node-http-handler': 3.350.0
1740
+ '@aws-sdk/types': 3.347.0
1741
+ '@aws-sdk/util-buffer-from': 3.310.0
1742
+ tslib: 2.5.3
1743
+ dev: false
1744
+
1745
  /@aws-sdk/util-uri-escape/3.201.0:
1746
  resolution: {integrity: sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==}
1747
  engines: {node: '>=14.0.0'}
 
1750
  dev: false
1751
  optional: true
1752
 
1753
+ /@aws-sdk/util-uri-escape/3.310.0:
1754
+ resolution: {integrity: sha512-drzt+aB2qo2LgtDoiy/3sVG8w63cgLkqFIa2NFlGpUgHFWTXkqtbgf4L5QdjRGKWhmZsnqkbtL7vkSWEcYDJ4Q==}
1755
+ engines: {node: '>=14.0.0'}
1756
+ dependencies:
1757
+ tslib: 2.5.3
1758
+ dev: false
1759
+
1760
  /@aws-sdk/util-user-agent-browser/3.201.0:
1761
  resolution: {integrity: sha512-iL2gyz7GuUVtZcMZpqvfxdFrl9hc28qpagymmJ/w2yhN86YNPHdK8Sx1Yo6VxNGVDCCWGb7tHXf7VP+U4Yv/Lg==}
1762
  dependencies:
 
1766
  dev: false
1767
  optional: true
1768
 
1769
+ /@aws-sdk/util-user-agent-browser/3.347.0:
1770
+ resolution: {integrity: sha512-ydxtsKVtQefgbk1Dku1q7pMkjDYThauG9/8mQkZUAVik55OUZw71Zzr3XO8J8RKvQG8lmhPXuAQ0FKAyycc0RA==}
1771
+ dependencies:
1772
+ '@aws-sdk/types': 3.347.0
1773
+ bowser: 2.11.0
1774
+ tslib: 2.5.3
1775
+ dev: false
1776
+
1777
  /@aws-sdk/util-user-agent-node/3.201.0:
1778
  resolution: {integrity: sha512-6lhhvwB3AZSISnYQpDGdlyTrzfYK2P9QYjy7vZEBRd9TSOaggiFICXe03ZvZfVOSeg0EInlMKn1fIHzPUHRuHQ==}
1779
  engines: {node: '>=14.0.0'}
 
1789
  dev: false
1790
  optional: true
1791
 
1792
+ /@aws-sdk/util-user-agent-node/3.354.0:
1793
+ resolution: {integrity: sha512-2xkblZS3PGxxh//0lgCwJw2gvh9ZBcI9H9xv05YP7hcwlz9BmkAlbei2i6Uew6agJMLO4unfgWoBTpzp3WLaKg==}
1794
+ engines: {node: '>=14.0.0'}
1795
+ peerDependencies:
1796
+ aws-crt: '>=1.0.0'
1797
+ peerDependenciesMeta:
1798
+ aws-crt:
1799
+ optional: true
1800
+ dependencies:
1801
+ '@aws-sdk/node-config-provider': 3.354.0
1802
+ '@aws-sdk/types': 3.347.0
1803
+ tslib: 2.5.3
1804
+ dev: false
1805
+
1806
  /@aws-sdk/util-utf8-browser/3.188.0:
1807
  resolution: {integrity: sha512-jt627x0+jE+Ydr9NwkFstg3cUvgWh56qdaqAMDsqgRlKD21md/6G226z/Qxl7lb1VEW2LlmCx43ai/37Qwcj2Q==}
1808
  dependencies:
1809
  tslib: 2.4.1
1810
  dev: false
 
1811
 
1812
  /@aws-sdk/util-utf8-node/3.201.0:
1813
  resolution: {integrity: sha512-A+bJFR/1rHYOJg137E69L1sX0I+LH+xf9ZjMXG9BVO0hSo7yDPoJVpHrzTJyOc3tuRITjIGBv9Qi4TKcoOSi1A==}
 
1818
  dev: false
1819
  optional: true
1820
 
1821
+ /@aws-sdk/util-utf8/3.310.0:
1822
+ resolution: {integrity: sha512-DnLfFT8uCO22uOJc0pt0DsSNau1GTisngBCDw8jQuWT5CqogMJu4b/uXmwEqfj8B3GX6Xsz8zOd6JpRlPftQoA==}
1823
+ engines: {node: '>=14.0.0'}
1824
+ dependencies:
1825
+ '@aws-sdk/util-buffer-from': 3.310.0
1826
+ tslib: 2.5.3
1827
+ dev: false
1828
+
1829
+ /@aws-sdk/util-waiter/3.347.0:
1830
+ resolution: {integrity: sha512-3ze/0PkwkzUzLncukx93tZgGL0JX9NaP8DxTi6WzflnL/TEul5Z63PCruRNK0om17iZYAWKrf8q2mFoHYb4grA==}
1831
+ engines: {node: '>=14.0.0'}
1832
+ dependencies:
1833
+ '@aws-sdk/abort-controller': 3.347.0
1834
+ '@aws-sdk/types': 3.347.0
1835
+ tslib: 2.5.3
1836
+ dev: false
1837
+
1838
+ /@aws-sdk/xml-builder/3.310.0:
1839
+ resolution: {integrity: sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==}
1840
+ engines: {node: '>=14.0.0'}
1841
+ dependencies:
1842
+ tslib: 2.5.3
1843
+ dev: false
1844
+
1845
  /@esbuild/android-arm/0.16.17:
1846
  resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==}
1847
  engines: {node: '>=12'}
 
2251
  rollup: 3.10.1
2252
  dev: true
2253
 
2254
+ /@smithy/protocol-http/1.0.1:
2255
+ resolution: {integrity: sha512-9OrEn0WfOVtBNYJUjUAn9AOiJ4lzERCJJ/JeZs8E6yajTGxBaFRxUnNBHiNqoDJVg076hY36UmEnPx7xXrvUSg==}
2256
+ engines: {node: '>=14.0.0'}
2257
+ dependencies:
2258
+ '@smithy/types': 1.0.0
2259
+ tslib: 2.5.3
2260
+ dev: false
2261
+
2262
+ /@smithy/types/1.0.0:
2263
+ resolution: {integrity: sha512-kc1m5wPBHQCTixwuaOh9vnak/iJm21DrSf9UK6yDE5S3mQQ4u11pqAUiKWnlrZnYkeLfAI9UEHj9OaMT1v5Umg==}
2264
+ engines: {node: '>=14.0.0'}
2265
+ dependencies:
2266
+ tslib: 2.5.3
2267
+ dev: false
2268
+
2269
  /@sveltejs/adapter-node/1.1.4_@sveltejs+kit@1.5.6:
2270
  resolution: {integrity: sha512-3iEBqi1fXLXP9YIbVuz2LXajoebRJCmAFEQbN40DlxAnA7G+InxUgnqFun3q9gBMz2Qvd99K51g/HxWetXRe8Q==}
2271
  peerDependencies:
 
2355
  resolution: {integrity: sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw==}
2356
  dev: true
2357
 
2358
+ /@types/mime-types/2.1.1:
2359
+ resolution: {integrity: sha512-vXOTGVSLR2jMw440moWTC7H19iUyLtP3Z1YTj7cSsubOICinjMxFeb/V57v9QdyyPGbbWolUFSSmSiRSn94tFw==}
2360
+ dev: true
2361
+
2362
  /@types/node/18.11.9:
2363
  resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==}
2364
 
 
2817
  /bowser/2.11.0:
2818
  resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==}
2819
  dev: false
 
2820
 
2821
  /brace-expansion/1.1.11:
2822
  resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
 
3306
  dev: false
3307
  optional: true
3308
 
3309
+ /fast-xml-parser/4.2.4:
3310
+ resolution: {integrity: sha512-fbfMDvgBNIdDJLdLOwacjFAPYt67tr31H9ZhWSm45CDAxvd0I6WTlSOUo7K2P/K5sA5JgMKG64PI3DMcaFdWpQ==}
3311
+ hasBin: true
3312
+ dependencies:
3313
+ strnum: 1.0.5
3314
+ dev: false
3315
+
3316
  /fastq/1.13.0:
3317
  resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==}
3318
  dependencies:
 
4281
  /strnum/1.0.5:
4282
  resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==}
4283
  dev: false
 
4284
 
4285
  /supports-color/7.2.0:
4286
  resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
 
4489
  /tslib/2.4.1:
4490
  resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==}
4491
 
4492
+ /tslib/2.5.3:
4493
+ resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==}
4494
+ dev: false
4495
+
4496
  /tsutils/3.21.0_typescript@5.0.3:
4497
  resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
4498
  engines: {node: '>= 6'}
 
4609
  resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
4610
  hasBin: true
4611
  dev: false
 
4612
 
4613
  /vite/4.0.4:
4614
  resolution: {integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==}
src/lib/components/Picture.svelte CHANGED
@@ -30,7 +30,7 @@
30
  computedWidth = null;
31
  } else if (matchedHeight !== null && picture) {
32
  computedWidth = Math.round(
33
- (matchedHeight / picture.storage[0].height) * picture.storage[0].width
34
  );
35
  } else {
36
  computedWidth = null;
@@ -42,7 +42,7 @@
42
  computedHeight = null;
43
  } else if (matchedWidth !== null && picture) {
44
  computedHeight = Math.round(
45
- (matchedWidth / picture.storage[0].width) * picture.storage[0].height
46
  );
47
  } else {
48
  computedHeight = null;
@@ -57,8 +57,8 @@
57
  {#if picture}
58
  <img
59
  alt={picture.name}
60
- srcset={picture.storage
61
- .map((format) => `/photos/raw/${format._id} ${format.width}w`)
62
  .join(', ')}
63
  sizes={matchedWidth ?? computedWidth !== null ? `${matchedWidth ?? computedWidth}px` : `100vw`}
64
  class={className}
 
30
  computedWidth = null;
31
  } else if (matchedHeight !== null && picture) {
32
  computedWidth = Math.round(
33
+ (matchedHeight / picture.storage.original.height) * picture.storage.original.width
34
  );
35
  } else {
36
  computedWidth = null;
 
42
  computedHeight = null;
43
  } else if (matchedWidth !== null && picture) {
44
  computedHeight = Math.round(
45
+ (matchedWidth / picture.storage.original.width) * picture.storage.original.height
46
  );
47
  } else {
48
  computedHeight = null;
 
57
  {#if picture}
58
  <img
59
  alt={picture.name}
60
+ srcset={picture.storage.formats
61
+ .map((format) => `/photos/raw/${picture?._id}/format/${format.width} ${format.width}w`)
62
  .join(', ')}
63
  sizes={matchedWidth ?? computedWidth !== null ? `${matchedWidth ?? computedWidth}px` : `100vw`}
64
  class={className}
src/lib/picture.ts ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ import type { Picture } from './types/Picture';
2
+
3
+ export function pictureLink(picture: Picture) {
4
+ return `/photos/raw/${picture._id}/format/${picture.storage.formats[0].width}`;
5
+ }
src/lib/server/db/index.ts CHANGED
@@ -1,9 +1,9 @@
1
  import { MONGODB_URL } from '$env/static/private';
2
  import { MongoClient, type WithSessionCallback } from 'mongodb';
3
- import { createPageCollection } from './page';
4
- import { createPictureCollections } from './picture';
5
- import { createProductCollection } from './product';
6
- import { createUserCollection } from './user';
7
 
8
  const client = new MongoClient(MONGODB_URL, {
9
  directConnection: true
@@ -16,10 +16,10 @@ const db = client.db('bergere');
16
  const pages = createPageCollection(db, client);
17
  const users = createUserCollection(db, client);
18
  const products = createProductCollection(db);
19
- const { pictures, picturesFs } = createPictureCollections(db);
20
 
21
  export { client, db };
22
- export const collections = { products, pictures, pages, users, picturesFs };
23
 
24
  export async function withTransaction(cb: WithSessionCallback) {
25
  await client.withSession((session) => session.withTransaction(cb));
 
1
  import { MONGODB_URL } from '$env/static/private';
2
  import { MongoClient, type WithSessionCallback } from 'mongodb';
3
+ import { createPageCollection } from './page-collection';
4
+ import { createPictureCollections } from './picture-collection';
5
+ import { createProductCollection } from './product-collection';
6
+ import { createUserCollection } from './user-collection';
7
 
8
  const client = new MongoClient(MONGODB_URL, {
9
  directConnection: true
 
16
  const pages = createPageCollection(db, client);
17
  const users = createUserCollection(db, client);
18
  const products = createProductCollection(db);
19
+ const pictures = createPictureCollections(db);
20
 
21
  export { client, db };
22
+ export const collections = { products, pictures, pages, users };
23
 
24
  export async function withTransaction(cb: WithSessionCallback) {
25
  await client.withSession((session) => session.withTransaction(cb));
src/lib/server/db/{page.ts → page-collection.ts} RENAMED
File without changes
src/lib/server/db/picture-collection.ts ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import type { Picture } from '$lib/types/Picture';
2
+ import type { Collection, Db } from 'mongodb';
3
+
4
+ export function createPictureCollections(db: Db): Collection<Picture> {
5
+ return db.collection<Picture>('pictures');
6
+ }
src/lib/server/db/picture.ts DELETED
@@ -1,12 +0,0 @@
1
- import type { PictureFs, Picture } from '$lib/types/Picture';
2
- import type { Collection, Db } from 'mongodb';
3
-
4
- export function createPictureCollections(db: Db): {
5
- pictures: Collection<Picture>;
6
- picturesFs: Collection<PictureFs>;
7
- } {
8
- const coll = db.collection<Picture>('pictures');
9
- const fs = db.collection<PictureFs>('pictures.fs');
10
-
11
- return { pictures: coll, picturesFs: fs };
12
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
src/lib/server/db/{product.ts → product-collection.ts} RENAMED
File without changes
src/lib/server/db/{user.ts → user-collection.ts} RENAMED
File without changes
src/lib/server/photo.ts CHANGED
@@ -3,81 +3,173 @@ import { collections, withTransaction } from '$lib/server/db';
3
  import { generateId } from '$lib/utils/generateId';
4
  import type { ClientSession } from 'mongodb';
5
  import { error } from '@sveltejs/kit';
 
 
 
 
 
6
 
 
 
 
 
 
 
7
  export async function generatePicture(
8
  buffer: Buffer,
9
  name: string,
10
  opts?: { productId?: string; cb?: (session: ClientSession) => Promise<void> }
11
  ): Promise<void> {
12
  const image = sharp(buffer);
13
- const { width, height } = await image.metadata();
14
 
15
  if (!width || !height) {
16
  throw error(400, 'Invalid image: no height or width');
17
  }
18
 
19
- const formats: Array<{ width: number; height: number; data: Buffer }> = [];
 
 
20
 
21
- if (width <= 2048 && height <= 2048) {
22
- formats.push({
23
- width,
24
- height,
25
- data: await image.toFormat('webp').toBuffer()
26
- });
27
  }
28
 
29
- for (const size of [2048, 1024, 512, 256, 128]) {
30
- if (width > size || height > size) {
31
- const buffer = await image
32
- .resize(width > height ? { width: size } : { height: size })
33
- .toFormat('webp')
34
- .toBuffer();
35
- const metadata = await sharp(buffer).metadata();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
 
37
  formats.push({
38
- width: metadata.width!,
39
- height: metadata.height!,
40
- data: buffer
 
41
  });
42
  }
43
- }
44
 
45
- const _id = generateId(name);
 
 
 
 
 
 
 
 
 
 
 
 
46
 
47
- await withTransaction(async (session) => {
48
- await collections.pictures.insertOne(
49
- {
50
- _id,
51
- name,
52
- storage: formats.map((format) => ({
53
- _id: `${_id}-${format.width}x${format.height}`,
54
- width: format.width,
55
- height: format.height,
56
- size: format.data.length
57
- })),
58
- ...(opts?.productId && { productId: opts.productId }),
59
- createdAt: new Date(),
60
- updatedAt: new Date()
61
- },
62
- { session }
63
- );
64
-
65
- await collections.picturesFs.insertMany(
66
- formats.map(
67
- (format) => ({
68
- _id: `${_id}-${format.width}x${format.height}`,
 
 
 
 
 
 
 
 
 
69
  createdAt: new Date(),
70
- updatedAt: new Date(),
71
- size: format.data.length,
72
- data: format.data,
73
- picture: _id
74
- }),
75
  { session }
76
- )
77
- );
78
 
79
- if (opts?.cb) {
80
- await opts.cb(session);
 
 
 
 
 
 
81
  }
82
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  }
 
3
  import { generateId } from '$lib/utils/generateId';
4
  import type { ClientSession } from 'mongodb';
5
  import { error } from '@sveltejs/kit';
6
+ import { s3client } from './s3';
7
+ import { DeleteObjectCommand, PutObjectCommand } from '@aws-sdk/client-s3';
8
+ import { S3_BUCKET } from '$env/static/private';
9
+ import * as mimeTypes from 'mime-types';
10
+ import type { ImageData, Picture } from '$lib/types/Picture';
11
 
12
+ /**
13
+ * Upload picture to S3 under different formats, and create a document in db.pictures.
14
+ *
15
+ * You can associate the picture to a product, and you can pass a callback called at the end that if it fails,
16
+ * will cancel everything (remove from DB and S3)
17
+ */
18
  export async function generatePicture(
19
  buffer: Buffer,
20
  name: string,
21
  opts?: { productId?: string; cb?: (session: ClientSession) => Promise<void> }
22
  ): Promise<void> {
23
  const image = sharp(buffer);
24
+ const { width, height, format } = await image.metadata();
25
 
26
  if (!width || !height) {
27
  throw error(400, 'Invalid image: no height or width');
28
  }
29
 
30
+ if (!format) {
31
+ throw error(400, 'Invalid image format');
32
+ }
33
 
34
+ const mime = mimeTypes.lookup(format);
35
+
36
+ if (!mime) {
37
+ throw error(400, 'Invalid image format: ' + format);
 
 
38
  }
39
 
40
+ const _id = generateId(name);
41
+ const extension = '.' + mimeTypes.extension(mime);
42
+
43
+ const uploadedKeys: string[] = [];
44
+
45
+ const pathPrefix = picturePrefix(opts?.productId);
46
+
47
+ const path = `${pathPrefix}${_id}${extension}`;
48
+
49
+ await s3client.send(
50
+ new PutObjectCommand({
51
+ Bucket: S3_BUCKET,
52
+ Key: path,
53
+ Body: buffer,
54
+ ContentType: mime
55
+ })
56
+ );
57
+ uploadedKeys.push(path);
58
+
59
+ const original = {
60
+ key: path,
61
+ width,
62
+ height,
63
+ size: buffer.length
64
+ };
65
+
66
+ const formats: ImageData[] = [];
67
+
68
+ try {
69
+ if (width <= 2048 && height <= 2048) {
70
+ const key = `${pathPrefix}${_id}-${width}x${height}.webp`;
71
+ const buffer = await image.toFormat('webp').toBuffer();
72
+ await s3client.send(
73
+ new PutObjectCommand({
74
+ Bucket: S3_BUCKET,
75
+ Key: key,
76
+ Body: buffer,
77
+ ContentType: 'image/webp'
78
+ })
79
+ );
80
+
81
+ uploadedKeys.push(key);
82
 
83
  formats.push({
84
+ width,
85
+ height,
86
+ key,
87
+ size: buffer.length
88
  });
89
  }
 
90
 
91
+ for (const size of [2048, 1024, 512, 256, 128]) {
92
+ if (width > size || height > size) {
93
+ const buffer = await image
94
+ .resize(width > height ? { width: size } : { height: size })
95
+ .toFormat('webp')
96
+ .toBuffer();
97
+
98
+ // Is it possible to get the new width and height as an intermediate step of the above call instead?
99
+ const { width: newWidth, height: newHeight } = await sharp(buffer).metadata();
100
+
101
+ if (!newWidth || !newHeight) {
102
+ throw error(500, 'Could not get resized width and height');
103
+ }
104
 
105
+ const key = `${pathPrefix}${_id}-${newWidth}x${newHeight}.webp`;
106
+ await s3client.send(
107
+ new PutObjectCommand({
108
+ Bucket: S3_BUCKET,
109
+ Key: key,
110
+ Body: buffer,
111
+ ContentType: 'image/webp'
112
+ })
113
+ );
114
+
115
+ uploadedKeys.push(key);
116
+
117
+ formats.push({
118
+ width: newWidth,
119
+ height: newHeight,
120
+ key,
121
+ size: buffer.length
122
+ });
123
+ }
124
+ }
125
+
126
+ await withTransaction(async (session) => {
127
+ await collections.pictures.insertOne(
128
+ {
129
+ _id,
130
+ name,
131
+ storage: {
132
+ original,
133
+ formats
134
+ },
135
+ ...(opts?.productId && { productId: opts.productId }),
136
  createdAt: new Date(),
137
+ updatedAt: new Date()
138
+ },
 
 
 
139
  { session }
140
+ );
 
141
 
142
+ if (opts?.cb) {
143
+ await opts.cb(session);
144
+ }
145
+ });
146
+ } catch (err) {
147
+ // Remove uploaded files
148
+ for (const key of uploadedKeys) {
149
+ s3client.send(new DeleteObjectCommand({ Bucket: S3_BUCKET, Key: key })).catch();
150
  }
151
+ throw err;
152
+ }
153
+ }
154
+
155
+ export async function deletePicture(pictureId: Picture['_id']) {
156
+ const res = await collections.pictures.findOneAndDelete({ _id: pictureId });
157
+
158
+ if (!res.value) {
159
+ return;
160
+ }
161
+
162
+ for (const format of res.value.storage.formats) {
163
+ await s3client
164
+ .send(new DeleteObjectCommand({ Bucket: S3_BUCKET, Key: format.key }))
165
+ .catch(console.error);
166
+ }
167
+
168
+ await s3client
169
+ .send(new DeleteObjectCommand({ Bucket: S3_BUCKET, Key: res.value.storage.original.key }))
170
+ .catch(console.error);
171
+ }
172
+
173
+ export function picturePrefix(productId?: string) {
174
+ return productId ? `produits/${productId}/` : `photos/`;
175
  }
src/lib/server/s3.ts ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { S3_KEY, S3_REGION, S3_SECRET, S3_ENDPOINT_URL, S3_BUCKET } from '$env/static/private';
2
+ import * as AWS from '@aws-sdk/client-s3';
3
+
4
+ const s3client = new AWS.S3({
5
+ endpoint: S3_ENDPOINT_URL,
6
+ region: S3_REGION,
7
+ credentials: { accessKeyId: S3_KEY, secretAccessKey: S3_SECRET }
8
+ });
9
+
10
+ await s3client
11
+ .send(
12
+ new AWS.PutBucketCorsCommand({
13
+ Bucket: S3_BUCKET,
14
+ CORSConfiguration: {
15
+ CORSRules: [
16
+ {
17
+ AllowedMethods: ['PUT'],
18
+ // todo: change to production domain
19
+ AllowedOrigins: ['*'],
20
+ AllowedHeaders: ['*'],
21
+ ID: 'CORSRule1'
22
+ }
23
+ ]
24
+ }
25
+ })
26
+ )
27
+ .catch((err) => console.error('S3 CORS error: ', err));
28
+
29
+ export function secureDownloadLink(url: string) {
30
+ if (['127.0.0.1', 'localhost'].includes(new URL(url).hostname)) {
31
+ return url;
32
+ }
33
+
34
+ return url.replace('http:', 'https:');
35
+ }
36
+
37
+ export { s3client };
src/lib/types/Picture.ts CHANGED
@@ -5,17 +5,15 @@ export interface Picture extends Timestamps {
5
  productId?: string;
6
  name: string;
7
 
8
- storage: Array<{
9
- _id: string;
10
- width: number;
11
- height: number;
12
- size: number;
13
- }>;
14
  }
15
 
16
- export interface PictureFs extends Timestamps {
17
- _id: string;
18
- data: Buffer;
 
19
  size: number;
20
- picture: string;
21
  }
 
5
  productId?: string;
6
  name: string;
7
 
8
+ storage: {
9
+ original: ImageData;
10
+ formats: ImageData[];
11
+ };
 
 
12
  }
13
 
14
+ export interface ImageData {
15
+ key: string;
16
+ width: number;
17
+ height: number;
18
  size: number;
 
19
  }
src/routes/+layout.server.ts CHANGED
@@ -1,6 +1,6 @@
1
  import type { LayoutServerLoad } from './$types';
2
  import '$lib/server/db';
3
- import { pages } from '$lib/server/db/page';
4
  import type { Picture } from '$lib/types/Picture';
5
  import { filterNullish } from '$lib/utils/filterNullish';
6
  import { collections } from '$lib/server/db';
 
1
  import type { LayoutServerLoad } from './$types';
2
  import '$lib/server/db';
3
+ import { pages } from '$lib/server/db/page-collection';
4
  import type { Picture } from '$lib/types/Picture';
5
  import { filterNullish } from '$lib/utils/filterNullish';
6
  import { collections } from '$lib/server/db';
src/routes/+layout.svelte CHANGED
@@ -11,7 +11,11 @@
11
  export let data: LayoutData;
12
 
13
  $: shownPicture =
14
- data.pictures.find((p) => p.storage[0].width >= p.storage[0].height) ?? data.pictures[0];
 
 
 
 
15
 
16
  let menuOpen = false;
17
  let date = new Date();
@@ -33,15 +37,16 @@
33
  <meta property="twitter:description" content={description} />
34
  {/if}
35
  <meta property="og:type" content={$page.data.type || 'website'} />
36
- {#if shownPicture}
37
  <meta
38
  property="og:image"
39
- content="{$page.url.protocol}//{$page.url.host}/photos/raw/{shownPicture.storage.slice(-2)[0]
40
- ._id}"
41
  />
42
  <meta
43
  name="twitter:image"
44
- content="{$page.url.protocol}//{$page.url.host}/photos/raw/{shownPicture.storage[0]._id}"
 
45
  />
46
  <meta name="twitter:card" content="summary_large_image" />
47
  {/if}
 
11
  export let data: LayoutData;
12
 
13
  $: shownPicture =
14
+ data.pictures.find((p) => p.storage.formats[0].width >= p.storage.formats[0].height) ??
15
+ data.pictures[0];
16
+
17
+ $: shownPictureFormat =
18
+ shownPicture?.storage.formats.find((f) => f.width <= 1024 && f.height <= 1024) ?? null;
19
 
20
  let menuOpen = false;
21
  let date = new Date();
 
37
  <meta property="twitter:description" content={description} />
38
  {/if}
39
  <meta property="og:type" content={$page.data.type || 'website'} />
40
+ {#if shownPicture && shownPictureFormat}
41
  <meta
42
  property="og:image"
43
+ content="{$page.url.protocol}//{$page.url
44
+ .host}/photos/raw/{shownPicture._id}/format/{shownPictureFormat.width}"
45
  />
46
  <meta
47
  name="twitter:image"
48
+ content="{$page.url.protocol}//{$page.url
49
+ .host}/photos/raw/{shownPicture._id}/format/{shownPictureFormat.width}"
50
  />
51
  <meta name="twitter:card" content="summary_large_image" />
52
  {/if}
src/routes/admin/manipulations/+page.server.ts ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { PutObjectCommand } from '@aws-sdk/client-s3';
2
+ import { collections } from '$lib/server/db';
3
+ import { picturePrefix } from '$lib/server/photo';
4
+ import { s3client } from '$lib/server/s3';
5
+ import { S3_BUCKET } from '$env/static/private';
6
+ import { error } from '@sveltejs/kit';
7
+
8
+ export const actions = {
9
+ migrateImages: async () => {
10
+ for await (const picture of collections.pictures.find({ version: 0 })) {
11
+ console.log('Migrating', picture._id);
12
+ const storage = picture.storage as any as Array<{
13
+ _id: string;
14
+ width: number;
15
+ height: number;
16
+ size: number;
17
+ }>;
18
+
19
+ for (const format of storage) {
20
+ const fs = await collections.picturesFs.findOne({ _id: format._id });
21
+
22
+ if (!fs) {
23
+ console.log('Missing fs for', format._id);
24
+ throw error(500, 'Missing fs for ' + format._id);
25
+ }
26
+
27
+ const path = picturePrefix(picture.productId) + format._id + '.webp';
28
+
29
+ await s3client.send(
30
+ new PutObjectCommand({
31
+ Bucket: S3_BUCKET,
32
+ Key: path,
33
+
34
+ Body: new Uint8Array(fs.data.buffer, 0, fs.data.buffer.byteLength),
35
+ ContentType: 'image/webp'
36
+ })
37
+ );
38
+ }
39
+
40
+ const newStorage = storage.map((format) => ({
41
+ width: format.width,
42
+ height: format.height,
43
+ size: format.size,
44
+ key: picturePrefix(picture.productId) + format._id + '.webp'
45
+ }));
46
+
47
+ await collections.pictures.updateOne(
48
+ {
49
+ _id: picture._id
50
+ },
51
+ {
52
+ $set: {
53
+ storage: {
54
+ original: newStorage[0],
55
+ formats: newStorage
56
+ }
57
+ },
58
+ $unset: {
59
+ version: ''
60
+ }
61
+ }
62
+ );
63
+ }
64
+
65
+ console.log('Done');
66
+ }
67
+ };
src/routes/admin/manipulations/+page.svelte ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ <form action="/admin/manipulations?/migrateImages" method="POST">
2
+ <button class="btn">Migrer les images</button>
3
+ </form>
src/routes/admin/pages/+page.server.ts CHANGED
@@ -1,5 +1,5 @@
1
  import { collections } from '$lib/server/db';
2
- import { pages } from '$lib/server/db/page';
3
  import type { PageServerLoad } from './$types';
4
 
5
  export const load: PageServerLoad = async () => {
 
1
  import { collections } from '$lib/server/db';
2
+ import { pages } from '$lib/server/db/page-collection';
3
  import type { PageServerLoad } from './$types';
4
 
5
  export const load: PageServerLoad = async () => {
src/routes/admin/pages/[id]/+server.ts CHANGED
@@ -1,5 +1,5 @@
1
  import { collections } from '$lib/server/db';
2
- import { pages } from '$lib/server/db/page';
3
  import { error } from '@sveltejs/kit';
4
  import type { RequestHandler } from './$types';
5
 
 
1
  import { collections } from '$lib/server/db';
2
+ import { pages } from '$lib/server/db/page-collection';
3
  import { error } from '@sveltejs/kit';
4
  import type { RequestHandler } from './$types';
5
 
src/routes/admin/photos/nouveau/+page.server.ts CHANGED
@@ -1,18 +1,17 @@
1
  import type { Actions } from './$types';
2
  import busboy from 'busboy';
3
- import { pipeline } from 'node:stream';
4
  import { streamToBuffer } from '$lib/server/utils/streamToBuffer';
5
  import { generatePicture } from '$lib/server/photo';
6
  import { redirect } from '@sveltejs/kit';
7
 
8
  export const actions: Actions = {
9
  default: async (input) => {
10
- let buffer: Buffer;
11
  let name = '';
12
  let productId = '';
13
 
14
  // eslint-disable-next-line no-async-promise-executor
15
- await new Promise<void>(async (resolve, reject) => {
16
  try {
17
  const bb = busboy({
18
  headers: {
@@ -21,8 +20,7 @@ export const actions: Actions = {
21
  });
22
  bb.on('file', async (name, file, info) => {
23
  // const { filename, encoding, mimeType } = info;
24
- buffer = await streamToBuffer(file);
25
- resolve();
26
  });
27
  bb.on('field', (_name, val) => {
28
  if (_name === 'name') {
@@ -32,7 +30,7 @@ export const actions: Actions = {
32
  }
33
  });
34
 
35
- await pipeline(input.request.body as any, bb, () => {});
36
  } catch (err) {
37
  reject(err);
38
  }
 
1
  import type { Actions } from './$types';
2
  import busboy from 'busboy';
3
+ import { pipeline } from 'node:stream/promises';
4
  import { streamToBuffer } from '$lib/server/utils/streamToBuffer';
5
  import { generatePicture } from '$lib/server/photo';
6
  import { redirect } from '@sveltejs/kit';
7
 
8
  export const actions: Actions = {
9
  default: async (input) => {
 
10
  let name = '';
11
  let productId = '';
12
 
13
  // eslint-disable-next-line no-async-promise-executor
14
+ const buffer = await new Promise<Buffer>(async (resolve, reject) => {
15
  try {
16
  const bb = busboy({
17
  headers: {
 
20
  });
21
  bb.on('file', async (name, file, info) => {
22
  // const { filename, encoding, mimeType } = info;
23
+ resolve(await streamToBuffer(file));
 
24
  });
25
  bb.on('field', (_name, val) => {
26
  if (_name === 'name') {
 
30
  }
31
  });
32
 
33
+ await pipeline(input.request.body as any, bb);
34
  } catch (err) {
35
  reject(err);
36
  }
src/routes/photos/raw/[id]/+server.ts DELETED
@@ -1,14 +0,0 @@
1
- import { collections } from '$lib/server/db';
2
- import { error } from '@sveltejs/kit';
3
- import type { RequestHandler } from './$types';
4
-
5
- export const GET: RequestHandler = async ({ params }) => {
6
- const fs = await collections.picturesFs.findOne({ _id: params.id });
7
-
8
- if (!fs) {
9
- throw error(404, 'Image non trouvée');
10
- }
11
- return new Response(new Uint8Array(fs.data.buffer, 0, fs.data.buffer.byteLength), {
12
- headers: { 'Content-Type': 'image/webp', 'Cache-Control': 'max-age=604800' }
13
- });
14
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/routes/photos/raw/[id]/format/[width]/+server.ts ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { error, redirect } from '@sveltejs/kit';
2
+ import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
3
+ import type { RequestHandler } from './$types';
4
+ import { collections } from '$lib/server/db';
5
+ import { s3client, secureDownloadLink } from '$lib/server/s3';
6
+ import { GetObjectCommand } from '@aws-sdk/client-s3';
7
+ import { S3_BUCKET } from '$env/static/private';
8
+
9
+ export const GET: RequestHandler = async ({ params }) => {
10
+ const picture = await collections.pictures.findOne({
11
+ _id: params.id,
12
+ 'storage.formats.width': +params.width
13
+ });
14
+
15
+ if (!picture) {
16
+ throw error(404);
17
+ }
18
+
19
+ const format = picture.storage.formats.find((f) => f.width === +params.width);
20
+
21
+ if (!format) {
22
+ throw error(500, "Impossible de trouver le format d'image demandé");
23
+ }
24
+
25
+ throw redirect(
26
+ 302,
27
+ secureDownloadLink(
28
+ await getSignedUrl(
29
+ s3client,
30
+ new GetObjectCommand({
31
+ Bucket: S3_BUCKET,
32
+ Key: format.key
33
+ }),
34
+ { expiresIn: 24 * 3600 }
35
+ )
36
+ )
37
+ );
38
+ };
src/routes/realisations/+page.svelte CHANGED
@@ -5,6 +5,7 @@
5
  import { typedKeys } from '$lib/utils/typedKeys';
6
  import { marked } from 'marked';
7
  import type { PageData } from './$types';
 
8
 
9
  export let data: PageData;
10
 
@@ -22,30 +23,29 @@
22
  <h1 class="text-4xl text-oxford mt-4">Nos réalisations</h1>
23
 
24
  {#each picKeys as picKey, i}
25
- <article
26
- class="{i % 2
27
- ? 'bg-oxford'
28
- : 'bg-sunray'} text-white text-lg md:h-xl my-16 flex flex-wrap md:flex-no-wrap rounded-3xl overflow-hidden"
29
- >
30
- <div class="grow h-full w-full md:w-3/6 basis-auto md:basis-0" class:md:order-last={i % 2}>
31
- <PictureComponent
32
- picture={pictures.find((p) => p._id === pageData.pictures[picKey])}
33
- sizes="(max-width: 1024px) 50vw, 512px"
34
- class="w-full h-full object-cover"
35
- />
36
- </div>
37
- <div class="grow basis-0 flex flex-col relative justify-center">
38
- <div class="px-4 py-6">
39
- {@html marked(pageData.text[picKey])}
40
- <!-- svelte-ignore security-anchor-rel-noreferrer -->
41
- <a
42
- href="/photos/raw/{pictures.find((p) => p._id === pageData.pictures[picKey]).storage[0]
43
- ._id}"
44
- class="underline"
45
- target="_blank">Photo entière</a
46
- >
47
  </div>
48
- </div>
49
- </article>
50
  {/each}
51
  </Container>
 
5
  import { typedKeys } from '$lib/utils/typedKeys';
6
  import { marked } from 'marked';
7
  import type { PageData } from './$types';
8
+ import { pictureLink } from '$lib/picture';
9
 
10
  export let data: PageData;
11
 
 
23
  <h1 class="text-4xl text-oxford mt-4">Nos réalisations</h1>
24
 
25
  {#each picKeys as picKey, i}
26
+ {@const picture = pictures.find((p) => p._id === pageData.pictures[picKey])}
27
+
28
+ {#if picture}
29
+ <article
30
+ class="{i % 2
31
+ ? 'bg-oxford'
32
+ : 'bg-sunray'} text-white text-lg md:h-xl my-16 flex flex-wrap md:flex-no-wrap rounded-3xl overflow-hidden"
33
+ >
34
+ <div class="grow h-full w-full md:w-3/6 basis-auto md:basis-0" class:md:order-last={i % 2}>
35
+ <PictureComponent
36
+ {picture}
37
+ sizes="(max-width: 1024px) 50vw, 512px"
38
+ class="w-full h-full object-cover"
39
+ />
40
+ </div>
41
+ <div class="grow basis-0 flex flex-col relative justify-center">
42
+ <div class="px-4 py-6">
43
+ {@html marked(pageData.text[picKey] || '')}
44
+ <!-- svelte-ignore security-anchor-rel-noreferrer -->
45
+ <a href={pictureLink(picture)} class="underline" target="_blank">Photo entière</a>
46
+ </div>
 
47
  </div>
48
+ </article>
49
+ {/if}
50
  {/each}
51
  </Container>
src/routes/tissus-et-finitions/+page.svelte CHANGED
@@ -3,6 +3,7 @@
3
  import Picture from '$lib/components/Picture.svelte';
4
  import Masonry from '$lib/components/Masonry.svelte';
5
  import type { PageData } from './$types';
 
6
 
7
  export let data: PageData;
8
 
@@ -13,11 +14,7 @@
13
  <h1 class="text-4xl text-oxford mb-3">Tissus et finitions</h1>
14
  <Masonry>
15
  {#each pictures as picture}
16
- <a
17
- href="/photos/raw/{picture.storage[0]._id}"
18
- class="relative picture-link"
19
- data-title={picture.name}
20
- >
21
  <Picture
22
  sizes="(min-width: 1024px) 33vw, (min-width: 675px) 50vw, 100vw"
23
  {picture}
 
3
  import Picture from '$lib/components/Picture.svelte';
4
  import Masonry from '$lib/components/Masonry.svelte';
5
  import type { PageData } from './$types';
6
+ import { pictureLink } from '$lib/picture';
7
 
8
  export let data: PageData;
9
 
 
14
  <h1 class="text-4xl text-oxford mb-3">Tissus et finitions</h1>
15
  <Masonry>
16
  {#each pictures as picture}
17
+ <a href={pictureLink(picture)} class="relative picture-link" data-title={picture.name}>
 
 
 
 
18
  <Picture
19
  sizes="(min-width: 1024px) 33vw, (min-width: 675px) 50vw, 100vw"
20
  {picture}
src/routes/vente/[id]/+page.svelte CHANGED
@@ -1,6 +1,7 @@
1
  <script lang="ts">
2
  import Container from '$lib/components/Container.svelte';
3
  import Picture from '$lib/components/Picture.svelte';
 
4
  import type { PageData } from './$types';
5
  import { marked } from 'marked';
6
 
@@ -21,7 +22,7 @@
21
  <article class="flex my-8 lg:my-16 flex-wrap lg:flex-nowrap">
22
  <div class="grow lg:basis-0 justify-center items-center flex flex-col">
23
  <!-- svelte-ignore security-anchor-rel-noreferrer -->
24
- <a href="/photos/raw/{product.photos[photoIndex].storage[0]._id}" target="_blank">
25
  <Picture
26
  picture={product.photos[photoIndex]}
27
  sizes="(min-width: 1152px) 576px, (max-width: 1024px) 100vw, 50vw"
 
1
  <script lang="ts">
2
  import Container from '$lib/components/Container.svelte';
3
  import Picture from '$lib/components/Picture.svelte';
4
+ import { pictureLink } from '$lib/picture';
5
  import type { PageData } from './$types';
6
  import { marked } from 'marked';
7
 
 
22
  <article class="flex my-8 lg:my-16 flex-wrap lg:flex-nowrap">
23
  <div class="grow lg:basis-0 justify-center items-center flex flex-col">
24
  <!-- svelte-ignore security-anchor-rel-noreferrer -->
25
+ <a href={pictureLink(product.photos[photoIndex])} target="_blank">
26
  <Picture
27
  picture={product.photos[photoIndex]}
28
  sizes="(min-width: 1152px) 576px, (max-width: 1024px) 100vw, 50vw"