filestack-js
Version:
Official JavaScript library for Filestack
1,155 lines (1,154 loc) • 103 kB
JavaScript
/*
* 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 { config } from './../config';
import { TransformSchema } from './../schema/transforms.schema';
import { getValidator } from './../schema/validator';
import { resolveHost, b64 } from './utils';
import { FilestackError, FilestackErrorType } from './../filestack_error';
import Debug from 'debug';
var debug = Debug('fs:filelink');
export var Align;
(function (Align) {
Align["left"] = "left";
Align["right"] = "right";
Align["center"] = "center";
Align["bottom"] = "bottom";
Align["top"] = "top";
Align["faces"] = "faces";
Align["middle"] = "middle";
})(Align || (Align = {}));
/**
* Fit enum
*/
export var FitOptions;
(function (FitOptions) {
FitOptions["clip"] = "clip";
FitOptions["crop"] = "crop";
FitOptions["scale"] = "scale";
FitOptions["max"] = "max";
})(FitOptions || (FitOptions = {}));
/**
* Blur enum
*/
export var BlurMode;
(function (BlurMode) {
BlurMode["linear"] = "linear";
BlurMode["gaussian"] = "gaussian";
})(BlurMode || (BlurMode = {}));
/**
* Shapes enum
*/
export var ShapeType;
(function (ShapeType) {
ShapeType["oval"] = "oval";
ShapeType["rect"] = "rect";
})(ShapeType || (ShapeType = {}));
/**
* Noise type enum
*/
export var NoiseType;
(function (NoiseType) {
NoiseType["none"] = "none";
NoiseType["low"] = "low";
NoiseType["medium"] = "medium";
NoiseType["high"] = "high";
})(NoiseType || (NoiseType = {}));
/**
* Style type enum
*/
export var StyleType;
(function (StyleType) {
StyleType["artwork"] = "artwork";
StyleType["photo"] = "photo";
})(StyleType || (StyleType = {}));
/**
* Color space enum
*/
export var ColorspaceType;
(function (ColorspaceType) {
ColorspaceType["RGB"] = "RGB";
ColorspaceType["CMYK"] = "CMYK";
ColorspaceType["Input"] = "Input";
})(ColorspaceType || (ColorspaceType = {}));
/**
* Crop faces options enum
*/
export var CropfacesType;
(function (CropfacesType) {
CropfacesType["thumb"] = "thumb";
CropfacesType["crop"] = "crop";
CropfacesType["fill"] = "fill";
})(CropfacesType || (CropfacesType = {}));
/**
* Watermark postion options enum
*/
export var ImageWatermarkPosition;
(function (ImageWatermarkPosition) {
ImageWatermarkPosition["top"] = "top";
ImageWatermarkPosition["middle"] = "middle";
ImageWatermarkPosition["bottom"] = "bottom";
ImageWatermarkPosition["left"] = "left";
ImageWatermarkPosition["center"] = "center";
ImageWatermarkPosition["right"] = "right";
})(ImageWatermarkPosition || (ImageWatermarkPosition = {}));
/**
* SmartCrop options enum
*/
export var SmartCropMode;
(function (SmartCropMode) {
SmartCropMode["face"] = "face";
SmartCropMode["auto"] = "auto";
})(SmartCropMode || (SmartCropMode = {}));
/**
* Convert to format
*/
export var AudioTypes;
(function (AudioTypes) {
AudioTypes["libmp3lame"] = "libmp3lame";
AudioTypes["libvorbis"] = "libvorbis";
AudioTypes["libfdk_aac"] = "libfdk_aac";
AudioTypes["dib_ac3"] = "dib_ac3";
AudioTypes["pcm_s16le"] = "pcm_s16le";
AudioTypes["mp2"] = "mp2";
AudioTypes["ac3"] = "ac3";
AudioTypes["eac3"] = "eac3";
})(AudioTypes || (AudioTypes = {}));
/**
* Convert to format
*/
export var VideoTypes;
(function (VideoTypes) {
VideoTypes["h264"] = "h264";
VideoTypes["h264_hi"] = "h264.hi";
VideoTypes["webm"] = "webm";
VideoTypes["webm-hi"] = "webm.hi";
VideoTypes["ogg"] = "ogg";
VideoTypes["ogg-hi"] = "ogg.hi";
VideoTypes["hls-variant"] = "hls.variant";
VideoTypes["mp3"] = "mp3";
VideoTypes["oga"] = "oga";
VideoTypes["m4a"] = "m4a";
VideoTypes["aac"] = "aac";
VideoTypes["hls"] = "hls.variant.audio";
})(VideoTypes || (VideoTypes = {}));
export var URLScreenshotAgent;
(function (URLScreenshotAgent) {
URLScreenshotAgent["desktop"] = "desktop";
URLScreenshotAgent["mobile"] = "mobile";
})(URLScreenshotAgent || (URLScreenshotAgent = {}));
export var URLScreenshotMode;
(function (URLScreenshotMode) {
URLScreenshotMode["all"] = "all";
URLScreenshotMode["window"] = "window";
})(URLScreenshotMode || (URLScreenshotMode = {}));
export var URLScreenshotOrientation;
(function (URLScreenshotOrientation) {
URLScreenshotOrientation["portrait"] = "portrait";
URLScreenshotOrientation["landscape"] = "landscape";
})(URLScreenshotOrientation || (URLScreenshotOrientation = {}));
/**
* Video storage location
*/
export var Locations;
(function (Locations) {
Locations["s3"] = "s3";
Locations["azure"] = "azure";
Locations["gcs"] = "gcs";
Locations["rackspace"] = "rackspace";
Locations["dropbox"] = "dropbox";
})(Locations || (Locations = {}));
export var VideoAccess;
(function (VideoAccess) {
VideoAccess["private"] = "private";
VideoAccess["public"] = "public";
})(VideoAccess || (VideoAccess = {}));
export var VideoAccessMode;
(function (VideoAccessMode) {
VideoAccessMode["preserve"] = "preserve";
VideoAccessMode["constrain"] = "constrain";
VideoAccessMode["letterbox"] = "letterbox";
VideoAccessMode["pad"] = "pad";
VideoAccessMode["crop"] = "crop";
})(VideoAccessMode || (VideoAccessMode = {}));
export var EnhancePreset;
(function (EnhancePreset) {
EnhancePreset["auto"] = "auto";
EnhancePreset["vivid"] = "vivid";
EnhancePreset["beautify"] = "beautify";
EnhancePreset["beautifyPlus"] = "beautify_plus";
EnhancePreset["fixDark"] = "fix_dark";
EnhancePreset["fixNoise"] = "fix_noise";
EnhancePreset["fixTint"] = "fix_tint";
EnhancePreset["outdor"] = "outdoor";
EnhancePreset["fireworks"] = "fireworks";
})(EnhancePreset || (EnhancePreset = {}));
var handleRegexp = /^[\w\-]{20}|wf:\/\/[\w\-\/]{106}$/;
/**
* Class for handling filelinks. For now its supports all filestack transforms.
* It outputs transform url or array of transforms
* @example
* const link = new Filelink('handle or externalUrl', 'apikey');
* link.flip().flop().store();
*
* console.log(link.toString());
* // enable base64 support
* link.setBase64(true)
*
* console.log(link.toString());
*
* @export
* @class Filelink
*/
var Filelink = /** @class */ (function () {
/**
* Class for generating tranformation urls
* @param {(string | string[])} source - handle or multiple handles (i.e. for collage)
* @param {string} [apikey] - your apikey - required for all external sources
*
* @memberof Filelink
*/
function Filelink(source, apikey) {
/**
* Applied transforms array
*
* @private
* @memberof Filelink
*/
this.transforms = [];
/**
* Is base64 support is enabled
*
* @private
* @type {boolean}
* @memberof Filelink
*/
this.b64 = false;
/**
* should use a validator to check params of every task
* @private
* @type {boolean}
* @memberof Filelink
*/
this.useValidator = true;
/**
* Converts array of objects to object
*
* @private
* @example [{name: 'resize', params: {height: 125}}] => {resize: {height: 125}}
* @param arr - any array
*/
this.arrayToObject = function (array, nameKey, dataKey) {
if (array === void 0) { array = []; }
return array.reduce(function (obj, item) {
obj[item[nameKey]] = item[dataKey];
return obj;
}, {});
};
this.apikey = apikey;
this.setSource(source);
}
/**
* Enable new base64 link support to avoid problems with special chars in link
*
* @param {boolean} flag
* @returns
* @memberof Filelink
*/
Filelink.prototype.setBase64 = function (flag) {
this.b64 = flag;
return this;
};
/**
* Switch the useValidator flag
*
* @param {boolean} flag
* @returns
* @memberof Filelink
*/
Filelink.prototype.setUseValidator = function (flag) {
this.useValidator = flag;
return this;
};
/**
* Set cname for transformation link
*
* @param {string} cname
* @returns
* @memberof Filelink
*/
Filelink.prototype.setCname = function (cname) {
this.cname = cname;
return this;
};
/**
* Set custom domain. Used for test purpose. It will be removed when after client.transform
*
* @param {string} domain
* @returns
* @memberof Filelink
*/
Filelink.prototype.setCustomDomain = function (domain) {
this.customDomain = domain;
return this;
};
Filelink.prototype.setSource = function (source) {
this.source = source;
var isExternal = this.isSourceExternal();
debug("Source ".concat(source, " - isExternal? ").concat(isExternal));
if (isExternal && !this.apikey) {
throw new FilestackError('External sources requires apikey to handle transforms');
}
if (!isExternal && typeof this.source === 'string' && !handleRegexp.test(this.source) && this.source.indexOf('filestackcontent') === -1) {
throw new FilestackError('Invalid filestack source provided');
}
};
/**
* Returns JSONSchema form transformations params
*
* @returns
* @memberof Filelink
*/
Filelink.prototype.getValidationSchema = function () {
return TransformSchema;
};
/**
* Returns transformations in JSON format
*
* @returns
* @memberof Filelink
*/
Filelink.prototype.getTransformations = function () {
if (this.useValidator) {
this.validateTasks(this.transforms);
}
return this.transforms;
};
/**
* Returns transform url
*
* @returns
* @memberof Filelink
*/
Filelink.prototype.toString = function () {
var returnUrl = [];
returnUrl.push(this.getCdnHost());
if (this.useValidator) {
this.validateTasks(this.transforms);
}
if (this.apikey) {
returnUrl.push(this.apikey);
}
var transformsString = this.generateTransformString();
var source = this.source;
if (this.b64) {
if (this.transforms.length > 0) {
transformsString = "b64/".concat(b64(JSON.stringify(this.transforms), true));
}
if (Array.isArray(source)) {
source = this.arrayToString(source);
}
source = "b64://".concat(b64(source, true));
}
else {
if (Array.isArray(source)) {
source = this.arrayToString(source);
}
else {
source = this.escapeValue(source);
}
}
if (transformsString.length) {
returnUrl.push(transformsString);
}
returnUrl.push(source);
return returnUrl.join('/');
};
/**
* Add task and validate
*
* @param {string} name
* @param {*} [params]
* @returns
* @memberof Filelink
*/
Filelink.prototype.addTask = function (name, params) {
Debug("Add task ".concat(name, " with params %O"), params);
if (name !== 'cache' && typeof params === 'boolean') {
if (!params) {
return this;
}
else {
params = undefined;
}
}
else if (typeof params === 'object' && !Object.keys(params).length) {
params = undefined;
}
this.transforms.push({ name: name, params: params });
return this;
};
/**
* Returns all tasks added for transformation
*
* @memberof Filelink
*/
Filelink.prototype.getTasks = function () {
return this.transforms;
};
/**
* Cleanup transformations on filelink
*
* @returns
* @memberof Filelink
*/
Filelink.prototype.reset = function () {
this.transforms = [];
return this;
};
/**
* Transformations part
*/
/**
* Add autoimage transformation
*
* @see https://www.filestack.com/docs/api/processing/#auto-image-conversion
* @returns this
* @memberof Filelink
*/
Filelink.prototype.autoImage = function () {
return this.addTask('auto_image', true);
};
/**
* Adds flip transformation
*
* @see https://www.filestack.com/docs/api/processing/#flip
* @returns this
* @memberof Filelink
*/
Filelink.prototype.flip = function () {
return this.addTask('flip', true);
};
/**
* Adds flop transformation
*
* @see https://www.filestack.com/docs/api/processing/#flop
* @returns this
* @memberof Filelink
*/
Filelink.prototype.flop = function () {
return this.addTask('flop', true);
};
/**
* Adds imagesize transformation
*
* @see https://www.filestack.com/docs/api/processing/#image-size
* @returns this
* @memberof Filelink
*/
Filelink.prototype.imagesize = function () {
return this.addTask('imagesize', true);
};
/**
* Adds noMetadata transformation
*
* @see https://www.filestack.com/docs/api/processing/#strip-metadata
* @returns this
* @memberof Filelink
*/
Filelink.prototype.noMetadata = function () {
return this.addTask('no_metadata', true);
};
/**
* Adds Progressive JPEG transformation
*
* @see https://www.filestack.com/docs/api/processing/#progressive-jpeg
* @returns this
* @memberof Filelink
*/
Filelink.prototype.pjpg = function (params) {
return this.addTask('pjpg', params);
};
/**
* Adds imagesize transformation
*
* @see https://www.filestack.com/docs/api/processing/#smart-crop
* @returns this
* @memberof Filelink
*/
Filelink.prototype.smartCrop = function (params) {
return this.addTask('smart_crop', params);
};
/**
* Adds watermart transformation
*
* @see https://www.filestack.com/docs/api/processing/#watermark
* @returns this
* @memberof Filelink
*/
Filelink.prototype.watermark = function (params) {
return this.addTask('watermark', params);
};
/**
* Adds enhance transformation
*
* @see https://www.filestack.com/docs/api/processing/#enhance
* @returns this
* @memberof Filelink
*/
Filelink.prototype.enhance = function (params) {
return this.addTask('enhance', params || true);
};
/**
* Add security to link
*
* @see https://www.filestack.com/docs/api/processing/#redeye
* @returns
* @memberof Filelink
*/
Filelink.prototype.redeye = function () {
return this.addTask('redeye', true);
};
/**
* Add monochrome transformation
*
* @see https://www.filestack.com/docs/api/processing/#monochrome
* @returns this
* @memberof Filelink
*/
Filelink.prototype.monochrome = function () {
return this.addTask('monochrome', true);
};
/**
* Add compress transformation
*
* @see https://www.filestack.com/docs/api/processing/#compress
* @returns this
* @memberof Filelink
*/
Filelink.prototype.compress = function (params) {
return this.addTask('compress', params || true);
};
/**
* Adds negative transformation
*
* @see https://www.filestack.com/docs/api/processing/#negative
* @returns this
* @memberof Filelink
*/
Filelink.prototype.negative = function () {
return this.addTask('negative', true);
};
/**
* Adds tags transformation
*
* @see https://www.filestack.com/docs/api/processing/#tags
* @returns this
* @memberof Filelink
*/
Filelink.prototype.tags = function () {
return this.addTask('tags', true);
};
/**
* Adds sfw transformation
*
* @see https://www.filestack.com/docs/api/processing/#sfw
* @returns this
* @memberof Filelink
*/
Filelink.prototype.sfw = function () {
return this.addTask('sfw', true);
};
/**
* Add animate transformation
*
* @see https://www.filestack.com/docs/api/processing/#animate-images-to-gif
* @param params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.animate = function (params) {
return this.addTask('animate', params);
};
/**
* Adds store transformation
*
* @see https://www.filestack.com/docs/api/processing/#store
* @param {(StoreParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.store = function (params) {
return this.addTask('store', params);
};
/**
* Adds cache transformation
*
* @see https://www.filestack.com/docs/api/processing/#cache
* @param {(CacheParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.cache = function (params) {
return this.addTask('cache', params);
};
/**
* Adds resize transformation
*
* @see https://www.filestack.com/docs/api/processing/#resize
* @param {ResizeParams} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.resize = function (params) {
return this.addTask('resize', params);
};
/**
* Adds crop transformation
*
* @see https://www.filestack.com/docs/api/processing/#crop
* @param {CropParams} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.crop = function (params) {
return this.addTask('crop', params);
};
/**
* Adds rotate transformation
*
* @see https://www.filestack.com/docs/api/processing/#rotate
* @param {RotateParams} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.rotate = function (params) {
return this.addTask('rotate', params);
};
/**
* Adds detect_faces transformation
*
* @see https://www.filestack.com/docs/api/processing/#facial-detection
* @param {(DetectFacesParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.detectFaces = function (params) {
return this.addTask('detect_faces', params);
};
/**
* Adds crop faces transformation
*
* @see https://www.filestack.com/docs/api/processing/#crop-faces
* @param {CropFacesParams} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.cropFaces = function (params) {
return this.addTask('crop_faces', params);
};
/**
* Adds pixelate faces transformation
*
* @see https://www.filestack.com/docs/api/processing/#pixelate-faces
* @param {PixelateFacesParams} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.pixelateFaces = function (params) {
return this.addTask('pixelate_faces', params);
};
/**
* Adds blur faces transformation
*
* @see https://www.filestack.com/docs/api/processing/#blur-faces
* @param {BlurFacesParams} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.blurFaces = function (params) {
return this.addTask('blur_faces', params);
};
/**
* Adds rounded corners transformation
*
* @see https://www.filestack.com/docs/api/processing/#rounded-corners
* @param {(RoundedCornersParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.roundedCorners = function (params) {
return this.addTask('rounded_corners', params);
};
/**
* Adds polaroid transformation
*
* @see https://www.filestack.com/docs/api/processing/#polaroid
* @param {(PolaroidParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.polaroid = function (params) {
return this.addTask('polaroid', params);
};
/**
* Adds vignette transformation
*
* @see https://www.filestack.com/docs/api/processing/#vignette
* @param {(VignetteParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.vignette = function (params) {
return this.addTask('vignette', params);
};
/**
* Adds torn edges transformation
*
* @see https://www.filestack.com/docs/api/processing/#torn-edges
* @param {(TornEdgesParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.tornEdges = function (params) {
return this.addTask('torn_edges', params);
};
/**
* Adds shadow transformation
*
* @see https://www.filestack.com/docs/api/processing/#shadow
* @param {(ShadowParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.shadow = function (params) {
return this.addTask('shadow', params);
};
/**
* Adds circle transformation
*
* @see https://www.filestack.com/docs/api/processing/#circle
* @param {(CircleParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.circle = function (params) {
return this.addTask('circle', params);
};
/**
* Adds border transformation
*
* @see https://www.filestack.com/docs/api/processing/#border
* @param {(BorderParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.border = function (params) {
return this.addTask('border', params);
};
/**
* Adds sharpen transformation
*
* @see https://www.filestack.com/docs/api/processing/#sharpen
* @param {(SharpenParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.sharpen = function (params) {
return this.addTask('sharpen', params);
};
/**
* Adds blur transformation
*
* @see https://www.filestack.com/docs/api/processing/#blur
* @param {(BlurParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.blur = function (params) {
return this.addTask('blur', params);
};
/**
* Adds blackwhite transformation
*
* @see https://www.filestack.com/docs/api/processing/#blackwhite
* @param {(BlackwhiteParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.blackwhite = function (params) {
return this.addTask('blackwhite', params);
};
/**
* Adds sepia transformation
*
* @see https://www.filestack.com/docs/api/processing/#sepia
* @param {(SepiaParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.sepia = function (params) {
return this.addTask('sepia', params);
};
/**
* Adds pixelate transformation
*
* @see https://www.filestack.com/docs/api/processing/#pixelate
* @param {(PixelateParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.pixelate = function (params) {
return this.addTask('pixelate', params);
};
/**
* Adds oilpaint transformation
*
* @see https://www.filestack.com/docs/api/processing/#oil-paint
* @param {(OilPaintParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.oilPaint = function (params) {
return this.addTask('oil_paint', params);
};
/**
* Adds modulate transformation
*
* @see https://www.filestack.com/docs/api/processing/#modulate
* @param {(ModulateParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.modulate = function (params) {
return this.addTask('modulate', params);
};
/**
* Adds partial pixelate transformation
*
* @see https://www.filestack.com/docs/api/processing/#partial-pixelate
* @param {PartialPixelateParams} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.partialPixelate = function (params) {
return this.addTask('partial_pixelate', params);
};
/**
* Adds partial blur transformation
*
* @see https://www.filestack.com/docs/api/processing/#partial-blur
* @param {PartialBlurParams} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.partialBlur = function (params) {
return this.addTask('partial_blur', params);
};
/**
* Adds collage transformation
*
* @see https://www.filestack.com/docs/api/processing/#collage
* @param {CollageParams} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.collage = function (params) {
return this.addTask('collage', params);
};
/**
* Adds upscale transformation
*
* @see https://www.filestack.com/docs/api/processing/#upscale
* @param {(UpscaleParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.upscale = function (params) {
return this.addTask('upscale', params);
};
/**
* Adds ascii transformation
*
* @see https://www.filestack.com/docs/api/processing/#ascii
* @param {(AsciiParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.ascii = function (params) {
return this.addTask('ascii', params);
};
/**
* Adds quality transformation
*
* @see https://www.filestack.com/docs/api/processing/#quality
* @param {QualityParams} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.quality = function (params) {
return this.addTask('quality', params);
};
/**
* Adds security transformation
*
* @see https://www.filestack.com/docs/api/processing/#security
* @param {SecurityParams} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.security = function (params) {
return this.addTask('security', params);
};
/**
* Adds output transformation
*
* @see https://www.filestack.com/docs/api/processing/#output
* @param {OutputParams} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.output = function (params) {
return this.addTask('output', params);
};
/**
* Adds video convert transformation
*
* @see https://www.filestack.com/docs/api/processing/#video-convert
* @param {VideoConvertParams} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.videoConvert = function (params) {
return this.addTask('video_convert', params);
};
/**
* Adds URLScreenshot transformation
*
* @see https://www.filestack.com/docs/api/processing/#urlscreenshot
* @param {(URLScreenshotParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.URLScreenshot = function (params) {
return this.addTask('urlscreenshot', params);
};
/**
* Adds pdfinfo transformation
*
* @see https://www.filestack.com/docs/api/processing/#pdfinfo
* @param {(PdfInfoParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.PDFInfo = function (params) {
return this.addTask('pdfinfo', params);
};
/**
* Adds pdfconvert transformation
*
* @see https://www.filestack.com/docs/api/processing/#pdfconvert
* @param {(PdfConvertParams | boolean)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.PDFConvert = function (params) {
return this.addTask('pdfconvert', params);
};
/**
* Adds fallback transformation
*
* @see https://www.filestack.com/docs/api/processing/#fallback
* @param {(FallbackParams)} params
* @returns this
* @memberof Filelink
*/
Filelink.prototype.fallback = function (params) {
return this.addTask('fallback', params);
};
/**
* Add zip transformation which create a zip package on files
* used on actual context
*
* @see https://www.filestack.com/docs/api/processing/#zip
* @returns this
* @memberof Filelink
*/
Filelink.prototype.zip = function () {
return this.addTask('zip', true);
};
/**
* Add task which minify a css file
*
* @returns this
* @memberof Filelink
*/
Filelink.prototype.minifyCss = function (params) {
return this.addTask('minify_css', params);
};
/**
* Add task which minify a javascript file.
* For better handling of 'targets' param, use with b64 flag enabled.
*
* @returns this
* @memberof Filelink
*/
Filelink.prototype.minifyJs = function (params) {
return this.addTask('minify_js', params);
};
/**
* Checks if source is external
*
* @private
* @returns {boolean}
* @memberof Filelink
*/
Filelink.prototype.isSourceExternal = function () {
if (!this.source) {
throw new FilestackError('Source not Set');
}
var toTest = Array.isArray(this.source) ? this.source : [this.source];
for (var i in toTest) {
/* istanbul ignore next */
if (!toTest.hasOwnProperty(i)) {
continue;
}
if (toTest[i].indexOf('src:') === 0 || (toTest[i].indexOf('http') === 0 && toTest[i].indexOf('filestackcontent') === -1)) {
return true;
}
}
return false;
};
/**
* Validate every task against schema
*
* @private
* @param {object[]} transformations - object which contain all transformations
* @returns {void}
* @memberof Filelink
*/
Filelink.prototype.validateTasks = function (transformations) {
var res = Filelink.validator(this.arrayToObject(transformations, 'name', 'params'));
if (res.errors.length) {
throw new FilestackError("Params validation error", res.errors, FilestackErrorType.VALIDATION);
}
return;
};
/**
* Returns correct cdn url with cname support
*
* @private
* @returns {string}
* @memberof Filelink
*/
Filelink.prototype.getCdnHost = function () {
var urls = Object.assign({}, config.urls);
if (this.customDomain) {
urls.cdnUrl = this.customDomain;
}
urls = resolveHost(urls, this.cname);
return urls.cdnUrl;
};
/**
* Returns applied transformations as string
*
* @private
* @returns {string}
* @memberof Filelink
*/
Filelink.prototype.generateTransformString = function () {
var _this = this;
var transforms = [];
this.transforms.forEach(function (el) {
transforms.push(_this.optionToString(el.name, el.params));
});
return transforms.join('/');
};
/**
* Flatten transformation option to string
*
* @private
* @example {resize:{width: 100,height: 200}} => resize=width:100,height:200
* @param key - option key
* @param values - option params
*/
Filelink.prototype.optionToString = function (key, values) {
var _this = this;
var optionsString = [];
if (typeof values === 'undefined') {
return key;
}
// if we just want to enable feature
if (typeof values === 'boolean') {
if (!values && key === 'cache') {
return 'cache=false';
}
return key;
}
Object.keys(values).forEach(function (i) {
if (Array.isArray(values[i])) {
optionsString.push("".concat(i, ":").concat(_this.arrayToString(values[i])));
return;
}
optionsString.push("".concat(i, ":").concat(_this.escapeValue(values[i])));
});
return "".concat(key, "=").concat(optionsString.join(','));
};
/**
* Escape params values
*
* @private
* @param {string} value
* @returns {string}
* @memberof Filelink
*/
Filelink.prototype.escapeValue = function (value) {
if (typeof value !== 'string') {
return value;
}
if (value.indexOf('/') > -1 || value.indexOf(',') > -1) {
return "\"".concat(value, "\"");
}
return value;
};
/**
* Converts nested arrays to string
*
* @private
* @example [1,2, [2,3]] => "[1,2, [2,3]]"
* @param arr - any array
*/
Filelink.prototype.arrayToString = function (arr) {
var _this = this;
var toReturn = arr.map(function (el) {
if (Array.isArray(el)) {
return _this.arrayToString(el);
}
return _this.escapeValue(el);
});
return "[".concat(toReturn, "]");
};
/**
* Validator instance
*
* @private
* @memberof Filelink
*/
Filelink.validator = getValidator(TransformSchema);
return Filelink;
}());
export { Filelink };
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvZmlsZWxpbmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFMUIsSUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBRW5DLE1BQU0sQ0FBTixJQUFZLEtBUVg7QUFSRCxXQUFZLEtBQUs7SUFDZixzQkFBYSxDQUFBO0lBQ2Isd0JBQWUsQ0FBQTtJQUNmLDBCQUFpQixDQUFBO0lBQ2pCLDBCQUFpQixDQUFBO0lBQ2pCLG9CQUFXLENBQUE7SUFDWCx3QkFBZSxDQUFBO0lBQ2YsMEJBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQVJXLEtBQUssS0FBTCxLQUFLLFFBUWhCO0FBT0Q7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSxVQUtYO0FBTEQsV0FBWSxVQUFVO0lBQ3BCLDJCQUFhLENBQUE7SUFDYiwyQkFBYSxDQUFBO0lBQ2IsNkJBQWUsQ0FBQTtJQUNmLHlCQUFXLENBQUE7QUFDYixDQUFDLEVBTFcsVUFBVSxLQUFWLFVBQVUsUUFLckI7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLFFBR1g7QUFIRCxXQUFZLFFBQVE7SUFDbEIsNkJBQWlCLENBQUE7SUFDakIsaUNBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQUhXLFFBQVEsS0FBUixRQUFRLFFBR25CO0FBRUQ7O0dBRUc7QUFDSCxNQUFN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