@cardenelabs/dragon 0.14.0 → 0.15.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/dist/index.cjs +33 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +144 -119
- package/dist/index.d.ts +144 -119
- package/dist/index.js +33 -8
- package/dist/index.js.map +1 -1
- package/package.json +11 -11
- package/src/compile.ts +70 -9
- package/src/index.ts +11 -0
- package/src/types.ts +13 -1
- package/src/v05/parser.ts +15 -7
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cardenelabs/dragon",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"description": "Dragon — Mermaid 感覚で animated SVG を生成する Text DSL。 cdl engine を内部利用。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "cardene777",
|
|
@@ -46,15 +46,6 @@
|
|
|
46
46
|
"node": ">=18"
|
|
47
47
|
},
|
|
48
48
|
"sideEffects": false,
|
|
49
|
-
"scripts": {
|
|
50
|
-
"build": "tsup",
|
|
51
|
-
"dev": "tsup --watch",
|
|
52
|
-
"typecheck": "tsc --noEmit",
|
|
53
|
-
"test": "cd ../.. && vitest run packages/dragon",
|
|
54
|
-
"test:watch": "cd ../.. && vitest packages/dragon",
|
|
55
|
-
"lint": "tsc --noEmit",
|
|
56
|
-
"prepublishOnly": "pnpm run typecheck && pnpm run test && pnpm run build"
|
|
57
|
-
},
|
|
58
49
|
"dependencies": {
|
|
59
50
|
"@cardenelabs/cdl": "^0.14.0"
|
|
60
51
|
},
|
|
@@ -75,5 +66,14 @@
|
|
|
75
66
|
"react": "^19.1.0",
|
|
76
67
|
"tsup": "^8.5.1",
|
|
77
68
|
"typescript": "^5.8.0"
|
|
69
|
+
},
|
|
70
|
+
"scripts": {
|
|
71
|
+
"build": "tsup",
|
|
72
|
+
"dev": "tsup --watch",
|
|
73
|
+
"typecheck": "tsc --noEmit",
|
|
74
|
+
"typecheck:test": "tsc --noEmit -p tsconfig.test.json",
|
|
75
|
+
"test": "cd ../.. && vitest run packages/dragon",
|
|
76
|
+
"test:watch": "cd ../.. && vitest packages/dragon",
|
|
77
|
+
"lint": "tsc --noEmit"
|
|
78
78
|
}
|
|
79
|
-
}
|
|
79
|
+
}
|
package/src/compile.ts
CHANGED
|
@@ -25,6 +25,7 @@ import type {
|
|
|
25
25
|
ErRelationCardinality,
|
|
26
26
|
FormulaAst,
|
|
27
27
|
LaidDiagram,
|
|
28
|
+
NodeKind,
|
|
28
29
|
} from "@cardenelabs/cdl";
|
|
29
30
|
import {
|
|
30
31
|
sequence,
|
|
@@ -45,7 +46,7 @@ import {
|
|
|
45
46
|
inputDefaultValue,
|
|
46
47
|
} from "@cardenelabs/cdl";
|
|
47
48
|
import { parseFocusEntry } from "./focus";
|
|
48
|
-
import { DRAW_TARGETS } from "./v05/parser";
|
|
49
|
+
import { DRAW_TARGETS, DSL_ONLY_KINDS } from "./v05/parser";
|
|
49
50
|
import { isColorValue, pointsOutside, stripExternalPaint } from "./color";
|
|
50
51
|
import {
|
|
51
52
|
MAX_INPUT_ELEMENTS,
|
|
@@ -60,6 +61,56 @@ import {
|
|
|
60
61
|
type RelativeDirection,
|
|
61
62
|
} from "./relative-pos";
|
|
62
63
|
|
|
64
|
+
/**
|
|
65
|
+
* 記法だけが持つ種類を、描画できる種類へ読み替える (#1420)。
|
|
66
|
+
*
|
|
67
|
+
* 記法は `contract` / `eoa` のような **描画側に無い種類** を受け付ける
|
|
68
|
+
* (`v05/parser.ts` の `DSL_ONLY_KINDS`)。 図種ごとの役割分け (`solidity` の縦列の並べ替え
|
|
69
|
+
* など) に使うためで、記法としては正しい。
|
|
70
|
+
*
|
|
71
|
+
* **そのまま描画側へ渡すと図の組み立てが落ちる**。 描画側は知らない種類の大きさを引けず、
|
|
72
|
+
* `Cannot read properties of undefined (reading 'h')` で止まる (実測)。
|
|
73
|
+
*
|
|
74
|
+
* `solidity` と `er` は組み立ての中で別の種類に置き換えていたが、`flow` / `swimlane` /
|
|
75
|
+
* `state` / `topology` は `a.kind` をそのまま渡していた。 記法が受ける値で図が出ない状態
|
|
76
|
+
* だったので、渡す手前で必ず通す。
|
|
77
|
+
*
|
|
78
|
+
* ## 読み替え先
|
|
79
|
+
*
|
|
80
|
+
* | 種類 | 読み替え先 | なぜ |
|
|
81
|
+
* |---|---|---|
|
|
82
|
+
* | `entity` | `storage` | 表を持つ = ER 図の実体 |
|
|
83
|
+
* | `state` | `card` | 状態は札で表す |
|
|
84
|
+
* | `contract` / `proxy` / `library` / `interface` | `card` | 契約は札で表す (`solidity` の置き換え先に合わせた) |
|
|
85
|
+
* | `eoa` | `person` | 人が持つ財布 |
|
|
86
|
+
* | `multisig` | `signer` | 複数人で署名する (`solidity` の置き換え先に合わせた) |
|
|
87
|
+
*
|
|
88
|
+
* **表は `DSL_ONLY_KINDS` を鍵にして書く**。 種類を足した時に読み替え先が無いと
|
|
89
|
+
* 型検査が落ちるので、足し忘れが残らない。
|
|
90
|
+
*/
|
|
91
|
+
const 記法だけの種類の読み替え: Readonly<
|
|
92
|
+
Record<(typeof DSL_ONLY_KINDS)[number], NodeKind>
|
|
93
|
+
> = {
|
|
94
|
+
entity: "storage",
|
|
95
|
+
state: "card",
|
|
96
|
+
contract: "card",
|
|
97
|
+
proxy: "card",
|
|
98
|
+
library: "card",
|
|
99
|
+
interface: "card",
|
|
100
|
+
eoa: "person",
|
|
101
|
+
multisig: "signer",
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/** 描画側へ渡せる種類にする。 記法だけの種類はここで読み替わる (#1420) */
|
|
105
|
+
function 描ける種別(kind: string | undefined): NodeKind {
|
|
106
|
+
if (kind === undefined) return "actor";
|
|
107
|
+
const 読み替え先 = (
|
|
108
|
+
記法だけの種類の読み替え as Record<string, NodeKind | undefined>
|
|
109
|
+
)[kind];
|
|
110
|
+
return 読み替え先 ?? (kind as NodeKind);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
|
|
63
114
|
export interface CompileToCdlOpts {
|
|
64
115
|
/**
|
|
65
116
|
* CAR-1657 = parts identifier lookup catalog、 caller (CdlEditor / test) が inject。
|
|
@@ -5330,7 +5381,7 @@ function compileC4(doc: DslDocument): CdlDiagram {
|
|
|
5330
5381
|
b.node(x.id, {
|
|
5331
5382
|
lane: lid,
|
|
5332
5383
|
stack,
|
|
5333
|
-
kind: x.actor.kind,
|
|
5384
|
+
kind: 描ける種別(x.actor.kind),
|
|
5334
5385
|
title: x.actor.name,
|
|
5335
5386
|
});
|
|
5336
5387
|
}
|
|
@@ -6384,7 +6435,7 @@ function compileFlow(doc: DslDocument): CdlDiagram {
|
|
|
6384
6435
|
flowBuilder.step(
|
|
6385
6436
|
{
|
|
6386
6437
|
id: slugify(a.name) || `n${i}`,
|
|
6387
|
-
kind: a.kind,
|
|
6438
|
+
kind: 描ける種別(a.kind),
|
|
6388
6439
|
title: 箱の題(a),
|
|
6389
6440
|
},
|
|
6390
6441
|
edgeLabel,
|
|
@@ -6423,7 +6474,7 @@ function compileSwimlane(doc: DslDocument): CdlDiagram {
|
|
|
6423
6474
|
swim.node(nodeId, {
|
|
6424
6475
|
lane: laneId,
|
|
6425
6476
|
stack,
|
|
6426
|
-
kind: actor?.kind
|
|
6477
|
+
kind: 描ける種別(actor?.kind),
|
|
6427
6478
|
title: actorName,
|
|
6428
6479
|
});
|
|
6429
6480
|
laneStackCount.set(laneId, stack + 1);
|
|
@@ -6454,7 +6505,7 @@ function compileSwimlane(doc: DslDocument): CdlDiagram {
|
|
|
6454
6505
|
swim.node(slugify(a.name) || `n${i}`, {
|
|
6455
6506
|
lane: swim.laneId(a.name),
|
|
6456
6507
|
stack: 0,
|
|
6457
|
-
kind: a.kind
|
|
6508
|
+
kind: 描ける種別(a.kind),
|
|
6458
6509
|
title: 箱の題(a),
|
|
6459
6510
|
});
|
|
6460
6511
|
});
|
|
@@ -6577,7 +6628,7 @@ function compileTopology(doc: DslDocument): CdlDiagram {
|
|
|
6577
6628
|
for (const a of doc.actors) {
|
|
6578
6629
|
groupBuilder.add({
|
|
6579
6630
|
id: slugify(a.name) || a.name,
|
|
6580
|
-
kind: a.kind,
|
|
6631
|
+
kind: 描ける種別(a.kind),
|
|
6581
6632
|
title: 箱の題(a),
|
|
6582
6633
|
});
|
|
6583
6634
|
}
|
|
@@ -6717,7 +6768,12 @@ function compileGenericWithAnimate(doc: DslDocument, opts: GenericOpts): CdlDiag
|
|
|
6717
6768
|
while (集合?.has(stack)) stack += 1;
|
|
6718
6769
|
埋める(lid, stack);
|
|
6719
6770
|
}
|
|
6720
|
-
b.node(id, {
|
|
6771
|
+
b.node(id, {
|
|
6772
|
+
lane: lid,
|
|
6773
|
+
stack,
|
|
6774
|
+
kind: 描ける種別(a.kind),
|
|
6775
|
+
title: 箱の題(a),
|
|
6776
|
+
});
|
|
6721
6777
|
});
|
|
6722
6778
|
} else if (kind === "flow" || kind === "topology") {
|
|
6723
6779
|
// 1 lane に全 actor を縦 stack
|
|
@@ -6730,7 +6786,12 @@ function compileGenericWithAnimate(doc: DslDocument, opts: GenericOpts): CdlDiag
|
|
|
6730
6786
|
doc.actors.forEach((a, idx) => {
|
|
6731
6787
|
const id = slugify(a.name) || `n${idx}`;
|
|
6732
6788
|
actorToNodeId.set(a.name, id);
|
|
6733
|
-
b.node(id, {
|
|
6789
|
+
b.node(id, {
|
|
6790
|
+
lane: lid,
|
|
6791
|
+
stack: idx,
|
|
6792
|
+
kind: 描ける種別(a.kind),
|
|
6793
|
+
title: 箱の題(a),
|
|
6794
|
+
});
|
|
6734
6795
|
});
|
|
6735
6796
|
} else {
|
|
6736
6797
|
// swimlane / er / state ... actor ごとに 1 lane (横並び)
|
|
@@ -6755,7 +6816,7 @@ function compileGenericWithAnimate(doc: DslDocument, opts: GenericOpts): CdlDiag
|
|
|
6755
6816
|
b.node(id, {
|
|
6756
6817
|
lane: lid,
|
|
6757
6818
|
stack: 0,
|
|
6758
|
-
kind: a.kind,
|
|
6819
|
+
kind: 描ける種別(a.kind),
|
|
6759
6820
|
title: 箱の題(a),
|
|
6760
6821
|
...(isInitial ? { eyebrow: "初期" } : {}),
|
|
6761
6822
|
...(isFinal ? { eyebrow: "最終" } : {}),
|
package/src/index.ts
CHANGED
|
@@ -11,6 +11,17 @@
|
|
|
11
11
|
export { parseTextDsl } from "./parser";
|
|
12
12
|
export { compileToCdl } from "./compile";
|
|
13
13
|
export type { CompileNotice } from "./compile";
|
|
14
|
+
/**
|
|
15
|
+
* 組み立てた図の型 (#1415)。
|
|
16
|
+
*
|
|
17
|
+
* `textDslToDiagram` が返す型そのもので、実体は `@cardenelabs/cdl` が持つ。 使う側が
|
|
18
|
+
* 戻り値に型を付けるには必ず要るので、ここから引けるようにする。
|
|
19
|
+
*
|
|
20
|
+
* 再 export が無い間、使う側は `@cardenelabs/cdl` を直接の依存に足す必要があった。
|
|
21
|
+
* 足さずに書くと **型が暗黙の `any` に落ち、その先の `.map((n) => ...)` まで検査が効かなく
|
|
22
|
+
* なる** (実測 = この 1 件が 39 件の暗黙 `any` を生んでいた)。
|
|
23
|
+
*/
|
|
24
|
+
export type { CdlDiagram } from "@cardenelabs/cdl";
|
|
14
25
|
export { parseTextDslV05 } from "./v05";
|
|
15
26
|
// 記法一覧が「実際に受け付ける値」 を実装から引くための公開。 手書きすると説明と実装がずれる。
|
|
16
27
|
export { DRAW_TARGETS, DRAW_WORDS, PHASE_ITEM_WORDS, PRESET_TYPES, TOP_LEVEL_KEYS } from "./v05/parser";
|
package/src/types.ts
CHANGED
|
@@ -4,6 +4,18 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { CdlDiagram, NodeKind, Tone, EdgeStyle } from "@cardenelabs/cdl";
|
|
7
|
+
import type { DslOnlyKind } from "./v05/parser";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 記法が書ける箱の種類 (#1420)。
|
|
11
|
+
*
|
|
12
|
+
* 描画できる種類 (`NodeKind`) に、**記法だけが持つ種類** (`contract` / `eoa` など) を足す。
|
|
13
|
+
* 後者は図種ごとの役割分け (`solidity` の縦列の並べ替えなど) に使い、描画側へ渡す手前で
|
|
14
|
+
* `compile.ts` の `描ける種別` が読み替える。
|
|
15
|
+
*
|
|
16
|
+
* `NodeKind` だけに縛っていた間、記法が受ける値を型が表せていなかった。
|
|
17
|
+
*/
|
|
18
|
+
export type DslNodeKind = NodeKind | DslOnlyKind;
|
|
7
19
|
import type { RelativePos } from "./relative-pos";
|
|
8
20
|
|
|
9
21
|
/**
|
|
@@ -188,7 +200,7 @@ export type DslAxes = {
|
|
|
188
200
|
/** 登場人物 (v0.5+ ... inline option 拡張) */
|
|
189
201
|
export type DslActor = {
|
|
190
202
|
name: string;
|
|
191
|
-
kind:
|
|
203
|
+
kind: DslNodeKind;
|
|
192
204
|
/**
|
|
193
205
|
* 著者が種類を書いたか。 書かなかった時 `kind` には既定の `actor` が入るため、
|
|
194
206
|
* `kind` の値だけでは「書いた `actor`」 と「書かなかった」 を区別できない。
|
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,
|
|
@@ -262,10 +263,13 @@ const NODE_KIND_DEFAULT: NodeKind = "actor";
|
|
|
262
263
|
* 記法だけが持つ種類。 描画側には無いが、 図種ごとの組み立てで意味を持つ。
|
|
263
264
|
*
|
|
264
265
|
* `contract` / `eoa` / `multisig` / `proxy` / `library` / `interface` は Solidity 図の
|
|
265
|
-
* 役割分けに、 `entity` / `state` は ER 図と状態遷移図に使う。
|
|
266
|
-
*
|
|
266
|
+
* 役割分けに、 `entity` / `state` は ER 図と状態遷移図に使う。
|
|
267
|
+
*
|
|
268
|
+
* **描画側へ渡す前に必ず読み替える** (`compile.ts` の `描ける種別`)。 読み替えを通さずに渡すと
|
|
269
|
+
* 図の組み立てが落ちる = 描画側は知らない種類の大きさを引けない (#1420 で実測、
|
|
270
|
+
* `Cannot read properties of undefined (reading 'h')`)。
|
|
267
271
|
*/
|
|
268
|
-
const DSL_ONLY_KINDS = [
|
|
272
|
+
export const DSL_ONLY_KINDS = [
|
|
269
273
|
"entity",
|
|
270
274
|
"state",
|
|
271
275
|
"contract",
|
|
@@ -276,6 +280,9 @@ const DSL_ONLY_KINDS = [
|
|
|
276
280
|
"interface",
|
|
277
281
|
] as const;
|
|
278
282
|
|
|
283
|
+
/** 記法だけが持つ種類。 描画側の `NodeKind` には含まれない */
|
|
284
|
+
export type DslOnlyKind = (typeof DSL_ONLY_KINDS)[number];
|
|
285
|
+
|
|
279
286
|
/**
|
|
280
287
|
* AWS などの固有名を、 同じ役割を表す汎用の種類に読み替える表。
|
|
281
288
|
*
|
|
@@ -1082,15 +1089,16 @@ function classifyValues(values: string[], line: number, errors: DslError[]): Act
|
|
|
1082
1089
|
}
|
|
1083
1090
|
|
|
1084
1091
|
/**
|
|
1085
|
-
* 書かれた種類名を、
|
|
1092
|
+
* 書かれた種類名を、 記法が扱う種類に解決する。
|
|
1086
1093
|
*
|
|
1087
|
-
* 固有名 (`lambda` / `rds` 等) は読み替え表を通す。
|
|
1094
|
+
* 固有名 (`lambda` / `rds` 等) は読み替え表を通す。 記法だけが持つ種類はそのまま返し、
|
|
1095
|
+
* 描画側へ渡す時に `compile.ts` の `描ける種別` が読み替える。
|
|
1088
1096
|
*/
|
|
1089
|
-
export function resolveNodeKind(raw: string):
|
|
1097
|
+
export function resolveNodeKind(raw: string): DslNodeKind {
|
|
1090
1098
|
if (raw === "") return NODE_KIND_DEFAULT;
|
|
1091
1099
|
// `Object.hasOwn` で引く。 素の添字だと `toString` 等の既定の持ち物が引けてしまい、
|
|
1092
1100
|
// 種類として関数が返る。 呼ぶ前に受理集合で弾いてはいるが、 表を引く側でも閉じておく。
|
|
1093
|
-
return Object.hasOwn(INFRA_KIND_ALIAS, raw) ? INFRA_KIND_ALIAS[raw]! : (raw as
|
|
1101
|
+
return Object.hasOwn(INFRA_KIND_ALIAS, raw) ? INFRA_KIND_ALIAS[raw]! : (raw as DslNodeKind);
|
|
1094
1102
|
}
|
|
1095
1103
|
|
|
1096
1104
|
function numberOrUndef(s: string | undefined): number | undefined {
|