From 5baafac8ada12a739ad5da223b6feb1f7e330e2c Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Mon, 15 Feb 2021 22:06:37 +0200 Subject: [PATCH] Make Chart static properties and methods read only (#8431) --- src/core/core.controller.js | 70 +++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 22 deletions(-) diff --git a/src/core/core.controller.js b/src/core/core.controller.js index 12c62afd4..83067af44 100644 --- a/src/core/core.controller.js +++ b/src/core/core.controller.js @@ -66,6 +66,12 @@ function getCanvas(item) { return item; } +const instances = {}; +const getChart = (key) => { + const canvas = getCanvas(key); + return Object.values(instances).filter((c) => c.canvas === canvas).pop(); +}; + class Chart { // eslint-disable-next-line max-statements @@ -74,7 +80,7 @@ class Chart { this.config = config = new Config(config); const initialCanvas = getCanvas(item); - const existingChart = Chart.getChart(initialCanvas); + const existingChart = getChart(initialCanvas); if (existingChart) { throw new Error( 'Canvas is already in use. Chart with ID \'' + existingChart.id + '\'' + @@ -118,7 +124,7 @@ class Chart { this.$context = undefined; // Add the chart instance to the global namespace - Chart.instances[me.id] = me; + instances[me.id] = me; if (!context || !canvas) { // The given item is not a compatible context2d element, let's return before finalizing @@ -840,7 +846,7 @@ class Chart { me.notifyPlugins('destroy'); - delete Chart.instances[me.id]; + delete instances[me.id]; } toBase64Image(...args) { @@ -1090,27 +1096,47 @@ class Chart { } } -// These are available to both, UMD and ESM packages -Chart.defaults = defaults; -Chart.instances = {}; -Chart.registry = registry; -Chart.version = version; - -Chart.getChart = (key) => { - const canvas = getCanvas(key); - return Object.values(Chart.instances).filter((c) => c.canvas === canvas).pop(); -}; - // @ts-ignore const invalidatePlugins = () => each(Chart.instances, (chart) => chart._plugins.invalidate()); -Chart.register = (...items) => { - registry.add(...items); - invalidatePlugins(); -}; -Chart.unregister = (...items) => { - registry.remove(...items); - invalidatePlugins(); -}; +const enumerable = true; + +// These are available to both, UMD and ESM packages. Read Only! +Object.defineProperties(Chart, { + defaults: { + enumerable, + value: defaults + }, + instances: { + enumerable, + value: instances + }, + registry: { + enumerable, + value: registry + }, + version: { + enumerable, + value: version + }, + getChart: { + enumerable, + value: getChart + }, + register: { + enumerable, + value: (...items) => { + registry.add(...items); + invalidatePlugins(); + } + }, + unregister: { + enumerable, + value: (...items) => { + registry.remove(...items); + invalidatePlugins(); + } + } +}); export default Chart;