Configuration
The only supported ways to define configuration are javascript or typescript files (transpiled through ts-node).
Reference
collections
- Type:
Record<string, AssetDescriptor | AssetDescriptorObject>
- Required: Yes
Defines collections of assets along with configuration for them like storage, requirements, processors and other options.
Asset descriptor can be defined as object
import {Configuration} from '@farbor/server';
export const config: Configuration = {
collections: {
image: {
requirements: [
new RequirementFileSize({start: 1_000_000})
]
}
}
}
or as an instance of AssetDescriptorBuilder
class
import {AssetDescriptorBuilder, RequirementFileSize, Configuration} from '@farbor/server';
export const config: Configuration = {
collections: {
image: new AssetDescriptorBuilder()
.addRequirement(
new RequirementFileSize({start: 1_000_000})
)
}
}
Using AssetDescriptorBuilder
class is recommended for more complex configurations with conditions
as it allows using method chaining through conditional builder pattern.
import {AssetDescriptor} from '@farbor/server';
import {isProduction} from '@pallad/app-env';
export const config: Configuration = {
collections: {
image: new AssetDescriptor()
.runIf(isProduction, (descriptor) => { // add filesize requirement only for production
descriptor.addRequirement(new RequirementFileSize({
start: 1_000_000
}))
})
}
}
In both scenarios, if any of parameters is not defined at asset descriptor level then it is taken from collectionsDefaults
.
collectionsDefaults
Defines default attributes for asset descriptors defined in collections
.
If any of the attributes is not defined at asset descriptor level then it is taken from here.
collections.*.storage
, collectionsDefaults.storage
- Type:
AssetStorage
- Required: No / Yes (for asset descriptor) if default is not provided
- Default: none
Defines storage for assets.
In case of collectionDefaults.storage
provided storage is not used directly but each asset descriptor receives a copy of it
(created through createNewStorageForCollection
).
collections.*.processedStorage
, collectionsDefaults.processedStorage
- Type:
ProcessedAssetStorage
- Required: No / Yes (for asset descriptor) if default is not provided
- Default: none
Defines storage for processed assets in collection.
In case of collectionDefaults.processedStorage
provided storage is not used directly but each collection asset descriptor receives a copy of it
(created through createNewStorageForCollection
).
collections.*.requirements
, collectionsDefaults.requirements
- Type:
Array<Requirement>
- Required: No
- Default:
[]
List of requirements that assets in collection must meet upon saving.
collections.*.visibilityOptions
, collectionsDefaults.visibilityOptions
- Type:
Visibility | {fallback: Visibility, allowed: Visibility[]}
- Required: No
- Default
{fallback: 'public', allowed: ['public', 'private']}
Where type Visibility = 'public' | 'private'
Possible visibility for assets in collection.
fallback
- default visibility applied to uploaded file if not explicitly setallowed
- list of allowed visibilities for assets in collection
You can just provide visibility as a string which translates to:
private
={fallback: 'private', allowed: ['private']}
public
={fallback: 'public', allowed: ['public']}
Available presets:
AssetVisibilityOptionsPreset.PRIVATE_ONLY
-{fallback: 'private', allowed: ['private']}
AssetVisibilityOptionsPreset.PUBLIC_ONLY
-{fallback: 'public', allowed: ['public']}
AssetVisibilityOptionsPreset.PRIVATE_DEFAULT
-{fallback: 'private', allowed: ['public', 'private']}
AssetVisibilityOptionsPreset.PUBLIC_DEFAULT
-{fallback: 'public', allowed: ['public', 'private']}
collections.*.preProcessDescriptors
, collectionsDefaults.preProcessDescriptors
- Type:
Array<PreProcessDescriptor>
- Required: No
- Default:
collectionsDefaults.preProcessDescriptors
List of processor descriptors applied to assets before saving.
secretKeyStorage
- Type:
Record<string, Buffer | Secret<Buffer>> | SecretKeyStorage
- Required: No
- Default: StaticSecretKeyStorage.fromEnvironmentVariables
Defines storage for secret keys used for signing and verifying tokens.
Example configuration
import path from "node:path";
import {
RequirementImageDimension,
RequirementImageAspectRatio,
processor as processorSharp,
} from "@farbor/processor-sharp";
import {
AssetExtension,
Configuration,
RequirementFileSize,
RequirementMimeType,
} from "@farbor/server";
import { AssetStorage, ProcessedAssetStorage } from "@farbor/storage-filesystem";
// eslint-disable-next-line import/no-default-export
const config: Configuration = {
collections: {
image: {
requirements: [
// allow only images
RequirementMimeType.images(),
// image need to be at least 100x100
new RequirementImageDimension({
width: { start: 100 },
height: { start: 100 },
}),
// max file size 100MB
new RequirementFileSize({
end: 104_857_600,
}),
],
},
avatar: {
requirements: [
// allow only images
RequirementMimeType.images(),
// avatar must be square of exact size (this is stupid but just for demo purposes)
new RequirementImageDimension({
width: 800,
height: 800,
}),
// aspect ratio of image 1:1
new RequirementImageAspectRatio([1, 1]),
],
},
icon: {
requirements: [
// only SVG files
new RequirementMimeType([AssetExtension.Preset.SVG]),
// dimensions of at least 32x32
new RequirementImageDimension({
width: { start: 32 },
height: { start: 32 },
}),
],
},
document: {
// accept only documents
requirements: [new RequirementMimeType([AssetExtension.Preset.PDF])],
},
report: {
// accept only csv files
requirements: [new RequirementMimeType([AssetExtension.Preset.CSV])],
// all of the files can only be private
visibilityOptions: "private",
},
},
collectionsDefaults: {
// all assets are stored under `storage` directory (and subdirectory for each collection)
storage: AssetStorage.fromUncheckedRootDirectory(path.join(__dirname, "../storage")),
// all processed assets are stored under `processed-storage` directory (and subdirectory for each collection)
processedStorage: ProcessedAssetStorage.fromUncheckedRootDirectory(
path.join(__dirname, "../processed-storage")
),
// default processors available for all collections
processors: [processorSharp],
},
};
export default config;