hyperprop-charting-library 0.1.108 → 0.1.109

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.
@@ -951,30 +951,54 @@ function createChart(element, options = {}) {
951
951
  }
952
952
  };
953
953
  };
954
- const normalizeDrawingState = (drawing) => ({
955
- id: drawing.id ?? `drawing-${generatedDrawingId++}`,
956
- type: drawing.type,
957
- points: drawing.points.map((point) => ({
958
- index: Number(point.index) || 0,
959
- price: Number(point.price) || 0,
960
- ...point.time ? { time: point.time } : {}
961
- })),
962
- visible: drawing.visible ?? true,
963
- color: drawing.color ?? "#94a3b8",
964
- colors: Array.isArray(drawing.colors) ? drawing.colors.filter((value) => typeof value === "string") : [],
965
- style: drawing.style ?? "dotted",
966
- width: Math.max(1, Number(drawing.width) || 1),
967
- locked: drawing.locked ?? false,
968
- accountSize: Number(drawing.accountSize) || 0,
969
- lotSize: Number(drawing.lotSize) || 1,
970
- risk: Number(drawing.risk) || 0,
971
- riskMode: drawing.riskMode === "amount" ? "amount" : "percent",
972
- leverage: Number(drawing.leverage) || 1,
973
- pointValue: Number(drawing.pointValue) || 1,
974
- qtyPrecision: Number.isFinite(drawing.qtyPrecision) ? Math.max(0, Math.floor(Number(drawing.qtyPrecision))) : 0,
975
- fontSize: Math.max(6, Number(drawing.fontSize) || 14),
976
- ...drawing.label === void 0 ? {} : { label: drawing.label }
977
- });
954
+ const bumpGeneratedDrawingIdPast = (id) => {
955
+ const match = /^drawing-(\d+)$/.exec(id);
956
+ if (!match) return;
957
+ const n = Number(match[1]);
958
+ if (Number.isFinite(n) && n >= generatedDrawingId) {
959
+ generatedDrawingId = n + 1;
960
+ }
961
+ };
962
+ const normalizeDrawingState = (drawing) => {
963
+ const id = drawing.id ?? `drawing-${generatedDrawingId++}`;
964
+ bumpGeneratedDrawingIdPast(id);
965
+ return {
966
+ id,
967
+ type: drawing.type,
968
+ points: drawing.points.map((point) => ({
969
+ index: Number(point.index) || 0,
970
+ price: Number(point.price) || 0,
971
+ ...point.time ? { time: point.time } : {}
972
+ })),
973
+ visible: drawing.visible ?? true,
974
+ color: drawing.color ?? "#94a3b8",
975
+ colors: Array.isArray(drawing.colors) ? drawing.colors.filter((value) => typeof value === "string") : [],
976
+ style: drawing.style ?? "dotted",
977
+ width: Math.max(1, Number(drawing.width) || 1),
978
+ locked: drawing.locked ?? false,
979
+ accountSize: Number(drawing.accountSize) || 0,
980
+ lotSize: Number(drawing.lotSize) || 1,
981
+ risk: Number(drawing.risk) || 0,
982
+ riskMode: drawing.riskMode === "amount" ? "amount" : "percent",
983
+ leverage: Number(drawing.leverage) || 1,
984
+ pointValue: Number(drawing.pointValue) || 1,
985
+ qtyPrecision: Number.isFinite(drawing.qtyPrecision) ? Math.max(0, Math.floor(Number(drawing.qtyPrecision))) : 0,
986
+ fontSize: Math.max(6, Number(drawing.fontSize) || 14),
987
+ ...drawing.label === void 0 ? {} : { label: drawing.label }
988
+ };
989
+ };
990
+ const dedupeDrawingIds = (list) => {
991
+ const seen = /* @__PURE__ */ new Set();
992
+ return list.map((drawing) => {
993
+ if (!seen.has(drawing.id)) {
994
+ seen.add(drawing.id);
995
+ return drawing;
996
+ }
997
+ const id = `drawing-${generatedDrawingId++}`;
998
+ seen.add(id);
999
+ return { ...drawing, id };
1000
+ });
1001
+ };
978
1002
  const serializeDrawing = (drawing) => ({
979
1003
  id: drawing.id,
980
1004
  type: drawing.type,
@@ -997,7 +1021,9 @@ function createChart(element, options = {}) {
997
1021
  });
998
1022
  let tradeMarkers = [];
999
1023
  let indicators = (options.indicators ?? []).map((indicator) => normalizeIndicatorState(indicator));
1000
- let drawings = (options.drawings ?? []).map((drawing) => normalizeDrawingState(drawing));
1024
+ let drawings = dedupeDrawingIds(
1025
+ (options.drawings ?? []).map((drawing) => normalizeDrawingState(drawing))
1026
+ );
1001
1027
  let activeDrawingTool = null;
1002
1028
  let draftDrawing = null;
1003
1029
  let drawingDragState = null;
@@ -5336,7 +5362,7 @@ function createChart(element, options = {}) {
5336
5362
  const getMagnetMode = () => magnetMode;
5337
5363
  const getDrawings = () => drawings.map((drawing) => serializeDrawing(drawing));
5338
5364
  const setDrawings = (nextDrawings) => {
5339
- drawings = nextDrawings.map((drawing) => normalizeDrawingState(drawing));
5365
+ drawings = dedupeDrawingIds(nextDrawings.map((drawing) => normalizeDrawingState(drawing)));
5340
5366
  draftDrawing = null;
5341
5367
  emitDrawingsChange();
5342
5368
  scheduleDraw();
@@ -925,30 +925,54 @@ function createChart(element, options = {}) {
925
925
  }
926
926
  };
927
927
  };
928
- const normalizeDrawingState = (drawing) => ({
929
- id: drawing.id ?? `drawing-${generatedDrawingId++}`,
930
- type: drawing.type,
931
- points: drawing.points.map((point) => ({
932
- index: Number(point.index) || 0,
933
- price: Number(point.price) || 0,
934
- ...point.time ? { time: point.time } : {}
935
- })),
936
- visible: drawing.visible ?? true,
937
- color: drawing.color ?? "#94a3b8",
938
- colors: Array.isArray(drawing.colors) ? drawing.colors.filter((value) => typeof value === "string") : [],
939
- style: drawing.style ?? "dotted",
940
- width: Math.max(1, Number(drawing.width) || 1),
941
- locked: drawing.locked ?? false,
942
- accountSize: Number(drawing.accountSize) || 0,
943
- lotSize: Number(drawing.lotSize) || 1,
944
- risk: Number(drawing.risk) || 0,
945
- riskMode: drawing.riskMode === "amount" ? "amount" : "percent",
946
- leverage: Number(drawing.leverage) || 1,
947
- pointValue: Number(drawing.pointValue) || 1,
948
- qtyPrecision: Number.isFinite(drawing.qtyPrecision) ? Math.max(0, Math.floor(Number(drawing.qtyPrecision))) : 0,
949
- fontSize: Math.max(6, Number(drawing.fontSize) || 14),
950
- ...drawing.label === void 0 ? {} : { label: drawing.label }
951
- });
928
+ const bumpGeneratedDrawingIdPast = (id) => {
929
+ const match = /^drawing-(\d+)$/.exec(id);
930
+ if (!match) return;
931
+ const n = Number(match[1]);
932
+ if (Number.isFinite(n) && n >= generatedDrawingId) {
933
+ generatedDrawingId = n + 1;
934
+ }
935
+ };
936
+ const normalizeDrawingState = (drawing) => {
937
+ const id = drawing.id ?? `drawing-${generatedDrawingId++}`;
938
+ bumpGeneratedDrawingIdPast(id);
939
+ return {
940
+ id,
941
+ type: drawing.type,
942
+ points: drawing.points.map((point) => ({
943
+ index: Number(point.index) || 0,
944
+ price: Number(point.price) || 0,
945
+ ...point.time ? { time: point.time } : {}
946
+ })),
947
+ visible: drawing.visible ?? true,
948
+ color: drawing.color ?? "#94a3b8",
949
+ colors: Array.isArray(drawing.colors) ? drawing.colors.filter((value) => typeof value === "string") : [],
950
+ style: drawing.style ?? "dotted",
951
+ width: Math.max(1, Number(drawing.width) || 1),
952
+ locked: drawing.locked ?? false,
953
+ accountSize: Number(drawing.accountSize) || 0,
954
+ lotSize: Number(drawing.lotSize) || 1,
955
+ risk: Number(drawing.risk) || 0,
956
+ riskMode: drawing.riskMode === "amount" ? "amount" : "percent",
957
+ leverage: Number(drawing.leverage) || 1,
958
+ pointValue: Number(drawing.pointValue) || 1,
959
+ qtyPrecision: Number.isFinite(drawing.qtyPrecision) ? Math.max(0, Math.floor(Number(drawing.qtyPrecision))) : 0,
960
+ fontSize: Math.max(6, Number(drawing.fontSize) || 14),
961
+ ...drawing.label === void 0 ? {} : { label: drawing.label }
962
+ };
963
+ };
964
+ const dedupeDrawingIds = (list) => {
965
+ const seen = /* @__PURE__ */ new Set();
966
+ return list.map((drawing) => {
967
+ if (!seen.has(drawing.id)) {
968
+ seen.add(drawing.id);
969
+ return drawing;
970
+ }
971
+ const id = `drawing-${generatedDrawingId++}`;
972
+ seen.add(id);
973
+ return { ...drawing, id };
974
+ });
975
+ };
952
976
  const serializeDrawing = (drawing) => ({
953
977
  id: drawing.id,
954
978
  type: drawing.type,
@@ -971,7 +995,9 @@ function createChart(element, options = {}) {
971
995
  });
972
996
  let tradeMarkers = [];
973
997
  let indicators = (options.indicators ?? []).map((indicator) => normalizeIndicatorState(indicator));
974
- let drawings = (options.drawings ?? []).map((drawing) => normalizeDrawingState(drawing));
998
+ let drawings = dedupeDrawingIds(
999
+ (options.drawings ?? []).map((drawing) => normalizeDrawingState(drawing))
1000
+ );
975
1001
  let activeDrawingTool = null;
976
1002
  let draftDrawing = null;
977
1003
  let drawingDragState = null;
@@ -5310,7 +5336,7 @@ function createChart(element, options = {}) {
5310
5336
  const getMagnetMode = () => magnetMode;
5311
5337
  const getDrawings = () => drawings.map((drawing) => serializeDrawing(drawing));
5312
5338
  const setDrawings = (nextDrawings) => {
5313
- drawings = nextDrawings.map((drawing) => normalizeDrawingState(drawing));
5339
+ drawings = dedupeDrawingIds(nextDrawings.map((drawing) => normalizeDrawingState(drawing)));
5314
5340
  draftDrawing = null;
5315
5341
  emitDrawingsChange();
5316
5342
  scheduleDraw();
package/dist/index.cjs CHANGED
@@ -951,30 +951,54 @@ function createChart(element, options = {}) {
951
951
  }
952
952
  };
953
953
  };
954
- const normalizeDrawingState = (drawing) => ({
955
- id: drawing.id ?? `drawing-${generatedDrawingId++}`,
956
- type: drawing.type,
957
- points: drawing.points.map((point) => ({
958
- index: Number(point.index) || 0,
959
- price: Number(point.price) || 0,
960
- ...point.time ? { time: point.time } : {}
961
- })),
962
- visible: drawing.visible ?? true,
963
- color: drawing.color ?? "#94a3b8",
964
- colors: Array.isArray(drawing.colors) ? drawing.colors.filter((value) => typeof value === "string") : [],
965
- style: drawing.style ?? "dotted",
966
- width: Math.max(1, Number(drawing.width) || 1),
967
- locked: drawing.locked ?? false,
968
- accountSize: Number(drawing.accountSize) || 0,
969
- lotSize: Number(drawing.lotSize) || 1,
970
- risk: Number(drawing.risk) || 0,
971
- riskMode: drawing.riskMode === "amount" ? "amount" : "percent",
972
- leverage: Number(drawing.leverage) || 1,
973
- pointValue: Number(drawing.pointValue) || 1,
974
- qtyPrecision: Number.isFinite(drawing.qtyPrecision) ? Math.max(0, Math.floor(Number(drawing.qtyPrecision))) : 0,
975
- fontSize: Math.max(6, Number(drawing.fontSize) || 14),
976
- ...drawing.label === void 0 ? {} : { label: drawing.label }
977
- });
954
+ const bumpGeneratedDrawingIdPast = (id) => {
955
+ const match = /^drawing-(\d+)$/.exec(id);
956
+ if (!match) return;
957
+ const n = Number(match[1]);
958
+ if (Number.isFinite(n) && n >= generatedDrawingId) {
959
+ generatedDrawingId = n + 1;
960
+ }
961
+ };
962
+ const normalizeDrawingState = (drawing) => {
963
+ const id = drawing.id ?? `drawing-${generatedDrawingId++}`;
964
+ bumpGeneratedDrawingIdPast(id);
965
+ return {
966
+ id,
967
+ type: drawing.type,
968
+ points: drawing.points.map((point) => ({
969
+ index: Number(point.index) || 0,
970
+ price: Number(point.price) || 0,
971
+ ...point.time ? { time: point.time } : {}
972
+ })),
973
+ visible: drawing.visible ?? true,
974
+ color: drawing.color ?? "#94a3b8",
975
+ colors: Array.isArray(drawing.colors) ? drawing.colors.filter((value) => typeof value === "string") : [],
976
+ style: drawing.style ?? "dotted",
977
+ width: Math.max(1, Number(drawing.width) || 1),
978
+ locked: drawing.locked ?? false,
979
+ accountSize: Number(drawing.accountSize) || 0,
980
+ lotSize: Number(drawing.lotSize) || 1,
981
+ risk: Number(drawing.risk) || 0,
982
+ riskMode: drawing.riskMode === "amount" ? "amount" : "percent",
983
+ leverage: Number(drawing.leverage) || 1,
984
+ pointValue: Number(drawing.pointValue) || 1,
985
+ qtyPrecision: Number.isFinite(drawing.qtyPrecision) ? Math.max(0, Math.floor(Number(drawing.qtyPrecision))) : 0,
986
+ fontSize: Math.max(6, Number(drawing.fontSize) || 14),
987
+ ...drawing.label === void 0 ? {} : { label: drawing.label }
988
+ };
989
+ };
990
+ const dedupeDrawingIds = (list) => {
991
+ const seen = /* @__PURE__ */ new Set();
992
+ return list.map((drawing) => {
993
+ if (!seen.has(drawing.id)) {
994
+ seen.add(drawing.id);
995
+ return drawing;
996
+ }
997
+ const id = `drawing-${generatedDrawingId++}`;
998
+ seen.add(id);
999
+ return { ...drawing, id };
1000
+ });
1001
+ };
978
1002
  const serializeDrawing = (drawing) => ({
979
1003
  id: drawing.id,
980
1004
  type: drawing.type,
@@ -997,7 +1021,9 @@ function createChart(element, options = {}) {
997
1021
  });
998
1022
  let tradeMarkers = [];
999
1023
  let indicators = (options.indicators ?? []).map((indicator) => normalizeIndicatorState(indicator));
1000
- let drawings = (options.drawings ?? []).map((drawing) => normalizeDrawingState(drawing));
1024
+ let drawings = dedupeDrawingIds(
1025
+ (options.drawings ?? []).map((drawing) => normalizeDrawingState(drawing))
1026
+ );
1001
1027
  let activeDrawingTool = null;
1002
1028
  let draftDrawing = null;
1003
1029
  let drawingDragState = null;
@@ -5336,7 +5362,7 @@ function createChart(element, options = {}) {
5336
5362
  const getMagnetMode = () => magnetMode;
5337
5363
  const getDrawings = () => drawings.map((drawing) => serializeDrawing(drawing));
5338
5364
  const setDrawings = (nextDrawings) => {
5339
- drawings = nextDrawings.map((drawing) => normalizeDrawingState(drawing));
5365
+ drawings = dedupeDrawingIds(nextDrawings.map((drawing) => normalizeDrawingState(drawing)));
5340
5366
  draftDrawing = null;
5341
5367
  emitDrawingsChange();
5342
5368
  scheduleDraw();
package/dist/index.js CHANGED
@@ -925,30 +925,54 @@ function createChart(element, options = {}) {
925
925
  }
926
926
  };
927
927
  };
928
- const normalizeDrawingState = (drawing) => ({
929
- id: drawing.id ?? `drawing-${generatedDrawingId++}`,
930
- type: drawing.type,
931
- points: drawing.points.map((point) => ({
932
- index: Number(point.index) || 0,
933
- price: Number(point.price) || 0,
934
- ...point.time ? { time: point.time } : {}
935
- })),
936
- visible: drawing.visible ?? true,
937
- color: drawing.color ?? "#94a3b8",
938
- colors: Array.isArray(drawing.colors) ? drawing.colors.filter((value) => typeof value === "string") : [],
939
- style: drawing.style ?? "dotted",
940
- width: Math.max(1, Number(drawing.width) || 1),
941
- locked: drawing.locked ?? false,
942
- accountSize: Number(drawing.accountSize) || 0,
943
- lotSize: Number(drawing.lotSize) || 1,
944
- risk: Number(drawing.risk) || 0,
945
- riskMode: drawing.riskMode === "amount" ? "amount" : "percent",
946
- leverage: Number(drawing.leverage) || 1,
947
- pointValue: Number(drawing.pointValue) || 1,
948
- qtyPrecision: Number.isFinite(drawing.qtyPrecision) ? Math.max(0, Math.floor(Number(drawing.qtyPrecision))) : 0,
949
- fontSize: Math.max(6, Number(drawing.fontSize) || 14),
950
- ...drawing.label === void 0 ? {} : { label: drawing.label }
951
- });
928
+ const bumpGeneratedDrawingIdPast = (id) => {
929
+ const match = /^drawing-(\d+)$/.exec(id);
930
+ if (!match) return;
931
+ const n = Number(match[1]);
932
+ if (Number.isFinite(n) && n >= generatedDrawingId) {
933
+ generatedDrawingId = n + 1;
934
+ }
935
+ };
936
+ const normalizeDrawingState = (drawing) => {
937
+ const id = drawing.id ?? `drawing-${generatedDrawingId++}`;
938
+ bumpGeneratedDrawingIdPast(id);
939
+ return {
940
+ id,
941
+ type: drawing.type,
942
+ points: drawing.points.map((point) => ({
943
+ index: Number(point.index) || 0,
944
+ price: Number(point.price) || 0,
945
+ ...point.time ? { time: point.time } : {}
946
+ })),
947
+ visible: drawing.visible ?? true,
948
+ color: drawing.color ?? "#94a3b8",
949
+ colors: Array.isArray(drawing.colors) ? drawing.colors.filter((value) => typeof value === "string") : [],
950
+ style: drawing.style ?? "dotted",
951
+ width: Math.max(1, Number(drawing.width) || 1),
952
+ locked: drawing.locked ?? false,
953
+ accountSize: Number(drawing.accountSize) || 0,
954
+ lotSize: Number(drawing.lotSize) || 1,
955
+ risk: Number(drawing.risk) || 0,
956
+ riskMode: drawing.riskMode === "amount" ? "amount" : "percent",
957
+ leverage: Number(drawing.leverage) || 1,
958
+ pointValue: Number(drawing.pointValue) || 1,
959
+ qtyPrecision: Number.isFinite(drawing.qtyPrecision) ? Math.max(0, Math.floor(Number(drawing.qtyPrecision))) : 0,
960
+ fontSize: Math.max(6, Number(drawing.fontSize) || 14),
961
+ ...drawing.label === void 0 ? {} : { label: drawing.label }
962
+ };
963
+ };
964
+ const dedupeDrawingIds = (list) => {
965
+ const seen = /* @__PURE__ */ new Set();
966
+ return list.map((drawing) => {
967
+ if (!seen.has(drawing.id)) {
968
+ seen.add(drawing.id);
969
+ return drawing;
970
+ }
971
+ const id = `drawing-${generatedDrawingId++}`;
972
+ seen.add(id);
973
+ return { ...drawing, id };
974
+ });
975
+ };
952
976
  const serializeDrawing = (drawing) => ({
953
977
  id: drawing.id,
954
978
  type: drawing.type,
@@ -971,7 +995,9 @@ function createChart(element, options = {}) {
971
995
  });
972
996
  let tradeMarkers = [];
973
997
  let indicators = (options.indicators ?? []).map((indicator) => normalizeIndicatorState(indicator));
974
- let drawings = (options.drawings ?? []).map((drawing) => normalizeDrawingState(drawing));
998
+ let drawings = dedupeDrawingIds(
999
+ (options.drawings ?? []).map((drawing) => normalizeDrawingState(drawing))
1000
+ );
975
1001
  let activeDrawingTool = null;
976
1002
  let draftDrawing = null;
977
1003
  let drawingDragState = null;
@@ -5310,7 +5336,7 @@ function createChart(element, options = {}) {
5310
5336
  const getMagnetMode = () => magnetMode;
5311
5337
  const getDrawings = () => drawings.map((drawing) => serializeDrawing(drawing));
5312
5338
  const setDrawings = (nextDrawings) => {
5313
- drawings = nextDrawings.map((drawing) => normalizeDrawingState(drawing));
5339
+ drawings = dedupeDrawingIds(nextDrawings.map((drawing) => normalizeDrawingState(drawing)));
5314
5340
  draftDrawing = null;
5315
5341
  emitDrawingsChange();
5316
5342
  scheduleDraw();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hyperprop-charting-library",
3
- "version": "0.1.108",
3
+ "version": "0.1.109",
4
4
  "description": "Lightweight TypeScript charting core",
5
5
  "type": "module",
6
6
  "main": "./dist/hyperprop-charting-library.cjs",