@forgecharts/sdk 1.5.71 → 1.5.73
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +19 -55
- package/dist/index.js.map +1 -1
- package/dist/internal.js +19 -55
- package/dist/internal.js.map +1 -1
- package/dist/pixi/PixiChart.d.ts +8 -1
- package/dist/pixi/PixiChart.d.ts.map +1 -1
- package/dist/pixi/PixiLastPriceRenderer.d.ts.map +1 -1
- package/dist/react/index.js +74 -65
- package/dist/react/index.js.map +1 -1
- package/dist/react/internal.js +75 -66
- package/dist/react/internal.js.map +1 -1
- package/dist/react/shell/ScriptDrawer.d.ts.map +1 -1
- package/dist/react/shell/useWatchlistQuotes.d.ts +12 -0
- package/dist/react/shell/useWatchlistQuotes.d.ts.map +1 -1
- package/dist/react/workspace/ChartWorkspace.d.ts +12 -1
- package/dist/react/workspace/ChartWorkspace.d.ts.map +1 -1
- package/dist/react/workspace/toolbars/TopToolbar.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/pixi/PixiChart.d.ts
CHANGED
|
@@ -187,7 +187,14 @@ export declare class PixiChart implements ChartBackend {
|
|
|
187
187
|
private _handleDrawClick;
|
|
188
188
|
private _buildDraftPreview;
|
|
189
189
|
private _snapToBar;
|
|
190
|
-
/**
|
|
190
|
+
/**
|
|
191
|
+
* Convert a Timeframe string to seconds (internal helper).
|
|
192
|
+
*
|
|
193
|
+
* Delegates to the shared parser — this was one of three private maps, and
|
|
194
|
+
* the only one still keyed '1D'/'1W' uppercase, so canonical '1d' fell to
|
|
195
|
+
* the 3600 fallback here while '1D' fell to the 1m fallback everywhere
|
|
196
|
+
* else. One derivation, one dialect.
|
|
197
|
+
*/
|
|
191
198
|
private _tfToSeconds;
|
|
192
199
|
private _resolveOptions;
|
|
193
200
|
private _resolveColors;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PixiChart.d.ts","sourceRoot":"","sources":["../../src/pixi/PixiChart.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PixiChart.d.ts","sourceRoot":"","sources":["../../src/pixi/PixiChart.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PixiLastPriceRenderer.d.ts","sourceRoot":"","sources":["../../src/pixi/PixiLastPriceRenderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"PixiLastPriceRenderer.d.ts","sourceRoot":"","sources":["../../src/pixi/PixiLastPriceRenderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAyB7C;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAO;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAO;IACtC,OAAO,CAAC,QAAQ,CAAK;IACrB,yDAAyD;IACzD,cAAc,EAAE,MAAM,GAAG,SAAS,CAAa;IAC/C,2CAA2C;IAC3C,aAAa,UAAQ;gBAET,KAAK,EAAE,SAAS;IAyB5B,OAAO,IAAI,IAAI;IAOf;;;;OAIG;IACH,IAAI,CACF,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,SAAS,GAClB,OAAO;IA8EV,6EAA6E;IAC7E,WAAW,IAAI,OAAO;CAIvB"}
|
package/dist/react/index.js
CHANGED
|
@@ -47,8 +47,14 @@ function timeframeToMs(tf) {
|
|
|
47
47
|
const secs = parseTfSeconds(tf);
|
|
48
48
|
return secs !== null ? secs * 1e3 : null;
|
|
49
49
|
}
|
|
50
|
+
function normalizeTimeframe(tf) {
|
|
51
|
+
const m = /^(\d+)([a-zA-Z])$/.exec(tf.trim());
|
|
52
|
+
if (!m) return tf.trim();
|
|
53
|
+
const unit = m[2];
|
|
54
|
+
return m[1] + (unit === "M" ? unit : unit.toLowerCase());
|
|
55
|
+
}
|
|
50
56
|
function parseTfSeconds(tf) {
|
|
51
|
-
const m = /^(\d+)(s|m|h|d|w|M)$/.exec(tf);
|
|
57
|
+
const m = /^(\d+)(s|m|h|d|w|M)$/.exec(normalizeTimeframe(tf));
|
|
52
58
|
if (!m) return null;
|
|
53
59
|
const n = parseInt(m[1], 10);
|
|
54
60
|
const unit = m[2];
|
|
@@ -64,6 +70,7 @@ function parseTfSeconds(tf) {
|
|
|
64
70
|
return unitSec !== void 0 ? n * unitSec : null;
|
|
65
71
|
}
|
|
66
72
|
function getBucketStart(timeMs, timeframe) {
|
|
73
|
+
timeframe = normalizeTimeframe(timeframe);
|
|
67
74
|
if (timeframe === "1w") return getWeekBucketStart(timeMs);
|
|
68
75
|
if (timeframe === "1M") return getMonthBucketStart(timeMs);
|
|
69
76
|
if (timeframe === "3M") return getQuarterBucketStart(timeMs);
|
|
@@ -7670,32 +7677,7 @@ function formatCountdown(secs) {
|
|
|
7670
7677
|
return `${m}:${String(s).padStart(2, "0")}`;
|
|
7671
7678
|
}
|
|
7672
7679
|
function tfToSeconds(tf) {
|
|
7673
|
-
|
|
7674
|
-
"1s": 1,
|
|
7675
|
-
"5s": 5,
|
|
7676
|
-
"10s": 10,
|
|
7677
|
-
"15s": 15,
|
|
7678
|
-
"30s": 30,
|
|
7679
|
-
"1m": 60,
|
|
7680
|
-
"3m": 180,
|
|
7681
|
-
"5m": 300,
|
|
7682
|
-
"15m": 900,
|
|
7683
|
-
"30m": 1800,
|
|
7684
|
-
"1h": 3600,
|
|
7685
|
-
"2h": 7200,
|
|
7686
|
-
"4h": 14400,
|
|
7687
|
-
"6h": 21600,
|
|
7688
|
-
"8h": 28800,
|
|
7689
|
-
"12h": 43200,
|
|
7690
|
-
"1D": 86400,
|
|
7691
|
-
"3D": 259200,
|
|
7692
|
-
"1W": 604800,
|
|
7693
|
-
"1M": 2592e3,
|
|
7694
|
-
"3M": 7776e3,
|
|
7695
|
-
"6M": 15552e3,
|
|
7696
|
-
"12M": 31536e3
|
|
7697
|
-
};
|
|
7698
|
-
return map[tf] ?? 3600;
|
|
7680
|
+
return parseTfSeconds(tf) ?? 3600;
|
|
7699
7681
|
}
|
|
7700
7682
|
var PixiLastPriceRenderer = class {
|
|
7701
7683
|
_lineGfx;
|
|
@@ -9680,34 +9662,16 @@ var PixiChart = class {
|
|
|
9680
9662
|
}
|
|
9681
9663
|
return { time: bestBar.time, price: snappedPrice };
|
|
9682
9664
|
}
|
|
9683
|
-
/**
|
|
9665
|
+
/**
|
|
9666
|
+
* Convert a Timeframe string to seconds (internal helper).
|
|
9667
|
+
*
|
|
9668
|
+
* Delegates to the shared parser — this was one of three private maps, and
|
|
9669
|
+
* the only one still keyed '1D'/'1W' uppercase, so canonical '1d' fell to
|
|
9670
|
+
* the 3600 fallback here while '1D' fell to the 1m fallback everywhere
|
|
9671
|
+
* else. One derivation, one dialect.
|
|
9672
|
+
*/
|
|
9684
9673
|
_tfToSeconds(tf) {
|
|
9685
|
-
|
|
9686
|
-
"1s": 1,
|
|
9687
|
-
"5s": 5,
|
|
9688
|
-
"10s": 10,
|
|
9689
|
-
"15s": 15,
|
|
9690
|
-
"30s": 30,
|
|
9691
|
-
"1m": 60,
|
|
9692
|
-
"3m": 180,
|
|
9693
|
-
"5m": 300,
|
|
9694
|
-
"15m": 900,
|
|
9695
|
-
"30m": 1800,
|
|
9696
|
-
"1h": 3600,
|
|
9697
|
-
"2h": 7200,
|
|
9698
|
-
"4h": 14400,
|
|
9699
|
-
"6h": 21600,
|
|
9700
|
-
"8h": 28800,
|
|
9701
|
-
"12h": 43200,
|
|
9702
|
-
"1D": 86400,
|
|
9703
|
-
"3D": 259200,
|
|
9704
|
-
"1W": 604800,
|
|
9705
|
-
"1M": 2592e3,
|
|
9706
|
-
"3M": 7776e3,
|
|
9707
|
-
"6M": 15552e3,
|
|
9708
|
-
"12M": 31536e3
|
|
9709
|
-
};
|
|
9710
|
-
return map[tf] ?? 3600;
|
|
9674
|
+
return parseTfSeconds(tf) ?? 3600;
|
|
9711
9675
|
}
|
|
9712
9676
|
// ─── Option resolvers ────────────────────────────────────────────────────────
|
|
9713
9677
|
_resolveOptions(opts) {
|
|
@@ -18144,7 +18108,7 @@ var DEMONSTRATION_STROKE = "rgba(255, 200, 50, 0.7)";
|
|
|
18144
18108
|
var DEMONSTRATION_COLOR = "var(--crosshair-overlay, rgba(255,255,255,0.75))";
|
|
18145
18109
|
|
|
18146
18110
|
// src/version.ts
|
|
18147
|
-
var FORGECHARTS_VERSION = "1.5.
|
|
18111
|
+
var FORGECHARTS_VERSION = "1.5.73" ;
|
|
18148
18112
|
function applyRuntimeConfig(caps, config) {
|
|
18149
18113
|
if (!config) return caps;
|
|
18150
18114
|
const orderEntry = config.enableOrderEntry === false ? false : caps.orderEntry;
|
|
@@ -18371,11 +18335,19 @@ var _listeners = /* @__PURE__ */ new Set();
|
|
|
18371
18335
|
var _subscribed = /* @__PURE__ */ new Set();
|
|
18372
18336
|
var _reconnectTimer = null;
|
|
18373
18337
|
var _authToken = null;
|
|
18338
|
+
var _baseUrl = null;
|
|
18374
18339
|
function setWsAuthToken(token) {
|
|
18375
18340
|
_authToken = token;
|
|
18376
18341
|
}
|
|
18342
|
+
function setWsBaseUrl(url) {
|
|
18343
|
+
if (!url) {
|
|
18344
|
+
_baseUrl = null;
|
|
18345
|
+
return;
|
|
18346
|
+
}
|
|
18347
|
+
_baseUrl = url.replace(/\/$/, "").replace(/^http/, "ws");
|
|
18348
|
+
}
|
|
18377
18349
|
function _wsUrl() {
|
|
18378
|
-
const base = typeof window === "undefined" ? "ws://localhost:4001/ws" : `${window.location.protocol === "https:" ? "wss" : "ws"}://${window.location.host}/ws
|
|
18350
|
+
const base = _baseUrl ?? (typeof window === "undefined" ? "ws://localhost:4001/ws" : `${window.location.protocol === "https:" ? "wss" : "ws"}://${window.location.host}/ws`);
|
|
18379
18351
|
return _authToken ? `${base}?token=${encodeURIComponent(_authToken)}` : base;
|
|
18380
18352
|
}
|
|
18381
18353
|
function _send(msg) {
|
|
@@ -25973,6 +25945,7 @@ function IndicatorsDialog({ onAdd, onClose, maxIndicators, getAuthToken }) {
|
|
|
25973
25945
|
] })
|
|
25974
25946
|
] }) });
|
|
25975
25947
|
}
|
|
25948
|
+
var chipLabel = (tf) => /^\d+[dw]$/.test(tf) ? tf.toUpperCase() : tf;
|
|
25976
25949
|
var TF_LABELS = {
|
|
25977
25950
|
"1m": "1 minute",
|
|
25978
25951
|
"2m": "2 minutes",
|
|
@@ -26412,7 +26385,7 @@ function TopToolbar({
|
|
|
26412
26385
|
onClick: () => onTimeframeChange(tf),
|
|
26413
26386
|
children: tf
|
|
26414
26387
|
},
|
|
26415
|
-
tf
|
|
26388
|
+
chipLabel(tf)
|
|
26416
26389
|
)),
|
|
26417
26390
|
/* @__PURE__ */ jsx(
|
|
26418
26391
|
"button",
|
|
@@ -29980,6 +29953,7 @@ function ScriptDrawer({ onClose, onAddIndicator, apiUrl, getAuthToken }) {
|
|
|
29980
29953
|
const [savedScripts, setSavedScripts] = useState([]);
|
|
29981
29954
|
const [scriptsMenuOpen, setScriptsMenuOpen] = useState(false);
|
|
29982
29955
|
const [saving, setSaving] = useState(false);
|
|
29956
|
+
const [saveError, setSaveError] = useState(null);
|
|
29983
29957
|
const [activeScriptId, setActiveScriptId] = useState(null);
|
|
29984
29958
|
const [saveNameInput, setSaveNameInput] = useState("");
|
|
29985
29959
|
const [showSaveNamePrompt, setShowSaveNamePrompt] = useState(false);
|
|
@@ -30073,6 +30047,7 @@ function ScriptDrawer({ onClose, onAddIndicator, apiUrl, getAuthToken }) {
|
|
|
30073
30047
|
}, [scriptsMenuOpen]);
|
|
30074
30048
|
const handleSaveScript = useCallback(async (name) => {
|
|
30075
30049
|
setSaving(true);
|
|
30050
|
+
setSaveError(null);
|
|
30076
30051
|
const base = apiUrl ?? "";
|
|
30077
30052
|
const auth = await _authHeaders();
|
|
30078
30053
|
const scriptSource = code;
|
|
@@ -30080,27 +30055,28 @@ function ScriptDrawer({ onClose, onAddIndicator, apiUrl, getAuthToken }) {
|
|
|
30080
30055
|
const scriptName = name ?? extractScriptName(scriptSource);
|
|
30081
30056
|
try {
|
|
30082
30057
|
if (activeScriptId) {
|
|
30083
|
-
await fetch(`${base}/api/scripts/${encodeURIComponent(activeScriptId)}/versions`, {
|
|
30058
|
+
const res = await fetch(`${base}/api/scripts/${encodeURIComponent(activeScriptId)}/versions`, {
|
|
30084
30059
|
method: "POST",
|
|
30085
30060
|
headers: { "Content-Type": "application/json", ...auth },
|
|
30086
30061
|
body: JSON.stringify({ source: scriptSource })
|
|
30087
30062
|
});
|
|
30063
|
+
if (!res.ok) throw new Error(`save failed (${res.status})`);
|
|
30088
30064
|
} else {
|
|
30089
30065
|
const res = await fetch(`${base}/api/scripts`, {
|
|
30090
30066
|
method: "POST",
|
|
30091
30067
|
headers: { "Content-Type": "application/json", ...auth },
|
|
30092
30068
|
body: JSON.stringify({ name: scriptName, language: scriptLang, source: scriptSource })
|
|
30093
30069
|
});
|
|
30094
|
-
if (res.ok) {
|
|
30095
|
-
|
|
30096
|
-
|
|
30097
|
-
}
|
|
30070
|
+
if (!res.ok) throw new Error(`save failed (${res.status})`);
|
|
30071
|
+
const created = await res.json();
|
|
30072
|
+
setActiveScriptId(created.id);
|
|
30098
30073
|
}
|
|
30099
30074
|
await fetchSavedScripts();
|
|
30100
|
-
|
|
30075
|
+
setShowSaveNamePrompt(false);
|
|
30076
|
+
} catch (err) {
|
|
30077
|
+
setSaveError(err instanceof Error ? err.message : "save failed");
|
|
30101
30078
|
}
|
|
30102
30079
|
setSaving(false);
|
|
30103
|
-
setShowSaveNamePrompt(false);
|
|
30104
30080
|
}, [apiUrl, _authHeaders, code, activeScriptId, extractScriptName, fetchSavedScripts]);
|
|
30105
30081
|
const handleSaveClick = useCallback(() => {
|
|
30106
30082
|
if (activeScriptId) {
|
|
@@ -30203,6 +30179,16 @@ function ScriptDrawer({ onClose, onAddIndicator, apiUrl, getAuthToken }) {
|
|
|
30203
30179
|
]
|
|
30204
30180
|
}
|
|
30205
30181
|
),
|
|
30182
|
+
saveError && /* @__PURE__ */ jsx(
|
|
30183
|
+
"span",
|
|
30184
|
+
{
|
|
30185
|
+
className: "script-save-error",
|
|
30186
|
+
role: "alert",
|
|
30187
|
+
title: saveError,
|
|
30188
|
+
style: { color: "var(--fc-danger, #e5484d)", fontSize: 11, marginLeft: 6 },
|
|
30189
|
+
children: saveError
|
|
30190
|
+
}
|
|
30191
|
+
),
|
|
30206
30192
|
/* @__PURE__ */ jsxs("div", { className: "script-my-scripts-wrap", ref: scriptsMenuRef, children: [
|
|
30207
30193
|
/* @__PURE__ */ jsxs(
|
|
30208
30194
|
"button",
|
|
@@ -31293,6 +31279,8 @@ function ChartWorkspace({
|
|
|
31293
31279
|
symbolResolver,
|
|
31294
31280
|
rollRule,
|
|
31295
31281
|
onRollRuleChange,
|
|
31282
|
+
quotesWsUrl,
|
|
31283
|
+
getQuotesAuthToken,
|
|
31296
31284
|
extraTfGroups,
|
|
31297
31285
|
// RightToolbar
|
|
31298
31286
|
watchlistOpen,
|
|
@@ -31349,6 +31337,27 @@ function ChartWorkspace({
|
|
|
31349
31337
|
tradingBridge,
|
|
31350
31338
|
tradingOverlayStore
|
|
31351
31339
|
}) {
|
|
31340
|
+
const [quotesReady, setQuotesReady] = React11.useState(false);
|
|
31341
|
+
React11.useEffect(() => {
|
|
31342
|
+
let cancelled = false;
|
|
31343
|
+
if (!quotesWsUrl || !getQuotesAuthToken) {
|
|
31344
|
+
setQuotesReady(false);
|
|
31345
|
+
return void 0;
|
|
31346
|
+
}
|
|
31347
|
+
void (async () => {
|
|
31348
|
+
try {
|
|
31349
|
+
const token = await getQuotesAuthToken();
|
|
31350
|
+
if (cancelled) return;
|
|
31351
|
+
setWsAuthToken(token || null);
|
|
31352
|
+
setWsBaseUrl(quotesWsUrl);
|
|
31353
|
+
setQuotesReady(true);
|
|
31354
|
+
} catch {
|
|
31355
|
+
}
|
|
31356
|
+
})();
|
|
31357
|
+
return () => {
|
|
31358
|
+
cancelled = true;
|
|
31359
|
+
};
|
|
31360
|
+
}, [quotesWsUrl, getQuotesAuthToken]);
|
|
31352
31361
|
const capabilities = useChartCapabilities();
|
|
31353
31362
|
const dataBlocked = useLicenseDataBlocked();
|
|
31354
31363
|
useHostLicense(hostApiUrl, getAuthToken);
|
|
@@ -31529,7 +31538,7 @@ function ChartWorkspace({
|
|
|
31529
31538
|
onClose: closeWatchlist,
|
|
31530
31539
|
onSelectSymbol: onSymbolChange,
|
|
31531
31540
|
symbolResolver,
|
|
31532
|
-
liveQuotes:
|
|
31541
|
+
liveQuotes: quotesReady,
|
|
31533
31542
|
...hostApiUrl !== void 0 ? { apiUrl: hostApiUrl } : {},
|
|
31534
31543
|
...getAuthToken !== void 0 ? { getAuthToken } : {}
|
|
31535
31544
|
}
|