@cardenelabs/dragon 0.34.0 → 0.35.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.
Files changed (127) hide show
  1. package/README.md +39 -720
  2. package/dist/cli.cjs +4529 -0
  3. package/dist/cli.cjs.map +1 -0
  4. package/dist/cli.js +4523 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/export.cjs +3912 -0
  7. package/dist/export.cjs.map +1 -0
  8. package/dist/export.d.cts +36 -0
  9. package/dist/export.d.ts +36 -0
  10. package/dist/export.js +3907 -0
  11. package/dist/export.js.map +1 -0
  12. package/dist/fonts.cjs +7 -0
  13. package/dist/fonts.cjs.map +1 -0
  14. package/dist/fonts.js +4 -0
  15. package/dist/fonts.js.map +1 -0
  16. package/dist/index.cjs +4105 -20356
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.cts +227 -5522
  19. package/dist/index.d.ts +227 -5522
  20. package/dist/index.js +4091 -20283
  21. package/dist/index.js.map +1 -1
  22. package/dist/player.global.js +2 -0
  23. package/dist/schema-BBWfniwH.d.cts +112 -0
  24. package/dist/schema-BBWfniwH.d.ts +112 -0
  25. package/package.json +39 -24
  26. package/src/cli.ts +237 -0
  27. package/src/export/capture.ts +277 -0
  28. package/src/export/fonts.ts +68 -0
  29. package/src/export/html.ts +32 -0
  30. package/src/export/index.ts +146 -0
  31. package/src/field-messages.ts +104 -0
  32. package/src/figure-text.ts +42 -0
  33. package/src/index.ts +30 -283
  34. package/src/layout/architecture.ts +381 -0
  35. package/src/layout/measure.ts +21 -0
  36. package/src/layout/scene.ts +353 -0
  37. package/src/layout/sequence.ts +189 -0
  38. package/src/load-fonts.ts +8 -0
  39. package/src/look/fonts.ts +33 -0
  40. package/src/look/palettes.json +209 -0
  41. package/src/look/values.ts +155 -0
  42. package/src/markdown.ts +35 -0
  43. package/src/messages.ts +122 -0
  44. package/src/parser.ts +342 -310
  45. package/src/player-global.ts +4 -0
  46. package/src/player.ts +271 -0
  47. package/src/printer.ts +76 -0
  48. package/src/render/icons.ts +41 -0
  49. package/src/render/motion.ts +106 -0
  50. package/src/render/parts.ts +279 -0
  51. package/src/render/svg.ts +341 -0
  52. package/src/schema.ts +161 -16
  53. package/src/schemas/diagram.schema.json +150 -0
  54. package/src/schemas/validate-diagram.d.ts +12 -0
  55. package/src/schemas/validate-diagram.js +8 -0
  56. package/src/timeline.ts +166 -0
  57. package/src/tokenize.ts +20 -281
  58. package/src/version.ts +55 -0
  59. package/src/view.ts +16 -0
  60. package/src/words.ts +79 -0
  61. package/examples/quick-start.md +0 -142
  62. package/src/canvas-bounds.ts +0 -52
  63. package/src/color.ts +0 -197
  64. package/src/compile/actor-ids.ts +0 -297
  65. package/src/compile/actor-option-notice.ts +0 -379
  66. package/src/compile/actors.ts +0 -103
  67. package/src/compile/c4.ts +0 -74
  68. package/src/compile/chain.ts +0 -93
  69. package/src/compile/chart-fields.ts +0 -193
  70. package/src/compile/deep-rewrite.ts +0 -30
  71. package/src/compile/derived-source.ts +0 -18
  72. package/src/compile/direction.ts +0 -102
  73. package/src/compile/edge-option-notice.ts +0 -112
  74. package/src/compile/er-relation.ts +0 -200
  75. package/src/compile/flow.ts +0 -54
  76. package/src/compile/flowchart.ts +0 -344
  77. package/src/compile/funnel.ts +0 -87
  78. package/src/compile/gantt.ts +0 -337
  79. package/src/compile/generic.ts +0 -696
  80. package/src/compile/hierarchy.ts +0 -92
  81. package/src/compile/journey.ts +0 -93
  82. package/src/compile/kinds.ts +0 -139
  83. package/src/compile/lanes.ts +0 -138
  84. package/src/compile/metro.ts +0 -271
  85. package/src/compile/mind.ts +0 -393
  86. package/src/compile/node-title.ts +0 -24
  87. package/src/compile/notice.ts +0 -141
  88. package/src/compile/order.ts +0 -57
  89. package/src/compile/parts-lookup.ts +0 -17
  90. package/src/compile/parts.ts +0 -2709
  91. package/src/compile/placement-apply.ts +0 -689
  92. package/src/compile/placement.ts +0 -15
  93. package/src/compile/quadrant.ts +0 -265
  94. package/src/compile/record.ts +0 -75
  95. package/src/compile/row-marks.ts +0 -128
  96. package/src/compile/rows.ts +0 -40
  97. package/src/compile/sequence.ts +0 -305
  98. package/src/compile/slug.ts +0 -37
  99. package/src/compile/stages.ts +0 -247
  100. package/src/compile/subtitle.ts +0 -35
  101. package/src/compile/swimlane-marks.ts +0 -87
  102. package/src/compile/swimlane.ts +0 -82
  103. package/src/compile/timeline.ts +0 -213
  104. package/src/compile/topology.ts +0 -44
  105. package/src/compile/tree.ts +0 -69
  106. package/src/compile/value-chart.ts +0 -337
  107. package/src/compile/values.ts +0 -432
  108. package/src/compile/word-state.ts +0 -82
  109. package/src/compile.ts +0 -3168
  110. package/src/focus.ts +0 -46
  111. package/src/input-size.ts +0 -181
  112. package/src/json-line-map.ts +0 -30
  113. package/src/json-parser.ts +0 -4306
  114. package/src/keywords.ts +0 -417
  115. package/src/near-name.ts +0 -42
  116. package/src/notation-lint.ts +0 -342
  117. package/src/relative-pos.ts +0 -251
  118. package/src/schemas/diagram.json +0 -3088
  119. package/src/types.ts +0 -1009
  120. package/src/v05/index.ts +0 -9
  121. package/src/v05/input-table.generated.ts +0 -138
  122. package/src/v05/parser-types.ts +0 -32
  123. package/src/v05/parser.ts +0 -6668
  124. package/src/v05/readout-table.generated.ts +0 -1088
  125. package/src/v05/removed-syntax.ts +0 -115
  126. package/src/value-syntax.ts +0 -313
  127. package/src/write-position.ts +0 -270
