plugins/RemoveDuplicatedStyles.js

/**
 * Plugin to remove duplicated styles (text/shape styles with the same name)
 *
 * @alias module:plugins.RemoveDuplicatedStyles
 * @example
 * sketch.use(new RemoveDuplicatedStyles());
 */
class RemoveDuplicatedStyles {
    run(sketch) {
        this.uniqueSharedStyles = new Map();
        this.uniqueTextStyles = new Map();
        this.duplicatedStyles = [];

        sketch.sharedStyles.forEach(style => {
            if (this.uniqueSharedStyles.has(style.name)) {
                this.duplicatedStyles.push(style);
            } else {
                this.uniqueSharedStyles.set(style.name, style);
            }
        });

        sketch.textStyles.forEach(style => {
            if (this.uniqueTextStyles.has(style.name)) {
                this.duplicatedStyles.push(style);
            } else {
                this.uniqueTextStyles.set(style.name, style);
            }
        });

        sketch.pages.forEach(page => {
            page.getAll('style', style => style.sharedStyle).forEach(style => {
                if (style.parent._class === 'text') {
                    style.sharedStyle = this.uniqueTextStyles.get(
                        style.sharedStyle.name
                    );
                } else {
                    style.sharedStyle = this.uniqueSharedStyles.get(
                        style.sharedStyle.name
                    );
                }
            });
        });

        this.duplicatedStyles.forEach(style => style.detach());

        return Promise.resolve();
    }
}

module.exports = RemoveDuplicatedStyles;