@cedarjs/uploads 8.0.0-canary.3548 → 8.0.0-canary.3552
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/detectContentType.d.ts +43 -0
- package/dist/detectContentType.d.ts.map +1 -1
- package/dist/detectContentType.js +11 -8
- package/dist/fastify/plugin.d.ts.map +1 -1
- package/dist/fastify/plugin.js +29 -13
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/package.json +7 -7
|
@@ -165,4 +165,47 @@ export declare function isClaimedContentTypeAllowed(accept: string[], claimedTyp
|
|
|
165
165
|
* await storeFile(target, { db, filename, mimeType, data })
|
|
166
166
|
*/
|
|
167
167
|
export declare function acceptedContentType(bytes: Uint8Array, accept: string[], claimedType?: string, options?: DetectContentTypeOptions): string | null;
|
|
168
|
+
/** Why `checkContentType()` refused a file. */
|
|
169
|
+
export interface ContentTypeRejection {
|
|
170
|
+
/**
|
|
171
|
+
* What `detectContentType()` says the bytes are, or `null` when it doesn't
|
|
172
|
+
* recognise them.
|
|
173
|
+
*/
|
|
174
|
+
detected: string | null;
|
|
175
|
+
/**
|
|
176
|
+
* The claimed type, canonical (`image/jpeg` for `image/jpg`), or `null`
|
|
177
|
+
* when none was claimed.
|
|
178
|
+
*/
|
|
179
|
+
claimed: string | null;
|
|
180
|
+
}
|
|
181
|
+
/** The result of `checkContentType()`: the type to record, or why not. */
|
|
182
|
+
export type ContentTypeCheck = {
|
|
183
|
+
contentType: string;
|
|
184
|
+
} | {
|
|
185
|
+
rejected: ContentTypeRejection;
|
|
186
|
+
};
|
|
187
|
+
/**
|
|
188
|
+
* `acceptedContentType()`, saying why a file is refused: the same rules,
|
|
189
|
+
* but returns `{ contentType }` for an accepted file and
|
|
190
|
+
* `{ rejected: { detected, claimed } }` for a refused one, so an error can
|
|
191
|
+
* name both types.
|
|
192
|
+
*
|
|
193
|
+
* The two differing is the case worth explaining. An iPhone photo whose
|
|
194
|
+
* major brand is `hevc` is detected as `image/heic-sequence`, while the
|
|
195
|
+
* browser claims `image/heic`, so a profile that only lists `image/heic`
|
|
196
|
+
* refuses it.
|
|
197
|
+
*
|
|
198
|
+
* @example
|
|
199
|
+
* import { checkContentType } from '@cedarjs/uploads'
|
|
200
|
+
*
|
|
201
|
+
* const result = checkContentType(data, ['image/heic'], 'image/heic')
|
|
202
|
+
*
|
|
203
|
+
* if ('rejected' in result) {
|
|
204
|
+
* const { detected, claimed } = result.rejected
|
|
205
|
+
* throw new Error(`Sent as ${claimed}, but the file is ${detected}`)
|
|
206
|
+
* }
|
|
207
|
+
*
|
|
208
|
+
* await storeFile(target, { db, filename, mimeType: result.contentType, data })
|
|
209
|
+
*/
|
|
210
|
+
export declare function checkContentType(bytes: Uint8Array, accept: string[], claimedType?: string, options?: DetectContentTypeOptions): ContentTypeCheck;
|
|
168
211
|
//# sourceMappingURL=detectContentType.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detectContentType.d.ts","sourceRoot":"","sources":["../src/detectContentType.ts"],"names":[],"mappings":"AAOA;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,OAAO,CAAA;AAE7C;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,8BAA8B,QAAY,CAAA;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,QAAkB,CAAA;AAEtD,MAAM,WAAW,wBAAwB;IACvC;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,UAAU,CAAA;CAClB;AAgBD;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,CA2BvD,CAAA;AA+eF;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,UAAU,GACf;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAUzC;AAoHD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,wBAA6B,GACrC,MAAM,GAAG,IAAI,CAmCf;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EAAE,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAUT;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,MAAM,EAAE,EAChB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,GAAE,wBAA6B,GACrC,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"detectContentType.d.ts","sourceRoot":"","sources":["../src/detectContentType.ts"],"names":[],"mappings":"AAOA;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,OAAO,CAAA;AAE7C;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,8BAA8B,QAAY,CAAA;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,QAAkB,CAAA;AAEtD,MAAM,WAAW,wBAAwB;IACvC;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,UAAU,CAAA;CAClB;AAgBD;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,CA2BvD,CAAA;AA+eF;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,UAAU,GACf;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAUzC;AAoHD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,UAAU,EACjB,OAAO,GAAE,wBAA6B,GACrC,MAAM,GAAG,IAAI,CAmCf;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EAAE,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAUT;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,MAAM,EAAE,EAChB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,GAAE,wBAA6B,GACrC,MAAM,GAAG,IAAI,CAIf;AAED,+CAA+C;AAC/C,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB;;;OAGG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAED,0EAA0E;AAC1E,MAAM,MAAM,gBAAgB,GAC1B;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,oBAAoB,CAAA;CAAE,CAAA;AAE9D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,MAAM,EAAE,EAChB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,GAAE,wBAA6B,GACrC,gBAAgB,CAuBlB"}
|
|
@@ -417,19 +417,21 @@ function isClaimedContentTypeAllowed(accept, claimedType) {
|
|
|
417
417
|
return isExplicitOnlyContentType(claimed) ? isContentTypeListed(accept, claimed) : isMimeTypeAllowed(accept, claimed);
|
|
418
418
|
}
|
|
419
419
|
function acceptedContentType(bytes, accept, claimedType, options = {}) {
|
|
420
|
+
const result = checkContentType(bytes, accept, claimedType, options);
|
|
421
|
+
return "contentType" in result ? result.contentType : null;
|
|
422
|
+
}
|
|
423
|
+
function checkContentType(bytes, accept, claimedType, options = {}) {
|
|
420
424
|
const detected = detectContentType(bytes, options);
|
|
425
|
+
const claimed = claimedType ? canonicalContentType(claimedType) : "";
|
|
426
|
+
const rejected = { detected, claimed: claimed || null };
|
|
421
427
|
if (detected) {
|
|
422
428
|
const allowed = isExplicitOnlyContentType(detected) ? isContentTypeListed(accept, detected) : isMimeTypeAllowed(accept, detected);
|
|
423
|
-
return allowed ? detected :
|
|
424
|
-
}
|
|
425
|
-
if (!claimedType) {
|
|
426
|
-
return null;
|
|
429
|
+
return allowed ? { contentType: detected } : { rejected };
|
|
427
430
|
}
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
return null;
|
|
431
|
+
if (!claimed || DETECTABLE_CONTENT_TYPES.has(claimed)) {
|
|
432
|
+
return { rejected };
|
|
431
433
|
}
|
|
432
|
-
return isClaimedContentTypeAllowed(accept, claimed) ? claimed :
|
|
434
|
+
return isClaimedContentTypeAllowed(accept, claimed) ? { contentType: claimed } : { rejected };
|
|
433
435
|
}
|
|
434
436
|
export {
|
|
435
437
|
DETECTABLE_CONTENT_TYPES,
|
|
@@ -437,6 +439,7 @@ export {
|
|
|
437
439
|
DETECT_CONTENT_TYPE_TAIL_BYTES,
|
|
438
440
|
MAX_ZIP_DIRECTORY_BYTES,
|
|
439
441
|
acceptedContentType,
|
|
442
|
+
checkContentType,
|
|
440
443
|
detectContentType,
|
|
441
444
|
findZipCentralDirectory,
|
|
442
445
|
isClaimedContentTypeAllowed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/fastify/plugin.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAA;AAE5E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/fastify/plugin.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAA;AAE5E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AAsB9D,OAAO,KAAK,EAEV,cAAc,EACd,cAAc,EAEf,MAAM,aAAa,CAAA;AAIpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AA4B1D,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,iCAAiC;IACjC,OAAO,EAAE,cAAc,CAAA;IACvB,EAAE,EAAE,cAAc,CAAA;IAClB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,mBAAmB,CAAA;IAClC;;;OAGG;IACH,SAAS,CAAC,EAAE;QACV,QAAQ,EAAE,MAAM,CAAA;QAChB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;QACnC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;KACrB,CAAA;IACD,6EAA6E;IAC7E,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB;;;;;;;;;;;;;;OAcG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B;AAuGD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CA2Rf"}
|
package/dist/fastify/plugin.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import fastifyMultipart from "@fastify/multipart";
|
|
2
|
+
import { isExplicitOnlyContentType } from "../contentTypes.js";
|
|
2
3
|
import { deleteFile } from "../deleteFile.js";
|
|
3
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
checkContentType,
|
|
6
|
+
DETECTABLE_CONTENT_TYPES
|
|
7
|
+
} from "../detectContentType.js";
|
|
4
8
|
import { UploadError } from "../errors.js";
|
|
5
9
|
import { generateStorageKey, trimTrailingSlashes } from "../keys.js";
|
|
6
10
|
import {
|
|
@@ -44,22 +48,34 @@ function headerValue(req, name) {
|
|
|
44
48
|
function normalizeMimeType(mimeType) {
|
|
45
49
|
return mimeType.split(";")[0].trim().toLowerCase();
|
|
46
50
|
}
|
|
47
|
-
function verifiedContentType(payload, data, claimedType) {
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
claimedType
|
|
52
|
-
);
|
|
53
|
-
if (mimeType) {
|
|
54
|
-
return mimeType;
|
|
51
|
+
function verifiedContentType(payload, data, claimedType, filename) {
|
|
52
|
+
const result = checkContentType(data, payload.allowedMimeTypes, claimedType);
|
|
53
|
+
if ("contentType" in result) {
|
|
54
|
+
return result.contentType;
|
|
55
55
|
}
|
|
56
|
-
const detected = detectContentType(data);
|
|
57
|
-
const what = detected ? `'${detected}'` : `of a type that couldn't be recognised (claimed '${claimedType}')`;
|
|
58
56
|
throw new UploadError(
|
|
59
57
|
"MIME_TYPE_NOT_ALLOWED",
|
|
60
|
-
|
|
58
|
+
describeRejection(result.rejected, filename, payload.profile)
|
|
61
59
|
);
|
|
62
60
|
}
|
|
61
|
+
function describeRejection({ detected, claimed }, filename, profile) {
|
|
62
|
+
const file = filename ? `File '${filename}'` : "File";
|
|
63
|
+
const notAllowed = (type) => isExplicitOnlyContentType(type) ? `which upload profile '${profile}' only accepts when its allowedMimeTypes lists it by name` : `which is not in the allowedMimeTypes of upload profile '${profile}'`;
|
|
64
|
+
if (detected) {
|
|
65
|
+
const fix = `Add '${detected}' to accept it.`;
|
|
66
|
+
if (claimed && claimed !== detected) {
|
|
67
|
+
return `${file} was sent as '${claimed}', but its content is '${detected}', ${notAllowed(detected)}. ${fix}`;
|
|
68
|
+
}
|
|
69
|
+
return `${file} is '${detected}', ${notAllowed(detected)}. ${fix}`;
|
|
70
|
+
}
|
|
71
|
+
if (!claimed) {
|
|
72
|
+
return `${file} was sent without a type, and its content isn't a type that could be recognised.`;
|
|
73
|
+
}
|
|
74
|
+
if (DETECTABLE_CONTENT_TYPES.has(claimed)) {
|
|
75
|
+
return `${file} was sent as '${claimed}', but its content isn't '${claimed}' or any other type that could be recognised.`;
|
|
76
|
+
}
|
|
77
|
+
return `${file} was sent as '${claimed}', ${notAllowed(claimed)}.`;
|
|
78
|
+
}
|
|
63
79
|
function contentDispositionHeader(disposition, filename) {
|
|
64
80
|
const ascii = filename.replace(/[^\x20-\x7e]/g, "_").replace(/["\\]/g, "_");
|
|
65
81
|
const encoded = encodeURIComponent(filename);
|
|
@@ -157,7 +173,7 @@ async function cedarUploadsPlugin(fastify, options) {
|
|
|
157
173
|
throw e;
|
|
158
174
|
}
|
|
159
175
|
const size = BigInt(data.byteLength);
|
|
160
|
-
const mimeType = verifyContentType ? verifiedContentType(payload, data, part.mimetype) : part.mimetype;
|
|
176
|
+
const mimeType = verifyContentType ? verifiedContentType(payload, data, part.mimetype, part.filename) : part.mimetype;
|
|
161
177
|
assertTokenAllowsFile(payload, { contentType: mimeType, size });
|
|
162
178
|
const storageKey = generateStorageKey(mimeType);
|
|
163
179
|
const upload = await createPendingUpload({
|
package/dist/index.d.ts
CHANGED
|
@@ -4,8 +4,8 @@ export type { UploadErrorCode } from './errors.js';
|
|
|
4
4
|
export { defineStorageTargets, resolveTarget } from './targets.js';
|
|
5
5
|
export { DB_MAX_FILE_SIZE, DEFAULT_UPLOAD_TOKEN_EXPIRES_IN, defineUploadProfiles, isMimeTypeAllowed, resolveProfile, } from './profiles.js';
|
|
6
6
|
export type { ResolvedUploadProfile, UploadProfile, UploadProfiles, } from './profiles.js';
|
|
7
|
-
export { acceptedContentType, DETECT_CONTENT_TYPE_BYTES, DETECT_CONTENT_TYPE_TAIL_BYTES, DETECTABLE_CONTENT_TYPES, detectContentType, findZipCentralDirectory, isClaimedContentTypeAllowed, MAX_ZIP_DIRECTORY_BYTES, } from './detectContentType.js';
|
|
8
|
-
export type { DetectContentTypeOptions } from './detectContentType.js';
|
|
7
|
+
export { acceptedContentType, checkContentType, DETECT_CONTENT_TYPE_BYTES, DETECT_CONTENT_TYPE_TAIL_BYTES, DETECTABLE_CONTENT_TYPES, detectContentType, findZipCentralDirectory, isClaimedContentTypeAllowed, MAX_ZIP_DIRECTORY_BYTES, } from './detectContentType.js';
|
|
8
|
+
export type { ContentTypeCheck, ContentTypeRejection, DetectContentTypeOptions, } from './detectContentType.js';
|
|
9
9
|
export { canonicalContentType, CONTENT_TYPE_ALIASES, isExplicitOnlyContentType, isScriptableContentType, MACRO_CONTENT_TYPES, SCRIPTABLE_CONTENT_TYPES, } from './contentTypes.js';
|
|
10
10
|
export { createFsProvider } from './providers/fs.js';
|
|
11
11
|
export type { FsProviderOptions } from './providers/fs.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,EACL,gBAAgB,EAChB,+BAA+B,EAC/B,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,GACf,MAAM,eAAe,CAAA;AACtB,YAAY,EACV,qBAAqB,EACrB,aAAa,EACb,cAAc,GACf,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,8BAA8B,EAC9B,wBAAwB,EACxB,iBAAiB,EACjB,uBAAuB,EACvB,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,wBAAwB,CAAA;AAC/B,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
} from "./profiles.js";
|
|
11
11
|
import {
|
|
12
12
|
acceptedContentType,
|
|
13
|
+
checkContentType,
|
|
13
14
|
DETECT_CONTENT_TYPE_BYTES,
|
|
14
15
|
DETECT_CONTENT_TYPE_TAIL_BYTES,
|
|
15
16
|
DETECTABLE_CONTENT_TYPES,
|
|
@@ -82,6 +83,7 @@ export {
|
|
|
82
83
|
acceptedContentType,
|
|
83
84
|
canonicalContentType,
|
|
84
85
|
cedarUploadsPlugin,
|
|
86
|
+
checkContentType,
|
|
85
87
|
cleanupStaleUploads,
|
|
86
88
|
confirmUpload,
|
|
87
89
|
createDbProvider,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cedarjs/uploads",
|
|
3
|
-
"version": "8.0.0-canary.
|
|
3
|
+
"version": "8.0.0-canary.3552",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/cedarjs/cedar.git",
|
|
@@ -43,9 +43,9 @@
|
|
|
43
43
|
"test:watch": "vitest watch"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@cedarjs/api": "8.0.0-canary.
|
|
47
|
-
"@cedarjs/context": "8.0.0-canary.
|
|
48
|
-
"@cedarjs/graphql-server": "8.0.0-canary.
|
|
46
|
+
"@cedarjs/api": "8.0.0-canary.3552",
|
|
47
|
+
"@cedarjs/context": "8.0.0-canary.3552",
|
|
48
|
+
"@cedarjs/graphql-server": "8.0.0-canary.3552",
|
|
49
49
|
"@fastify/multipart": "9.4.0",
|
|
50
50
|
"graphql": "16.14.2",
|
|
51
51
|
"mime-types": "2.1.35"
|
|
@@ -55,8 +55,8 @@
|
|
|
55
55
|
"@arethetypeswrong/cli": "0.18.5",
|
|
56
56
|
"@aws-sdk/client-s3": "3.1156.0",
|
|
57
57
|
"@aws-sdk/s3-request-presigner": "3.1156.0",
|
|
58
|
-
"@cedarjs/framework-tools": "8.0.0-canary.
|
|
59
|
-
"@cedarjs/web": "8.0.0-canary.
|
|
58
|
+
"@cedarjs/framework-tools": "8.0.0-canary.3552",
|
|
59
|
+
"@cedarjs/web": "8.0.0-canary.3552",
|
|
60
60
|
"@prisma/adapter-better-sqlite3": "7.10.1",
|
|
61
61
|
"@prisma/client": "7.10.1",
|
|
62
62
|
"@testing-library/dom": "10.4.2",
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
"@apollo/client": "4.3.5",
|
|
91
91
|
"@aws-sdk/client-s3": "^3.0.0",
|
|
92
92
|
"@aws-sdk/s3-request-presigner": "^3.0.0",
|
|
93
|
-
"@cedarjs/web": "8.0.0-canary.
|
|
93
|
+
"@cedarjs/web": "8.0.0-canary.3552",
|
|
94
94
|
"@uppy/aws-s3": "^6.0.0",
|
|
95
95
|
"@uppy/core": "^6.0.0",
|
|
96
96
|
"@uppy/dashboard": "^6.0.0",
|