package/src/focus.ts DELETED
@@ -1,46 +0,0 @@
1
- /**
2
- * 光らせる相手 (`focus:`) の書き方を読む。
3
- *
4
- * 書き方は 2 通り。 箱の名前 1 つか、 矢印 (`A -> B`) で 2 者を指す形。
5
- *
6
- * 読み方をここに 1 つだけ置く。 id の形は図種で違う (順序図は縦列の上端 / 下端 / 手順箱、
7
- * フローは箱 1 個) ため id への解決は図種ごとに残すが、 「どちらの書き方か」 の判断を
8
- * 図種ごとに持つと、 同じ記述が図種によって別の意味になる。
9
- *
10
- * 以前は図種ごとに判定していて、 順序図と汎用の 2 経路が `-` 1 文字を矢印と見なしていた。
11
- * その結果 `api-gateway` のような名前が「api から gateway への矢印」 と読まれ、 順序図では
12
- * 光らず、 フローでは名前に部分一致した別の矢印が光っていた (実測)。
13
- */
14
-
15
- /** 光らせる相手の指定。 */
16
- export type FocusEntry =
17
- | { kind: "edge"; from: string; to: string }
18
- | { kind: "node"; name: string };
19
-
20
- /**
21
- * 矢印の形。 `->` の 2 文字か `→` の 1 文字だけを矢印と見なす。
22
- *
23
- * `-` 1 文字を矢印に含めてはいけない。 名前に `-` を使う箱 (`api-gateway` / `shape-code-block`)
24
- * が矢印として読まれる。
25
- */
26
- const ARROW = /^(.+?)\s*(?:->|→)\s*(.+)$/;
27
-
28
- /**
29
- * 書かれた 1 件を読む。
30
- *
31
- * 矢印の両側は 1 文字以上を要求するので、 片側だけの形 (`-> API` / `API ->`) は矢印に
32
- * ならず名前として読まれる。
33
- *
34
- * `knownNames` に一致する名前は矢印より先に名前として読む。 引用符付きで矢印を含む名前
35
- * (`"A -> B"`) を書いた箱は実在し得るので、 常に矢印と読むと光らせられない (実測 = 名前が
36
- * 一致する箱があるのに何も光らず、 「矢印が流れにありません」 と誤報した)。
37
- *
38
- * @param knownNames 実在する箱の名前。 渡さない場合は書き方だけで判断する
39
- */
40
- export function parseFocusEntry(raw: string, knownNames?: ReadonlySet<string>): FocusEntry {
41
- const item = raw.trim();
42
- if (knownNames?.has(item)) return { kind: "node", name: item };
43
- const m = item.match(ARROW);
44
- if (!m) return { kind: "node", name: item };
45
- return { kind: "edge", from: m[1]!.trim(), to: m[2]!.trim() };
46
- }
package/src/input-size.ts DELETED
@@ -1,181 +0,0 @@
1
- import type { DslDocument } from "./types";
2
-
3
- /**
4
- * 図を組み立てる前に、 大きすぎる入力を止める (#1005)。
5
- *
6
- * 組み立てにかかる時間は要素数の 2 乗で伸びる。 実測 (要素だけを並べた形)。
7
- *
8
- * | 要素 | 組み立て |
9
- * |---|---|
10
- * | 1,000 | 104ms |
11
- * | 2,000 | 346ms |
12
- * | 5,000 | 1,647ms |
13
- * | 10,000 | 7,622ms |
14
- *
15
- * 待機 (500ms) の後に同じ流れの中で走るため、 この間 editor は操作を受け付けない。
16
- * 貼ってしまうと tab を閉じるまで戻らない。
17
- *
18
- * 見本 (catalog) は 1 図あたり平均 4 要素、 最も多い file でも平均 7 要素。 実用の規模と
19
- * 1 秒の境界 (約 3,000 要素) は桁が 2-3 つ違うため、 上限を置いても正当な図には当たらない。
20
- *
21
- * 既にある `dom-complexity-budget` (400 要素) とは別物。 あちらは組み立てた**後**に
22
- * 「見やすさ」 の観点で警告を出すだけで、 組み立て自体は走る。 こちらは組み立てる**前**に
23
- * 「固まらない」 ために止める。 400-2,000 の範囲は従来どおり警告が出て図も描ける。
24
- */
25
-
26
- /** 組み立てを止める要素数。 1 秒を明確に下回る水準に置く (2,000 要素で約 350ms) */
27
- export const MAX_INPUT_ELEMENTS = 2000;
28
-
29
- /**
30
- * 組み立てを止める本文の大きさ (byte)。
31
- *
32
- * 要素数だけでは、 1 要素に極端に長い文字列を持つ形を捉えられない。 読み取り自体は速い
33
- * (10,000 要素 98,936 byte で 2ms) ので、 実用の余裕を大きく取って置く。
34
- */
35
- export const MAX_INPUT_BYTES = 512 * 1024;
36
-
37
- /** 数えた結果。 超過した時に何がどれだけ超えたかを画面に出すために使う */
38
- export interface InputSize {
39
- elements: number;
40
- bytes: number;
41
- }
42
-
43
- /**
44
- * 記法の解析結果から要素数を数える。
45
- *
46
- * 数えるのは組み立ての重さに効くもの = 要素 / 流れ / 段 / 状態 / 段組み。
47
- * 図の題名や表示の設定は数に入れない (何件あっても重さが変わらない)。
48
- *
49
- * **段の中身 (光らせる相手 / 遷移 / 即時変更) も数える**。 段の数だけを見ると、
50
- * 1 段に 1,000 件の相手を書いた形が 1 件として通る。 実測ではこの形が組み立ての中で
51
- * 約 100 万件に展開され、 呼び出しの深さが上限を超えて落ちた。
52
- *
53
- * **他の値から決まる値 (`values:`) も数える** (#1162)。 これらは毎 frame 解かれるので、
54
- * 数に入れないと上限をすり抜けた本文が描画のたびに重さを持つ。
55
- */
56
- export function countDocElements(doc: DslDocument): number {
57
- const phases = doc.animate?.phases ?? [];
58
- const phaseChildren = phases.reduce(
59
- (acc, p) => acc + (p.highlight?.length ?? 0) + (p.tweens?.length ?? 0) + (p.sets?.length ?? 0),
60
- 0,
61
- );
62
- return (
63
- doc.actors.length +
64
- doc.flow.length +
65
- phases.length +
66
- phaseChildren +
67
- (doc.animate?.states.length ?? 0) +
68
- (doc.values?.length ?? 0) +
69
- // 値を見せる部品も描画時に 1 widget ずつ展開される (#1374)。 数えないと、 actors が
70
- // 少ないまま readouts だけを大量に並べた入力が組み立て前の上限をすり抜ける。
71
- (doc.readouts?.length ?? 0) +
72
- // 読む人が動かすつまみも 1 widget ずつ展開される (#1389)。 readouts と同じ上限で守る。
73
- (doc.inputs?.length ?? 0) +
74
- /*
75
- * 式 (#1391) と、押下 / 巻き上げ (#1393) も数える。
76
- *
77
- * **図の側 (`countDiagramElements`) は既に数えている**。 記法側だけ数えないと、
78
- * 箱が少ないままこれらを大量に並べた入力が組み立て前の上限をすり抜け、
79
- * 組み立て終わってから (= 時間をかけてから) 図の側で弾かれる。
80
- */
81
- (doc.formulas?.length ?? 0) +
82
- (doc.events?.length ?? 0) +
83
- (doc.scrolls?.length ?? 0) +
84
- (doc.groups ? Object.keys(doc.groups).length : 0) +
85
- (doc.lanes ? Object.keys(doc.lanes).length : 0)
86
- );
87
- }
88
-
89
- /**
90
- * 組み立て済みの図から要素数を数える。
91
- *
92
- * 記法を通らない入口 (本文に埋め込んだ図の定義) 用。 解析結果が無いため、 図の側で数える。
93
- *
94
- * **段の中身と読み取り部品も数える**。 段を 1 件として数えるだけだと、段の中に 10,000 件の
95
- * 光らせる指定を持つ図が「1 要素」 と判定されて素通りする (実測)。 記法側の数え方
96
- * (`countDocElements`) は段の中身を足しているので、こちらも揃える。
97
- */
98
- export function countDiagramElements(diagram: {
99
- nodes?: unknown[];
100
- edges?: unknown[];
101
- lanes?: unknown[];
102
- states?: unknown[];
103
- phases?: unknown[];
104
- readouts?: unknown[];
105
- inputs?: unknown[];
106
- formulas?: unknown[];
107
- scrollTriggers?: unknown[];
108
- eventBindings?: unknown[];
109
- derived?: unknown[];
110
- }): number {
111
- const phases = Array.isArray(diagram.phases) ? diagram.phases : [];
112
- const phaseChildren = phases.reduce((acc: number, p) => {
113
- const ph = p as {
114
- activate?: unknown[];
115
- highlight?: unknown[];
116
- tweens?: unknown[];
117
- sets?: unknown[];
118
- };
119
- return (
120
- acc +
121
- (Array.isArray(ph?.activate) ? ph.activate.length : 0) +
122
- (Array.isArray(ph?.highlight) ? ph.highlight.length : 0) +
123
- (Array.isArray(ph?.tweens) ? ph.tweens.length : 0) +
124
- (Array.isArray(ph?.sets) ? ph.sets.length : 0)
125
- );
126
- }, 0);
127
- return (
128
- (diagram.nodes?.length ?? 0) +
129
- (diagram.edges?.length ?? 0) +
130
- (diagram.lanes?.length ?? 0) +
131
- (diagram.states?.length ?? 0) +
132
- phases.length +
133
- phaseChildren +
134
- // 図が持てる並びは全部数える。 1 つでも外すと、そこに寄せた図が素通りする
135
- (diagram.readouts?.length ?? 0) +
136
- (diagram.inputs?.length ?? 0) +
137
- (diagram.formulas?.length ?? 0) +
138
- (diagram.scrollTriggers?.length ?? 0) +
139
- (diagram.eventBindings?.length ?? 0) +
140
- // 他の値から決まる値 (#1162)。 記法側 (`countDocElements`) が数えるので、こちらも揃える
141
- (diagram.derived?.length ?? 0)
142
- );
143
- }
144
-
145
- /** 本文の大きさを byte で数える (文字数ではなく実際の大きさ) */
146
- export function countBytes(src: string): number {
147
- // Node にも browser にもある形で数える。 `Buffer` は browser に無い
148
- return new TextEncoder().encode(src).length;
149
- }
150
-
151
- /**
152
- * 大きすぎる入力なら、 その旨を伝える文を返す。 収まっていれば `null`。
153
- *
154
- * 投げるのではなく文を返すのは、 呼出側が「誤りとして表示する」 か「別の扱いにする」 かを
155
- * 選べるようにするため。
156
- *
157
- * `bytes` に 0 を渡すと大きさの検査を飛ばす (要素数だけを見たい合流点で使う)。
158
- */
159
- export function describeOversize(size: InputSize): string | null {
160
- if (size.elements > MAX_INPUT_ELEMENTS) {
161
- return `要素が ${size.elements.toLocaleString()} 件あります。 ${MAX_INPUT_ELEMENTS.toLocaleString()} 件までにしてください (これ以上は組み立てに時間がかかり、 画面が止まります)`;
162
- }
163
- if (size.bytes > MAX_INPUT_BYTES) {
164
- // KB の整数で出す。 MB 小数 1 桁だと、 1 byte 超えただけの時に「0.5MB / 上限 0.5MB」 と
165
- // 同じ数字が並び、 制限内なのに拒まれたように読める
166
- const kb = Math.ceil(size.bytes / 1024);
167
- const limitKb = Math.floor(MAX_INPUT_BYTES / 1024);
168
- return `本文が ${kb.toLocaleString()}KB あります。 ${limitKb.toLocaleString()}KB までにしてください (これ以上は読み取りだけで待たされ、 記憶も大きく使います)`;
169
- }
170
- return null;
171
- }
172
-
173
- /**
174
- * 本文が大きすぎるなら、 その旨を伝える文を返す。 収まっていれば `null`。
175
- *
176
- * **読み取る前に呼ぶ**。 要素数の上限は読み取った後にしか分からないため、 巨大な本文を
177
- * 渡された時の読み取り自体 (11.9MB で記憶 200MB) を防げない。
178
- */
179
- export function describeOversizeSource(src: string): string | null {
180
- return describeOversize({ elements: 0, bytes: countBytes(src) });
181
- }
@@ -1,30 +0,0 @@
1
- /**
2
- * JSON / YAML の本文で「どこに書いたか」 を指す鍵と、そこから行番号を引く表 (#2117)。
3
- *
4
- * JSON を読む経路は行番号を持たないため、組み立ての知らせは全て 0 行になり、画面は
5
- * 「どの行の話か」 を出せなかった。 本文の行が分かる入口 (編集画面の YAML 欄) は、本文を
6
- * 読む時に場所ごとの行を集めてこの表で渡す。 表を渡さない呼出 (LLM が作った JSON を直に
7
- * 渡す経路) は今までどおり 0 行になる。
8
- *
9
- * 鍵の形は RFC 6901 (JSON Pointer) と同じにする (`/actors/1` / `/values/sales`)。
10
- * 名前をそのまま `.` で繋ぐ形にすると、`values` に `a.b` という名前を書いた場所と、
11
- * `values.a` の中の `b` という欄が同じ鍵になる。 `/` と `~` を書き換える規則があるため、
12
- * この形では重ならない。
13
- *
14
- * 表を作る側 (`apps/playground-spa/src/lib/yaml-lines.ts`) と引く側 (`json-parser.ts`) は
15
- * 同じ関数を呼ぶ。 別々に持つと、片方だけ直した時に **全ての行が引けなくなる** =
16
- * 引けない状態は知らせが 0 行に戻るだけで、図も誤りも変わらないため気付けない。
17
- */
18
-
19
- /** 本文の場所 (JSON Pointer) から、元の本文の行番号 (1 始まり) を引く表。 */
20
- export type 書いた行の表 = ReadonlyMap<string, number>;
21
-
22
- /**
23
- * 場所を指す鍵を作る。 引数は上から順に、欄の名前と並びの番号。
24
- *
25
- * 文書そのものは引数なしで空文字になる。 1 つずつ足す時は、親の鍵に
26
- * `書いた場所の鍵(次の区切り)` を繋げる (同じ結果になる)。
27
- */
28
- export function 書いた場所の鍵(...道: readonly (string | number)[]): string {
29
- return 道.map((区切り) => `/${String(区切り).replace(/~/g, "~0").replace(/\//g, "~1")}`).join("");
30
- }