@cedarjs/uploads 8.0.0-canary.3550 → 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.
@@ -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,CAyBf"}
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 : null;
424
- }
425
- if (!claimedType) {
426
- return null;
429
+ return allowed ? { contentType: detected } : { rejected };
427
430
  }
428
- const claimed = canonicalContentType(claimedType);
429
- if (DETECTABLE_CONTENT_TYPES.has(claimed)) {
430
- return null;
431
+ if (!claimed || DETECTABLE_CONTENT_TYPES.has(claimed)) {
432
+ return { rejected };
431
433
  }
432
- return isClaimedContentTypeAllowed(accept, claimed) ? claimed : null;
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;AAiB9D,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;AA+DD;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CA2Rf"}
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"}
@@ -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 { acceptedContentType, detectContentType } from "../detectContentType.js";
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 mimeType = acceptedContentType(
49
- data,
50
- payload.allowedMimeTypes,
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
- `File is ${what}, which is not allowed for upload profile '${payload.profile}'.`
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';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
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.3550",
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.3550",
47
- "@cedarjs/context": "8.0.0-canary.3550",
48
- "@cedarjs/graphql-server": "8.0.0-canary.3550",
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.3550",
59
- "@cedarjs/web": "8.0.0-canary.3550",
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.3550",
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",