Skip to content

Commit a46fe81

Browse files
committed
MC-3095: Display TypeScript errors within local build process
- Resolve mass converter errors
1 parent b22bff5 commit a46fe81

File tree

9 files changed

+75
-36
lines changed

9 files changed

+75
-36
lines changed

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/content-type-config.d.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ export interface ContentTypeConfigAppearanceInterface {
4141

4242
export interface DataMappingInterface {
4343
path: string;
44+
converters: ConverterInterface[];
4445
elements: {
4546
[key: string]: {
4647
style: DataMappingStyleInterface[];
@@ -52,6 +53,14 @@ export interface DataMappingInterface {
5253
};
5354
}
5455

56+
export interface ConverterInterface {
57+
name: string;
58+
component: string;
59+
config: {
60+
[key: string]: string;
61+
};
62+
}
63+
5564
export interface DataMappingStyleInterface {
5665
var?: string;
5766
name: string;

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/mass-converter/converter-interface.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,30 @@
66
/**
77
* @api
88
*/
9-
export interface ConverterInterface {
9+
export default interface ConverterInterface {
1010
/**
1111
* Process data after it's read and converted by element converters
1212
*
13-
* @param {object} data
14-
* @param {object} config
13+
* @param {ConverterDataInterface} data
14+
* @param {ConverterConfigInterface} config
1515
* @returns {object}
1616
*/
17-
fromDom(data: object, config: object): object;
17+
fromDom(data: ConverterDataInterface, config: ConverterConfigInterface): object;
1818

1919
/**
2020
* Process data before it's converted by element converters
2121
*
22-
* @param {object} data
23-
* @param {object} config
22+
* @param {ConverterDataInterface} data
23+
* @param {ConverterConfigInterface} config
2424
* @returns {object}
2525
*/
26-
toDom(data: object, config: object): object;
26+
toDom(data: ConverterDataInterface, config: ConverterConfigInterface): object;
27+
}
28+
29+
export interface ConverterDataInterface {
30+
[key: string]: any;
31+
}
32+
33+
export interface ConverterConfigInterface {
34+
[key: string]: any;
2735
}

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/mass-converter/converter-pool-factory.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ import ConverterPool from "./converter-pool";
1111
* Create a new instance of converter pool
1212
* @api
1313
*/
14-
export default function create(contentType: string): Promise<> {
14+
export default function create(contentType: string): Promise<typeof ConverterPool> {
1515
const config = Config.getContentTypeConfig(contentType);
16-
const converters = [];
17-
for (const appearanceName: string of Object.keys(config.appearances)) {
16+
const converters: string[] = [];
17+
let appearanceName: string;
18+
for (appearanceName of Object.keys(config.appearances)) {
1819
const dataMapping = config.appearances[appearanceName].data_mapping;
1920
if (undefined !== dataMapping && undefined !== dataMapping.converters) {
2021
for (const converterConfig of dataMapping.converters) {
@@ -25,7 +26,7 @@ export default function create(contentType: string): Promise<> {
2526
}
2627
}
2728

28-
return new Promise((resolve: (converterPool: object) => void) => {
29+
return new Promise((resolve: (converterPool: typeof ConverterPool) => void) => {
2930
loadModule(converters, (...loadedConverters: any[]) => {
3031
for (let i = 0; i < converters.length; i++) {
3132
ConverterPool.register(converters[i], new loadedConverters[i]());

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/mass-converter/converter-pool.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,26 @@ import ConverterInterface from "./converter-interface";
99
* @api
1010
*/
1111
class DataConverterPool {
12-
private converters: object = {};
12+
private converters: {
13+
[key: string]: ConverterInterface;
14+
} = {};
1315

16+
/**
17+
* Retrieve a data converter instance from the pool
18+
*
19+
* @param {string} name
20+
* @returns {ConverterInterface}
21+
*/
1422
public get(name: string): ConverterInterface {
15-
return this.converters[name] !== undefined ? this.converters[name] : false;
23+
return this.converters[name] !== undefined ? this.converters[name] : null;
1624
}
1725

26+
/**
27+
* Register a new data converter into the pool
28+
*
29+
* @param {string} name
30+
* @param {ConverterInterface} converter
31+
*/
1832
public register(name: string, converter: ConverterInterface) {
1933
this.converters[name] = converter;
2034
}

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/mass-converter/empty-mobile-image.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
* See COPYING.txt for license details.
44
*/
55

6-
import ConverterInterface from "./converter-interface";
6+
import ConverterInterface, {ConverterConfigInterface, ConverterDataInterface} from "./converter-interface";
77

88
export default class EmptyMobileImage implements ConverterInterface {
99
/**
1010
* Process data after it's read and converted by element converters
1111
*
12-
* @param {object} data
12+
* @param {ConverterDataInterface} data
1313
* @param {object} config
1414
* @returns {object}
1515
*/
16-
public fromDom(data: object, config: object): object {
16+
public fromDom(data: ConverterDataInterface, config: ConverterConfigInterface): object {
1717
const desktopImage = data[config.desktop_image_variable];
1818
const mobileImage = data[config.mobile_image_variable];
1919
if (mobileImage && desktopImage
@@ -28,11 +28,11 @@ export default class EmptyMobileImage implements ConverterInterface {
2828
/**
2929
* Process data before it's converted by element converters
3030
*
31-
* @param {object} data
31+
* @param {ConverterDataInterface} data
3232
* @param {object} config
3333
* @returns {object}
3434
*/
35-
public toDom(data: object, config: object): object {
35+
public toDom(data: ConverterDataInterface, config: ConverterConfigInterface): object {
3636
if (data[config.mobile_image_variable] === undefined
3737
|| data[config.mobile_image_variable][0] === undefined
3838
) {

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/mass-converter/preferred-color-format.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,18 @@
33
* See COPYING.txt for license details.
44
*/
55

6-
import tinycolor from "tinycolor";
7-
import ConverterInterface from "./converter-interface";
6+
import "tinycolor";
7+
import ConverterInterface, {ConverterConfigInterface, ConverterDataInterface} from "./converter-interface";
88

99
export default class PreferredColorFormat implements ConverterInterface {
1010
/**
1111
* Process data after it's read and converted by element converters
1212
*
13-
* @param {object} data
14-
* @param {object} config
13+
* @param {ConverterDataInterface} data
14+
* @param {ConverterConfigInterface} config
1515
* @returns {object}
1616
*/
17-
public fromDom(data: object, config: object): object {
17+
public fromDom(data: ConverterDataInterface, config: ConverterConfigInterface): object {
1818
if (data.background_color !== "") {
1919
data.background_color = tinycolor(data.background_color).toString(data.background_color_format);
2020
}
@@ -24,11 +24,11 @@ export default class PreferredColorFormat implements ConverterInterface {
2424
/**
2525
* Process data before it's converted by element converters
2626
*
27-
* @param {object} data
28-
* @param {object} config
27+
* @param {ConverterDataInterface} data
28+
* @param {ConverterConfigInterface} config
2929
* @returns {object}
3030
*/
31-
public toDom(data: object, config: object): object {
31+
public toDom(data: ConverterDataInterface, config: ConverterConfigInterface): object {
3232
data.background_color_format = tinycolor(data.background_color).getFormat();
3333
return data;
3434
}

app/code/Magento/PageBuilder/view/adminhtml/web/ts/js/mass-converter/widget-directive-abstract.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,20 @@
44
*/
55

66
import _ from "underscore";
7-
import ConverterInterface from "./converter-interface";
7+
import ConverterInterface, {ConverterConfigInterface, ConverterDataInterface} from "./converter-interface";
88

99
export default class WidgetDirectiveAbstract implements ConverterInterface {
1010
/**
1111
* Convert value to internal format
1212
*
13-
* @param {object} data
14-
* @param {object} config
13+
* @param {ConverterDataInterface} data
14+
* @param {ConverterConfigInterface} config
1515
* @returns {object}
1616
*/
17-
public fromDom(data: object, config: object): object {
17+
public fromDom(data: ConverterDataInterface, config: ConverterConfigInterface): object {
1818
let attributes: object = {};
1919

20-
data[config.html_variable].replace(/\{\{widget(.*?)\}\}/i, ((match, attributeString) => {
20+
data[config.html_variable].replace(/\{\{widget(.*?)\}\}/i, ((match: string, attributeString: string) => {
2121
attributes = this.parseAttributesString(attributeString);
2222
}).bind(this));
2323

@@ -27,11 +27,11 @@ export default class WidgetDirectiveAbstract implements ConverterInterface {
2727
/**
2828
* Convert value to knockout format
2929
*
30-
* @param {object} data
31-
* @param {object} config
30+
* @param {ConverterDataInterface} data
31+
* @param {ConverterConfigInterface} config
3232
* @returns {object}
3333
*/
34-
public toDom(data: object, config: object): object {
34+
public toDom(data: ConverterDataInterface, config: ConverterConfigInterface): object {
3535
data[config.html_variable] = this.buildDirective(data);
3636
return data;
3737
}
@@ -51,11 +51,13 @@ export default class WidgetDirectiveAbstract implements ConverterInterface {
5151
* @return {Object}
5252
*/
5353
protected parseAttributesString(attributes: string): object {
54-
const result = {};
54+
const result: {
55+
[key: string]: string;
56+
} = {};
5557

5658
attributes.replace(
5759
/(\w+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g,
58-
(match, key, value) => {
60+
(match: string, key: string, value: string) => {
5961
result[key] = value.replace(/&quote;/g, "\"");
6062
},
6163
);

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"@types/magento2": "https://github.com/magento/ts-types.git",
1717
"@types/requirejs": "^2.1.31",
1818
"@types/slick-carousel": "^1.6.32",
19+
"@types/tinycolor": "^1.1.27",
1920
"@types/underscore": "^1.8.1",
2021
"babel-cli": "^7.0.0-beta.3",
2122
"babel-core": "^7.0.0-beta.3",

yarn.lock

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@
5151
dependencies:
5252
"@types/jquery" "*"
5353

54+
"@types/tinycolor@^1.1.27":
55+
version "1.1.27"
56+
resolved "https://registry.yarnpkg.com/@types/tinycolor/-/tinycolor-1.1.27.tgz#d01d05a681d0ce28923b021d5f3d752ea0478089"
57+
5458
"@types/underscore@^1.8.1":
5559
version "1.8.4"
5660
resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.8.4.tgz#187da45fe08986d3be50f1aa58fd3d45726bf336"

0 commit comments

Comments
 (0)