filestack-js
Version:
Official JavaScript library for Filestack
1,159 lines (1,158 loc) • 104 kB
JavaScript
"use strict";
/*
* 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.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.Filelink = exports.EnhancePreset = exports.VideoAccessMode = exports.VideoAccess = exports.Locations = exports.URLScreenshotOrientation = exports.URLScreenshotMode = exports.URLScreenshotAgent = exports.VideoTypes = exports.AudioTypes = exports.SmartCropMode = exports.ImageWatermarkPosition = exports.CropfacesType = exports.ColorspaceType = exports.StyleType = exports.NoiseType = exports.ShapeType = exports.BlurMode = exports.FitOptions = exports.Align = void 0;
var tslib_1 = require("tslib");
var config_1 = require("./../config");
var transforms_schema_1 = require("./../schema/transforms.schema");
var validator_1 = require("./../schema/validator");
var utils_1 = require("./utils");
var filestack_error_1 = require("./../filestack_error");
var debug_1 = tslib_1.__importDefault(require("debug"));
var debug = (0, debug_1.default)('fs:filelink');
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 = exports.Align || (exports.Align = {}));
/**
* Fit enum
*/
var FitOptions;
(function (FitOptions) {
FitOptions["clip"] = "clip";
FitOptions["crop"] = "crop";
FitOptions["scale"] = "scale";
FitOptions["max"] = "max";
})(FitOptions = exports.FitOptions || (exports.FitOptions = {}));
/**
* Blur enum
*/
var BlurMode;
(function (BlurMode) {
BlurMode["linear"] = "linear";
BlurMode["gaussian"] = "gaussian";
})(BlurMode = exports.BlurMode || (exports.BlurMode = {}));
/**
* Shapes enum
*/
var ShapeType;
(function (ShapeType) {
ShapeType["oval"] = "oval";
ShapeType["rect"] = "rect";
})(ShapeType = exports.ShapeType || (exports.ShapeType = {}));
/**
* Noise type enum
*/
var NoiseType;
(function (NoiseType) {
NoiseType["none"] = "none";
NoiseType["low"] = "low";
NoiseType["medium"] = "medium";
NoiseType["high"] = "high";
})(NoiseType = exports.NoiseType || (exports.NoiseType = {}));
/**
* Style type enum
*/
var StyleType;
(function (StyleType) {
StyleType["artwork"] = "artwork";
StyleType["photo"] = "photo";
})(StyleType = exports.StyleType || (exports.StyleType = {}));
/**
* Color space enum
*/
var ColorspaceType;
(function (ColorspaceType) {
ColorspaceType["RGB"] = "RGB";
ColorspaceType["CMYK"] = "CMYK";
ColorspaceType["Input"] = "Input";
})(ColorspaceType = exports.ColorspaceType || (exports.ColorspaceType = {}));
/**
* Crop faces options enum
*/
var CropfacesType;
(function (CropfacesType) {
CropfacesType["thumb"] = "thumb";
CropfacesType["crop"] = "crop";
CropfacesType["fill"] = "fill";
})(CropfacesType = exports.CropfacesType || (exports.CropfacesType = {}));
/**
* Watermark postion options enum
*/
var ImageWatermarkPosition;
(function (ImageWatermarkPosition) {
ImageWatermarkPosition["top"] = "top";
ImageWatermarkPosition["middle"] = "middle";
ImageWatermarkPosition["bottom"] = "bottom";
ImageWatermarkPosition["left"] = "left";
ImageWatermarkPosition["center"] = "center";
ImageWatermarkPosition["right"] = "right";
})(ImageWatermarkPosition = exports.ImageWatermarkPosition || (exports.ImageWatermarkPosition = {}));
/**
* SmartCrop options enum
*/
var SmartCropMode;
(function (SmartCropMode) {
SmartCropMode["face"] = "face";
SmartCropMode["auto"] = "auto";
})(SmartCropMode = exports.SmartCropMode || (exports.SmartCropMode = {}));
/**
* Convert to format
*/
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 = exports.AudioTypes || (exports.AudioTypes = {}));
/**
* Convert to format
*/
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 = exports.VideoTypes || (exports.VideoTypes = {}));
var URLScreenshotAgent;
(function (URLScreenshotAgent) {
URLScreenshotAgent["desktop"] = "desktop";
URLScreenshotAgent["mobile"] = "mobile";
})(URLScreenshotAgent = exports.URLScreenshotAgent || (exports.URLScreenshotAgent = {}));
var URLScreenshotMode;
(function (URLScreenshotMode) {
URLScreenshotMode["all"] = "all";
URLScreenshotMode["window"] = "window";
})(URLScreenshotMode = exports.URLScreenshotMode || (exports.URLScreenshotMode = {}));
var URLScreenshotOrientation;
(function (URLScreenshotOrientation) {
URLScreenshotOrientation["portrait"] = "portrait";
URLScreenshotOrientation["landscape"] = "landscape";
})(URLScreenshotOrientation = exports.URLScreenshotOrientation || (exports.URLScreenshotOrientation = {}));
/**
* Video storage location
*/
var Locations;
(function (Locations) {
Locations["s3"] = "s3";
Locations["azure"] = "azure";
Locations["gcs"] = "gcs";
Locations["rackspace"] = "rackspace";
Locations["dropbox"] = "dropbox";
})(Locations = exports.Locations || (exports.Locations = {}));
var VideoAccess;
(function (VideoAccess) {
VideoAccess["private"] = "private";
VideoAccess["public"] = "public";
})(VideoAccess = exports.VideoAccess || (exports.VideoAccess = {}));
var VideoAccessMode;
(function (VideoAccessMode) {
VideoAccessMode["preserve"] = "preserve";
VideoAccessMode["constrain"] = "constrain";
VideoAccessMode["letterbox"] = "letterbox";
VideoAccessMode["pad"] = "pad";
VideoAccessMode["crop"] = "crop";
})(VideoAccessMode = exports.VideoAccessMode || (exports.VideoAccessMode = {}));
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 = exports.EnhancePreset || (exports.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 filestack_error_1.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 filestack_error_1.FilestackError('Invalid filestack source provided');
}
};
/**
* Returns JSONSchema form transformations params
*
* @returns
* @memberof Filelink
*/
Filelink.prototype.getValidationSchema = function () {
return transforms_schema_1.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((0, utils_1.b64)(JSON.stringify(this.transforms), true));
}
if (Array.isArray(source)) {
source = this.arrayToString(source);
}
source = "b64://".concat((0, utils_1.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) {
(0, debug_1.default)("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 filestack_error_1.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 filestack_error_1.FilestackError("Params validation error", res.errors, filestack_error_1.FilestackErrorType.VALIDATION);
}
return;
};
/**
* Returns correct cdn url with cname support
*
* @private
* @returns {string}
* @memberof Filelink
*/
Filelink.prototype.getCdnHost = function () {
var urls = Object.assign({}, config_1.config.urls);
if (this.customDomain) {
urls.cdnUrl = this.customDomain;
}
urls = (0, utils_1.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 = (0, validator_1.getValidator)(transforms_schema_1.TransformSchema);
return Filelink;
}());
exports.Filelink = Filelink;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvZmlsZWxpbmsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRzs7OztBQUVILHNDQUFxQztBQUNyQyxtRUFBZ0U7QUFDaEUsbURBQXFEO0FBQ3JELGlDQUEyQztBQUMzQyx3REFBMEU7QUFDMUUsd0RBQTBCO0FBRTFCLElBQU0sS0FBSyxHQUFHLElBQUEsZUFBSyxFQUFDLGFBQWEsQ0FBQyxDQUFDO0FBRW5DLElBQVksS0FRWDtBQVJELFdBQVksS0FBSztJQUNmLHNCQUFhLENBQUE7SUFDYix3QkFBZSxDQUFBO0lBQ2YsMEJBQWlCLENBQUE7SUFDakIsMEJBQWlCLENBQUE7SUFDakIsb0JBQVcsQ0FBQTtJQUNYLHdCQUFlLENBQUE7SUFDZiwwQkFBaUIsQ0FBQTtBQUNuQixDQUFDLEVBUlcsS0FBSyxHQUFMLGFBQUssS0FBTCxhQUFLLFFBUWhCO0FBT0Q7O0dBRUc7QUFDSCxJQUFZLFVBS1g7QUFMRCxXQUFZLFVBQVU7SUFDcEIsMkJBQWEsQ0FBQTtJQUNiLDJCQUFhLENBQUE7SUFDYiw2QkFBZSxDQUFBO0lBQ2YseUJBQVcsQ0FBQTtBQUNiLENBQUMsRUFMVyxVQUFVLEdBQVYsa0JBQVUsS0FBVixrQkFBVSxRQUtyQjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxRQUdYO0FBSEQsV0FBWSxRQUFRO0lBQ2xCLDZCQUFpQixDQUFBO0lBQ2pCLGlDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFIVyxRQUFRLEdBQVIsZ0JBQVEsS0FBUixnQkFBUSxRQUduQjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxTQUdYO0FBSEQsV0FBWSxTQUFTO0lBQ25CLDBCQUFhLENBQUE7SUFDYiwwQkFBYSxDQUFBO0FBQ2YsQ0FBQyxFQUhXLFNBQVMsR0FBVCxpQkFBUyxLQUFULGlCQUFTLFFBR3BCO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLFNBS1g7QUFMRCxXQUFZLFNBQVM7SUFDbkIsMEJBQWEsQ0FBQTtJQUNiLHdCQUFXLENB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