UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

1,155 lines (1,154 loc) 103 kB
/* * 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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