@cardenelabs/dragon 0.14.0 → 0.16.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/src/v05/parser.ts CHANGED
@@ -56,6 +56,7 @@ import type {
56
56
  DslAxes,
57
57
  DslDocument,
58
58
  DslActor,
59
+ DslNodeKind,
59
60
  DslDynShape,
60
61
  DslReadout,
61
62
  DslInput,
@@ -248,6 +249,11 @@ export const PRESET_TYPES: ReadonlySet<PresetType> = new Set([
248
249
  "pie",
249
250
  "bar",
250
251
  "line",
252
+ "gauge",
253
+ "radial",
254
+ "stat",
255
+ "waffle",
256
+ "stacked",
251
257
  "funnel",
252
258
  "tree",
253
259
  "journey",
@@ -262,10 +268,13 @@ const NODE_KIND_DEFAULT: NodeKind = "actor";
262
268
  * 記法だけが持つ種類。 描画側には無いが、 図種ごとの組み立てで意味を持つ。
263
269
  *
264
270
  * `contract` / `eoa` / `multisig` / `proxy` / `library` / `interface` は Solidity 図の
265
- * 役割分けに、 `entity` / `state` は ER 図と状態遷移図に使う。 組み立ての段階で描画できる
266
- * 種類に置き換わるため、 そのまま描画側に渡ることはない。
271
+ * 役割分けに、 `entity` / `state` は ER 図と状態遷移図に使う。
272
+ *
273
+ * **描画側へ渡す前に必ず読み替える** (`compile.ts` の `描ける種別`)。 読み替えを通さずに渡すと
274
+ * 図の組み立てが落ちる = 描画側は知らない種類の大きさを引けない (#1420 で実測、
275
+ * `Cannot read properties of undefined (reading 'h')`)。
267
276
  */
268
- const DSL_ONLY_KINDS = [
277
+ export const DSL_ONLY_KINDS = [
269
278
  "entity",
270
279
  "state",
271
280
  "contract",
@@ -276,6 +285,9 @@ const DSL_ONLY_KINDS = [
276
285
  "interface",
277
286
  ] as const;
278
287
 
288
+ /** 記法だけが持つ種類。 描画側の `NodeKind` には含まれない */
289
+ export type DslOnlyKind = (typeof DSL_ONLY_KINDS)[number];
290
+
279
291
  /**
280
292
  * AWS などの固有名を、 同じ役割を表す汎用の種類に読み替える表。
281
293
  *
@@ -1082,15 +1094,16 @@ function classifyValues(values: string[], line: number, errors: DslError[]): Act
1082
1094
  }
1083
1095
 
1084
1096
  /**
1085
- * 書かれた種類名を、 描画できる種類に解決する。
1097
+ * 書かれた種類名を、 記法が扱う種類に解決する。
1086
1098
  *
1087
- * 固有名 (`lambda` / `rds` 等) は読み替え表を通す。 それ以外はそのまま返す。
1099
+ * 固有名 (`lambda` / `rds` 等) は読み替え表を通す。 記法だけが持つ種類はそのまま返し、
1100
+ * 描画側へ渡す時に `compile.ts` の `描ける種別` が読み替える。
1088
1101
  */
1089
- export function resolveNodeKind(raw: string): NodeKind {
1102
+ export function resolveNodeKind(raw: string): DslNodeKind {
1090
1103
  if (raw === "") return NODE_KIND_DEFAULT;
1091
1104
  // `Object.hasOwn` で引く。 素の添字だと `toString` 等の既定の持ち物が引けてしまい、
1092
1105
  // 種類として関数が返る。 呼ぶ前に受理集合で弾いてはいるが、 表を引く側でも閉じておく。
1093
- return Object.hasOwn(INFRA_KIND_ALIAS, raw) ? INFRA_KIND_ALIAS[raw]! : (raw as NodeKind);
1106
+ return Object.hasOwn(INFRA_KIND_ALIAS, raw) ? INFRA_KIND_ALIAS[raw]! : (raw as DslNodeKind);
1094
1107
  }
1095
1108
 
1096
1109
  function numberOrUndef(s: string | undefined): number | undefined {
@@ -2368,6 +2381,11 @@ function applyContinuationLines(actor: DslActor, rest: Line[], errors: DslError[
2368
2381
  case "値":
2369
2382
  out.value = stripQuotes(raw);
2370
2383
  break;
2384
+ // 前の時点の値 (#1450)。 内訳を帯で示す図と値 1 つを大きく示す図が読む
2385
+ case "previous":
2386
+ case "前の値":
2387
+ out.previous = stripQuotes(raw);
2388
+ break;
2371
2389
  case "shape":
2372
2390
  case "図形":
2373
2391
  out.shape = 図形として読む(raw, ln.no, errors);
@@ -2564,6 +2582,9 @@ export const ACTOR_ITEM_KEYS: ReadonlySet<string> = new Set([
2564
2582
  "補足",
2565
2583
  "value",
2566
2584
  "値",
2585
+ // 前の時点の値 (#1450)。 内訳の変化を帯で示す図と、値 1 つを大きく示す図が読む
2586
+ "previous",
2587
+ "前の値",
2567
2588
  "rows",
2568
2589
  "行",
2569
2590
  // 箱の中に描く図形 (#1374)
@@ -2728,6 +2749,7 @@ const ACTOR_RESERVED_FIELDS: ReadonlySet<string> = new Set([
2728
2749
  "subtitle",
2729
2750
  "eyebrow",
2730
2751
  "value",
2752
+ "previous",
2731
2753
  "rows",
2732
2754
  "lane",
2733
2755
  "stack",
@@ -2880,6 +2902,7 @@ export const INLINE_ACTOR_ALIASES: Record<string, string> = {
2880
2902
  種類: "kind",
2881
2903
  補足: "subtitle",
2882
2904
  値: "value",
2905
+ 前の値: "previous",
2883
2906
  行: "rows",
2884
2907
  };
2885
2908
 
@@ -2902,6 +2925,7 @@ export const INLINE_ACTOR_KEYS: ReadonlySet<string> = new Set([
2902
2925
  "subtitle",
2903
2926
  "eyebrow",
2904
2927
  "value",
2928
+ "previous",
2905
2929
  "rows",
2906
2930
  "lane",
2907
2931
  "stack",
@@ -3072,6 +3096,7 @@ function parseActor(line: Line, errors: DslError[]): DslActor | null {
3072
3096
  owner: isPart ? undefined : opts.owner,
3073
3097
  end: isPart ? undefined : opts.end,
3074
3098
  value: opts.value,
3099
+ previous: opts.previous,
3075
3100
  rows: opts.rows
3076
3101
  ? opts.rows
3077
3102
  .replace(/^\[|\]$/g, "")
@@ -3504,7 +3529,10 @@ function parsePhase(block: Line[], errors: DslError[]): DslPhase | null {
3504
3529
  continue;
3505
3530
  }
3506
3531
  if (key === "draw") {
3507
- const = stripQuotes(value).trim();
3532
+ // `draw: line 0.4` = 語の後ろに「描き終えるまでに段の何割を使うか」 を書ける (#1441)
3533
+ // 割合を別の項目にすると「割合だけ書いて `draw` が無い段」 が書けてしまい、
3534
+ // 何も起きない指定になる。 同じ行なら書けない
3535
+ const [語 = "", 割合の文字, ...余り] = stripQuotes(value).trim().split(/\s+/);
3508
3536
  // **読めない語を黙って捨てない** (#1304 / #1306 と同じ扱い)。 受ける語は 1 つだけで、
3509
3537
  // 書き間違いはその段が何も描かない形になって手掛かりが残らない
3510
3538
  if (!DRAW_WORDS.has(語)) {
@@ -3513,9 +3541,29 @@ function parsePhase(block: Line[], errors: DslError[]): DslPhase | null {
3513
3541
  message: `draw に書けない語です: "${語}"`,
3514
3542
  hint: `使える語 = ${[...DRAW_WORDS].join(", ")}`,
3515
3543
  });
3544
+ } else if (余り.length > 0) {
3545
+ errors.push({
3546
+ line: ln.no,
3547
+ message: `draw に書ける項目は語と割合の 2 つまでです: "${stripQuotes(value).trim()}"`,
3548
+ hint: "use `draw: line 0.4`",
3549
+ });
3516
3550
  } else {
3517
3551
  phase.draw = 語;
3518
3552
  phase.drawPos = { line: ln.no };
3553
+ if (割合の文字 !== undefined) {
3554
+ const 割合 = Number(割合の文字);
3555
+ // 範囲外を黙って捨てない。 描画側は 1 に落として図を出すため、
3556
+ // 知らせが無いと「書いたのに速さが変わらない」 が手掛かりなしで起きる
3557
+ if (!Number.isFinite(割合) || 割合 <= 0 || 割合 > 1) {
3558
+ errors.push({
3559
+ line: ln.no,
3560
+ message: `draw の割合が範囲外です: "${割合の文字}"`,
3561
+ hint: "0 より大きく 1 以下で書きます (例 `draw: line 0.4`)",
3562
+ });
3563
+ } else {
3564
+ phase.drawRatio = 割合;
3565
+ }
3566
+ }
3519
3567
  }
3520
3568
  i += 1;
3521
3569
  continue;