// npm 패키지
@antv/scale
Toolkit for mapping abstract data into visual representation.
버전
74
메인테이너
52
라이선스
MIT
최초 publish
2018-06-22
publisher
kn9117
tarball
541,393 B
AUTO-PUBLISHED·1개 버전 인덱싱됨·최근 publish: 2025-09-04
// publisher 캠페인by kn9117
이 계정에서 catch된 패키지 4건고립된 catch가 아닙니다. 동일 publisher가 3개의 다른 패키지를 추가로 발행했고, 모두 파이프라인이 catch했습니다 — 일회성이 아닌 조직적 캠페인의 형태. 아래 링크는 각 형제 catch의 분석으로 이동합니다.
// offending code· @0.5.2· no static-pattern hits
llm: benign · 0.85→ 의심 전송지 없음, 원격 실행 형태 없음 — 1 known-vendor host(s).
- @0.5.2··AUTO-PUBLISHED·publisher: kn9117heuristic 75/100static flags 0llm benign (0.85) via ollamamature-packageosv-flagged:MAL-2026-4083
→ 의심 전송지 없음, 원격 실행 형태 없음 — 1 known-vendor host(s).
// offending code· no static-pattern hits
--- install scripts --- ### prepare husky install ### prepublishOnly npm run ci --- package.json (entry) --- { "name": "@antv/scale", "version": "0.5.2", "description": "Toolkit for mapping abstract data into visual representation.", "license": "MIT", "main": "lib/index.js", "module": "esm/index.js", "unpkg": "dist/scale.min.js", "types": "lib/index.d.ts", "sideEffects": false, "files": [ "src", "lib", "esm", "dist" ], "scripts": { "clean": "rimraf lib esm dist", "lint-staged": "lint-staged", "size": "limit-size", "lint": "eslint ./src/**/*.ts ./__tests__/**/*.ts && prettier ./src ./__tests__ --check ", "fix": "eslint ./src/**/*.ts ./__tests__/**/*.ts --fix && prettier ./src ./__tests__ --write ", "test": "run-s test:timezone test:jest", "test:jest": "jest --testPathIgnorePatterns=__tests__/bugs/d3-timezone.spec.ts", "test:timezone": "cross-env TZ=Europe/Berlin jest __tests__/bugs/d3-timezone.spec.ts", "build:umd": "rimraf ./dist && rollup -c && npm run size", "build:cjs": "rimraf ./lib && tsc --module commonjs --outDir lib", "build:esm": "rimraf ./esm && tsc --module ESNext --outDir esm", "build": "run-p build:*", "ci": "run-s lint test build", "prepublishOnly": "npm run ci", "prepare": "h --- index.js (entry) --- "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createInterpolateColor = exports.createInterpolateValue = exports.createInterpolateNumber = exports.DURATION_MONTH = exports.DURATION_YEAR = exports.DURATION_WEEK = exports.DURATION_DAY = exports.DURATION_HOUR = exports.DURATION_MINUTE = exports.DURATION_SECOND = exports.d3Time = exports.d3Log = exports.wilkinsonExtended = exports.rPretty = exports.d3Ticks = exports.Diverging = exports.Sequential = exports.Continuous = exports.Base = exports.Time = exports.Quantile = exports.Quantize = exports.Log = exports.Threshold = exports.Sqrt = exports.Pow = exports.Point = exports.Linear = exports.Identity = exports.Constant = exports.Ordinal = exports.Band = void 0; // scales var band_1 = require("./scales/band"); Object.defineProperty(exports, "Band", { enumerable: true, get: function () { return band_1.Band; } }); var ordinal_1 = require("./scales/ordinal"); Object.defineProperty(exports, "Ordinal", { enumerable: true, get: function () { return ordinal_1.Ordinal; } }); var constant_1 = require("./scales/constant"); Object.defineProperty(exports, "Constant", { enumerable: true, get: function () { return co --- bundled output (OSV-MAL flagged — LLM scope expansion) --- --- lib/utils/create-quartile.js (bundled) --- "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createQuartile = void 0; /** * 给予一个排序好的数组,分位数 * * @param arr 排序好的数组 * @param percentage 百分比 * @returns {number} 计算结果 */ function quantileSorted(arr, percentage) { const len = arr.length; if (!len) { return undefined; } if (len < 2) { return arr[len - 1]; } const i = (len - 1) * percentage; const i0 = Math.floor(i); const v0 = arr[i0]; const v1 = arr[i0 + 1]; return v0 + (v1 - v0) * (i - i0); } /** * 给定一个数组, 创建分位数数组 * * @param arr 排序好的数组 * @param n 分位数数组长度 * @param isSorted 数组是否排序好 * @returns {number[]} 分位数数组 */ function createQuartile(arr, n, isSorted = false) { const numberArr = arr; if (!isSorted) { numberArr.sort((a, b) => a - b); } const tmp = []; for (let i = 1; i < n; i += 1) { tmp.push(quantileSorted(numberArr, i / n)); } return tmp; } exports.createQuartile = createQuartile; //# sourceMappingURL=create-quartile.js.map --- lib/utils/find-tick-interval.js (bundled) --- "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.findTickInterval = void 0; const time_interval_1 = require("./time-interval"); const utc_interval_1 = require("./utc-interval"); const bisect_1 = require("./bisect"); const ticks_1 = require("./ticks"); function chooseTickIntervals(utc) { const intervalMap = utc ? utc_interval_1.utcIntervalMap : time_interval_1.localIntervalMap; const { year, month, week, day, hour, minute, second, millisecond } = intervalMap; const tickIntervals = [ [second, 1], [second, 5], [second, 15], [second, 30], [minute, 1], [minute, 5], [minute, 15], [minute, 30], [hour, 1], [hour, 3], [hour, 6], [hour, 12], [day, 1], [day, 2], [week, 1], [month, 1], [month, 3], [year, 1], ]; return { tickIntervals, year, millisecond, }; } function findTickInterval(start, stop, count, interval, utc) { const lo = +start; const hi = +stop; const { tickIntervals, year, millisecond } = chooseTickIntervals(utc); const getter = ([interval, count]) => interval.duration * count; const targetCount = interval ? (hi - lo) / interval : count || 5; const targetInterval = interval || (hi - lo) / targetCount; const len = tickIntervals.length; const i = (0, bisect_1.bisect)(tickIntervals, targetInterval, 0, len, getter); let matchInterval; if (i === len) { const step = (0, ticks_1.tickStep)(lo / year.duration, hi / year.duration, targetCount); matchInterval = [year, step]; } else if (i) { const closeToLow = targetInterval / getter(tickIntervals[i - 1]) < getter(tickIntervals[i]) / targetInterval; const [timeInterval, targetStep] = closeToLow ? tickIntervals[i - 1] : tickIntervals[i]; const step = interval ? Math.ceil(interval / timeInterval.duration) : targetStep; --- lib/utils/pretty-number.js (bundled) --- "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.prettyNumber = void 0; // 为了解决 js 运算的精度问题 function prettyNumber(n) { return Math.abs(n) < 1e-14 ? n : parseFloat(n.toFixed(14)); } exports.prettyNumber = prettyNumber; //# sourceMappingURL=pretty-number.js.map --- lib/utils/time-interval.js (bundled) --- "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.localIntervalMap = exports.year = exports.week = exports.month = exports.day = exports.hour = exports.minute = exports.second = exports.millisecond = exports.createInterval = exports.DURATION_YEAR = exports.DURATION_MONTH = exports.DURATION_WEEK = exports.DURATION_DAY = exports.DURATION_HOUR = exports.DURATION_MINUTE = exports.DURATION_SECOND = void 0; exports.DURATION_SECOND = 1000; exports.DURATION_MINUTE = exports.DURATION_SECOND * 60; exports.DURATION_HOUR = exports.DURATION_MINUTE * 60; exports.DURATION_DAY = exports.DURATION_HOUR * 24; exports.DURATION_WEEK = exports.DURATION_DAY * 7; exports.DURATION_MONTH = exports.DURATION_DAY * 30; exports.DURATION_YEAR = exports.DURATION_DAY * 365; function createInterval(duration, floorish, offseti, field) { const adjust = (date, step) => { const test = (date) => field(date) % step === 0; let i = step; while (i && !test(date)) { offseti(date, -1); i -= 1; } return date; }; const floori = (date, step) => { if (step) adjust(date, step); floorish(date); }; const floor = (date, step) => { const d = new Date(+date); floori(d, step); return d; }; const ceil = (date, step) => { const d = new Date(+date - 1); floori(d, step); offseti(d, step); floori(d); return d; }; const range = (start, stop, step, shouldAdjust) => { const ticks = []; const roundStep = Math.floor(step); const t = shouldAdjust ? ceil(start, step) : ceil(start); for (let i = t; i < stop; offseti(i, roundStep), floori(i)) { ticks.push(new Date(+i)); } return ticks; }; return { ceil, floor, range, duration, }; } exports.createInterval = createInterval; exports.millisecond = createInterval(1 --- lib/utils/utc-interval.js (bundled) --- "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.utcIntervalMap = exports.utcYear = exports.utcWeek = exports.utcMonth = exports.utcDay = exports.utcHour = exports.utcMinute = exports.utcSecond = exports.utcMillisecond = void 0; const time_interval_1 = require("./time-interval"); exports.utcMillisecond = (0, time_interval_1.createInterval)(1, (date) => date, (date, step = 1) => { date.setTime(+date + step); }, (date) => date.getTime()); exports.utcSecond = (0, time_interval_1.createInterval)(time_interval_1.DURATION_SECOND, (date) => { date.setUTCMilliseconds(0); }, (date, step = 1) => { date.setTime(+date + time_interval_1.DURATION_SECOND * step); }, (date) => date.getUTCSeconds()); exports.utcMinute = (0, time_interval_1.createInterval)(time_interval_1.DURATION_MINUTE, (date) => { date.setUTCSeconds(0, 0); }, (date, step = 1) => { date.setTime(+date + time_interval_1.DURATION_MINUTE * step); }, (date) => date.getUTCMinutes()); exports.utcHour = (0, time_interval_1.createInterval)(time_interval_1.DURATION_HOUR, (date) => { date.setUTCMinutes(0, 0, 0); }, (date, step = 1) => { date.setTime(+date + time_interval_1.DURATION_HOUR * step); }, (date) => date.getUTCHours()); exports.utcDay = (0, time_interval_1.createInterval)(time_interval_1.DURATION_DAY, (date) => { date.setUTCHours(0, 0, 0, 0); }, (date, step = 1) => { date.setTime(+date + time_interval_1.DURATION_DAY * step); }, (date) => date.getUTCDate() - 1); exports.utcMonth = (0, time_interval_1.createInterval)(time_interval_1.DURATION_MONTH, (date) => { date.setUTCDate(1); date.setUTCHours(0, 0, 0, 0); }, (date, step = 1) => { const month = date.getUTCMonth(); date.setUTCMonth(month + step); }, (date) => date.getUTCMonth()); exports.utcWeek = (0, time_interval_1.createInterval)(time_interval_1.DURATION_WEEK, (date) => { date.setUTCDate(date.getUTCDate() - ((date.getUTCDay() + 7) % 7)); date.setUTCHours(0, 0, 0, 0); }, --- lib/tick-methods/r-pretty.js (bundled) --- "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.rPretty = void 0; const pretty_number_1 = require("../utils/pretty-number"); /** * 创建分割点 * @param min 左区间 * @param max 右区间 * @param n 分割点个数 * @returns 计算后的 ticks * @see R pretty https://svn.r-project.org/R/trunk/src/appl/pretty.c * @see R pretty https://www.rdocumentation.org/packages/base/versio
