Utility functions for customizing file detection and FormData handling in apollo-upload-client. These functions are used internally by UploadHttpLink but can be imported directly for custom implementations.
Default implementation for appending files to FormData instances using the standard FormData.append method.
/**
* The default implementation for the class UploadHttpLink constructor option
* formDataAppendFile that uses the standard FormData.append method.
* @param {FormData} formData - Form data to append the specified file to.
* @param {string} fieldName - Field name for the file.
* @param {ExtractableFile} file - File to append. Can be File, Blob, or FileList.
* @returns {void}
*/
export default function formDataAppendFile(
formData: FormData,
fieldName: string,
file: ExtractableFile
): void;Usage Examples:
import formDataAppendFile from "apollo-upload-client/formDataAppendFile.mjs";
// Basic usage
const formData = new FormData();
const file = new File(["content"], "example.txt", { type: "text/plain" });
formDataAppendFile(formData, "file", file);
// Custom implementation example
const customFormDataAppendFile = (formData, fieldName, file) => {
if ("name" in file && file.name) {
// Use filename for files that have names
formData.append(fieldName, file, file.name);
} else {
// Generate filename for files without names (like Blobs)
const extension = file.type ? file.type.split('/')[1] : 'bin';
const filename = `upload_${Date.now()}.${extension}`;
formData.append(fieldName, file, filename);
}
};
// Use custom implementation with UploadHttpLink
import UploadHttpLink from "apollo-upload-client/UploadHttpLink.mjs";
const link = new UploadHttpLink({
formDataAppendFile: customFormDataAppendFile,
});Function that determines whether a value is an extractable file. Re-exported from the extract-files package.
/**
* Checks if a value is an extractable file.
* Re-exported from the extract-files package.
* @param {unknown} value - Value to check.
* @returns {value is ExtractableFile} Is the value an extractable file (FileList, File, or Blob).
*/
export default function isExtractableFile(value: unknown): value is ExtractableFile;Usage Examples:
import isExtractableFile from "apollo-upload-client/isExtractableFile.mjs";
// Check various file types
const file = new File(["content"], "test.txt");
const blob = new Blob(["content"], { type: "text/plain" });
const fileList = document.querySelector('input[type="file"]').files;
const regularObject = { name: "not-a-file" };
console.log(isExtractableFile(file)); // true
console.log(isExtractableFile(blob)); // true
console.log(isExtractableFile(fileList)); // true
console.log(isExtractableFile(regularObject)); // false
// Create enhanced file matcher
const isExtractableFileEnhanced = (value) =>
isExtractableFile(value) ||
(typeof CustomFile !== "undefined" && value instanceof CustomFile);
// Use custom matcher with UploadHttpLink
import UploadHttpLink from "apollo-upload-client/UploadHttpLink.mjs";
const link = new UploadHttpLink({
isExtractableFile: isExtractableFileEnhanced,
});For applications that need to support custom file types beyond the default FileList, File, and Blob types:
import isExtractableFile from "apollo-upload-client/isExtractableFile.mjs";
import UploadHttpLink from "apollo-upload-client/UploadHttpLink.mjs";
// Support additional file types
class CustomFile {
constructor(data, filename) {
this.data = data;
this.filename = filename;
}
}
const customIsExtractableFile = (value) => {
// Check default types first
if (isExtractableFile(value)) return true;
// Check custom types
if (value instanceof CustomFile) return true;
// Check for file-like objects
if (value && typeof value === 'object' && 'data' in value && 'filename' in value) {
return true;
}
return false;
};
// Custom FormData appender for custom file types
const customFormDataAppendFile = (formData, fieldName, file) => {
if (file instanceof CustomFile) {
formData.append(fieldName, file.data, file.filename);
} else if (isExtractableFile(file)) {
// Use default behavior for standard file types
if ("name" in file) {
formData.append(fieldName, file, file.name);
} else {
formData.append(fieldName, file);
}
} else {
// Handle other custom file-like objects
const data = file.data || file;
const name = file.filename || file.name || 'upload';
formData.append(fieldName, data, name);
}
};
const link = new UploadHttpLink({
isExtractableFile: customIsExtractableFile,
formDataAppendFile: customFormDataAppendFile,
});The default formDataAppendFile function handles different file types:
FormData.append(fieldName, file, file.name) to preserve the original filenameFormData.append(fieldName, file) which results in a default filenameThe default isExtractableFile function recognizes these types as extractable:
<input type="file" multiple> elementsThe isExtractableFile function is re-exported from the extract-files package, which handles the deep traversal of GraphQL variables to find and extract file objects. The extraction process: