Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions __TESTS_BUNDLE_SIZE__/bundleSizeTestCases.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ const bundleSizeTestCases:ITestCase[] = [
},
{
name: 'Tests CloudinaryImage image with Resize, adjust and delivery',
sizeLimitInKB: 23,
sizeLimitInKB: 24,
importsArray: [
importFromDist('assets/CloudinaryImage', 'CloudinaryImage'),
importFromDist('instance/Cloudinary', 'Cloudinary'),
Expand Down Expand Up @@ -88,7 +88,7 @@ const bundleSizeTestCases:ITestCase[] = [
},
{
name: 'Import All Actions',
sizeLimitInKB: 30,
sizeLimitInKB: 31,
importsArray: [
importFromPackage('Actions')
]
Expand Down
24 changes: 22 additions & 2 deletions __TESTS__/unit/fromJson/fromJson.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,30 @@ describe('fromJson', () => {
{actionType: 'thumbnail', dimensions: {width: 100}, relative: true, gravity: 'south', zoom: 4},
{actionType: 'pad', dimensions: {width: 100}, relative: true, gravity: 'south', x: 3, y:4, background: 'white'},
{actionType: 'limitPad', dimensions: {width: 100}, relative: true, gravity: 'south', x: 3, y:4, background: 'white'},
{actionType: 'minimumPad', dimensions: {width: 100}, relative: true, gravity: 'south', x: 3, y:4, background: 'white'}
{actionType: 'minimumPad', dimensions: {width: 100}, relative: true, gravity: 'south', x: 3, y:4, background: 'white'},
]);

expect(transformation.toString()).toStrictEqual('ar_7.0,c_scale,w_100/ar_16:9,c_fit,fl_relative,h_200/c_limit,fl_ignore_aspect_ratio,fl_relative,h_200/c_mfit,fl_region_relative,w_100/c_crop,fl_region_relative,g_north_east,w_100,y_3,z_7/c_fill,fl_relative,g_south,w_100,x_4,y_5/c_lfill,fl_relative,g_south,w_100,x_4,y_5/c_thumb,fl_relative,g_south,w_100,z_4/b_white,c_pad,fl_relative,g_south,w_100,x_3,y_4/b_white,c_lpad,fl_relative,g_south,w_100,x_3,y_4/b_white,c_mpad,fl_relative,g_south,w_100,x_3,y_4');
expect(transformation.toString()).toStrictEqual([
'ar_7.0,c_scale,w_100',
'ar_16:9,c_fit,fl_relative,h_200',
'c_limit,fl_ignore_aspect_ratio,fl_relative,h_200',
'c_mfit,fl_region_relative,w_100',
'c_crop,fl_region_relative,g_north_east,w_100,y_3,z_7',
'c_fill,fl_relative,g_south,w_100,x_4,y_5',
'c_lfill,fl_relative,g_south,w_100,x_4,y_5',
'c_thumb,fl_relative,g_south,w_100,z_4',
'b_white,c_pad,fl_relative,g_south,w_100,x_3,y_4',
'b_white,c_lpad,fl_relative,g_south,w_100,x_3,y_4',
'b_white,c_mpad,fl_relative,g_south,w_100,x_3,y_4',
].join('/'));
});

it('should generate a transformation string from colorSpace action', function () {
const transformation = fromJson([
{actionType: 'colorSpace', mode: 'srgbTrueColor'}
]);

expect(transformation.toString()).toStrictEqual('cs_srgb:truecolor');
});

it('should generate an error for array that includes an unsupported action', function () {
Expand Down
7 changes: 4 additions & 3 deletions __TESTS__/unit/toJson/toJson.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ import {Transformation} from '../../../src';
import {Delivery, Resize} from "../../../src/actions";
import {UnsupportedError} from "../../../src/internal/utils/unsupportedError";
import {Action} from "../../../src/internal/Action";
import {AspectRatio} from "../../../src/qualifiers";
import {AspectRatio, ColorSpace} from "../../../src/qualifiers";
import {Format} from "../../../src/qualifiers/format";
import {Progressive} from "../../../src/qualifiers/progressive";
import {Quality} from "../../../src/qualifiers/quality";
import {ChromaSubSampling} from "../../../src/qualifiers";
import {trueColor} from "../../../src/qualifiers/colorSpace";

describe('Transformation.toJson()', () => {
it('scale', () => {
Expand Down Expand Up @@ -133,11 +134,11 @@ describe('Transformation.toJson()', () => {

it('delivery.colorSpace', () => {
const transformation = new Transformation()
.addAction(Delivery.colorSpace('srgb'));
.addAction(Delivery.colorSpace(ColorSpace.trueColor()));
expect(transformation.toJson()).toStrictEqual([
{
actionType: 'colorSpace',
colorSpaceType: 'srgb'
mode: 'srgbTrueColor'
}
]
);
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"test:unit:watch": "jest --watch --reporters default",
"test:types": "tsc --project tsconfig.test.json",
"test:import:require": "cd testApps/testImportAndRequire && npm run test",
"test:model": "jest json.test.ts",
"build": "bash ./scripts/build.sh",
"build:ESM": "tsc --project tsconfig.json --outDir dist --declaration true",
"build:rollup": "rollup -c",
Expand Down
7 changes: 4 additions & 3 deletions src/actions/delivery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,9 @@ import {DeliveryAction} from "./delivery/DeliveryAction.js";
import {ColorSpaceType} from "../types/types.js";
import {QualityTypes} from "../types/types.js";
import {ImageFormatType, VideoFormatType} from "../types/types.js";
import {DeliveryColorSpaceAction} from "./delivery/DeliveryColorSpaceAction.js";

export type IDeliveryAction = DeliveryAction | DeliveryColorSpaceFromICC;
export type IDeliveryAction = DeliveryAction | DeliveryColorSpaceAction | DeliveryColorSpaceFromICC;

/**
* @summary action
Expand Down Expand Up @@ -156,8 +157,8 @@ function defaultImage(publicIdWithExtension:string) :DeliveryAction {
* colorSpace(trueColor()),
* );
*/
function colorSpace(mode:ColorSpaceType|string): DeliveryAction {
return new DeliveryAction('cs', mode, 'colorSpaceType');
function colorSpace(mode: ColorSpaceType): DeliveryColorSpaceAction {
return new DeliveryColorSpaceAction(mode);
}


Expand Down
49 changes: 49 additions & 0 deletions src/actions/delivery/DeliveryColorSpaceAction.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import {Action} from "../../internal/Action.js";
import {Qualifier} from "../../internal/qualifier/Qualifier.js";
import {
ColorSpaceModeType,
IDeliveryColorSpaceActionModel
} from "../../internal/models/IDeliveryColorSpaceActionModel.js";
import {IActionModel} from "../../internal/models/IActionModel.js";
import {ColorSpace} from "../../qualifiers/colorSpace.js";
import {ColorSpaceType} from "../../types/types.js";
import {
COLOR_SPACE_MODE_TO_COLOR_SPACE_MODEL_MODE_MAP,
COLOR_SPACE_MODEL_MODE_TO_COLOR_SPACE_MODE_MAP
} from "../../internal/internalConstants.js";

/**
* @description Specifies the color space to use.
* @memberOf Actions.Delivery
* @extends SDK.Action
* @see Visit {@link Actions.Delivery|Delivery} for an example
*/
class DeliveryColorSpaceAction extends Action {
protected _actionModel: IDeliveryColorSpaceActionModel = {};

/**
* Create a new DeliveryColorSpaceAction
* @param mode
*/
constructor(mode: ColorSpaceType) {
super();

this._actionModel = {
actionType: 'colorSpace',
mode: (COLOR_SPACE_MODE_TO_COLOR_SPACE_MODEL_MODE_MAP[mode] || mode) as ColorSpaceModeType
};

this.addQualifier(new Qualifier('cs', ColorSpace[mode] ? ColorSpace[mode]() : mode));
}

static fromJson(actionModel: IActionModel): DeliveryColorSpaceAction {
const {mode} = (actionModel as IDeliveryColorSpaceActionModel);
const colorSpaceMode = COLOR_SPACE_MODEL_MODE_TO_COLOR_SPACE_MODE_MAP[mode] || mode;

// We are using this() to allow inheriting classes to use super.fromJson.apply(this, [actionModel])
// This allows the inheriting classes to determine the class to be created
return new this(colorSpaceMode);
}
}

export {DeliveryColorSpaceAction};
4 changes: 3 additions & 1 deletion src/internal/fromJson.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {ThumbResizeAction} from "../actions/resize/ThumbnailAction.js";
import {ResizePadAction} from "../actions/resize/ResizePadAction.js";
import {ResizeLimitPadAction} from "../actions/resize/ResizeLimitPadAction.js";
import {ResizeMinimumPadAction} from "../actions/resize/ResizeMinimumPadAction.js";
import {DeliveryColorSpaceAction} from "../actions/delivery/DeliveryColorSpaceAction.js";

const ActionModelMap: Record<string, IHasFromJson> = {
scale: ResizeScaleAction,
Expand All @@ -27,7 +28,8 @@ const ActionModelMap: Record<string, IHasFromJson> = {
thumbnail: ThumbResizeAction,
pad: ResizePadAction,
limitPad: ResizeLimitPadAction,
minimumPad: ResizeMinimumPadAction
minimumPad: ResizeMinimumPadAction,
colorSpace: DeliveryColorSpaceAction
};

/**
Expand Down
9 changes: 9 additions & 0 deletions src/internal/internalConstants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,15 @@ export const ACTION_TYPE_TO_CHROMA_MAP: Record<number, string> = {
420: "CHROMA_420"
};

export const COLOR_SPACE_MODEL_MODE_TO_COLOR_SPACE_MODE_MAP: Record<string, string> = {
'noCmyk': 'no_cmyk',
'keepCmyk': 'keep_cmyk',
'tinySrgb': 'tinysrgb',
'srgbTrueColor': 'srgb:truecolor'
};

export const COLOR_SPACE_MODE_TO_COLOR_SPACE_MODEL_MODE_MAP = objectFlip(COLOR_SPACE_MODEL_MODE_TO_COLOR_SPACE_MODE_MAP);

export const CROP_MODE_TO_ACTION_TYPE_MAP = objectFlip(ACTION_TYPE_TO_CROP_MODE_MAP);

export const DELIVERY_MODE_TO_ACTION_TYPE_MAP = objectFlip(ACTION_TYPE_TO_DELIVERY_MODE_MAP);
Expand Down
9 changes: 9 additions & 0 deletions src/internal/models/IDeliveryColorSpaceActionModel.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import {IActionModel} from "./IActionModel.js";

type ColorSpaceModeType = "srgb" | "srgbTrueColor" | "tinySrgb" | "cmyk" | "noCmyk" | "keepCmyk";

interface IDeliveryColorSpaceActionModel extends IActionModel{
mode?: ColorSpaceModeType
}

export {ColorSpaceModeType, IDeliveryColorSpaceActionModel};
16 changes: 9 additions & 7 deletions src/qualifiers/colorSpace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,21 @@
* @see Visit {@link Actions.Delivery.colorSpace|Delivery Color Space} for an example
*/

import {ColorSpaceType} from "../types/types.js";

/**
* @summary qualifier
* @memberOf Qualifiers.ColorSpace
*/
function srgb(): string {
function srgb(): ColorSpaceType {
return 'srgb';
}

/**
* @summary qualifier
* @memberOf Qualifiers.ColorSpace
*/
function trueColor(): string {
function trueColor(): ColorSpaceType {
return 'srgb:truecolor';
}

Expand All @@ -26,7 +28,7 @@ function trueColor(): string {
* @summary qualifier
* @memberOf Qualifiers.ColorSpace
*/
function tinySrgb(): string {
function tinySrgb(): ColorSpaceType {
return 'tinysrgb';
}

Expand All @@ -35,7 +37,7 @@ function tinySrgb(): string {
* @summary qualifier
* @memberOf Qualifiers.ColorSpace
*/
function cmyk(): string | number {
function cmyk(): ColorSpaceType {
return 'cmyk';
}

Expand All @@ -44,7 +46,7 @@ function cmyk(): string | number {
* @summary qualifier
* @memberOf Qualifiers.ColorSpace
*/
function noCmyk(): string {
function noCmyk(): ColorSpaceType {
return 'no_cmyk';
}

Expand All @@ -53,11 +55,11 @@ function noCmyk(): string {
* @summary qualifier
* @memberOf Qualifiers.ColorSpace
*/
function keepCmyk(): string {
function keepCmyk(): ColorSpaceType {
return 'keep_cmyk';
}

const ColorSpace = {
const ColorSpace: Record<string, ()=>ColorSpaceType> = {
cmyk,
keepCmyk,
noCmyk,
Expand Down