@meltemi/diagrams-render 0.0.0-stage → 1.10.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/LICENSE +21 -0
- package/README.md +54 -2
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/sketch.d.ts +14 -0
- package/dist/sketch.d.ts.map +1 -0
- package/dist/sketch.js +558 -0
- package/dist/sketch.js.map +1 -0
- package/dist/svg.d.ts +54 -0
- package/dist/svg.d.ts.map +1 -0
- package/dist/svg.js +276 -0
- package/dist/svg.js.map +1 -0
- package/package.json +42 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Architecture Studio contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,55 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @meltemi/diagrams-render
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Renders a vector scene to portable SVG: one file with its fonts embedded, outlined or named,
|
|
4
|
+
accessible titles and descriptions, links, and nothing that needs a network.
|
|
5
|
+
|
|
6
|
+
It is part of [Meltemi Diagrams](https://github.com/askenaz-dev/meltemi-diagrams#readme), diagrams as code with a canvas, motion and
|
|
7
|
+
exports. Every package of the product has the same version.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install @meltemi/diagrams-render
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Node 22.12.0 or later. The package is an ES module with type declarations.
|
|
16
|
+
|
|
17
|
+
## Use
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { createNodeFontLibrary } from "@meltemi/diagrams-fonts/node";
|
|
21
|
+
import { layoutDiagram } from "@meltemi/diagrams-layout";
|
|
22
|
+
import { createElkEngine } from "@meltemi/diagrams-layout-elk";
|
|
23
|
+
import { compile } from "@meltemi/diagrams-model";
|
|
24
|
+
import { renderSvg } from "@meltemi/diagrams-render";
|
|
25
|
+
|
|
26
|
+
const text = `language "0.2"
|
|
27
|
+
|
|
28
|
+
diagram shop: flow {
|
|
29
|
+
web["Web shop"]
|
|
30
|
+
api["Orders API"]
|
|
31
|
+
db[("Orders")]
|
|
32
|
+
web -> api: "HTTPS" as call
|
|
33
|
+
api -> db: "SQL" as store
|
|
34
|
+
}
|
|
35
|
+
`;
|
|
36
|
+
|
|
37
|
+
const fonts = createNodeFontLibrary();
|
|
38
|
+
const compilation = compile(text);
|
|
39
|
+
const { scene } = layoutDiagram(compilation, compilation.document.diagrams[0]!, {
|
|
40
|
+
measurer: fonts,
|
|
41
|
+
engine: createElkEngine(),
|
|
42
|
+
});
|
|
43
|
+
const svg = renderSvg(scene!, { fonts: "embedded", provider: fonts });
|
|
44
|
+
console.log(svg.includes("@font-face")); // true: the picture carries its fonts
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Documentation
|
|
48
|
+
|
|
49
|
+
- [SVG export](https://github.com/askenaz-dev/meltemi-diagrams/blob/main/docs/language/svg-export.md)
|
|
50
|
+
- [Fonts](https://github.com/askenaz-dev/meltemi-diagrams/blob/main/docs/language/fonts.md)
|
|
51
|
+
- [All documentation](https://github.com/askenaz-dev/meltemi-diagrams/blob/main/docs/README.md)
|
|
52
|
+
|
|
53
|
+
## Licence
|
|
54
|
+
|
|
55
|
+
MIT. Third-party components and their licences are listed in [THIRD_PARTY_LICENSES.md](https://github.com/askenaz-dev/meltemi-diagrams/blob/main/THIRD_PARTY_LICENSES.md).
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const PACKAGE_NAME = "@meltemi/diagrams-render";
|
|
2
|
+
export { embeddableFaces, escapeXml, fontFaceRule, fontFaceRules, renderSvg, type EmbeddableFace, type FontPolicy, type FontProvider, type RenderOptions, } from "./svg.js";
|
|
3
|
+
export { sketchItems, type SketchLevel } from "./sketch.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,6BAA6B,CAAC;AAEvD,OAAO,EACL,eAAe,EACf,SAAS,EACT,YAAY,EACZ,aAAa,EACb,SAAS,EACT,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,0BAA0B,CAAC;AAEvD,OAAO,EACL,eAAe,EACf,SAAS,EACT,YAAY,EACZ,aAAa,EACb,SAAS,GAKV,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,WAAW,EAAoB,MAAM,aAAa,CAAC"}
|
package/dist/sketch.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SceneItem } from "@meltemi/diagrams-layout";
|
|
2
|
+
/** A sketch level that paints: `light` or `rough`. */
|
|
3
|
+
export type SketchLevel = "light" | "rough";
|
|
4
|
+
/**
|
|
5
|
+
* The items of a scene with every stroke painted by hand: each stroked `rect`, `path` and
|
|
6
|
+
* `polyline` of a group whose role is `element`, `relation`, `label`, `frame`, `lifeline` or
|
|
7
|
+
* `event` becomes its fill alone (when it has one) followed by two stroke-only paths, its outline
|
|
8
|
+
* sampled every 16 px (`light`) or 12 px (`rough`) and each sample moved along the outline's
|
|
9
|
+
* normal by at most 0.6 px or 1.4 px. The jitter comes from a pseudo-random sequence seeded by the
|
|
10
|
+
* group's id and the pass, so the same text paints the same bytes and an edit elsewhere leaves a
|
|
11
|
+
* shape's wobble alone. Text, images, icons, gradient strokes and invisible overlays are kept.
|
|
12
|
+
*/
|
|
13
|
+
export declare function sketchItems(items: readonly SceneItem[], level: SketchLevel): SceneItem[];
|
|
14
|
+
//# sourceMappingURL=sketch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sketch.d.ts","sourceRoot":"","sources":["../src/sketch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKV,SAAS,EAEV,MAAM,0BAA0B,CAAC;AAElC,sDAAsD;AACtD,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,CAAC;AAmC5C;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,SAAS,EAAE,CAExF"}
|
package/dist/sketch.js
ADDED
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
/** How far apart the samples of a stroke are, and how far each moves off the outline. */
|
|
2
|
+
const LEVELS = {
|
|
3
|
+
light: { step: 16, jitter: 0.6 },
|
|
4
|
+
rough: { step: 12, jitter: 1.4 },
|
|
5
|
+
};
|
|
6
|
+
/** The roles whose strokes are painted by hand; icons, the mark and motion overlays are not. */
|
|
7
|
+
const SKETCHED = new Set([
|
|
8
|
+
"element",
|
|
9
|
+
"relation",
|
|
10
|
+
"label",
|
|
11
|
+
"frame",
|
|
12
|
+
"lifeline",
|
|
13
|
+
"event",
|
|
14
|
+
]);
|
|
15
|
+
/** A turn sharper than this, in radians, is a corner the samples keep. */
|
|
16
|
+
const CORNER = Math.PI / 6;
|
|
17
|
+
/** How finely curves are flattened before they are sampled again, in pixels. */
|
|
18
|
+
const FLATTEN = 2;
|
|
19
|
+
/**
|
|
20
|
+
* The items of a scene with every stroke painted by hand: each stroked `rect`, `path` and
|
|
21
|
+
* `polyline` of a group whose role is `element`, `relation`, `label`, `frame`, `lifeline` or
|
|
22
|
+
* `event` becomes its fill alone (when it has one) followed by two stroke-only paths, its outline
|
|
23
|
+
* sampled every 16 px (`light`) or 12 px (`rough`) and each sample moved along the outline's
|
|
24
|
+
* normal by at most 0.6 px or 1.4 px. The jitter comes from a pseudo-random sequence seeded by the
|
|
25
|
+
* group's id and the pass, so the same text paints the same bytes and an edit elsewhere leaves a
|
|
26
|
+
* shape's wobble alone. Text, images, icons, gradient strokes and invisible overlays are kept.
|
|
27
|
+
*/
|
|
28
|
+
export function sketchItems(items, level) {
|
|
29
|
+
return items.map((item) => (item.kind === "group" ? sketchGroup(item, level) : item));
|
|
30
|
+
}
|
|
31
|
+
function sketchGroup(group, level) {
|
|
32
|
+
if (!SKETCHED.has(group.role))
|
|
33
|
+
return group;
|
|
34
|
+
const passes = [random(hash(`${group.id}\u0000${0}`)), random(hash(`${group.id}\u0000${1}`))];
|
|
35
|
+
const items = [];
|
|
36
|
+
for (const item of group.items) {
|
|
37
|
+
if (item.kind === "group") {
|
|
38
|
+
items.push(sketchGroup(item, level));
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (!sketchable(item)) {
|
|
42
|
+
items.push(item);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const outline = subpathsOf(item);
|
|
46
|
+
if (outline.length === 0) {
|
|
47
|
+
items.push(item);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const fill = fillOf(item);
|
|
51
|
+
if (fill)
|
|
52
|
+
items.push(fill);
|
|
53
|
+
for (const next of passes) {
|
|
54
|
+
items.push(strokePass(item, sketchPath(outline, LEVELS[level], next)));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return { ...group, items };
|
|
58
|
+
}
|
|
59
|
+
/** Whether an item has a stroke the hand paints: seen, solid in colour, without a transform. */
|
|
60
|
+
function sketchable(item) {
|
|
61
|
+
if (item.kind !== "rect" && item.kind !== "path" && item.kind !== "polyline")
|
|
62
|
+
return false;
|
|
63
|
+
if (item.stroke === "none" || item.stroke.startsWith("url(") || !(item.strokeWidth > 0)) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
if (item.opacity === 0)
|
|
67
|
+
return false;
|
|
68
|
+
return !(item.kind === "path" && item.transform);
|
|
69
|
+
}
|
|
70
|
+
/** The item's fill alone, without its stroke; none for a polyline or an unfilled shape. */
|
|
71
|
+
function fillOf(item) {
|
|
72
|
+
if (item.kind === "polyline" || item.fill === "none")
|
|
73
|
+
return undefined;
|
|
74
|
+
const { className: _class, dash: _dash, ...rest } = item;
|
|
75
|
+
return { ...rest, stroke: "none", strokeWidth: 0, dashed: false };
|
|
76
|
+
}
|
|
77
|
+
/** One stroke-only pass of an item, with its width, dash, class and opacity. */
|
|
78
|
+
function strokePass(item, d) {
|
|
79
|
+
return {
|
|
80
|
+
kind: "path",
|
|
81
|
+
d,
|
|
82
|
+
fill: "none",
|
|
83
|
+
stroke: item.stroke,
|
|
84
|
+
strokeWidth: item.strokeWidth,
|
|
85
|
+
dashed: item.dashed,
|
|
86
|
+
rounded: true,
|
|
87
|
+
...(item.dash ? { dash: item.dash } : {}),
|
|
88
|
+
...(item.opacity !== undefined ? { opacity: item.opacity } : {}),
|
|
89
|
+
...(item.kind === "path" && item.strokeOpacity !== undefined
|
|
90
|
+
? { strokeOpacity: item.strokeOpacity }
|
|
91
|
+
: {}),
|
|
92
|
+
...(item.className ? { className: item.className } : {}),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// ------------------------------------------------------------------ outlines
|
|
96
|
+
function subpathsOf(item) {
|
|
97
|
+
if (item.kind === "polyline")
|
|
98
|
+
return item.points.length >= 2 ? [{ points: [...item.points], closed: false }] : [];
|
|
99
|
+
if (item.kind === "rect")
|
|
100
|
+
return [rectOutline(item)];
|
|
101
|
+
return parsePath(item.d);
|
|
102
|
+
}
|
|
103
|
+
/** A rectangle's outline: four sides with a quarter arc at each corner for its radius. */
|
|
104
|
+
function rectOutline(rect) {
|
|
105
|
+
const { x, y, width, height } = rect;
|
|
106
|
+
const r = Math.max(0, Math.min(rect.radius, width / 2, height / 2));
|
|
107
|
+
const points = [];
|
|
108
|
+
const arc = (cx, cy, from) => {
|
|
109
|
+
const steps = Math.max(2, Math.ceil((r * Math.PI) / 2 / FLATTEN));
|
|
110
|
+
for (let i = 0; i <= steps; i++) {
|
|
111
|
+
const a = from + (i / steps) * (Math.PI / 2);
|
|
112
|
+
points.push({ x: cx + r * Math.cos(a), y: cy + r * Math.sin(a) });
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
if (r === 0) {
|
|
116
|
+
points.push({ x, y }, { x: x + width, y }, { x: x + width, y: y + height }, { x, y: y + height });
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
arc(x + width - r, y + r, -Math.PI / 2);
|
|
120
|
+
arc(x + width - r, y + height - r, 0);
|
|
121
|
+
arc(x + r, y + height - r, Math.PI / 2);
|
|
122
|
+
arc(x + r, y + r, Math.PI);
|
|
123
|
+
}
|
|
124
|
+
return { points, closed: true };
|
|
125
|
+
}
|
|
126
|
+
const COMMAND = /[MmLlHhVvCcSsQqTtAaZz]/;
|
|
127
|
+
const NUMBER = /[+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?/y;
|
|
128
|
+
/** The tokens of path data: command letters and numbers. */
|
|
129
|
+
function tokens(d) {
|
|
130
|
+
const out = [];
|
|
131
|
+
let i = 0;
|
|
132
|
+
while (i < d.length) {
|
|
133
|
+
const c = d[i];
|
|
134
|
+
if (COMMAND.test(c)) {
|
|
135
|
+
out.push(c);
|
|
136
|
+
i++;
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (c === " " || c === "," || c === "\n" || c === "\t" || c === "\r") {
|
|
140
|
+
i++;
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
NUMBER.lastIndex = i;
|
|
144
|
+
const match = NUMBER.exec(d);
|
|
145
|
+
if (!match)
|
|
146
|
+
return out;
|
|
147
|
+
out.push(Number(match[0]));
|
|
148
|
+
i = NUMBER.lastIndex;
|
|
149
|
+
}
|
|
150
|
+
return out;
|
|
151
|
+
}
|
|
152
|
+
/** Path data flattened into subpaths: lines kept, curves and arcs sampled every few pixels. */
|
|
153
|
+
function parsePath(d) {
|
|
154
|
+
const list = tokens(d);
|
|
155
|
+
const subpaths = [];
|
|
156
|
+
let current;
|
|
157
|
+
let start = { x: 0, y: 0 };
|
|
158
|
+
let at = { x: 0, y: 0 };
|
|
159
|
+
let control;
|
|
160
|
+
let command = "";
|
|
161
|
+
let i = 0;
|
|
162
|
+
const number = () => {
|
|
163
|
+
const value = list[i];
|
|
164
|
+
i++;
|
|
165
|
+
return typeof value === "number" ? value : NaN;
|
|
166
|
+
};
|
|
167
|
+
const finish = (closed) => {
|
|
168
|
+
if (current && current.length >= 2)
|
|
169
|
+
subpaths.push({ points: current, closed });
|
|
170
|
+
current = undefined;
|
|
171
|
+
};
|
|
172
|
+
const lineTo = (p) => {
|
|
173
|
+
if (!current)
|
|
174
|
+
current = [at];
|
|
175
|
+
current.push(p);
|
|
176
|
+
at = p;
|
|
177
|
+
};
|
|
178
|
+
while (i < list.length) {
|
|
179
|
+
const token = list[i];
|
|
180
|
+
if (typeof token === "string") {
|
|
181
|
+
command = token;
|
|
182
|
+
i++;
|
|
183
|
+
if (command === "Z" || command === "z") {
|
|
184
|
+
if (current) {
|
|
185
|
+
finish(true);
|
|
186
|
+
}
|
|
187
|
+
at = start;
|
|
188
|
+
control = undefined;
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else if (command === "") {
|
|
193
|
+
return subpaths;
|
|
194
|
+
}
|
|
195
|
+
const relative = command === command.toLowerCase();
|
|
196
|
+
const base = relative ? at : { x: 0, y: 0 };
|
|
197
|
+
switch (command.toUpperCase()) {
|
|
198
|
+
case "M": {
|
|
199
|
+
finish(false);
|
|
200
|
+
const p = { x: base.x + number(), y: base.y + number() };
|
|
201
|
+
at = p;
|
|
202
|
+
start = p;
|
|
203
|
+
current = [p];
|
|
204
|
+
// Pairs after a move are lines.
|
|
205
|
+
command = relative ? "l" : "L";
|
|
206
|
+
control = undefined;
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
case "L":
|
|
210
|
+
lineTo({ x: base.x + number(), y: base.y + number() });
|
|
211
|
+
control = undefined;
|
|
212
|
+
break;
|
|
213
|
+
case "H":
|
|
214
|
+
lineTo({ x: (relative ? at.x : 0) + number(), y: at.y });
|
|
215
|
+
control = undefined;
|
|
216
|
+
break;
|
|
217
|
+
case "V":
|
|
218
|
+
lineTo({ x: at.x, y: (relative ? at.y : 0) + number() });
|
|
219
|
+
control = undefined;
|
|
220
|
+
break;
|
|
221
|
+
case "C":
|
|
222
|
+
case "S": {
|
|
223
|
+
const c1 = command.toUpperCase() === "C"
|
|
224
|
+
? { x: base.x + number(), y: base.y + number() }
|
|
225
|
+
: control
|
|
226
|
+
? { x: 2 * at.x - control.x, y: 2 * at.y - control.y }
|
|
227
|
+
: at;
|
|
228
|
+
const c2 = { x: base.x + number(), y: base.y + number() };
|
|
229
|
+
const end = { x: base.x + number(), y: base.y + number() };
|
|
230
|
+
const from = at;
|
|
231
|
+
const steps = curveSteps([from, c1, c2, end]);
|
|
232
|
+
for (let k = 1; k <= steps; k++)
|
|
233
|
+
lineTo(cubic(from, c1, c2, end, k / steps));
|
|
234
|
+
control = c2;
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
case "Q":
|
|
238
|
+
case "T": {
|
|
239
|
+
const c = command.toUpperCase() === "Q"
|
|
240
|
+
? { x: base.x + number(), y: base.y + number() }
|
|
241
|
+
: control
|
|
242
|
+
? { x: 2 * at.x - control.x, y: 2 * at.y - control.y }
|
|
243
|
+
: at;
|
|
244
|
+
const end = { x: base.x + number(), y: base.y + number() };
|
|
245
|
+
const from = at;
|
|
246
|
+
const steps = curveSteps([from, c, end]);
|
|
247
|
+
for (let k = 1; k <= steps; k++)
|
|
248
|
+
lineTo(quadratic(from, c, end, k / steps));
|
|
249
|
+
control = c;
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
case "A": {
|
|
253
|
+
const rx = number();
|
|
254
|
+
const ry = number();
|
|
255
|
+
const rotation = number();
|
|
256
|
+
const large = number() !== 0;
|
|
257
|
+
const sweep = number() !== 0;
|
|
258
|
+
const end = { x: base.x + number(), y: base.y + number() };
|
|
259
|
+
for (const p of arcPoints(at, end, rx, ry, rotation, large, sweep))
|
|
260
|
+
lineTo(p);
|
|
261
|
+
control = undefined;
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
default:
|
|
265
|
+
return subpaths;
|
|
266
|
+
}
|
|
267
|
+
if ([at.x, at.y].some((v) => !Number.isFinite(v)))
|
|
268
|
+
return subpaths;
|
|
269
|
+
}
|
|
270
|
+
finish(false);
|
|
271
|
+
return subpaths;
|
|
272
|
+
}
|
|
273
|
+
function curveSteps(points) {
|
|
274
|
+
let length = 0;
|
|
275
|
+
for (let k = 1; k < points.length; k++)
|
|
276
|
+
length += distance(points[k - 1], points[k]);
|
|
277
|
+
return Math.max(4, Math.min(64, Math.ceil(length / FLATTEN)));
|
|
278
|
+
}
|
|
279
|
+
function cubic(a, b, c, d, t) {
|
|
280
|
+
const u = 1 - t;
|
|
281
|
+
return {
|
|
282
|
+
x: u * u * u * a.x + 3 * u * u * t * b.x + 3 * u * t * t * c.x + t * t * t * d.x,
|
|
283
|
+
y: u * u * u * a.y + 3 * u * u * t * b.y + 3 * u * t * t * c.y + t * t * t * d.y,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
function quadratic(a, b, c, t) {
|
|
287
|
+
const u = 1 - t;
|
|
288
|
+
return {
|
|
289
|
+
x: u * u * a.x + 2 * u * t * b.x + t * t * c.x,
|
|
290
|
+
y: u * u * a.y + 2 * u * t * b.y + t * t * c.y,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
/** The points of an elliptical arc after its start, by the SVG endpoint parameterization. */
|
|
294
|
+
function arcPoints(from, to, rxIn, ryIn, degrees, large, sweep) {
|
|
295
|
+
let rx = Math.abs(rxIn);
|
|
296
|
+
let ry = Math.abs(ryIn);
|
|
297
|
+
if (rx === 0 || ry === 0 || (from.x === to.x && from.y === to.y))
|
|
298
|
+
return [to];
|
|
299
|
+
const phi = (degrees * Math.PI) / 180;
|
|
300
|
+
const cos = Math.cos(phi);
|
|
301
|
+
const sin = Math.sin(phi);
|
|
302
|
+
const dx = (from.x - to.x) / 2;
|
|
303
|
+
const dy = (from.y - to.y) / 2;
|
|
304
|
+
const x1 = cos * dx + sin * dy;
|
|
305
|
+
const y1 = -sin * dx + cos * dy;
|
|
306
|
+
const scale = (x1 * x1) / (rx * rx) + (y1 * y1) / (ry * ry);
|
|
307
|
+
if (scale > 1) {
|
|
308
|
+
rx *= Math.sqrt(scale);
|
|
309
|
+
ry *= Math.sqrt(scale);
|
|
310
|
+
}
|
|
311
|
+
const numerator = rx * rx * ry * ry - rx * rx * y1 * y1 - ry * ry * x1 * x1;
|
|
312
|
+
const denominator = rx * rx * y1 * y1 + ry * ry * x1 * x1;
|
|
313
|
+
const factor = (large === sweep ? -1 : 1) * Math.sqrt(Math.max(0, numerator / denominator));
|
|
314
|
+
const cx1 = (factor * rx * y1) / ry;
|
|
315
|
+
const cy1 = (-factor * ry * x1) / rx;
|
|
316
|
+
const cx = cos * cx1 - sin * cy1 + (from.x + to.x) / 2;
|
|
317
|
+
const cy = sin * cx1 + cos * cy1 + (from.y + to.y) / 2;
|
|
318
|
+
const angle = (ux, uy, vx, vy) => {
|
|
319
|
+
const a = Math.atan2(ux * vy - uy * vx, ux * vx + uy * vy);
|
|
320
|
+
return a;
|
|
321
|
+
};
|
|
322
|
+
const start = angle(1, 0, (x1 - cx1) / rx, (y1 - cy1) / ry);
|
|
323
|
+
let delta = angle((x1 - cx1) / rx, (y1 - cy1) / ry, (-x1 - cx1) / rx, (-y1 - cy1) / ry);
|
|
324
|
+
if (!sweep && delta > 0)
|
|
325
|
+
delta -= 2 * Math.PI;
|
|
326
|
+
if (sweep && delta < 0)
|
|
327
|
+
delta += 2 * Math.PI;
|
|
328
|
+
const steps = Math.max(4, Math.min(96, Math.ceil((Math.abs(delta) * Math.max(rx, ry)) / FLATTEN)));
|
|
329
|
+
const points = [];
|
|
330
|
+
for (let k = 1; k <= steps; k++) {
|
|
331
|
+
const t = start + (delta * k) / steps;
|
|
332
|
+
const ex = rx * Math.cos(t);
|
|
333
|
+
const ey = ry * Math.sin(t);
|
|
334
|
+
points.push(k === steps ? to : { x: cos * ex - sin * ey + cx, y: sin * ex + cos * ey + cy });
|
|
335
|
+
}
|
|
336
|
+
return points;
|
|
337
|
+
}
|
|
338
|
+
// ------------------------------------------------------------------ the hand
|
|
339
|
+
/**
|
|
340
|
+
* One pass of the hand over an outline: each subpath sampled every `step` pixels between the
|
|
341
|
+
* corners it keeps, each sample moved along the normal by at most `jitter`, drawn through the
|
|
342
|
+
* middles of its samples so the line bends smoothly, and a closed outline carried a little past
|
|
343
|
+
* its start.
|
|
344
|
+
*/
|
|
345
|
+
function sketchPath(outline, level, next) {
|
|
346
|
+
const parts = [];
|
|
347
|
+
for (const subpath of outline) {
|
|
348
|
+
const points = dedupe(subpath.points, subpath.closed);
|
|
349
|
+
if (points.length < 2)
|
|
350
|
+
continue;
|
|
351
|
+
const runs = runsOf(points, subpath.closed, level.step);
|
|
352
|
+
if (subpath.closed && runs.length === 1 && !hasCorner(points)) {
|
|
353
|
+
// A loop without a corner (an ellipse, a circle): drawn smoothly all the way round.
|
|
354
|
+
const samples = runs[0].slice(0, -1).map((sample) => ({
|
|
355
|
+
x: sample.point.x + sample.normal.x * level.jitter * (2 * next() - 1),
|
|
356
|
+
y: sample.point.y + sample.normal.y * level.jitter * (2 * next() - 1),
|
|
357
|
+
}));
|
|
358
|
+
parts.push(...smoothLoop(samples, level.jitter * (1 + next())));
|
|
359
|
+
continue;
|
|
360
|
+
}
|
|
361
|
+
const moved = runs.map((run) => run.map((sample) => ({
|
|
362
|
+
x: sample.point.x + sample.normal.x * level.jitter * (2 * next() - 1),
|
|
363
|
+
y: sample.point.y + sample.normal.y * level.jitter * (2 * next() - 1),
|
|
364
|
+
})));
|
|
365
|
+
// Runs share their corners: each run's first point is the last of the one before.
|
|
366
|
+
for (let r = 1; r < moved.length; r++)
|
|
367
|
+
moved[r][0] = moved[r - 1][moved[r - 1].length - 1];
|
|
368
|
+
if (subpath.closed && moved.length > 0) {
|
|
369
|
+
const first = moved[0][0];
|
|
370
|
+
const last = moved[moved.length - 1];
|
|
371
|
+
// The hand goes a little past where it started.
|
|
372
|
+
const second = moved[0][1] ?? first;
|
|
373
|
+
const length = distance(first, second) || 1;
|
|
374
|
+
const over = level.jitter * (1 + next());
|
|
375
|
+
last[last.length - 1] = {
|
|
376
|
+
x: first.x + ((second.x - first.x) / length) * over,
|
|
377
|
+
y: first.y + ((second.y - first.y) / length) * over,
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
const start = moved[0][0];
|
|
381
|
+
parts.push(`M${f(start.x)} ${f(start.y)}`);
|
|
382
|
+
for (const run of moved)
|
|
383
|
+
parts.push(...smooth(run));
|
|
384
|
+
}
|
|
385
|
+
return parts.join(" ");
|
|
386
|
+
}
|
|
387
|
+
/** A run of samples drawn through the middles of its inner samples: corners stay corners. */
|
|
388
|
+
function smooth(run) {
|
|
389
|
+
if (run.length === 2)
|
|
390
|
+
return [`L${f(run[1].x)} ${f(run[1].y)}`];
|
|
391
|
+
const out = [];
|
|
392
|
+
const mid = (a, b) => ({ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 });
|
|
393
|
+
const first = mid(run[0], run[1]);
|
|
394
|
+
out.push(`L${f(first.x)} ${f(first.y)}`);
|
|
395
|
+
for (let k = 1; k < run.length - 1; k++) {
|
|
396
|
+
const end = k === run.length - 2 ? run[k + 1] : mid(run[k], run[k + 1]);
|
|
397
|
+
out.push(`Q${f(run[k].x)} ${f(run[k].y)} ${f(end.x)} ${f(end.y)}`);
|
|
398
|
+
}
|
|
399
|
+
return out;
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* A closed loop of samples drawn through their middles, each sample a control: no corner where it
|
|
403
|
+
* starts, and the hand carried `over` pixels past the start along the loop.
|
|
404
|
+
*/
|
|
405
|
+
function smoothLoop(samples, over) {
|
|
406
|
+
const count = samples.length;
|
|
407
|
+
if (count < 3) {
|
|
408
|
+
return samples.map((p, k) => `${k === 0 ? "M" : "L"}${f(p.x)} ${f(p.y)}`).concat("Z");
|
|
409
|
+
}
|
|
410
|
+
const at = (k) => samples[k % count];
|
|
411
|
+
const mid = (k) => ({ x: (at(k).x + at(k + 1).x) / 2, y: (at(k).y + at(k + 1).y) / 2 });
|
|
412
|
+
const start = mid(0);
|
|
413
|
+
const out = [`M${f(start.x)} ${f(start.y)}`];
|
|
414
|
+
for (let k = 1; k <= count; k++) {
|
|
415
|
+
const end = mid(k);
|
|
416
|
+
out.push(`Q${f(at(k).x)} ${f(at(k).y)} ${f(end.x)} ${f(end.y)}`);
|
|
417
|
+
}
|
|
418
|
+
// Past the start, along the way the loop set off.
|
|
419
|
+
const next = at(1);
|
|
420
|
+
const length = distance(start, next) || 1;
|
|
421
|
+
out.push(`L${f(start.x + ((next.x - start.x) / length) * over)} ${f(start.y + ((next.y - start.y) / length) * over)}`);
|
|
422
|
+
return out;
|
|
423
|
+
}
|
|
424
|
+
/** Whether a closed outline turns sharply anywhere. */
|
|
425
|
+
function hasCorner(points) {
|
|
426
|
+
const count = points.length;
|
|
427
|
+
for (let k = 0; k < count; k++) {
|
|
428
|
+
const a = points[(k + count - 1) % count];
|
|
429
|
+
const b = points[k];
|
|
430
|
+
const c = points[(k + 1) % count];
|
|
431
|
+
const turn = Math.abs(Math.atan2((b.x - a.x) * (c.y - b.y) - (b.y - a.y) * (c.x - b.x), (b.x - a.x) * (c.x - b.x) + (b.y - a.y) * (c.y - b.y)));
|
|
432
|
+
if (turn > CORNER)
|
|
433
|
+
return true;
|
|
434
|
+
}
|
|
435
|
+
return false;
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* The outline cut at its corners into runs, each sampled evenly every `step` pixels at most: a
|
|
439
|
+
* run's first and last samples are its corners (or the ends of an open outline). A closed
|
|
440
|
+
* outline without a corner, a circle, starts at its first point.
|
|
441
|
+
*/
|
|
442
|
+
function runsOf(points, closed, step) {
|
|
443
|
+
const count = points.length;
|
|
444
|
+
const at = (k) => points[((k % count) + count) % count];
|
|
445
|
+
const isCorner = (k) => {
|
|
446
|
+
if (!closed && (k === 0 || k === count - 1))
|
|
447
|
+
return true;
|
|
448
|
+
const a = at(k - 1);
|
|
449
|
+
const b = at(k);
|
|
450
|
+
const c = at(k + 1);
|
|
451
|
+
const turn = Math.abs(Math.atan2((b.x - a.x) * (c.y - b.y) - (b.y - a.y) * (c.x - b.x), (b.x - a.x) * (c.x - b.x) + (b.y - a.y) * (c.y - b.y)));
|
|
452
|
+
return turn > CORNER;
|
|
453
|
+
};
|
|
454
|
+
const corners = [];
|
|
455
|
+
for (let k = 0; k < count; k++)
|
|
456
|
+
if (isCorner(k))
|
|
457
|
+
corners.push(k);
|
|
458
|
+
if (closed && corners.length === 0)
|
|
459
|
+
corners.push(0);
|
|
460
|
+
// The corner indices in order, a closed outline coming back to its first corner.
|
|
461
|
+
const stops = closed ? [...corners, corners[0] + count] : corners;
|
|
462
|
+
const runs = [];
|
|
463
|
+
for (let r = 0; r < stops.length - 1; r++) {
|
|
464
|
+
const from = stops[r];
|
|
465
|
+
const to = stops[r + 1];
|
|
466
|
+
const path = [];
|
|
467
|
+
for (let k = from; k <= to; k++)
|
|
468
|
+
path.push(at(k));
|
|
469
|
+
runs.push(sampleRun(path, step, closed || r > 0 ? at(from - 1) : undefined, closed || r < stops.length - 2 ? at(to + 1) : undefined));
|
|
470
|
+
}
|
|
471
|
+
return runs;
|
|
472
|
+
}
|
|
473
|
+
/** A run's samples, evenly spaced along it, each with the unit normal of the outline there. */
|
|
474
|
+
function sampleRun(path, step, before, after) {
|
|
475
|
+
const starts = [0];
|
|
476
|
+
for (let k = 1; k < path.length; k++)
|
|
477
|
+
starts.push(starts[k - 1] + distance(path[k - 1], path[k]));
|
|
478
|
+
const total = starts[starts.length - 1];
|
|
479
|
+
const pieces = Math.max(1, Math.ceil(total / step));
|
|
480
|
+
const samples = [];
|
|
481
|
+
const first = path[0];
|
|
482
|
+
const last = path[path.length - 1];
|
|
483
|
+
samples.push({ point: first, normal: cornerNormal(before, first, path[1]) });
|
|
484
|
+
let segment = 1;
|
|
485
|
+
for (let k = 1; k < pieces; k++) {
|
|
486
|
+
const along = (total * k) / pieces;
|
|
487
|
+
while (segment < path.length - 1 && starts[segment] < along)
|
|
488
|
+
segment++;
|
|
489
|
+
const a = path[segment - 1];
|
|
490
|
+
const b = path[segment];
|
|
491
|
+
const length = starts[segment] - starts[segment - 1];
|
|
492
|
+
const t = length === 0 ? 0 : (along - starts[segment - 1]) / length;
|
|
493
|
+
samples.push({
|
|
494
|
+
point: { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t },
|
|
495
|
+
normal: normalOf(a, b),
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
samples.push({ point: last, normal: cornerNormal(path[path.length - 2], last, after) });
|
|
499
|
+
return samples;
|
|
500
|
+
}
|
|
501
|
+
/** The unit normal of a segment. */
|
|
502
|
+
function normalOf(a, b) {
|
|
503
|
+
const length = distance(a, b);
|
|
504
|
+
return length === 0 ? { x: 0, y: 0 } : { x: -(b.y - a.y) / length, y: (b.x - a.x) / length };
|
|
505
|
+
}
|
|
506
|
+
/** The normal at a corner: halfway between the normals of the segments that meet there. */
|
|
507
|
+
function cornerNormal(before, at, after) {
|
|
508
|
+
const a = before ? normalOf(before, at) : undefined;
|
|
509
|
+
const b = after ? normalOf(at, after) : undefined;
|
|
510
|
+
if (!a)
|
|
511
|
+
return b ?? { x: 0, y: 0 };
|
|
512
|
+
if (!b)
|
|
513
|
+
return a;
|
|
514
|
+
const sum = { x: a.x + b.x, y: a.y + b.y };
|
|
515
|
+
const length = Math.hypot(sum.x, sum.y);
|
|
516
|
+
return length < 1e-6 ? a : { x: sum.x / length, y: sum.y / length };
|
|
517
|
+
}
|
|
518
|
+
/** The points without repeats, a closed outline without its start repeated at the end. */
|
|
519
|
+
function dedupe(points, closed) {
|
|
520
|
+
const out = [];
|
|
521
|
+
for (const p of points) {
|
|
522
|
+
const last = out[out.length - 1];
|
|
523
|
+
if (!last || distance(last, p) > 1e-6)
|
|
524
|
+
out.push(p);
|
|
525
|
+
}
|
|
526
|
+
if (closed && out.length > 1 && distance(out[0], out[out.length - 1]) <= 1e-6)
|
|
527
|
+
out.pop();
|
|
528
|
+
return out;
|
|
529
|
+
}
|
|
530
|
+
function distance(a, b) {
|
|
531
|
+
return Math.hypot(b.x - a.x, b.y - a.y);
|
|
532
|
+
}
|
|
533
|
+
/** A coordinate to two decimals, without a trailing zero. */
|
|
534
|
+
function f(value) {
|
|
535
|
+
const rounded = Math.round(value * 100) / 100;
|
|
536
|
+
return String(Object.is(rounded, -0) ? 0 : rounded);
|
|
537
|
+
}
|
|
538
|
+
/** FNV-1a, 32 bits: the seed of a group's passes. */
|
|
539
|
+
function hash(text) {
|
|
540
|
+
let h = 0x811c9dc5;
|
|
541
|
+
for (let k = 0; k < text.length; k++) {
|
|
542
|
+
h ^= text.charCodeAt(k);
|
|
543
|
+
h = Math.imul(h, 0x01000193);
|
|
544
|
+
}
|
|
545
|
+
return h >>> 0;
|
|
546
|
+
}
|
|
547
|
+
/** mulberry32: a small seeded generator of numbers in [0, 1). */
|
|
548
|
+
function random(seed) {
|
|
549
|
+
let state = seed >>> 0;
|
|
550
|
+
return () => {
|
|
551
|
+
state = (state + 0x6d2b79f5) >>> 0;
|
|
552
|
+
let t = state;
|
|
553
|
+
t = Math.imul(t ^ (t >>> 15), t | 1);
|
|
554
|
+
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
|
555
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
//# sourceMappingURL=sketch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sketch.js","sourceRoot":"","sources":["../src/sketch.ts"],"names":[],"mappings":"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"}
|
package/dist/svg.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { Scene } from "@meltemi/diagrams-layout";
|
|
2
|
+
/** How text reaches the viewer: font names, embedded fonts, or glyph outlines. */
|
|
3
|
+
export type FontPolicy = "system" | "embedded" | "outlined";
|
|
4
|
+
/** A font file to embed, limited by `unicodeRange` to the characters used (empty: whole font). */
|
|
5
|
+
export interface EmbeddableFace {
|
|
6
|
+
readonly family: string;
|
|
7
|
+
readonly weight: number;
|
|
8
|
+
/**
|
|
9
|
+
* The heaviest weight this file stands for, when the family has no heavier face: the rule then
|
|
10
|
+
* covers `weight` to `weightTo`, so a browser draws heavier text with this file as it is
|
|
11
|
+
* measured and outlined, not in a synthesized bold.
|
|
12
|
+
*/
|
|
13
|
+
readonly weightTo?: number;
|
|
14
|
+
readonly subset: string;
|
|
15
|
+
readonly format: "woff2" | "woff" | "truetype" | "opentype";
|
|
16
|
+
readonly data: Uint8Array;
|
|
17
|
+
readonly unicodeRange: string;
|
|
18
|
+
}
|
|
19
|
+
/** Fonts for the `embedded` and `outlined` policies, such as `@meltemi/diagrams-fonts`. */
|
|
20
|
+
export interface FontProvider {
|
|
21
|
+
/** The provider's family for a CSS font stack, or undefined when it has none. */
|
|
22
|
+
family(fontStack: string): string | undefined;
|
|
23
|
+
faces(family: string, weight: number, text: string): readonly EmbeddableFace[];
|
|
24
|
+
/** Text as a path in pixels, baseline at y = 0, starting at x = 0. */
|
|
25
|
+
outline(text: string, family: string, weight: number, size: number): {
|
|
26
|
+
d: string;
|
|
27
|
+
width: number;
|
|
28
|
+
};
|
|
29
|
+
/** False when a family's licence forbids embedding or outlining; such text stays `<text>`. */
|
|
30
|
+
embeddable?(family: string): boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface RenderOptions {
|
|
33
|
+
/** Defaults to `system`. */
|
|
34
|
+
readonly fonts?: FontPolicy;
|
|
35
|
+
readonly provider?: FontProvider;
|
|
36
|
+
}
|
|
37
|
+
/** Escapes text for element content and attribute values. */
|
|
38
|
+
export declare function escapeXml(text: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* Serialises a scene to standalone SVG. Portable by construction: inline presentation attributes,
|
|
41
|
+
* linear gradients and patterns in `<defs>` only when the scene declares them, no markers, no
|
|
42
|
+
* `dominant-baseline`, and no CSS except the `@font-face` rules of the `embedded` font policy.
|
|
43
|
+
*/
|
|
44
|
+
export declare function renderSvg(scene: Scene, options?: RenderOptions): string;
|
|
45
|
+
/**
|
|
46
|
+
* The font faces the text of `scenes` needs, each subset once, ordered by family, weight and subset;
|
|
47
|
+
* a face's `unicodeRange` covers the characters of every scene.
|
|
48
|
+
*/
|
|
49
|
+
export declare function embeddableFaces(scenes: readonly Scene[], provider: FontProvider): EmbeddableFace[];
|
|
50
|
+
/** The `@font-face` rule of a face, with its file inline. */
|
|
51
|
+
export declare function fontFaceRule(face: EmbeddableFace): string;
|
|
52
|
+
/** `@font-face` rules for the faces the scene's text needs, ordered by family, weight, subset. */
|
|
53
|
+
export declare function fontFaceRules(scene: Scene, provider: FontProvider): string[];
|
|
54
|
+
//# sourceMappingURL=svg.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../src/svg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EAKN,MAAM,0BAA0B,CAAC;AAKlC,kFAAkF;AAClF,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;AAE5D,kGAAkG;AAClG,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC5D,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AASD,2FAA2F;AAC3F,MAAM,WAAW,YAAY;IAC3B,iFAAiF;IACjF,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC9C,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE,CAAC;IAC/E,sEAAsE;IACtE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClG,8FAA8F;IAC9F,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,aAAa;IAC5B,4BAA4B;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;CAClC;AAOD,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM9C;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAmD3E;AA6FD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,KAAK,EAAE,EACxB,QAAQ,EAAE,YAAY,GACrB,cAAc,EAAE,CAwClB;AAED,6DAA6D;AAC7D,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAOzD;AAED,kGAAkG;AAClG,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM,EAAE,CAE5E"}
|
package/dist/svg.js
ADDED
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { sketchItems } from "./sketch.js";
|
|
2
|
+
const DASH = "5 4";
|
|
3
|
+
const FONT_MIME = {
|
|
4
|
+
woff2: "font/woff2",
|
|
5
|
+
woff: "font/woff",
|
|
6
|
+
truetype: "font/ttf",
|
|
7
|
+
opentype: "font/otf",
|
|
8
|
+
};
|
|
9
|
+
function n(value) {
|
|
10
|
+
const rounded = Math.round(value * 100) / 100;
|
|
11
|
+
return String(Object.is(rounded, -0) ? 0 : rounded);
|
|
12
|
+
}
|
|
13
|
+
/** Escapes text for element content and attribute values. */
|
|
14
|
+
export function escapeXml(text) {
|
|
15
|
+
return text
|
|
16
|
+
.replace(/&/g, "&")
|
|
17
|
+
.replace(/</g, "<")
|
|
18
|
+
.replace(/>/g, ">")
|
|
19
|
+
.replace(/"/g, """);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Serialises a scene to standalone SVG. Portable by construction: inline presentation attributes,
|
|
23
|
+
* linear gradients and patterns in `<defs>` only when the scene declares them, no markers, no
|
|
24
|
+
* `dominant-baseline`, and no CSS except the `@font-face` rules of the `embedded` font policy.
|
|
25
|
+
*/
|
|
26
|
+
export function renderSvg(scene, options = {}) {
|
|
27
|
+
const policy = options.fonts ?? "system";
|
|
28
|
+
if (policy !== "system" && !options.provider) {
|
|
29
|
+
throw new Error(`The "${policy}" font policy needs a font provider.`);
|
|
30
|
+
}
|
|
31
|
+
const fonts = policy === "system" ? null : { policy, provider: options.provider };
|
|
32
|
+
const out = [];
|
|
33
|
+
const w = n(scene.width);
|
|
34
|
+
const h = n(scene.height);
|
|
35
|
+
const box = scene.viewBox
|
|
36
|
+
? `${n(scene.viewBox.x)} ${n(scene.viewBox.y)} ${n(scene.viewBox.width)} ${n(scene.viewBox.height)}`
|
|
37
|
+
: `0 0 ${w} ${h}`;
|
|
38
|
+
out.push(`<svg xmlns="http://www.w3.org/2000/svg" width="${w}" height="${h}" viewBox="${box}" font-family="${escapeXml(scene.fonts.body)}">`);
|
|
39
|
+
if (scene.title !== null)
|
|
40
|
+
out.push(` <title>${escapeXml(scene.title)}</title>`);
|
|
41
|
+
if (scene.description !== null)
|
|
42
|
+
out.push(` <desc>${escapeXml(scene.description)}</desc>`);
|
|
43
|
+
if (scene.styleSheet) {
|
|
44
|
+
// The animated profile: CSS only, no scripts; `]]>` cannot occur in the generated rules.
|
|
45
|
+
out.push(" <style><![CDATA[");
|
|
46
|
+
for (const line of scene.styleSheet.split("\n"))
|
|
47
|
+
out.push(line === "" ? "" : ` ${line}`);
|
|
48
|
+
out.push(" ]]></style>");
|
|
49
|
+
}
|
|
50
|
+
const fontFaces = fonts?.policy === "embedded" ? fontFaceRules(scene, fonts.provider) : [];
|
|
51
|
+
if (scene.gradients.length > 0 || scene.patterns.length > 0 || fontFaces.length > 0) {
|
|
52
|
+
out.push(" <defs>");
|
|
53
|
+
if (fontFaces.length > 0) {
|
|
54
|
+
out.push(" <style>");
|
|
55
|
+
for (const rule of fontFaces)
|
|
56
|
+
out.push(` ${rule}`);
|
|
57
|
+
out.push(" </style>");
|
|
58
|
+
}
|
|
59
|
+
for (const gradient of scene.gradients)
|
|
60
|
+
out.push(...gradientDef(gradient));
|
|
61
|
+
for (const pattern of scene.patterns)
|
|
62
|
+
out.push(...patternDef(pattern));
|
|
63
|
+
out.push(" </defs>");
|
|
64
|
+
}
|
|
65
|
+
out.push(` <rect x="0" y="0" width="${w}" height="${h}" fill="${escapeXml(scene.background)}"/>`);
|
|
66
|
+
const outline = fonts?.policy === "outlined" ? fonts.provider : null;
|
|
67
|
+
// A sketch theme's strokes are painted by hand here, over the clean scene everyone else reads.
|
|
68
|
+
const items = scene.sketch ? sketchItems(scene.items, scene.sketch) : scene.items;
|
|
69
|
+
// A picture that links somewhere is one link around everything drawn.
|
|
70
|
+
if (scene.link) {
|
|
71
|
+
out.push(` <a href="${escapeXml(scene.link)}">`);
|
|
72
|
+
for (const item of items)
|
|
73
|
+
emit(item, out, " ", scene, outline);
|
|
74
|
+
out.push(" </a>");
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
for (const item of items)
|
|
78
|
+
emit(item, out, " ", scene, outline);
|
|
79
|
+
}
|
|
80
|
+
out.push("</svg>");
|
|
81
|
+
return `${out.join("\n")}\n`;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The dash of a stroke: an explicit pattern and offset, the default dash, round dots, or none.
|
|
85
|
+
* Dots are dashes of length 0 with round caps, spaced by the line's width; `roundCaps` says the
|
|
86
|
+
* element already writes them.
|
|
87
|
+
*/
|
|
88
|
+
function dashOf(item, roundCaps = false) {
|
|
89
|
+
if (item.dash) {
|
|
90
|
+
return ` stroke-dasharray="${item.dash.array.map(n).join(" ")}" stroke-dashoffset="${n(item.dash.offset)}"`;
|
|
91
|
+
}
|
|
92
|
+
if (item.dashed === "dotted") {
|
|
93
|
+
const caps = roundCaps ? "" : ' stroke-linecap="round"';
|
|
94
|
+
return ` stroke-dasharray="0 ${n(1.5 * item.strokeWidth + 3)}"${caps}`;
|
|
95
|
+
}
|
|
96
|
+
return item.dashed ? ` stroke-dasharray="${DASH}"` : "";
|
|
97
|
+
}
|
|
98
|
+
function opacityOf(opacity) {
|
|
99
|
+
return opacity !== undefined ? ` opacity="${n(opacity)}"` : "";
|
|
100
|
+
}
|
|
101
|
+
function classOf(item) {
|
|
102
|
+
return item.className ? ` class="${escapeXml(item.className)}"` : "";
|
|
103
|
+
}
|
|
104
|
+
/** A coordinate written as a number or kept as written (`50%`). */
|
|
105
|
+
const coordinate = (value) => typeof value === "number" ? n(value) : escapeXml(value);
|
|
106
|
+
/** A `<linearGradient>` or `<radialGradient>` with its units, transform, spread and stops. */
|
|
107
|
+
function gradientDef(gradient) {
|
|
108
|
+
const element = gradient.kind === "linear" ? "linearGradient" : "radialGradient";
|
|
109
|
+
const attributes = [`id="${escapeXml(gradient.id)}"`];
|
|
110
|
+
if (gradient.units)
|
|
111
|
+
attributes.push(`gradientUnits="${gradient.units}"`);
|
|
112
|
+
const keys = gradient.kind === "linear"
|
|
113
|
+
? ["x1", "y1", "x2", "y2"]
|
|
114
|
+
: ["cx", "cy", "r", "fx", "fy"];
|
|
115
|
+
for (const key of keys) {
|
|
116
|
+
const value = gradient[key];
|
|
117
|
+
if (value !== undefined)
|
|
118
|
+
attributes.push(`${key}="${coordinate(value)}"`);
|
|
119
|
+
}
|
|
120
|
+
if (gradient.transform)
|
|
121
|
+
attributes.push(`gradientTransform="${escapeXml(gradient.transform)}"`);
|
|
122
|
+
if (gradient.spread)
|
|
123
|
+
attributes.push(`spreadMethod="${gradient.spread}"`);
|
|
124
|
+
const lines = [` <${element} ${attributes.join(" ")}>`];
|
|
125
|
+
for (const stop of gradient.stops) {
|
|
126
|
+
const opacity = stop.opacity !== undefined ? ` stop-opacity="${n(stop.opacity)}"` : "";
|
|
127
|
+
lines.push(` <stop offset="${n(stop.offset)}" stop-color="${escapeXml(stop.color)}"${opacity}/>`);
|
|
128
|
+
}
|
|
129
|
+
lines.push(` </${element}>`);
|
|
130
|
+
return lines;
|
|
131
|
+
}
|
|
132
|
+
/** Opacity of pattern strokes and dots, so the fill below stays readable. */
|
|
133
|
+
const PATTERN_OPACITY = 0.35;
|
|
134
|
+
/** A `<pattern>` tile: diagonal lines (`hatch`), a dot grid (`dots`) or a diagonal grid (`cross`). */
|
|
135
|
+
function patternDef(pattern) {
|
|
136
|
+
const size = n(pattern.size);
|
|
137
|
+
const color = escapeXml(pattern.color);
|
|
138
|
+
const rotate = pattern.kind === "dots" ? "" : ' patternTransform="rotate(45)"';
|
|
139
|
+
const open = ` <pattern id="${escapeXml(pattern.id)}" patternUnits="userSpaceOnUse" width="${size}" height="${size}"${rotate}>`;
|
|
140
|
+
let shape;
|
|
141
|
+
if (pattern.kind === "dots") {
|
|
142
|
+
const c = n(pattern.size / 2);
|
|
143
|
+
shape = ` <circle cx="${c}" cy="${c}" r="${n(pattern.size * 0.15)}" fill="${color}" fill-opacity="${PATTERN_OPACITY}"/>`;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
const d = pattern.kind === "hatch" ? `M0 0V${size}` : `M0 0V${size}M0 0H${size}`;
|
|
147
|
+
shape = ` <path d="${d}" stroke="${color}" stroke-width="1.5" stroke-opacity="${PATTERN_OPACITY}" fill="none"/>`;
|
|
148
|
+
}
|
|
149
|
+
return [open, shape, " </pattern>"];
|
|
150
|
+
}
|
|
151
|
+
function stackOf(item, scene) {
|
|
152
|
+
return item.font === "mono" ? scene.fonts.mono : scene.fonts.body;
|
|
153
|
+
}
|
|
154
|
+
function textItems(items) {
|
|
155
|
+
return items.flatMap((item) => item.kind === "text" ? [item] : item.kind === "group" ? textItems(item.items) : []);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* The font faces the text of `scenes` needs, each subset once, ordered by family, weight and subset;
|
|
159
|
+
* a face's `unicodeRange` covers the characters of every scene.
|
|
160
|
+
*/
|
|
161
|
+
export function embeddableFaces(scenes, provider) {
|
|
162
|
+
const texts = new Map();
|
|
163
|
+
for (const scene of scenes) {
|
|
164
|
+
for (const item of textItems(scene.items)) {
|
|
165
|
+
const family = provider.family(stackOf(item, scene));
|
|
166
|
+
if (!family)
|
|
167
|
+
continue;
|
|
168
|
+
const key = `${family}|${item.weight}`;
|
|
169
|
+
const entry = texts.get(key) ?? { family, weight: item.weight, text: "" };
|
|
170
|
+
entry.text += item.text;
|
|
171
|
+
texts.set(key, entry);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// A family without the weight asked for gives the same file for several weights: it is embedded
|
|
175
|
+
// once, limited to the characters of them all.
|
|
176
|
+
const merged = new Map();
|
|
177
|
+
for (const face of [...texts.values()].flatMap((entry) => provider.faces(entry.family, entry.weight, entry.text))) {
|
|
178
|
+
const key = `${face.family}|${face.weight}|${face.subset}`;
|
|
179
|
+
const known = merged.get(key);
|
|
180
|
+
merged.set(key, known
|
|
181
|
+
? {
|
|
182
|
+
...known,
|
|
183
|
+
unicodeRange: known.unicodeRange === "" || face.unicodeRange === ""
|
|
184
|
+
? ""
|
|
185
|
+
: `${known.unicodeRange},${face.unicodeRange}`,
|
|
186
|
+
}
|
|
187
|
+
: face);
|
|
188
|
+
}
|
|
189
|
+
const faces = [...merged.values()];
|
|
190
|
+
return faces.sort((a, b) => (a.family < b.family ? -1 : a.family > b.family ? 1 : 0) ||
|
|
191
|
+
a.weight - b.weight ||
|
|
192
|
+
(a.subset < b.subset ? -1 : a.subset > b.subset ? 1 : 0));
|
|
193
|
+
}
|
|
194
|
+
/** The `@font-face` rule of a face, with its file inline. */
|
|
195
|
+
export function fontFaceRule(face) {
|
|
196
|
+
const range = face.unicodeRange === "" ? "" : `;unicode-range:${face.unicodeRange}`;
|
|
197
|
+
const weight = face.weightTo !== undefined && face.weightTo > face.weight
|
|
198
|
+
? `${face.weight} ${face.weightTo}`
|
|
199
|
+
: String(face.weight);
|
|
200
|
+
return `@font-face{font-family:"${face.family}";font-weight:${weight};src:url(data:${FONT_MIME[face.format]};base64,${base64(face.data)}) format("${face.format}")${range}}`;
|
|
201
|
+
}
|
|
202
|
+
/** `@font-face` rules for the faces the scene's text needs, ordered by family, weight, subset. */
|
|
203
|
+
export function fontFaceRules(scene, provider) {
|
|
204
|
+
return embeddableFaces([scene], provider).map(fontFaceRule);
|
|
205
|
+
}
|
|
206
|
+
/** Base64 without `Buffer`, so the renderer runs in browsers too. */
|
|
207
|
+
function base64(bytes) {
|
|
208
|
+
let binary = "";
|
|
209
|
+
const chunk = 0x8000;
|
|
210
|
+
for (let i = 0; i < bytes.length; i += chunk) {
|
|
211
|
+
binary += String.fromCharCode(...bytes.subarray(i, i + chunk));
|
|
212
|
+
}
|
|
213
|
+
return btoa(binary);
|
|
214
|
+
}
|
|
215
|
+
function emit(item, out, indent, scene, outline) {
|
|
216
|
+
switch (item.kind) {
|
|
217
|
+
case "group": {
|
|
218
|
+
const transform = item.transform ? ` transform="${escapeXml(item.transform)}"` : "";
|
|
219
|
+
const layer = item.layer ? ` data-layer="${escapeXml(item.layer)}"` : "";
|
|
220
|
+
out.push(`${indent}<g data-id="${escapeXml(item.id)}" data-role="${item.role}"${layer}${transform}${opacityOf(item.opacity)}${classOf(item)}>`);
|
|
221
|
+
if (item.href) {
|
|
222
|
+
// The element's drawing is a link; its group keeps its identity for tools.
|
|
223
|
+
out.push(`${indent} <a href="${escapeXml(item.href)}">`);
|
|
224
|
+
for (const child of item.items)
|
|
225
|
+
emit(child, out, `${indent} `, scene, outline);
|
|
226
|
+
out.push(`${indent} </a>`);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
for (const child of item.items)
|
|
230
|
+
emit(child, out, `${indent} `, scene, outline);
|
|
231
|
+
}
|
|
232
|
+
out.push(`${indent}</g>`);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
case "rect":
|
|
236
|
+
out.push(`${indent}<rect x="${n(item.x)}" y="${n(item.y)}" width="${n(item.width)}" height="${n(item.height)}" rx="${n(item.radius)}" fill="${escapeXml(item.fill)}" stroke="${escapeXml(item.stroke)}" stroke-width="${n(item.strokeWidth)}"${dashOf(item)}${opacityOf(item.opacity)}${classOf(item)}/>`);
|
|
237
|
+
return;
|
|
238
|
+
case "path": {
|
|
239
|
+
const rounded = item.rounded ? ' stroke-linecap="round" stroke-linejoin="round"' : "";
|
|
240
|
+
const extra = [
|
|
241
|
+
item.transform ? ` transform="${escapeXml(item.transform)}"` : "",
|
|
242
|
+
item.opacity !== undefined ? ` opacity="${n(item.opacity)}"` : "",
|
|
243
|
+
item.fillOpacity !== undefined ? ` fill-opacity="${n(item.fillOpacity)}"` : "",
|
|
244
|
+
item.strokeOpacity !== undefined ? ` stroke-opacity="${n(item.strokeOpacity)}"` : "",
|
|
245
|
+
item.fillRule === "evenodd" ? ' fill-rule="evenodd"' : "",
|
|
246
|
+
].join("");
|
|
247
|
+
out.push(`${indent}<path d="${escapeXml(item.d)}"${extra} fill="${escapeXml(item.fill)}" stroke="${escapeXml(item.stroke)}" stroke-width="${n(item.strokeWidth)}"${rounded}${dashOf(item, !!item.rounded)}${classOf(item)}/>`);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
case "image": {
|
|
251
|
+
const open = `${indent}<image x="${n(item.x)}" y="${n(item.y)}" width="${n(item.width)}" height="${n(item.height)}" href="${escapeXml(item.href)}" preserveAspectRatio="xMidYMid meet"`;
|
|
252
|
+
out.push(item.title === null
|
|
253
|
+
? `${open}/>`
|
|
254
|
+
: `${open}><title>${escapeXml(item.title)}</title></image>`);
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
case "polyline":
|
|
258
|
+
out.push(`${indent}<polyline points="${item.points.map((p) => `${n(p.x)},${n(p.y)}`).join(" ")}" fill="none" stroke="${escapeXml(item.stroke)}" stroke-width="${n(item.strokeWidth)}" stroke-linejoin="round" stroke-linecap="round"${dashOf(item, true)}${opacityOf(item.opacity)}${classOf(item)}/>`);
|
|
259
|
+
return;
|
|
260
|
+
case "text": {
|
|
261
|
+
const family = outline?.family(stackOf(item, scene));
|
|
262
|
+
if (outline && family && (outline.embeddable?.(family) ?? true)) {
|
|
263
|
+
const shape = outline.outline(item.text, family, item.weight, item.size);
|
|
264
|
+
if (shape.d === "")
|
|
265
|
+
return;
|
|
266
|
+
const shift = item.anchor === "start" ? 0 : item.anchor === "middle" ? shape.width / 2 : shape.width;
|
|
267
|
+
out.push(`${indent}<path transform="translate(${n(item.x - shift)} ${n(item.baseline)})" d="${shape.d}" fill="${escapeXml(item.fill)}" aria-label="${escapeXml(item.text)}"/>`);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
const familyAttribute = item.font === "mono" ? ` font-family="${escapeXml(scene.fonts.mono)}"` : "";
|
|
271
|
+
out.push(`${indent}<text x="${n(item.x)}" y="${n(item.baseline)}" text-anchor="${item.anchor}" font-size="${n(item.size)}" font-weight="${item.weight}"${familyAttribute} fill="${escapeXml(item.fill)}">${escapeXml(item.text)}</text>`);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=svg.js.map
|
package/dist/svg.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg.js","sourceRoot":"","sources":["../src/svg.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,45 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meltemi/diagrams-render",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "1.10.0",
|
|
4
|
+
"description": "Renders a vector scene to portable SVG.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/askenaz-dev/meltemi-diagrams.git",
|
|
9
|
+
"directory": "packages/render"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/askenaz-dev/meltemi-diagrams/tree/main/packages/render#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/askenaz-dev/meltemi-diagrams/issues"
|
|
14
|
+
},
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=22.12.0"
|
|
17
|
+
},
|
|
18
|
+
"type": "module",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"default": "./dist/index.js"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist"
|
|
27
|
+
],
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@meltemi/diagrams-model": "1.10.0",
|
|
30
|
+
"@meltemi/diagrams-language": "1.10.0",
|
|
31
|
+
"@meltemi/diagrams-layout": "1.10.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@meltemi/diagrams-fonts": "1.10.0",
|
|
35
|
+
"@meltemi/diagrams-layout-elk": "1.10.0",
|
|
36
|
+
"@meltemi/diagrams-assets": "1.10.0"
|
|
37
|
+
},
|
|
38
|
+
"publishConfig": {
|
|
39
|
+
"access": "public"
|
|
40
|
+
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"build": "tsc -p tsconfig.build.json",
|
|
43
|
+
"typecheck": "tsc -p tsconfig.json"
|
|
44
|
+
}
|
|
6
45
|
}
|