@cardenelabs/cdl 0.80.0 → 0.82.0
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/CHANGELOG.md +50 -1
- package/dist/index.cjs +35 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +27 -1
- package/dist/index.d.ts +27 -1
- package/dist/index.js +34 -9
- package/dist/index.js.map +1 -1
- package/dist/react.cjs.map +1 -1
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +4 -0
- package/src/visual-validate.ts +78 -6
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,53 @@ CDL (Chainome Diagram Language) の主要変更履歴。
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.82.0] - 2026-09-27
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **速さの判定の境と測り方を package の入口から読めるようにした** (#899 / #900)
|
|
13
|
+
|
|
14
|
+
`PERF_BUDGET_TOTAL_MS` と `PERF_SLOWEST_SAMPLE` を値として、`PerfClockKind` を型として
|
|
15
|
+
`@cardenelabs/cdl` から出した。 `src/visual-validate.ts` には元から export があったが、
|
|
16
|
+
使う側は package の入口から import するため届いていなかった。
|
|
17
|
+
|
|
18
|
+
届かないと使う側は境の `5000` を自分の検査に書き写すことになり、こちらで境を変えた時に
|
|
19
|
+
使う側の検査だけが古い前提で測り続ける。 同じ理由で入口へ出した先例が 2 つある
|
|
20
|
+
(`EDGE_LABEL_TEXT` 系と `STAGE_SVG_SELECTOR` 系) ので、同じ形に揃えた。
|
|
21
|
+
|
|
22
|
+
## [0.81.0] - 2026-09-27
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
|
|
26
|
+
- **速さの判定が機械の混み具合で動かなくなった** (#897 / #898)
|
|
27
|
+
|
|
28
|
+
軸 `validate-performance-budget` は検査に掛かった時間を壁時計 (`Date.now()`) で測っていた。
|
|
29
|
+
壁時計は待たされた分も足すため、値が図の性質ではなく機械の混み具合で動く。
|
|
30
|
+
|
|
31
|
+
| 測り方 | 累計の幅 (使う側の図 599 枚を 3 周) |
|
|
32
|
+
|---|---|
|
|
33
|
+
| その検査だけを回す (5 回) | 335..1739ms |
|
|
34
|
+
| 検査を一式回す (5 回) | 806..2468ms |
|
|
35
|
+
|
|
36
|
+
同じ入力で 7.4 倍ぶれていた。 境の 5000ms に対して最悪 49% なので超えてはいないが、図の
|
|
37
|
+
枚数は 0.41.1 で軸を作った時の 444 枚から 599 枚に増えており、余裕は枚数の増加だけで減る。
|
|
38
|
+
|
|
39
|
+
CPU 時間で測る形にした。 待っている間は増えないため、同時に他の検査が走っても値が動かない。
|
|
40
|
+
`Date.now()` の 1ms 刻みでは 1 枚あたりがほとんど 0ms に丸まるが、CPU 時間はマイクロ秒で
|
|
41
|
+
返るため超過時の「重い順」 の内訳も読める。 読む上乗せは 1 回 0.0008ms。
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
|
|
45
|
+
- **掃き出しの返り値が速さの測り方を持つようになった** (#897 / #898)
|
|
46
|
+
|
|
47
|
+
`visualValidateAll` の返り値に `perfClock` (`"cpu"` または `"wall"`) が入る。
|
|
48
|
+
CPU 時間が読めない環境では壁時計に落ちるため、**どちらで測ったかを返り値と超過の文面の
|
|
49
|
+
2 箇所に出す**。 測り方が変わったのに同じ顔で報告すると、読み手が 2 つの値を同じものとして
|
|
50
|
+
並べる。
|
|
51
|
+
|
|
52
|
+
返り値にも出すのは、超過していない周では文面が出ないため。 呼ぶ側が「CPU 時間で測れて
|
|
53
|
+
いるか」 を超過の有無と切り離して確かめられる。
|
|
54
|
+
|
|
8
55
|
## [0.80.0] - 2026-09-27
|
|
9
56
|
|
|
10
57
|
### Fixed
|
|
@@ -3279,7 +3326,9 @@ Initial OSS release.
|
|
|
3279
3326
|
使わない = annotated tag を push しても GitHub Release は作られず、 Release を作っていない版で
|
|
3280
3327
|
行き止まりになる。
|
|
3281
3328
|
|
|
3282
|
-
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.
|
|
3329
|
+
[Unreleased]: https://github.com/cardene777/cdl/compare/v0.82.0...HEAD
|
|
3330
|
+
[0.82.0]: https://github.com/cardene777/cdl/compare/v0.81.0...v0.82.0
|
|
3331
|
+
[0.81.0]: https://github.com/cardene777/cdl/compare/v0.80.0...v0.81.0
|
|
3283
3332
|
[0.80.0]: https://github.com/cardene777/cdl/compare/v0.79.0...v0.80.0
|
|
3284
3333
|
[0.79.0]: https://github.com/cardene777/cdl/compare/v0.78.0...v0.79.0
|
|
3285
3334
|
[0.78.0]: https://github.com/cardene777/cdl/compare/v0.77.0...v0.78.0
|
package/dist/index.cjs
CHANGED
|
@@ -18411,11 +18411,12 @@ function runAxes(laid, diag, violations, counts, push, profile, skippedAxes, \u5
|
|
|
18411
18411
|
}
|
|
18412
18412
|
function visualValidateAll(diagrams, opts) {
|
|
18413
18413
|
\u5668\u3092\u78BA\u304B\u3081\u308B(opts?.container);
|
|
18414
|
+
const \u6642\u8A08 = perfClock();
|
|
18414
18415
|
const durations = [];
|
|
18415
18416
|
const reports = diagrams.map((d) => {
|
|
18416
|
-
const
|
|
18417
|
+
const \u6B62\u3081\u308B = \u6642\u8A08.\u6E2C\u308B();
|
|
18417
18418
|
const r = visualValidate(d, opts);
|
|
18418
|
-
durations.push(
|
|
18419
|
+
durations.push(\u6B62\u3081\u308B());
|
|
18419
18420
|
return r;
|
|
18420
18421
|
});
|
|
18421
18422
|
const fail = reports.filter((r) => !r.ok).length;
|
|
@@ -18425,7 +18426,7 @@ function visualValidateAll(diagrams, opts) {
|
|
|
18425
18426
|
totalCounts[axis] += r.counts[axis];
|
|
18426
18427
|
}
|
|
18427
18428
|
}
|
|
18428
|
-
const metaViolations = validateMetaAxes(totalCounts, diagrams, durations, reports);
|
|
18429
|
+
const metaViolations = validateMetaAxes(totalCounts, diagrams, durations, reports, \u6642\u8A08.kind);
|
|
18429
18430
|
return {
|
|
18430
18431
|
total: reports.length,
|
|
18431
18432
|
pass: reports.length - fail,
|
|
@@ -18434,12 +18435,35 @@ function visualValidateAll(diagrams, opts) {
|
|
|
18434
18435
|
totalCounts,
|
|
18435
18436
|
profile: opts?.profile ?? "production",
|
|
18436
18437
|
skippedAxes: [...SKIPPED_AXES[opts?.profile ?? "production"]],
|
|
18437
|
-
metaViolations
|
|
18438
|
+
metaViolations,
|
|
18439
|
+
perfClock: \u6642\u8A08.kind
|
|
18438
18440
|
};
|
|
18439
18441
|
}
|
|
18440
18442
|
var PERF_BUDGET_TOTAL_MS = 5e3;
|
|
18443
|
+
function perfClock() {
|
|
18444
|
+
const cpu = globalThis.process?.cpuUsage;
|
|
18445
|
+
if (typeof cpu === "function") {
|
|
18446
|
+
return {
|
|
18447
|
+
kind: "cpu",
|
|
18448
|
+
\u6E2C\u308B: () => {
|
|
18449
|
+
const \u59CB\u3081 = cpu();
|
|
18450
|
+
return () => {
|
|
18451
|
+
const \u5DEE = cpu(\u59CB\u3081);
|
|
18452
|
+
return (\u5DEE.user + \u5DEE.system) / 1e3;
|
|
18453
|
+
};
|
|
18454
|
+
}
|
|
18455
|
+
};
|
|
18456
|
+
}
|
|
18457
|
+
return {
|
|
18458
|
+
kind: "wall",
|
|
18459
|
+
\u6E2C\u308B: () => {
|
|
18460
|
+
const \u59CB\u3081 = Date.now();
|
|
18461
|
+
return () => Date.now() - \u59CB\u3081;
|
|
18462
|
+
}
|
|
18463
|
+
};
|
|
18464
|
+
}
|
|
18441
18465
|
var PERF_SLOWEST_SAMPLE = 5;
|
|
18442
|
-
function perfBudgetViolations(durations, diagrams = []) {
|
|
18466
|
+
function perfBudgetViolations(durations, diagrams = [], clock) {
|
|
18443
18467
|
const total = durations.reduce((s, d) => s + d, 0);
|
|
18444
18468
|
if (total <= PERF_BUDGET_TOTAL_MS) return [];
|
|
18445
18469
|
const \u91CD\u3044\u9806 = durations.map((ms, i) => ({ id: diagrams[i]?.id ?? "?", ms })).sort((a, b) => b.ms - a.ms);
|
|
@@ -18450,12 +18474,13 @@ function perfBudgetViolations(durations, diagrams = []) {
|
|
|
18450
18474
|
{
|
|
18451
18475
|
axis: "validate-performance-budget",
|
|
18452
18476
|
diagramId: "__meta__",
|
|
18453
|
-
detail: `visualValidateAll \u5168 ${durations.length} \u56F3\u306E\u7D2F\u8A08 ${total}ms > ${PERF_BUDGET_TOTAL_MS}ms budget (\u91CD\u3044\u9806 ${\u5185\u8A33})
|
|
18477
|
+
detail: `visualValidateAll \u5168 ${durations.length} \u56F3\u306E\u7D2F\u8A08 ${total}ms > ${PERF_BUDGET_TOTAL_MS}ms budget (\u91CD\u3044\u9806 ${\u5185\u8A33})` + // 測り方が変わったのに同じ顔で報告すると、読み手が 2 つの値を同じものとして並べる
|
|
18478
|
+
(clock === void 0 ? "" : `\u3001 \u6E2C\u308A\u65B9 ${clock === "cpu" ? "CPU \u6642\u9593" : "\u58C1\u6642\u8A08 (CPU \u6642\u9593\u304C\u8AAD\u3081\u306A\u3044)"}`),
|
|
18454
18479
|
severity: "warn"
|
|
18455
18480
|
}
|
|
18456
18481
|
];
|
|
18457
18482
|
}
|
|
18458
|
-
function validateMetaAxes(totalCounts, diagrams = [], durations = [], reports = []) {
|
|
18483
|
+
function validateMetaAxes(totalCounts, diagrams = [], durations = [], reports = [], clock) {
|
|
18459
18484
|
const out = [];
|
|
18460
18485
|
const totalErrors = reports.reduce(
|
|
18461
18486
|
(sum, r) => sum + r.violations.filter((v) => v.severity === "error").length,
|
|
@@ -18470,7 +18495,7 @@ function validateMetaAxes(totalCounts, diagrams = [], durations = [], reports =
|
|
|
18470
18495
|
severity: "warn"
|
|
18471
18496
|
});
|
|
18472
18497
|
}
|
|
18473
|
-
out.push(...perfBudgetViolations(durations, diagrams));
|
|
18498
|
+
out.push(...perfBudgetViolations(durations, diagrams, clock));
|
|
18474
18499
|
const DEAD_ALLOWLIST = [
|
|
18475
18500
|
// catalog で自然発火なしを許容する security / migration / performance / meta / dev-quality axis 群。
|
|
18476
18501
|
// 実 diagram に該当データ (XSS / migration list / oversized / broken doc) が混入するのが稀なため。
|
|
@@ -34143,6 +34168,8 @@ exports.NEAR_COLLISION_DEFAULT_MIN = NEAR_COLLISION_DEFAULT_MIN;
|
|
|
34143
34168
|
exports.NEAR_COLLISION_POLICY = NEAR_COLLISION_POLICY;
|
|
34144
34169
|
exports.NODE_FRAME_SELECTOR = NODE_FRAME_SELECTOR;
|
|
34145
34170
|
exports.NODE_KINDS = NODE_KINDS;
|
|
34171
|
+
exports.PERF_BUDGET_TOTAL_MS = PERF_BUDGET_TOTAL_MS;
|
|
34172
|
+
exports.PERF_SLOWEST_SAMPLE = PERF_SLOWEST_SAMPLE;
|
|
34146
34173
|
exports.RELATION_FOCUSES = RELATION_FOCUSES;
|
|
34147
34174
|
exports.RELATION_FOCUS_DEFAULT = RELATION_FOCUS_DEFAULT;
|
|
34148
34175
|
exports.ROW_GAP_VARIANCE_TOL = ROW_GAP_VARIANCE_TOL;
|