filestack-js
Version:
Official JavaScript library for Filestack
520 lines (487 loc) • 10.4 kB
text/typescript
/*
* Copyright (c) 2018 by Filestack.
* Some rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Session } from '../client';
import { Filelink } from './../filelink';
/**
* @private
*/
const toSnakeCase = (original: { [index: string]: any }): { [index: string]: any } => {
let snakeCased: { [index: string]: any } = {};
const keys = Object.keys(original);
for (let i = 0; i < keys.length; i++) {
let newKey = keys[i].split(/(?=[A-Z])/).join('_').toLowerCase();
if (typeof original[keys[i]] === 'object' && !Array.isArray(original[keys[i]])) {
snakeCased[newKey] = toSnakeCase(original[keys[i]]);
} else {
snakeCased[newKey] = original[keys[i]];
}
}
return snakeCased;
};
/**
* Align enum
*/
export enum EAlignOptions {
left = 'left',
right = 'right',
center = 'center',
bottom = 'bottom',
top = 'top',
}
/**
* Align enum with faces option
*/
export enum EAlignFacesOptions {
left = 'left',
right = 'right',
center = 'center',
bottom = 'bottom',
top = 'top',
faces = 'faces',
}
/**
* Fit enum
*/
export enum EFitOptions {
clip = 'clip',
crop = 'crop',
scale = 'scale',
max = 'max',
}
/**
* Blur enum
*/
export enum EBlurMode {
linear = 'linear',
gaussian = 'gaussian',
}
/**
* Shapes enum
*/
export enum EShapeType {
oval = 'oval',
rect = 'rect',
}
/**
* Noise type enum
*/
export enum ENoiseType {
none = 'none',
low = 'low',
medium = 'medium',
high = 'high',
}
/**
* Style type enum
*/
export enum EStyleType {
artwork = 'artwork',
photo = 'photo',
}
/**
* Color space enum
*/
export enum EColorspaceType {
RGB = 'RGB',
CMYK = 'CMYK',
Input = 'Input',
}
/**
* Crop faces options enum
*/
export enum ECropfacesType {
thumb = 'thumb',
crop = 'crop',
fill = 'fill',
}
/**
* SmartCrop mode options enum
*/
export enum ESmartCropMode {
fit = 'fit',
auto = 'auto',
}
export enum EImageWatermarkPosition {
top = 'top',
middle = 'middle',
bottom = 'bottom',
left = 'left',
center = 'center',
right = 'right',
}
/**
* Convert to format
*/
export enum EAudioTypes {
libmp3lame = 'libmp3lame',
libvorbis = 'libvorbis',
libfdk_aac = 'libfdk_aac',
dib_ac3 = 'dib_ac3',
pcm_s16le = 'pcm_s16le',
mp2 = 'mp2',
ac3 = 'ac3',
eac3 = 'eac3',
}
/**
* Convert to format
*/
export enum EVideoTypes {
h264 = 'h264',
h264_hi = 'h264.hi',
webm = 'webm',
'webm-hi' = 'webm.hi',
ogg = 'ogg',
'ogg-hi' = 'ogg.hi',
'hls-variant' = 'hls.variant',
mp3 = 'mp3',
oga = 'oga',
m4a = 'm4a',
aac = 'aac',
hls = 'hls.variant.audio',
}
export enum EUrlscreenshotAgent {
desktop = 'desktop',
mobile = 'mobile',
}
export enum EUrlscreenshotMode {
all = 'all',
window = 'window',
}
export enum EUrlscreenshotOrientation {
portrait = 'portrait',
landscape = 'landscape',
}
/**
* Video storage location
*/
export enum EVideoLocations {
s3 = 's3',
azure = 'azure',
gcs = 'gcs',
rackspace = 'rackspace',
dropbox = 'dropbox',
}
export enum EVideoAccess {
private = 'private',
public = 'public',
}
export enum EVideoAccessMode {
preserve = 'preserve',
constrain = 'constrain',
letterbox = 'letterbox',
pad = 'pad',
crop = 'crop',
}
/**
* @see https://www.filestack.com/docs/image-transformations
*/
export interface TransformOptions {
flip?: boolean;
compress?: boolean;
flop?: boolean;
no_metadata?: boolean;
pjpg?: {
quality: number;
metadata: boolean;
};
smart_crop?: {
mode?: ESmartCropMode
width: number;
height: number;
};
watermark?: {
files: string;
size?: number;
position?: EImageWatermarkPosition | EImageWatermarkPosition[];
};
imagesize?: boolean;
enchance?: boolean;
redeye?: boolean;
monochrome?: boolean;
negative?: boolean;
tags?: boolean;
sfw?: boolean;
store?: {
filename?: string,
location?: string,
path?: string,
container?: string,
region?: string;
access?: string;
base64decode?: boolean;
};
resize?: {
width?: number;
height?: number;
fit?: EFitOptions;
align?: EAlignFacesOptions;
};
crop?: {
dim: [number, number, number, number]
};
rotate?: {
deg: number | string;
color?: string;
background?: string;
};
detect_faces?: {
minsize?: number;
maxsize?: number;
color?: string;
export?: boolean;
} | true;
crop_faces?: {
mode?: ECropfacesType;
width?: number;
height?: number;
faces?: number | string;
buffer?: number;
};
pixelate_faces?: {
faces?: number | string;
minsize?: number;
maxsize?: number;
buffer?: number;
amount?: number;
blur?: number;
type?: EShapeType;
};
blur_faces?: {
faces?: number | string;
minsize?: number;
maxsize?: number;
buffer?: number;
amount?: number;
blur?: number;
type?: EShapeType;
};
rounded_corners?: {
radius?: number;
blur?: number;
background?: string;
} | true;
vignette?: {
amount?: number;
blurmode?: EBlurMode;
background?: string;
};
polaroid?: {
color?: string;
rotate?: number;
background?: string;
} | true;
torn_edges?: {
spread?: [number, number];
background?: string;
} | true;
shadow?: {
blur?: number;
opacity?: number;
vector?: [number, number];
color?: string;
background?: string;
} | true;
circle?: {
background?: string;
} | true;
border?: {
width?: number;
color?: string;
background?: string;
} | true;
sharpen?: {
amount: number;
} | true;
blur?: {
amount: number;
} | true;
blackwhite?: {
threshold: number;
} | true;
sepia?: {
tone: number;
} | true;
pixelate?: {
amount: number;
} | true;
oil_paint?: {
amount: number;
} | true;
modulate?: {
brightness?: number;
hue?: number;
saturation?: number;
} | true;
partial_pixelate?: {
amount?: number;
blur?: number;
type?: EShapeType;
objects?: [[number, number, number, number]];
};
partial_blur?: {
amount: number;
blur?: number;
type?: EShapeType;
objects?: [[number, number, number, number]];
};
collage?: {
margin?: number;
width?: number;
height?: number;
color?: string;
fit?: EFitOptions,
files: [string];
};
upscale?: {
upscale?: boolean;
noise?: ENoiseType;
style?: EStyleType;
} | true;
ascii?: {
background?: string;
foreground?: string;
colored?: boolean;
size?: number;
reverse?: boolean;
} | true;
quality?: {
value: number;
};
security?: {
policy: string;
signature?: string;
};
output?: {
format: string;
colorspace?: string;
strip?: boolean;
quality?: number;
page?: number;
compress?: boolean;
density?: number;
background?: string;
secure?: boolean;
docinfo?: boolean;
pageformat?: string;
pageorientation?: string;
};
cache?: {
cache?: boolean;
expiry: number;
};
// audio/video
video_convert?: {
aspect_mode: EVideoAccessMode;
preset?: EVideoTypes;
force?: boolean;
title?: string;
extname?: string;
filename?: string;
location?: EVideoLocations;
path?: string;
access?: EVideoAccess;
container?: string;
audio_bitrate?: number;
audio_codec?: EAudioTypes;
upscale: boolean;
video_bitrate?: number;
audio_sample_rate?: number;
audio_channels?: number;
clip_length?: string;
clip_offset?: string;
width?: number;
height?: number;
two_pass?: boolean;
fps?: number;
keyframe_interval?: number;
watermark_url?: string;
watermark_top?: number;
watermark_bottom?: number;
watermark_right?: number;
watermark_left?: number;
watermark_width?: number;
watermark_height?: number;
};
urlscreenshot?: {
agent?: EUrlscreenshotAgent;
width?: number;
height?: number;
mode?: EUrlscreenshotMode;
delay?: number;
orientation?: EUrlscreenshotOrientation;
device?: string;
} | true;
pdfinfo?: {
colorinfo?: boolean
} | true;
pdfconvert?: {
pageorientation?: string
pageformat?: string
pages?: (string | number)[]
};
}
/**
* Creates filestack transform url.
* Transform params can be provided in camelCase or snakeCase style
*
* @example
* ```js
* // camelCase
* console.log(transform(session, {
* partialPixelate: {
* objects: [[10, 20, 200, 250], [275, 91, 500, 557]],
* },
* }, 'testfile'));
* ```
* result => https://cdn.filestackcontent.com/partial_pixelate=objects:[[10,20,200,250],[275,91,500,557]]/testfile
*
* ```js
* // snake_case
* console.log(transform(session, {
* partial_pixelate: {
* objects: [[10, 20, 200, 250], [275, 91, 500, 557]],
* },
* }, 'testfile'));
* ```
* result => https://cdn.filestackcontent.com/partial_pixelate=objects:[[10,20,200,250],[275,91,500,557]]/testfile
*
* Client.transform is deprecated. Use Filelink class instead
*
* @private
* @throws Error
* @param options Transformation options
* @param url url, handle or array of elements
*/
export const transform = (session: Session, url: string | string[], options: TransformOptions = {}, b64: boolean = false): string => {
options = toSnakeCase(options);
if (session.policy && session.signature) {
options.security = {
policy: session.policy,
signature: session.signature,
};
}
const filelink = new Filelink(url, session.apikey);
filelink.setCname(session.cname);
filelink.setBase64(b64);
Object.keys(options).forEach((key: keyof TransformOptions) => {
if (typeof options[key] === 'boolean' && !options[key] && key !== 'cache') {
return;
}
filelink.addTask(key, options[key]);
});
return filelink.toString();
};