Skip to content

Commit 33b31b8

Browse files
author
Nir Maoz
authored
Feature/color space from json (#466)
1 parent 1f2dcd3 commit 33b31b8

File tree

10 files changed

+112
-18
lines changed

10 files changed

+112
-18
lines changed

__TESTS_BUNDLE_SIZE__/bundleSizeTestCases.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ const bundleSizeTestCases:ITestCase[] = [
4545
},
4646
{
4747
name: 'Tests CloudinaryImage image with Resize, adjust and delivery',
48-
sizeLimitInKB: 23,
48+
sizeLimitInKB: 24,
4949
importsArray: [
5050
importFromDist('assets/CloudinaryImage', 'CloudinaryImage'),
5151
importFromDist('instance/Cloudinary', 'Cloudinary'),
@@ -88,7 +88,7 @@ const bundleSizeTestCases:ITestCase[] = [
8888
},
8989
{
9090
name: 'Import All Actions',
91-
sizeLimitInKB: 30,
91+
sizeLimitInKB: 31,
9292
importsArray: [
9393
importFromPackage('Actions')
9494
]

__TESTS__/unit/fromJson/fromJson.test.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,30 @@ describe('fromJson', () => {
1414
{actionType: 'thumbnail', dimensions: {width: 100}, relative: true, gravity: 'south', zoom: 4},
1515
{actionType: 'pad', dimensions: {width: 100}, relative: true, gravity: 'south', x: 3, y:4, background: 'white'},
1616
{actionType: 'limitPad', dimensions: {width: 100}, relative: true, gravity: 'south', x: 3, y:4, background: 'white'},
17-
{actionType: 'minimumPad', dimensions: {width: 100}, relative: true, gravity: 'south', x: 3, y:4, background: 'white'}
17+
{actionType: 'minimumPad', dimensions: {width: 100}, relative: true, gravity: 'south', x: 3, y:4, background: 'white'},
1818
]);
1919

20-
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');
20+
expect(transformation.toString()).toStrictEqual([
21+
'ar_7.0,c_scale,w_100',
22+
'ar_16:9,c_fit,fl_relative,h_200',
23+
'c_limit,fl_ignore_aspect_ratio,fl_relative,h_200',
24+
'c_mfit,fl_region_relative,w_100',
25+
'c_crop,fl_region_relative,g_north_east,w_100,y_3,z_7',
26+
'c_fill,fl_relative,g_south,w_100,x_4,y_5',
27+
'c_lfill,fl_relative,g_south,w_100,x_4,y_5',
28+
'c_thumb,fl_relative,g_south,w_100,z_4',
29+
'b_white,c_pad,fl_relative,g_south,w_100,x_3,y_4',
30+
'b_white,c_lpad,fl_relative,g_south,w_100,x_3,y_4',
31+
'b_white,c_mpad,fl_relative,g_south,w_100,x_3,y_4',
32+
].join('/'));
33+
});
34+
35+
it('should generate a transformation string from colorSpace action', function () {
36+
const transformation = fromJson([
37+
{actionType: 'colorSpace', mode: 'srgbTrueColor'}
38+
]);
39+
40+
expect(transformation.toString()).toStrictEqual('cs_srgb:truecolor');
2141
});
2242

2343
it('should generate an error for array that includes an unsupported action', function () {

__TESTS__/unit/toJson/toJson.test.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ import {Transformation} from '../../../src';
22
import {Delivery, Resize} from "../../../src/actions";
33
import {UnsupportedError} from "../../../src/internal/utils/unsupportedError";
44
import {Action} from "../../../src/internal/Action";
5-
import {AspectRatio} from "../../../src/qualifiers";
5+
import {AspectRatio, ColorSpace} from "../../../src/qualifiers";
66
import {Format} from "../../../src/qualifiers/format";
77
import {Progressive} from "../../../src/qualifiers/progressive";
88
import {Quality} from "../../../src/qualifiers/quality";
99
import {ChromaSubSampling} from "../../../src/qualifiers";
10+
import {trueColor} from "../../../src/qualifiers/colorSpace";
1011

1112
describe('Transformation.toJson()', () => {
1213
it('scale', () => {
@@ -133,11 +134,11 @@ describe('Transformation.toJson()', () => {
133134

134135
it('delivery.colorSpace', () => {
135136
const transformation = new Transformation()
136-
.addAction(Delivery.colorSpace('srgb'));
137+
.addAction(Delivery.colorSpace(ColorSpace.trueColor()));
137138
expect(transformation.toJson()).toStrictEqual([
138139
{
139140
actionType: 'colorSpace',
140-
colorSpaceType: 'srgb'
141+
mode: 'srgbTrueColor'
141142
}
142143
]
143144
);

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"test:unit:watch": "jest --watch --reporters default",
1212
"test:types": "tsc --project tsconfig.test.json",
1313
"test:import:require": "cd testApps/testImportAndRequire && npm run test",
14+
"test:model": "jest json.test.ts",
1415
"build": "bash ./scripts/build.sh",
1516
"build:ESM": "tsc --project tsconfig.json --outDir dist --declaration true",
1617
"build:rollup": "rollup -c",

src/actions/delivery.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,9 @@ import {DeliveryAction} from "./delivery/DeliveryAction.js";
1515
import {ColorSpaceType} from "../types/types.js";
1616
import {QualityTypes} from "../types/types.js";
1717
import {ImageFormatType, VideoFormatType} from "../types/types.js";
18+
import {DeliveryColorSpaceAction} from "./delivery/DeliveryColorSpaceAction.js";
1819

19-
export type IDeliveryAction = DeliveryAction | DeliveryColorSpaceFromICC;
20+
export type IDeliveryAction = DeliveryAction | DeliveryColorSpaceAction | DeliveryColorSpaceFromICC;
2021

2122
/**
2223
* @summary action
@@ -156,8 +157,8 @@ function defaultImage(publicIdWithExtension:string) :DeliveryAction {
156157
* colorSpace(trueColor()),
157158
* );
158159
*/
159-
function colorSpace(mode:ColorSpaceType|string): DeliveryAction {
160-
return new DeliveryAction('cs', mode, 'colorSpaceType');
160+
function colorSpace(mode: ColorSpaceType): DeliveryColorSpaceAction {
161+
return new DeliveryColorSpaceAction(mode);
161162
}
162163

163164

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import {Action} from "../../internal/Action.js";
2+
import {Qualifier} from "../../internal/qualifier/Qualifier.js";
3+
import {
4+
ColorSpaceModeType,
5+
IDeliveryColorSpaceActionModel
6+
} from "../../internal/models/IDeliveryColorSpaceActionModel.js";
7+
import {IActionModel} from "../../internal/models/IActionModel.js";
8+
import {ColorSpace} from "../../qualifiers/colorSpace.js";
9+
import {ColorSpaceType} from "../../types/types.js";
10+
import {
11+
COLOR_SPACE_MODE_TO_COLOR_SPACE_MODEL_MODE_MAP,
12+
COLOR_SPACE_MODEL_MODE_TO_COLOR_SPACE_MODE_MAP
13+
} from "../../internal/internalConstants.js";
14+
15+
/**
16+
* @description Specifies the color space to use.
17+
* @memberOf Actions.Delivery
18+
* @extends SDK.Action
19+
* @see Visit {@link Actions.Delivery|Delivery} for an example
20+
*/
21+
class DeliveryColorSpaceAction extends Action {
22+
protected _actionModel: IDeliveryColorSpaceActionModel = {};
23+
24+
/**
25+
* Create a new DeliveryColorSpaceAction
26+
* @param mode
27+
*/
28+
constructor(mode: ColorSpaceType) {
29+
super();
30+
31+
this._actionModel = {
32+
actionType: 'colorSpace',
33+
mode: (COLOR_SPACE_MODE_TO_COLOR_SPACE_MODEL_MODE_MAP[mode] || mode) as ColorSpaceModeType
34+
};
35+
36+
this.addQualifier(new Qualifier('cs', ColorSpace[mode] ? ColorSpace[mode]() : mode));
37+
}
38+
39+
static fromJson(actionModel: IActionModel): DeliveryColorSpaceAction {
40+
const {mode} = (actionModel as IDeliveryColorSpaceActionModel);
41+
const colorSpaceMode = COLOR_SPACE_MODEL_MODE_TO_COLOR_SPACE_MODE_MAP[mode] || mode;
42+
43+
// We are using this() to allow inheriting classes to use super.fromJson.apply(this, [actionModel])
44+
// This allows the inheriting classes to determine the class to be created
45+
return new this(colorSpaceMode);
46+
}
47+
}
48+
49+
export {DeliveryColorSpaceAction};

src/internal/fromJson.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {ThumbResizeAction} from "../actions/resize/ThumbnailAction.js";
1515
import {ResizePadAction} from "../actions/resize/ResizePadAction.js";
1616
import {ResizeLimitPadAction} from "../actions/resize/ResizeLimitPadAction.js";
1717
import {ResizeMinimumPadAction} from "../actions/resize/ResizeMinimumPadAction.js";
18+
import {DeliveryColorSpaceAction} from "../actions/delivery/DeliveryColorSpaceAction.js";
1819

1920
const ActionModelMap: Record<string, IHasFromJson> = {
2021
scale: ResizeScaleAction,
@@ -27,7 +28,8 @@ const ActionModelMap: Record<string, IHasFromJson> = {
2728
thumbnail: ThumbResizeAction,
2829
pad: ResizePadAction,
2930
limitPad: ResizeLimitPadAction,
30-
minimumPad: ResizeMinimumPadAction
31+
minimumPad: ResizeMinimumPadAction,
32+
colorSpace: DeliveryColorSpaceAction
3133
};
3234

3335
/**

src/internal/internalConstants.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,15 @@ export const ACTION_TYPE_TO_CHROMA_MAP: Record<number, string> = {
111111
420: "CHROMA_420"
112112
};
113113

114+
export const COLOR_SPACE_MODEL_MODE_TO_COLOR_SPACE_MODE_MAP: Record<string, string> = {
115+
'noCmyk': 'no_cmyk',
116+
'keepCmyk': 'keep_cmyk',
117+
'tinySrgb': 'tinysrgb',
118+
'srgbTrueColor': 'srgb:truecolor'
119+
};
120+
121+
export const COLOR_SPACE_MODE_TO_COLOR_SPACE_MODEL_MODE_MAP = objectFlip(COLOR_SPACE_MODEL_MODE_TO_COLOR_SPACE_MODE_MAP);
122+
114123
export const CROP_MODE_TO_ACTION_TYPE_MAP = objectFlip(ACTION_TYPE_TO_CROP_MODE_MAP);
115124

116125
export const DELIVERY_MODE_TO_ACTION_TYPE_MAP = objectFlip(ACTION_TYPE_TO_DELIVERY_MODE_MAP);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import {IActionModel} from "./IActionModel.js";
2+
3+
type ColorSpaceModeType = "srgb" | "srgbTrueColor" | "tinySrgb" | "cmyk" | "noCmyk" | "keepCmyk";
4+
5+
interface IDeliveryColorSpaceActionModel extends IActionModel{
6+
mode?: ColorSpaceModeType
7+
}
8+
9+
export {ColorSpaceModeType, IDeliveryColorSpaceActionModel};

src/qualifiers/colorSpace.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,21 @@
55
* @see Visit {@link Actions.Delivery.colorSpace|Delivery Color Space} for an example
66
*/
77

8+
import {ColorSpaceType} from "../types/types.js";
9+
810
/**
911
* @summary qualifier
1012
* @memberOf Qualifiers.ColorSpace
1113
*/
12-
function srgb(): string {
14+
function srgb(): ColorSpaceType {
1315
return 'srgb';
1416
}
1517

1618
/**
1719
* @summary qualifier
1820
* @memberOf Qualifiers.ColorSpace
1921
*/
20-
function trueColor(): string {
22+
function trueColor(): ColorSpaceType {
2123
return 'srgb:truecolor';
2224
}
2325

@@ -26,7 +28,7 @@ function trueColor(): string {
2628
* @summary qualifier
2729
* @memberOf Qualifiers.ColorSpace
2830
*/
29-
function tinySrgb(): string {
31+
function tinySrgb(): ColorSpaceType {
3032
return 'tinysrgb';
3133
}
3234

@@ -35,7 +37,7 @@ function tinySrgb(): string {
3537
* @summary qualifier
3638
* @memberOf Qualifiers.ColorSpace
3739
*/
38-
function cmyk(): string | number {
40+
function cmyk(): ColorSpaceType {
3941
return 'cmyk';
4042
}
4143

@@ -44,7 +46,7 @@ function cmyk(): string | number {
4446
* @summary qualifier
4547
* @memberOf Qualifiers.ColorSpace
4648
*/
47-
function noCmyk(): string {
49+
function noCmyk(): ColorSpaceType {
4850
return 'no_cmyk';
4951
}
5052

@@ -53,11 +55,11 @@ function noCmyk(): string {
5355
* @summary qualifier
5456
* @memberOf Qualifiers.ColorSpace
5557
*/
56-
function keepCmyk(): string {
58+
function keepCmyk(): ColorSpaceType {
5759
return 'keep_cmyk';
5860
}
5961

60-
const ColorSpace = {
62+
const ColorSpace: Record<string, ()=>ColorSpaceType> = {
6163
cmyk,
6264
keepCmyk,
6365
noCmyk,

0 commit comments

Comments
 (0)