Upload index.html with huggingface_hub
Browse files- index.html +193 -17
index.html
CHANGED
|
@@ -1,19 +1,195 @@
|
|
| 1 |
<!doctype html>
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
</html>
|
|
|
|
| 1 |
<!doctype html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="utf-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
| 6 |
+
<title>Highcharts license 2026 — scan dependencies in your browser</title>
|
| 7 |
+
<meta name="description" content="This browser tool finds Highcharts references in project files, quotes the EULA clause, and provides an Apache ECharts replacement line.">
|
| 8 |
+
<style>
|
| 9 |
+
:root{color-scheme:light}body{margin:0;font:15px/1.55 system-ui,-apple-system,"Segoe UI",sans-serif;background:#faf9f5;color:#1a1512}
|
| 10 |
+
.wrap{max-width:960px;margin:0 auto;padding:28px 18px 60px}h1{font-size:26px;margin:0 0 6px}.lede{color:#4a403a;margin:0 0 16px}
|
| 11 |
+
textarea{width:100%;min-height:260px;font:13px/1.45 ui-monospace,Menlo,Consolas,monospace;padding:12px;border:1px solid #d9d0c4;border-radius:8px;box-sizing:border-box}
|
| 12 |
+
.bar{display:flex;gap:10px;align-items:center;margin:12px 0}button{font:600 15px system-ui;padding:10px 18px;border:0;border-radius:8px;background:#1a1512;color:#fff;cursor:pointer}
|
| 13 |
+
input[type=date]{font:14px system-ui;padding:8px;border:1px solid #d9d0c4;border-radius:6px}
|
| 14 |
+
table{border-collapse:collapse;width:100%;font-size:14px;margin-top:10px}th,td{text-align:left;padding:8px 10px;border-bottom:1px solid #eee;vertical-align:top}th{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:#7a6e65}
|
| 15 |
+
.sev.error{color:#a8551f;font-weight:700}.sev.warn,.sev.warning{color:#96691f}.ok{color:#2a6446;font-weight:600}.sum{font-weight:600}
|
| 16 |
+
.note{font-size:13px;color:#7a6e65;margin-top:18px}#paid{margin-top:22px;padding:14px 16px;border:1px solid #e2d8cb;border-radius:10px;background:#fffdfa}
|
| 17 |
+
</style>
|
| 18 |
+
<script data-grow-initializer="">!(function(){window.growMe||((window.growMe=function(e){window.growMe._.push(e);}),(window.growMe._=[]));var e=document.createElement("script");(e.type="text/javascript"),(e.src="https://faves.grow.me/main.js"),(e.defer=!0),e.setAttribute("data-grow-faves-site-id","U2l0ZTphZjljMzgyMC0yMmU5LTRhYjgtYTIxNS03OTRhMGY1N2ExYzM=");var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t);})();</script>
|
| 19 |
+
<style data-yj-mfit="1">#out{max-width:100%}#out td,#out th{overflow-wrap:break-word}#out th{white-space:nowrap}#out pre{white-space:pre-wrap;overflow-wrap:anywhere}#out code{white-space:pre-wrap;overflow-wrap:break-word}@media (max-width:640px){#out td,#out th{overflow-wrap:anywhere}#out th{white-space:normal}table{display:block;max-width:100%;overflow-x:auto}pre{max-width:100%;overflow-x:auto}code,a{overflow-wrap:anywhere}img,svg,video,canvas,iframe{max-width:100%}textarea,input,select{max-width:100%;box-sizing:border-box}.yj-lgbar{position:static!important;justify-content:flex-end;margin:0 0 10px}h1,h2,h3,h4,p,li,dd,dt,blockquote,figcaption,summary,label,.res,.lead{overflow-wrap:anywhere}label{max-width:100%;box-sizing:border-box}#out table:not(:has(tr>:nth-child(4))){display:table;table-layout:fixed;width:100%}#out table:has(tr>:nth-child(4)),#out table:has(tr>:nth-child(4)) tbody,#out table:has(tr>:nth-child(4)) tr,#out table:has(tr>:nth-child(4)) td{display:block;width:auto;overflow:visible}#out table:has(tr>:nth-child(4)) thead{display:none}#out table:has(tr>:nth-child(4)) tr{padding:10px 0;border-bottom:1px solid rgba(128,128,128,.28)}#out table:has(tr>:nth-child(4)) td{border:0;padding:1px 0}#out table:has(tr>:nth-child(4)) td:nth-child(-n+3){display:inline-block;margin-right:10px;font-size:12px;opacity:.78}}</style>
|
| 20 |
+
<!--yj-canon-s101--><link rel="canonical" href="https://getreadystack.com/tools/apache-echarts-migration-check"><!--yj-trust-org-s191--><script type="application/ld+json" data-yj="yj-trust-org">{"@context": "https://schema.org", "@type": "Organization", "name": "ReadyStack", "url": "https://getreadystack.com/", "logo": "https://getreadystack.com/branding/readystack_profile.png", "email": "support@getreadystack.com", "contactPoint": {"@type": "ContactPoint", "contactType": "customer support", "email": "support@getreadystack.com", "availableLanguage": ["English", "German", "Japanese", "Spanish", "Portuguese"]}}</script><!--/yj-trust-org-s191--></head>
|
| 21 |
+
<body>
|
| 22 |
+
<div class="wrap">
|
| 23 |
+
<h1>Highcharts license 2026 — scan dependencies in your browser</h1><p data-yj-lw-link="1" style="margin:.4rem 0 1rem;padding:.55rem .8rem;border-left:3px solid #b7791f;background:#fff8e6;font-size:.95rem">Part of <a href="/license-watch?ref=lw_tool">License & Price Change Watch</a> — every vendor licence and price change we check, with the dates, and one free email the day a vendor changes terms.</p>
|
| 24 |
+
<p class="lede">Finds every Highcharts package, NuGet reference, import and CDN tag in package.json, .csproj, HTML or JS/TS, quotes the EULA clause and gives the exact Apache ECharts line that replaces it. Runs entirely in your browser — nothing is uploaded.</p>
|
| 25 |
+
<textarea id="src" spellcheck="false">{
|
| 26 |
+
"name": "ops-dashboard",
|
| 27 |
+
"version": "2.4.0",
|
| 28 |
+
"private": true,
|
| 29 |
+
"dependencies": {
|
| 30 |
+
"highcharts": "^12.1.2",
|
| 31 |
+
"highcharts-react-official": "^3.2.1",
|
| 32 |
+
"@highcharts/dashboards": "^3.1.0",
|
| 33 |
+
"@highcharts/map-collection": "^2.3.0",
|
| 34 |
+
"react": "^18.3.1",
|
| 35 |
+
"react-dom": "^18.3.1"
|
| 36 |
+
},
|
| 37 |
+
"devDependencies": {
|
| 38 |
+
"@types/highcharts": "^7.0.0",
|
| 39 |
+
"highcharts-export-server": "^4.0.2",
|
| 40 |
+
"typescript": "^5.6.3"
|
| 41 |
+
}
|
| 42 |
+
}</textarea>
|
| 43 |
+
<div class="bar"><button id="go">Check</button><label>as of <input type="date" id="today"></label></div>
|
| 44 |
+
<div id="out" aria-live="polite"></div>
|
| 45 |
+
<div id="paid"><strong>Free here:</strong> Map every Highcharts dependency, import and CDN tag in the open file to the exact Apache ECharts line that replaces it, with file, line and EULA clause.. <strong>In the editor:</strong> Whole-workspace migration plan, a dated Highcharts licence-exposure report for the company, a team key and a CI gate that fails a build adding new Highcharts use. — that part asks for a licence key.</div>
|
| 46 |
+
<p class="note">Same engine as the VS Code extension, byte for byte.</p>
|
| 47 |
+
</div>
|
| 48 |
+
<script>var ECM_RULES = [
|
| 49 |
+
{"id": "npm-highcharts", "sev": "error", "kind": "npm", "name": "highcharts", "replace": "\"echarts\": \"^6.1.0\"", "note": "Apache-2.0. Port each chart's options object to an ECharts option (series, xAxis, yAxis, tooltip)."},
|
| 50 |
+
{"id": "npm-highcharts-react-official", "sev": "error", "kind": "npm", "name": "highcharts-react-official", "replace": "\"echarts-for-react\": \"^3.0.6\"", "note": "The wrapper itself is MIT, but it renders through the highcharts package, which the EULA covers. echarts-for-react is MIT."},
|
| 51 |
+
{"id": "npm-highcharts-angular", "sev": "error", "kind": "npm", "name": "highcharts-angular", "replace": "\"ngx-echarts\": \"^22.0.0\"", "note": "The wrapper is MIT, but it renders through the highcharts package. ngx-echarts is MIT."},
|
| 52 |
+
{"id": "npm-angular-highcharts", "sev": "error", "kind": "npm", "name": "angular-highcharts", "replace": "\"ngx-echarts\": \"^22.0.0\"", "note": "Third-party MIT wrapper; the charts still come from the highcharts package. ngx-echarts is MIT."},
|
| 53 |
+
{"id": "npm-highcharts-vue", "sev": "error", "kind": "npm", "name": "highcharts-vue", "replace": "\"vue-echarts\": \"^8.3.2\"", "note": "highcharts-vue points to Highsoft's own licence file. vue-echarts is MIT."},
|
| 54 |
+
{"id": "npm-highcharts-dashboards", "sev": "error", "kind": "npm", "name": "@highcharts/dashboards", "replace": "\"echarts\": \"^6.1.0\"", "note": "Published under https://www.highcharts.com/license. ECharts has no dashboard layout package: place one echarts instance per cell of your own CSS grid."},
|
| 55 |
+
{"id": "npm-highcharts-export-server", "sev": "warning", "kind": "npm", "name": "highcharts-export-server", "replace": "echarts.init(null, null, { renderer: 'svg', ssr: true, width: 800, height: 400 }) then chart.renderToSVGString()", "note": "The export server is MIT but renders with the highcharts package. ECharts renders SVG on the server in Node without a browser."},
|
| 56 |
+
{"id": "npm-highcharts-map-collection", "sev": "warning", "kind": "npm", "name": "@highcharts/map-collection", "replace": "echarts.registerMap('world', geoJson)", "note": "Map data ships under Highsoft's licence file. Load a GeoJSON file you are licensed to use and register it with ECharts."},
|
| 57 |
+
{"id": "npm-types-highcharts", "sev": "info", "kind": "npm", "name": "@types/highcharts", "replace": "remove this line", "note": "A deprecated stub: highcharts ships its own types, and so does echarts."},
|
| 58 |
+
{"id": "npm-highcharts-grid-lite", "sev": "info", "kind": "npm", "name": "@highcharts/grid-lite", "replace": "keep, after reading the Grid Lite EULA", "note": "The Highcharts EULA says Grid Lite is governed by its own Grid Lite EULA, not by the Highcharts one. It is not a chart and has no ECharts counterpart."},
|
| 59 |
+
{"id": "nuget-highsoft-highcharts", "sev": "error", "kind": "nuget", "name": "Highsoft.Highcharts", "replace": "\u003cscript src=\"https://cdn.jsdelivr.net/npm/echarts@6.1.0/dist/echarts.min.js\"\u003e\u003c/script\u003e", "note": "There is no Apache .NET package for ECharts. Remove the PackageReference and render the chart in the page from JSON your controller returns."},
|
| 60 |
+
{"id": "nuget-highsoft-highstock", "sev": "error", "kind": "nuget", "name": "Highsoft.Highstock", "replace": "\u003cscript src=\"https://cdn.jsdelivr.net/npm/echarts@6.1.0/dist/echarts.min.js\"\u003e\u003c/script\u003e", "note": "Stock charts in ECharts are candlestick series plus dataZoom. Remove the PackageReference and render in the page."},
|
| 61 |
+
{"id": "cdn-code-highcharts-com", "sev": "error", "kind": "cdn", "name": "code.highcharts.com", "replace": "\u003cscript src=\"https://cdn.jsdelivr.net/npm/echarts@6.1.0/dist/echarts.min.js\"\u003e\u003c/script\u003e", "note": "EULA 2.3: Highsoft may log CDN traffic, verify domains and crawl public sites to find unlicensed use."},
|
| 62 |
+
{"id": "import-highcharts", "sev": "error", "kind": "import", "name": "highcharts", "replace": "import * as echarts from 'echarts';", "note": "Covers highcharts, highcharts/highstock and highcharts/modules/* imports or require() calls."}
|
| 63 |
+
]
|
| 64 |
+
;</script>
|
| 65 |
+
<script>/* Apache ECharts migration map: finds Highcharts in package.json, .csproj, HTML and JS/TS
|
| 66 |
+
and gives the exact Apache ECharts line that replaces each one. Same file runs in node and the browser. */
|
| 67 |
+
(function () {
|
| 68 |
+
var RULES = (typeof module !== 'undefined') ? require('./rules.json') : window.ECM_RULES;
|
| 69 |
+
var DEP_KEYS = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'];
|
| 70 |
+
var EULA = 'Highcharts EULA 1.4: any use within a company, for clients or in internal operations needs a separate Commercial Use License.';
|
| 71 |
+
|
| 72 |
+
function lineOf(text, idx) { return text.slice(0, idx).split('\n').length; }
|
| 73 |
+
function esc(s) { return s.replace(/[.*+?^${}()|[\]\\\/]/g, '\\$&'); }
|
| 74 |
+
function msg(r, found) { return found + ' → ' + r.replace + ' — ' + r.note + (r.sev === 'info' ? '' : ' ' + EULA); }
|
| 75 |
+
|
| 76 |
+
function checkPackageJson(text, pkg, out) {
|
| 77 |
+
var seen = {};
|
| 78 |
+
RULES.forEach(function (r) {
|
| 79 |
+
if (r.kind !== 'npm') return;
|
| 80 |
+
DEP_KEYS.forEach(function (k) {
|
| 81 |
+
var deps = pkg[k];
|
| 82 |
+
if (!deps || typeof deps !== 'object' || !(r.name in deps) || seen[r.name + k]) return;
|
| 83 |
+
seen[r.name + k] = 1;
|
| 84 |
+
var m = new RegExp('"' + esc(r.name) + '"\\s*:').exec(text);
|
| 85 |
+
out.push({ check: r.id, sev: r.sev, line: m ? lineOf(text, m.index) : 1,
|
| 86 |
+
msg: msg(r, '"' + r.name + '": "' + deps[r.name] + '" in ' + k) });
|
| 87 |
+
});
|
| 88 |
+
});
|
| 89 |
+
}
|
| 90 |
+
|
| 91 |
+
function scan(text, out) {
|
| 92 |
+
var lines = text.split('\n');
|
| 93 |
+
lines.forEach(function (raw, i) {
|
| 94 |
+
var ln = raw.replace(/\s+/g, ' ');
|
| 95 |
+
RULES.forEach(function (r) {
|
| 96 |
+
var m = null;
|
| 97 |
+
if (r.kind === 'nuget') {
|
| 98 |
+
m = new RegExp('<PackageReference[^>]*Include\\s*=\\s*"' + esc(r.name) + '"[^>]*?(Version\\s*=\\s*"([^"]+)")?', 'i').exec(ln);
|
| 99 |
+
if (m) out.push({ check: r.id, sev: r.sev, line: i + 1, msg: msg(r, 'PackageReference ' + r.name + (m[2] ? ' ' + m[2] : '')) });
|
| 100 |
+
} else if (r.kind === 'cdn') {
|
| 101 |
+
m = /<script[^>]*src\s*=\s*["']([^"']*code\.highcharts\.com[^"']*)["']/i.exec(ln);
|
| 102 |
+
if (m) out.push({ check: r.id, sev: r.sev, line: i + 1, msg: msg(r, '<script src="' + m[1] + '">') });
|
| 103 |
+
} else if (r.kind === 'import') {
|
| 104 |
+
m = /(?:\bfrom\s*|\brequire\s*\(\s*|\bimport\s*)['"](highcharts(?:\/[\w\-\/.]+)?)['"]/.exec(ln);
|
| 105 |
+
if (m) out.push({ check: r.id, sev: r.sev, line: i + 1, msg: msg(r, "'" + m[1] + "'") });
|
| 106 |
+
}
|
| 107 |
+
});
|
| 108 |
+
});
|
| 109 |
+
}
|
| 110 |
+
|
| 111 |
+
function check(text, opts) {
|
| 112 |
+
text = String(text || '').replace(/\r\n?/g, '\n');
|
| 113 |
+
var out = [], pkg = null, t = text.trim();
|
| 114 |
+
if (t.charAt(0) === '{') { try { pkg = JSON.parse(t); } catch (e) { pkg = null; } }
|
| 115 |
+
if (pkg && typeof pkg === 'object') checkPackageJson(text, pkg, out);
|
| 116 |
+
else scan(text, out);
|
| 117 |
+
out.sort(function (a, b) { return a.line - b.line; });
|
| 118 |
+
return { findings: out, today: (opts && opts.today) || '' };
|
| 119 |
+
}
|
| 120 |
+
|
| 121 |
+
var api = { engine: { check: check }, RULES: RULES, RULE_COUNT: RULES.length };
|
| 122 |
+
if (typeof module !== 'undefined' && module.exports) module.exports = api;
|
| 123 |
+
if (typeof window !== 'undefined') window.ECMENGINE = api;
|
| 124 |
+
})();
|
| 125 |
+
</script>
|
| 126 |
+
<script>// ⛔뼈대 — kit/scaffold.py 가 찍는다 (s143). findings [{check,sev,msg,line?}] → 글/HTML. 같은 파일이 Node 와 브라우저에서 산다.
|
| 127 |
+
'use strict';
|
| 128 |
+
function escapeHtml(s) { return String(s == null ? '' : s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"'); }
|
| 129 |
+
function summaryLine(res) {
|
| 130 |
+
const f = (res && res.findings) || []; const e = f.filter(function (x) { return String(x.sev || 'error').toLowerCase().startsWith('err'); }).length;
|
| 131 |
+
return f.length ? (f.length + ' finding' + (f.length === 1 ? '' : 's') + ' (' + e + ' error' + (e === 1 ? '' : 's') + ')') : 'Clean — no findings.';
|
| 132 |
+
}
|
| 133 |
+
function toText(res, label) {
|
| 134 |
+
const f = (res && res.findings) || [];
|
| 135 |
+
const lines = ['== ' + (label || '') + ' — ' + summaryLine(res)];
|
| 136 |
+
f.forEach(function (x) { lines.push(' ' + String(x.sev || 'error').toUpperCase().slice(0, 4) + ' ' + (x.line ? 'L' + x.line + ' ' : '') + (x.check || x.id || '') + ' ' + (x.msg || x.message || '')); });
|
| 137 |
+
return lines.join('\n');
|
| 138 |
+
}
|
| 139 |
+
function toHtml(res) {
|
| 140 |
+
const f = (res && res.findings) || [];
|
| 141 |
+
if (!f.length) return '<p class="ok">' + escapeHtml(summaryLine(res)) + '</p>';
|
| 142 |
+
const rows = f.map(function (x) { return '<tr><td class="sev ' + escapeHtml(String(x.sev || 'error')) + '">' + escapeHtml(String(x.sev || 'error')) + '</td><td>' + (x.line ? 'L' + escapeHtml(x.line) : '') + '</td><td><code>' + escapeHtml(x.check || x.id || '') + '</code></td><td>' + escapeHtml(x.msg || x.message || '') + '</td></tr>'; }).join('');
|
| 143 |
+
return '<p class="sum">' + escapeHtml(summaryLine(res)) + '</p><table><thead><tr><th>Level</th><th>Line</th><th>Check</th><th>What</th></tr></thead><tbody>' + rows + '</tbody></table>';
|
| 144 |
+
}
|
| 145 |
+
var ECMREPORT = { escapeHtml: escapeHtml, summaryLine: summaryLine, toText: toText, toHtml: toHtml };
|
| 146 |
+
if (typeof module !== 'undefined' && module.exports) module.exports = ECMREPORT;
|
| 147 |
+
else window.ECMREPORT = ECMREPORT;
|
| 148 |
+
</script>
|
| 149 |
+
<script>
|
| 150 |
+
(function(){
|
| 151 |
+
var src=document.getElementById('src'), out=document.getElementById('out'), go=document.getElementById('go'), today=document.getElementById('today');
|
| 152 |
+
today.value=new Date().toISOString().slice(0,10);
|
| 153 |
+
function run(){ try { var res=window.ECMENGINE.engine.check(src.value,{today:today.value}); out.innerHTML=window.ECMREPORT.toHtml(res); } catch(e){ out.innerHTML='<p class="sev error">Could not run: '+String(e.message||e)+'</p>'; } }
|
| 154 |
+
go.onclick=run; if (src.value.trim()) run();
|
| 155 |
+
})();
|
| 156 |
+
</script>
|
| 157 |
+
|
| 158 |
+
|
| 159 |
+
<section data-yj-install="free" style="margin:2rem auto 1rem;max-width:46rem;padding:1.25rem 1.25rem;border:1px solid #cfe3d6;border-radius:12px;background:#f6fbf8;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .4rem;font-size:1.2rem">Install free</h2><p style="margin:0 0 .8rem;color:#41505f">Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.</p><a href="https://marketplace.visualstudio.com/items?itemName=ReadyStack.apache-echarts-migration-check" rel="noopener" data-yj-install-door="mp" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'apache-echarts-migration-check',src:'mp',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">VS Code Marketplace</a><a href="https://open-vsx.org/extension/readystack/apache-echarts-migration-check" rel="noopener" data-yj-install-door="ovsx" onclick="try{navigator.sendBeacon('/api/ev',new Blob([JSON.stringify({t:'install',slug:'apache-echarts-migration-check',src:'ovsx',path:location.pathname})],{type:'application/json'}))}catch(e){}" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">Open VSX (Cursor, VSCodium)</a><pre style="margin:.5rem 0 0;padding:.6rem .8rem;background:#f3f5f8;border-radius:8px;font-size:.9rem;overflow:auto">ext install ReadyStack.apache-echarts-migration-check</pre><p style="margin:.6rem 0 0;font-size:.92rem;color:#41505f"><a href="https://getreadystack.com/api/buy/team" rel="nofollow" style="color:#0f7b3f;text-decoration:underline">Team? One key for every ReadyStack linter, 5 seats, $149 once</a></p></section>
|
| 160 |
+
<section data-yj-alert="rule" style="margin:1rem auto 1.5rem;max-width:46rem;padding:1.1rem 1.25rem;border:1px solid #d9dee6;border-radius:12px;background:#fbfcfd;font:15px/1.55 system-ui,-apple-system,Segoe UI,sans-serif"><b style="font-size:1.05rem">Get one email when this rule changes</b><div style="opacity:.78;margin:.35rem 0 .8rem">We watch the regulation and vendor sources behind Apache ECharts Migration: Highcharts Licence Map every day. When a rule changes, you get a single email with what changed and the updated check. No newsletter.</div><div style="display:flex;gap:8px;flex-wrap:wrap"><input id="yjae" type="email" placeholder="you@example.com" style="flex:1;min-width:210px;padding:11px 13px;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:#fff;color:inherit"><button id="yjab" style="padding:11px 18px;border-radius:8px;border:0;cursor:pointer;background:#0f7b3f;color:#fff;font:600 15px system-ui,sans-serif">Notify me</button></div><div id="yjao" hidden style="margin-top:.6rem;color:#0f7b3f">You're on the list. One email when it changes.</div><script>(function(){var b=document.getElementById("yjab"),e=document.getElementById("yjae");if(!b||!e)return;b.addEventListener("click",function(){var v=e.value.trim();if(!/.+@.+\..+/.test(v))return;try{localStorage.setItem("yj_em","1");}catch(_){}fetch(location.origin+"/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:v,slug:"apache-echarts-migration-check",lang:"en",source:"rule_alert"+((b.closest&&b.closest("section")&&b.closest("section").getAttribute("data-yj-moved"))?"_at_result":"")})}).then(function(r){var o=document.getElementById("yjao");o.hidden=false;if(!r.ok){o.textContent="Could not save - please try again.";}}).catch(function(){var o=document.getElementById("yjao");o.hidden=false;o.textContent="Could not save - please try again.";});});})();</script><script>(function(){var e=document.getElementById("yjae"),s=e&&e.closest?e.closest("section"):null,o=document.getElementById("out");if(!s||!o)return;var d=false;function mv(ev){if(d)return;if(ev&&ev.target&&s.contains(ev.target))return;d=true;var b=o;while(b.parentNode&&b.parentNode!==document.body&&b.parentNode.tagName!=="MAIN"&&b.parentNode.tagName!=="ARTICLE")b=b.parentNode;if(!b.parentNode||b===s||b.contains(s))return;try{b.parentNode.insertBefore(s,b.nextSibling);s.setAttribute("data-yj-moved","1");}catch(_){}}document.addEventListener("input",mv,true);document.addEventListener("change",mv,true);document.addEventListener("click",function(ev){var b=ev.target&&ev.target.closest?ev.target.closest("button,input[type=submit]"):null;if(b&&!b.closest("[data-yj],[data-yj-cta],[data-yj-install],[data-yj-alert],.yj-find,.yj-related,#yj-ask,.yjp"))mv(ev);},true);})();</script></section>
|
| 161 |
+
|
| 162 |
+
<section data-yj-cta="paid" style="margin:3rem auto;max-width:46rem;padding:1.5rem 1.25rem;border:1px solid #d8dee9;border-radius:12px;background:#fbfcfe;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .5rem;font-size:1.25rem">Get the full version <span class="yj-price">$29</span></h2><p class="yj-cta-paid" style="margin:.25rem 0 .6rem;color:#1f2a37">Whole-workspace migration plan, dated Highcharts licence-exposure report, team keys and a CI gate that fails builds adding new Highcharts use.</p><p class="yj-cta-pay" style="margin:.25rem 0 1rem;color:#5b6b7c;font-size:.94rem">One payment, one licence key for this tool. The key is shown right after payment.</p><p class="yj-cta-anchor" style="margin:0 0 1rem;color:#5b6b7c;font-size:.94rem">Apache ECharts is Apache-2.0: 0 dollars in licence fees. Highsoft sells the Highcharts Commercial Use License separately (EULA 1.4).</p><a href="https://getreadystack.com/api/buy/cl/polar_cl_vtDa8PLZhqPFIpAasxVENVUYjSYLaKwwLbuln0bufQv" rel="nofollow" style="display:inline-block;padding:.7rem 1.3rem;border-radius:8px;background:#1b64f2;color:#fff;text-decoration:none;font-weight:600">Buy the full version — $29</a></section><!--yj-trust-strip-s191--><aside data-yj="yj-trust-strip" style="max-width:46rem;margin:-1.8rem auto 2.4rem;padding:.9rem 1.2rem;border:1px solid #d8dee9;border-radius:12px;background:#f6f8fb;font:14.5px/1.55 system-ui,-apple-system,Segoe UI,sans-serif;color:#2b3640"><p style="margin:0 0 .3rem;font-weight:600">Buying here, plainly</p><ul style="margin:0;padding-left:1.2rem"><li style="margin:.25rem 0">Payment runs on Whop’s checkout: your card details go to Whop, not to us, and Whop emails you the receipt.</li><li style="margin:.25rem 0">Your licence key shows on the next page right after payment and stays in your Whop account (Your purchases).</li><li style="margin:.25rem 0">Chose a subscription? Cancel any time in your Whop account (Orders → Cancel membership); access lasts until the end of the period you paid.</li><li style="margin:.25rem 0">Your inputs are calculated in your browser and are not sent to us (unless you ask for the result by email).</li><li style="margin:.25rem 0">Questions before buying? support@getreadystack.com — we answer within 2 business days.</li></ul></aside><!--/yj-trust-strip-s191-->
|
| 163 |
+
|
| 164 |
+
|
| 165 |
+
|
| 166 |
+
|
| 167 |
+
|
| 168 |
+
<!--yj-embed-s178--><details id="embed" data-yj="yj-embed" style="max-width:46rem;margin:1.6rem auto;padding:.85rem 1.1rem;border:1px solid #8884;border-radius:10px"><summary style="cursor:pointer;font-weight:600">Embed this tool on your site (free)</summary><p style="margin:.6rem 0;opacity:.85">Paste this code into your page. It runs in your visitor’s browser and stays up to date. Nothing your visitors type is stored.</p><textarea readonly rows="6" style="width:100%;font:12px/1.4 ui-monospace,Menlo,Consolas,monospace;border:1px solid #8886;border-radius:7px;padding:.5rem"><iframe src="https://getreadystack.com/embed/apache-echarts-migration-check/" title="Apache ECharts Migration: Highcharts Licence Map — free online check" loading="lazy" data-rs-embed="en-apache-echarts-migration-check" style="width:100%;max-width:760px;height:640px;border:1px solid #e3e3e3;border-radius:10px"></iframe>
|
| 169 |
+
<p style="font-size:13px;margin:6px 0 0"><a href="https://getreadystack.com/tools/apache-echarts-migration-check">Apache ECharts Migration: Highcharts Licence Map — free online check</a> by <a href="https://getreadystack.com/">ReadyStack</a></p>
|
| 170 |
+
<script>window.addEventListener("message",function(e){if(e.origin!=="https://getreadystack.com"||!e.data||e.data.type!=="readystack-embed")return;var f=document.querySelectorAll("iframe[data-rs-embed]");for(var i=0;i<f.length;i++){if(f[i].contentWindow===e.source)f[i].style.height=Math.min(e.data.h+6,8000)+"px";}});</script></textarea><p style="margin:.5rem 0 0"><button type="button" data-yj="yj-embed-copy" style="font:inherit;padding:8px 14px;border:1px solid #8884;border-radius:9px;background:transparent;cursor:pointer">Copy code</button> <a href="/embed/">All embeddable tools</a></p><p style="margin:.7rem 0 0;font-size:.92em;opacity:.9">For businesses: your name and logo instead of ours, and each visitor’s result + e-mail in your inbox (only when they tick consent) — Pro from $19/month. <a href="/embed/pro/?ref=embed_box">See Pro →</a></p></details><script data-yj="yj-embed">(function(){var b=document.querySelector("[data-yj=yj-embed-copy]");if(!b)return;var t=b.textContent;b.addEventListener("click",function(){var a=b.closest("details").querySelector("textarea");var v=a.value;function d(){b.textContent="Copied";setTimeout(function(){b.textContent=t;},1800);}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(v).then(d,function(){a.select();});}else{a.select();}});})();</script><!--yj-share-s101--><div style="margin:28px 0 8px;text-align:center"><button id="yjcp" type="button" style="font:inherit;padding:10px 18px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Copy link</button><button id="yjimg" type="button" style="font:inherit;padding:10px 18px;margin-left:8px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Save result as image</button></div><script>(function(){var b=document.getElementById("yjimg");if(!b)return;b.addEventListener("click",function(){var o=document.getElementById("out");var txt=(o&&(o.innerText||o.textContent)||"").trim();if(!txt){b.textContent="(no result yet)";setTimeout(function(){b.textContent="Save result as image";},1500);return;}var lines=txt.split(String.fromCharCode(10)).filter(function(x){return x.trim();}).slice(0,10);var W=1200,P=56,c=document.createElement("canvas");c.width=W;var lh=38,H=P*2+70+lines.length*lh+60;c.height=H;var x=c.getContext("2d");x.fillStyle="#1a1512";x.fillRect(0,0,W,H);x.fillStyle="#f3e9d2";x.font="600 34px system-ui,Segoe UI,Arial";var t=(document.title||"").split("|")[0].trim();x.fillText(t.slice(0,54),P,P+34);x.font="22px ui-monospace,Menlo,Consolas,monospace";x.fillStyle="#e8dcc4";for(var i=0;i<lines.length;i++){x.fillText(lines[i].slice(0,88),P,P+70+i*lh+22);}x.font="600 22px system-ui,Segoe UI,Arial";x.fillStyle="#c9a227";var d=location.hostname.replace("www.","");x.fillText(d,W-P-x.measureText(d).width,H-P+6);c.toBlob(function(bl){var u=URL.createObjectURL(bl),a=document.createElement("a");a.href=u;a.download=(t||"result").replace(/[^a-z0-9]+/gi,"-").toLowerCase()+"-"+d+".png";document.body.appendChild(a);a.click();setTimeout(function(){URL.revokeObjectURL(u);a.remove();},2000);},"image/png");});})();</script><script>(function(){var b=document.getElementById("yjcp");if(!b)return;var t=b.textContent;b.addEventListener("click",function(){var u=location.href.split("#")[0];function d(){b.textContent="Link copied";setTimeout(function(){b.textContent=t;},1800);}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(u).then(d,function(){prompt("",u);});}else{prompt("",u);}});})();</script>
|
| 171 |
+
<script data-yj="yj-view-beacon">(function(){try{var p=location.pathname;var k='yjv:'+p;if(sessionStorage.getItem(k))return;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",ref:(document.referrer||''),src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}catch(e){}})();</script>
|
| 172 |
+
|
| 173 |
+
<script data-yj="yj-use-beacon">(function(){try{var o=document.getElementById('out');if(!o)return;var p=location.pathname,k='yju:'+p,sent=false;function fire(){if(sent||sessionStorage.getItem(k))return;if(!(o.textContent||'').replace(/\s+/g,'').length)return;sent=true;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",t:'use',src:(function(){try{return (new URLSearchParams(location.search).get('ref')||'').replace(/[^a-z_]/g,'').slice(0,12)}catch(e){return ''}})()})}).catch(function(){});}var mo=new MutationObserver(function(){fire();if(sent)mo.disconnect();});mo.observe(o,{childList:true,characterData:true,subtree:true});}catch(e){}})();</script>
|
| 174 |
+
|
| 175 |
+
<script data-yj="yj-prefill-s181 v1">(function(){try{var q=new URLSearchParams(location.search);if(!q.toString())return;var P={"R": {"employee": ["employee|w-?2\\b|arbeitnehmer|angestellt|会社員|従業員|給与所得|trabajador|asalariad|empregad|clt\\b|salari", "Employee"], "self": ["self-?employ|freelanc|sole (trader|prop)|selbst(ä|ae)ndig|freiberuf|個人事業|フリーランス|aut(ó|o)nom|\\bmei\\b", "Freelancer / self-employed"], "landlord": ["landlord|rental|vermiet|大家|不動産|arrendador|alquiler|locador|aluguel", "Landlord"], "investor": ["invest|trader|anleger|投資|inversor|investidor", "Investor / trader"], "employer": ["employer|arbeitgeber|雇用主|事業主|empleador|empregador", "Employer"], "seller": ["seller|online shop|h(ä|ae)ndler|販売|vendedor|e-?commerce", "Online seller"]}, "C": {"US": "^(us|usa)$|united states|estados unidos|vereinigte staaten|アメリカ|米国", "UK": "^(uk|gb)$|united kingdom|great britain|reino unido|vereinigtes k|イギリス|英国", "DE": "^de$|germany|deutschland|alemania|alemanha|ドイツ", "JP": "^jp$|japan|jap(ó|ã|o)n?|日本", "ES": "^es$|spain|españa|espana|espanha|spanien|スペイン", "BR": "^br$|brazil|brasil|ブラジル"}, "B": "your 2027 dates", "L": "en"};function ours(el){return !!(el&&el.closest&&el.closest("[data-yj],[data-yj-cta],[data-yj-cal],.yj-email-gate,.yj-find,.yj-related,#yj-ask,#yjgo,#yjr,header,footer,nav"));}function fields(){var r=document.querySelector("main")||document.body;return [].filter.call(r.querySelectorAll("input,select,textarea"),function(el){var t=(el.type||"").toLowerCase();return !ours(el)&&!el.disabled&&["email","hidden","search","password","file","submit","button","reset","image"].indexOf(t)<0;});}function key(el){return el.getAttribute("data-k")||el.id||el.name||"";}function fire(el){["input","change"].forEach(function(n){try{el.dispatchEvent(new Event(n,{bubbles:true}))}catch(e){}});}function setv(el,v){v=String(v).slice(0,80);var t=(el.type||"").toLowerCase(),tg=el.tagName;if(tg=="SELECT"){var o=[].filter.call(el.options,function(o){return o.value==v||o.text.trim()==v})[0];if(!o)return false;el.value=o.value;}else if(t=="checkbox"||t=="radio"){if(!/^(1|0|true|false|on|off|yes|no)$/i.test(v))return false;el.checked=/^(1|true|on|yes)$/i.test(v);}else if(t=="number"||t=="range"){var n=parseFloat(v.replace(/\s/g,"").replace(",","."));if(!isFinite(n))return false;el.value=String(n);}else if(t=="date"){if(!/^\d{4}-\d{2}-\d{2}$/.test(v))return false;el.value=v;}else{if(/[<>]/.test(v))return false;el.value=v;}fire(el);return true;}function pick(el,rx){if(el.tagName!="SELECT")return false;var re=new RegExp(rx,"i");var o=[].filter.call(el.options,function(o){return re.test(o.value)||re.test(o.text)})[0];if(!o||el.value==o.value)return false;el.value=o.value;fire(el);return true;}function run(){var F=fields(),done={},n=0;q.forEach(function(v,k){if(n>=20||/^(ref|role|cc|utm_.*|fbclid|gclid)$/.test(k)||!/^[A-Za-z0-9_-]{1,40}$/.test(k))return;F.forEach(function(el){if(key(el)===k&&!done[k]&&setv(el,v)){done[k]=1;n++;}});});var cc=(q.get("cc")||"").toUpperCase().replace(/[^A-Z]/g,"");if(P.C[cc])F.forEach(function(el){var k=key(el);if(!done[k]&&/country|land|pa(i|í)s|pays|国/i.test(k+" "+(el.id||""))&&pick(el,P.C[cc])){done[k]=1;n++;}});var ro=(q.get("role")||"").replace(/[^a-z]/g,""),R=P.R[ro];if(R)F.forEach(function(el){var k=key(el);if(!done[k]&&el.tagName=="SELECT"&&[].some.call(el.options,function(o){return [].some.call(Object.keys(P.R),function(x){return new RegExp(P.R[x][0],"i").test(o.text)})})&&pick(el,R[0])){done[k]=1;n++;}});if(q.get("ref")=="calendar"){var h=document.querySelector("main h1")||document.querySelector("h1");var d=document.createElement("div");d.setAttribute("data-yj","yj-prefill-back");d.style.cssText="margin:.4rem 0 .8rem;font:15px/1.5 system-ui,sans-serif;opacity:.9";var a=document.createElement("a");a.href="/"+P.L+"/calendar/?ref=tool"+(R?"&role="+ro:"")+(P.C[cc]?"&cc="+cc:"");a.textContent=(R?R[1]+" \u00b7 ":"")+P.B+" \u2192";d.appendChild(a);if(h&&h.parentNode)h.parentNode.insertBefore(d,h.nextSibling);}document.documentElement.setAttribute("data-yj-prefilled",String(n));}if(document.readyState=="loading")document.addEventListener("DOMContentLoaded",run);else run();}catch(e){}})();</script><div class="yj-home-find"><div class="yj-lgbar"><a href="/" class="yj-lg on">EN</a><a href="/de/" class="yj-lg">DE</a><a href="/ja/" class="yj-lg">JA</a><a href="/es/" class="yj-lg">ES</a><a href="/pt/" class="yj-lg">PT</a></div><section class="yj-find"><h2>Find a tool</h2><input id="yjq" type="search" autocomplete="off" placeholder="Type a product name, format or task"><div id="yjr"></div></section><style>.yj-lgbar{position:absolute;top:14px;right:18px;display:flex;gap:6px;z-index:60}.yj-lg{font:600 12px/1 system-ui,sans-serif;padding:6px 9px;border-radius:4px;text-decoration:none;color:#8b96a3;border:1px solid rgba(140,150,165,.28)}.yj-lg:hover{color:#e8eaed;border-color:rgba(160,175,195,.6)}.yj-lg.on{color:#0e1116;background:#cfd6de;border-color:#cfd6de}.yj-find{max-width:760px;margin:34px auto 8px;padding:0 20px}.yj-find h2{font:600 20px/1.3 system-ui,sans-serif;margin:0 0 10px}#yjq{width:100%;box-sizing:border-box;padding:13px 15px;font:400 15.5px system-ui,sans-serif;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:rgba(255,255,255,.04);color:inherit}#yjq:focus{outline:none;border-color:#7FD1C4}#yjr{margin-top:10px;display:flex;flex-direction:column;gap:6px}#yjr a{display:flex;justify-content:space-between;gap:12px;padding:11px 14px;border:1px solid rgba(140,150,165,.22);border-radius:6px;text-decoration:none;font:400 14.5px/1.4 system-ui,sans-serif;color:inherit}#yjr a:hover{border-color:#7FD1C4}#yjr .pr{font:600 13px system-ui,sans-serif;color:#5fbf9a;white-space:nowrap}</style><script>(function(){var q=document.getElementById("yjq"),r=document.getElementById("yjr"),D=null;function load(){if(D)return Promise.resolve(D);return fetch("/search-index.json").then(function(x){return x.json();}).then(function(j){D=j;return j;}).catch(function(){D=[];return D;});}function esc(t){return String(t).replace(/[&<>"]/g,function(c){return {"&":"&","<":"<",">":">",'"':"""}[c];});}function run(){var v=q.value.trim().toLowerCase();if(v.length<2){r.innerHTML="";return;}load().then(function(j){var w=v.split(/\s+/),o=[];for(var i=0;i<j.length&&o.length<12;i++){var t=j[i].t.toLowerCase();var ok=true;for(var k=0;k<w.length;k++){if(t.indexOf(w[k])<0){ok=false;break;}}if(ok)o.push(j[i]);}r.innerHTML=o.length?o.map(function(x){return "<a href=\""+esc(x.u)+"\">"+"<span>"+esc(x.t)+"</span>"+(x.p?"<span class=\"pr\">$"+x.p+"</span>":"")+"</a>";}).join(""):"";});}q.addEventListener("input",run);q.addEventListener("focus",load);})();</script></div><section data-yj="yj-facts-v1" style="max-width:920px;margin:48px auto 0;padding:0 20px;font-family:system-ui,sans-serif"><style>.yj-article p{font:400 15.5px/1.7 system-ui,sans-serif;color:#26313b;margin:0 0 12px;max-width:72ch}.yj-article h2,.yj-article h3,.yj-article h4{font:600 17px/1.35 system-ui,sans-serif;color:#1b1f24;margin:22px 0 8px}.yj-article table{border-collapse:collapse;margin:10px 0 16px;font:14px/1.45 system-ui,sans-serif}.yj-article th,.yj-article td{border:1px solid #e2e6ea;padding:6px 10px;text-align:left}.yj-article th{background:#f4f6f8}.yj-article pre{background:#0f1720;color:#e6edf3;padding:12px 14px;border-radius:8px;overflow:auto;font:13px/1.5 ui-monospace,Menlo,monospace}.yj-article code{font:13px ui-monospace,Menlo,monospace;background:#f1f3f5;padding:1px 4px;border-radius:3px}.yj-article pre code{background:none;padding:0}.yj-article ul,.yj-article ol{font:15px/1.6 system-ui,sans-serif;color:#26313b}</style><p style="font:400 13px/1.5 system-ui,sans-serif;color:#6b7680;margin:0 0 14px"><time datetime="2026-10-11">Updated 2026-10-11</time> · ReadyStack</p><script type="application/ld+json">{"@context":"https://schema.org","@type":"WebPage","dateModified":"2026-10-11","author":{"@type":"Organization","name":"ReadyStack"}}</script><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Worked example</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 16px;color:#5b6570">Real numbers from this tool, line by line.</p><div class="yj-article"><p><img src="https://getreadystack.com/img/promo/sku604232_result_card.jpg" alt="Migrate from Highcharts to Apache ECharts: find every line first" loading="lazy" style="max-width:100%;border-radius:6px"></p>
|
| 176 |
+
<p>6 findings in one package.json: that is what a front-end lead at a SaaS company in the US, UK or EU sees when this map reads a typical React dashboard that still ships Highcharts.</p>
|
| 177 |
+
<table><thead><tr><th>Line found</th><th>Line to add</th></tr></thead><tbody><tr><td>highcharts</td><td>"echarts": "^6.1.0"</td></tr><tr><td>highcharts-react-official</td><td>"echarts-for-react": "^3.0.6"</td></tr><tr><td>@highcharts/dashboards</td><td>echarts, one instance per grid cell</td></tr><tr><td>@highcharts/map-collection</td><td>echarts.registerMap('world', geoJson)</td></tr><tr><td>highcharts-export-server</td><td>echarts ssr: true, renderToSVGString()</td></tr><tr><td>@types/highcharts</td><td>remove this line</td></tr></tbody></table>
|
| 178 |
+
<p>A clean project with only echarts, echarts-for-react and react shows 0 findings.</p>
|
| 179 |
+
<h3>Why the move is happening</h3>
|
| 180 |
+
<p>Highsoft's end-user licence agreement, published at shop.highcharts.com/license-eula, grants free licences for Personal Use and Educational Use only. Section 1.4 says a Commercial Use License "is required for any and all use of the Software that does not strictly and entirely qualify" as personal or educational. It lists use within a company, non-profit or government entity, freelance work, and internal prototypes, R&D or presentations.</p>
|
| 181 |
+
<p>Section 2.3 says Highsoft may log CDN traffic and crawl public websites to find unlicensed use. Section 5.1 says the licence can end immediately and without notice if the terms are broken.</p>
|
| 182 |
+
<p>Apache ECharts is Apache-2.0. The replacement is not the hard part; finding every place the old library is still pulled in is.</p>
|
| 183 |
+
<h3>Where text search goes wrong</h3>
|
| 184 |
+
<p>A text search for "highcharts" returns comments and lockfile noise, and hides a detail: highcharts-react-official, highcharts-angular and highcharts-export-server are MIT-licensed wrappers, but they all render through the highcharts package. Keeping a wrapper because it is "MIT, so fine" keeps you inside the EULA.</p>
|
| 185 |
+
<p>The map reads only the places that pull code in:</p>
|
| 186 |
+
<ul><li>dependency blocks in package.json (dependencies, devDependencies, peerDependencies, optionalDependencies)</li><li>PackageReference lines for Highsoft.Highcharts and Highsoft.Highstock in .csproj files</li><li>script tags loading from code.highcharts.com</li><li>import and require() calls for highcharts and highcharts/modules/*</li></ul>
|
| 187 |
+
<p>It runs 14 rules in total, and each finding prints the line number, the version you have, the replacement line and the EULA clause.</p>
|
| 188 |
+
<h3>Three projects, three answers</h3>
|
| 189 |
+
<p>A React dashboard package.json gives 6 findings, as above.</p>
|
| 190 |
+
<p>An ASP.NET project with Highsoft.Highcharts and Highsoft.Highstock gives 2 findings. There is no Apache .NET package for ECharts, so both PackageReference lines go and the page loads the echarts 6.1.0 script, fed by JSON from your controller.</p>
|
| 191 |
+
<p>A plain HTML report page loading highcharts.js, modules/stock.js and modules/exporting.js from code.highcharts.com gives 3 findings, each replaced by a single echarts.min.js script tag.</p>
|
| 192 |
+
<h3>Free and full version</h3>
|
| 193 |
+
<p>The free extension checks the open file with all 14 rules and gives every replacement line with no key. If the company needs proof across many repositories, the full version adds a whole-workspace migration plan, a dated licence-exposure report and a CI gate that fails a build adding new Highcharts use.</p>
|
| 194 |
+
<p>Replacement versions were read from the npm registry on 2026-10-11: echarts 6.1.0, echarts-for-react 3.0.6, vue-echarts 8.3.2, ngx-echarts 22.0.0. The map shows where Highcharts is. Whether your use counts as commercial is for your team or counsel to decide.</p></div><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:30px 0 10px;color:#1b1f24">15 seconds — what it actually does</h2><video controls muted playsinline preload="none" poster="/img/promo/sku604232_result_card.jpg" style="width:100%;max-width:360px;border-radius:10px;display:block;margin:0 auto"><source src="/media/sku604232_short.mp4" type="video/mp4"></video><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:34px 0 6px;color:#1b1f24">Questions people ask</h2><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does Apache ECharts Migration: Highcharts Licence Map do?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">It reads a package.json, .csproj, HTML or JS/TS file and lists every Highcharts dependency, NuGet reference, CDN script tag and import with its line number. Next to each one it prints the Apache ECharts line that replaces it, such as "echarts": "^6.1.0" or "echarts-for-react": "^3.0.6", and the Highcharts EULA clause it relates to. It runs 14 rules.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Who is the Highcharts to Apache ECharts migration map for?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Front-end leads, agency developers and .NET teams at companies, non-profits or public bodies that ship Highcharts without a Commercial Use License. Highsoft's EULA section 1.4 says any use within a company, for freelance or consulting clients, or for internal prototypes and presentations needs that separate licence. It suits teams who have chosen Apache ECharts and need to find every remaining Highcharts line.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Why not just ask a chatbot or search the code for highcharts?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">A chatbot can name Apache ECharts, but it cannot see your files. A plain text search for highcharts also matches comments and misses that highcharts-react-official, highcharts-angular and highcharts-export-server are MIT wrappers that still render through the highcharts package. This map reads the dependency blocks, PackageReference lines, script tags and imports, then gives the exact replacement line for each.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What is free and what does the full version add?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Free: the open file is checked with all 14 rules, and every finding shows its line, the replacement line and the EULA clause, with no key. The full version adds a whole-workspace migration plan, a dated Highcharts licence-exposure report for the company, team keys and a CI gate that fails a build when someone adds new Highcharts use. It is a one-time payment of $29.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does Apache ECharts cost compared with Highcharts?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Apache ECharts is released under the Apache-2.0 licence, so using it in a company costs 0 dollars in licence fees. Highsoft sells the Highcharts Commercial Use License separately from the free EULA, which covers only Personal Use and Educational Use. This map finds each line to change so the move happens in one pass instead of a file-by-file search.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">When do the Highcharts licence terms change next?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Highsoft has not announced a next change date on https://shop.highcharts.com/license-eula as of 2026-10-11. The page keeps a version list for its agreements (Annual up to 4.1, Perpetual up to 19.1). Section 5.1 lets Highsoft end the free licence immediately and without notice if the terms are broken, so check the page before a release or a renewal.</p></details><script type="application/ld+json" data-yj="yj-faq-ld">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What does Apache ECharts Migration: Highcharts Licence Map do?", "acceptedAnswer": {"@type": "Answer", "text": "It reads a package.json, .csproj, HTML or JS/TS file and lists every Highcharts dependency, NuGet reference, CDN script tag and import with its line number. Next to each one it prints the Apache ECharts line that replaces it, such as \"echarts\": \"^6.1.0\" or \"echarts-for-react\": \"^3.0.6\", and the Highcharts EULA clause it relates to. It runs 14 rules."}}, {"@type": "Question", "name": "Who is the Highcharts to Apache ECharts migration map for?", "acceptedAnswer": {"@type": "Answer", "text": "Front-end leads, agency developers and .NET teams at companies, non-profits or public bodies that ship Highcharts without a Commercial Use License. Highsoft's EULA section 1.4 says any use within a company, for freelance or consulting clients, or for internal prototypes and presentations needs that separate licence. It suits teams who have chosen Apache ECharts and need to find every remaining Highcharts line."}}, {"@type": "Question", "name": "Why not just ask a chatbot or search the code for highcharts?", "acceptedAnswer": {"@type": "Answer", "text": "A chatbot can name Apache ECharts, but it cannot see your files. A plain text search for highcharts also matches comments and misses that highcharts-react-official, highcharts-angular and highcharts-export-server are MIT wrappers that still render through the highcharts package. This map reads the dependency blocks, PackageReference lines, script tags and imports, then gives the exact replacement line for each."}}, {"@type": "Question", "name": "What is free and what does the full version add?", "acceptedAnswer": {"@type": "Answer", "text": "Free: the open file is checked with all 14 rules, and every finding shows its line, the replacement line and the EULA clause, with no key. The full version adds a whole-workspace migration plan, a dated Highcharts licence-exposure report for the company, team keys and a CI gate that fails a build when someone adds new Highcharts use. It is a one-time payment of $29."}}, {"@type": "Question", "name": "What does Apache ECharts cost compared with Highcharts?", "acceptedAnswer": {"@type": "Answer", "text": "Apache ECharts is released under the Apache-2.0 licence, so using it in a company costs 0 dollars in licence fees. Highsoft sells the Highcharts Commercial Use License separately from the free EULA, which covers only Personal Use and Educational Use. This map finds each line to change so the move happens in one pass instead of a file-by-file search."}}, {"@type": "Question", "name": "When do the Highcharts licence terms change next?", "acceptedAnswer": {"@type": "Answer", "text": "Highsoft has not announced a next change date on https://shop.highcharts.com/license-eula as of 2026-10-11. The page keeps a version list for its agreements (Annual up to 4.1, Perpetual up to 19.1). Section 5.1 lets Highsoft end the free licence immediately and without notice if the terms are broken, so check the page before a release or a renewal."}}]}</script><div id="yj-ask" style="margin:36px 0 0;padding:18px 18px 16px;border:1px solid #e2e6ea;border-radius:10px;background:#fbfbfc"><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:0 0 4px;color:#1b1f24">Ask about this tool</h2><p style="font:400 13.5px/1.5 system-ui,sans-serif;margin:0 0 12px;color:#5b6570">One question, answered by the person who built it. Your email only if you want the answer sent.</p><form onsubmit="return yjAsk(event)" style="display:grid;gap:8px"><textarea name="question" required minlength="10" maxlength="2000" rows="3" placeholder="Your question" style="font:14px/1.5 system-ui,sans-serif;padding:10px;border:1px solid #cfd6dd;border-radius:6px"></textarea><div style="display:flex;gap:8px;flex-wrap:wrap"><input type="email" name="email" placeholder="Email (optional)" style="flex:1;min-width:200px;font:14px system-ui,sans-serif;padding:9px 10px;border:1px solid #cfd6dd;border-radius:6px"><button type="submit" style="font:600 14px system-ui,sans-serif;padding:9px 18px;border:0;border-radius:6px;background:#1b1f24;color:#fff;cursor:pointer">Send</button></div><p id="yj-ask-msg" style="font:13px system-ui,sans-serif;margin:2px 0 0;color:#0a6238;min-height:1em"></p></form><script>function yjAsk(e){e.preventDefault();var f=e.target,m=document.getElementById("yj-ask-msg");m.style.color="#0a6238";fetch(location.origin+"/api/ask",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sku:604232,slug:"apache-echarts-migration-check",lang:"en",question:f.question.value,email:f.email.value,page:location.pathname})}).then(function(r){if(!r.ok)throw 0;m.textContent="Thanks \u2014 noted. Answers land on this page and, if you left an email, in your inbox.";f.question.value="";}).catch(function(){m.style.color="#a8551f";m.textContent="Could not send. Please try again in a minute.";});return false;}</script></div></section><section class="yj-related" style="max-width:920px;margin:56px auto 40px;padding:0 20px"><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Same job, next tool</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 20px;color:#5b6570">Free in the browser. The full version is a one-time licence.</p><div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px"><a class="yj-rel-c" href="https://getreadystack.com/tools/arangodb-migration-check?ref=related"><span class="yj-rel-t">ArangoDB Migration Check: Neo4j End-of-Life Map</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/spdx-license-field-lint?ref=related"><span class="yj-rel-t">SPDX License Field Lint for package.json, pyproject.toml and Cargo.toml</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/huggingface-model-license-matrix?ref=related"><span class="yj-rel-t">Hugging Face Model Licence Matrix — all 70 model-card `license:` identifiers ×</span><span class="yj-rel-p">$4.99</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/cinc-migration-check?ref=related"><span class="yj-rel-t">Cinc Migration Check: Chef Infra licence gate lint</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/nicegui-migration-check?ref=related"><span class="yj-rel-t">NiceGUI Migration Check: PySimpleGUI Licence Gate</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/nuget-commercial-license-gate?ref=related"><span class="yj-rel-t">NuGet License Gate: AutoMapper, MediatR</span><span class="yj-rel-p">$29</span></a></div><style>.yj-rel-c{display:flex;flex-direction:column;gap:8px;padding:15px 16px;border:1px solid #e2e6ea;border-radius:6px;text-decoration:none;background:#fff}.yj-rel-c:hover{border-color:#b9c2cb;background:#fafbfc}.yj-rel-t{font:500 14.5px/1.42 system-ui,sans-serif;color:#1b1f24}.yj-rel-p{font:600 13px system-ui,sans-serif;color:#0a6238}</style></section><!--yj-trust-foot-s191--><footer data-yj="yj-trust-foot" style="margin:3rem auto 0;padding:1.2rem 1rem 2rem;border-top:1px solid rgba(128,128,128,.28);max-width:60rem;font:14px/1.6 system-ui,-apple-system,Segoe UI,sans-serif;color:#5b6570;text-align:center"><nav aria-label="ReadyStack" style="display:flex;gap:.4rem 1.1rem;justify-content:center;flex-wrap:wrap"><a href="/about" style="color:inherit">About</a><a href="/verify/" style="color:inherit">How we verify</a><a href="/privacy" style="color:inherit">Privacy</a><a href="/terms" style="color:inherit">Terms</a><a href="/contact.html" style="color:inherit">Contact</a><a href="mailto:support@getreadystack.com" style="color:inherit">support@getreadystack.com</a></nav><p style="margin:.6rem 0 0">🔒 Secure checkout by Whop · © 2026 ReadyStack</p></footer><!--/yj-trust-foot-s191--></body>
|
| 195 |
</html>
|