Merge pull request #1371 from nhooyr/imports

Add imports
This commit is contained in:
Alexander Wang 2023-06-07 16:32:58 -07:00 committed by GitHub
commit 202ffa254b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
392 changed files with 6131 additions and 833 deletions

View file

@ -1,5 +1,7 @@
#### Features 🚀
- D2 files have the ability to import from other D2 files. See [docs](https://d2lang.com/tour/imports). [#1371](https://github.com/terrastruct/d2/pull/1371)
#### Improvements 🧹
- Use shape specific sizing for grid containers [#1294](https://github.com/terrastruct/d2/pull/1294)

View file

@ -28,6 +28,7 @@ import (
"errors"
"fmt"
"math/big"
"path"
"strconv"
"strings"
"unicode"
@ -63,6 +64,7 @@ var _ Node = &DoubleQuotedString{}
var _ Node = &SingleQuotedString{}
var _ Node = &BlockString{}
var _ Node = &Substitution{}
var _ Node = &Import{}
var _ Node = &Array{}
var _ Node = &Map{}
@ -179,6 +181,10 @@ func (p Position) String() string {
return fmt.Sprintf("%d:%d", p.Line+1, p.Column+1)
}
func (p Position) Debug() string {
return fmt.Sprintf("%d:%d:%d", p.Line, p.Column, p.Byte)
}
// See docs on Range.
func (p Position) MarshalText() ([]byte, error) {
return []byte(fmt.Sprintf("%d:%d:%d", p.Line, p.Column, p.Byte)), nil
@ -256,6 +262,13 @@ func (p Position) Subtract(r rune, byUTF16 bool) Position {
return p
}
func (p Position) AdvanceString(s string, byUTF16 bool) Position {
for _, r := range s {
p = p.Advance(r, byUTF16)
}
return p
}
func (p Position) SubtractString(s string, byUTF16 bool) Position {
for _, r := range s {
p = p.Subtract(r, byUTF16)
@ -277,6 +290,7 @@ var _ MapNode = &Comment{}
var _ MapNode = &BlockComment{}
var _ MapNode = &Key{}
var _ MapNode = &Substitution{}
var _ MapNode = &Import{}
// ArrayNode is implemented by nodes that may be children of Arrays.
type ArrayNode interface {
@ -288,6 +302,7 @@ type ArrayNode interface {
var _ ArrayNode = &Comment{}
var _ ArrayNode = &BlockComment{}
var _ ArrayNode = &Substitution{}
var _ ArrayNode = &Import{}
// Value is implemented by nodes that may be values of a key.
type Value interface {
@ -334,6 +349,7 @@ func (s *DoubleQuotedString) node() {}
func (s *SingleQuotedString) node() {}
func (s *BlockString) node() {}
func (s *Substitution) node() {}
func (i *Import) node() {}
func (a *Array) node() {}
func (m *Map) node() {}
func (k *Key) node() {}
@ -351,6 +367,7 @@ func (s *DoubleQuotedString) Type() string { return "double quoted string" }
func (s *SingleQuotedString) Type() string { return "single quoted string" }
func (s *BlockString) Type() string { return s.Tag + " block string" }
func (s *Substitution) Type() string { return "substitution" }
func (i *Import) Type() string { return "import" }
func (a *Array) Type() string { return "array" }
func (m *Map) Type() string { return "map" }
func (k *Key) Type() string { return "map key" }
@ -368,6 +385,7 @@ func (s *DoubleQuotedString) GetRange() Range { return s.Range }
func (s *SingleQuotedString) GetRange() Range { return s.Range }
func (s *BlockString) GetRange() Range { return s.Range }
func (s *Substitution) GetRange() Range { return s.Range }
func (i *Import) GetRange() Range { return i.Range }
func (a *Array) GetRange() Range { return a.Range }
func (m *Map) GetRange() Range { return m.Range }
func (k *Key) GetRange() Range { return k.Range }
@ -379,6 +397,7 @@ func (c *Comment) mapNode() {}
func (c *BlockComment) mapNode() {}
func (k *Key) mapNode() {}
func (s *Substitution) mapNode() {}
func (i *Import) mapNode() {}
func (c *Comment) arrayNode() {}
func (c *BlockComment) arrayNode() {}
@ -390,6 +409,7 @@ func (s *DoubleQuotedString) arrayNode() {}
func (s *SingleQuotedString) arrayNode() {}
func (s *BlockString) arrayNode() {}
func (s *Substitution) arrayNode() {}
func (i *Import) arrayNode() {}
func (a *Array) arrayNode() {}
func (m *Map) arrayNode() {}
@ -402,6 +422,7 @@ func (s *SingleQuotedString) value() {}
func (s *BlockString) value() {}
func (a *Array) value() {}
func (m *Map) value() {}
func (i *Import) value() {}
func (n *Null) scalar() {}
func (b *Boolean) scalar() {}
@ -722,11 +743,20 @@ type Substitution struct {
Path []*StringBox `json:"path"`
}
type Import struct {
Range Range `json:"range"`
Spread bool `json:"spread"`
Pre string `json:"pre"`
Path []*StringBox `json:"path"`
}
// MapNodeBox is used to box MapNode for JSON persistence.
type MapNodeBox struct {
Comment *Comment `json:"comment,omitempty"`
BlockComment *BlockComment `json:"block_comment,omitempty"`
Substitution *Substitution `json:"substitution,omitempty"`
Import *Import `json:"import,omitempty"`
MapKey *Key `json:"map_key,omitempty"`
}
@ -739,6 +769,8 @@ func MakeMapNodeBox(n MapNode) MapNodeBox {
box.BlockComment = n
case *Substitution:
box.Substitution = n
case *Import:
box.Import = n
case *Key:
box.MapKey = n
}
@ -753,6 +785,8 @@ func (mb MapNodeBox) Unbox() MapNode {
return mb.BlockComment
case mb.Substitution != nil:
return mb.Substitution
case mb.Import != nil:
return mb.Import
case mb.MapKey != nil:
return mb.MapKey
default:
@ -765,6 +799,7 @@ type ArrayNodeBox struct {
Comment *Comment `json:"comment,omitempty"`
BlockComment *BlockComment `json:"block_comment,omitempty"`
Substitution *Substitution `json:"substitution,omitempty"`
Import *Import `json:"import,omitempty"`
Null *Null `json:"null,omitempty"`
Boolean *Boolean `json:"boolean,omitempty"`
Number *Number `json:"number,omitempty"`
@ -785,6 +820,8 @@ func MakeArrayNodeBox(an ArrayNode) ArrayNodeBox {
ab.BlockComment = an
case *Substitution:
ab.Substitution = an
case *Import:
ab.Import = an
case *Null:
ab.Null = an
case *Boolean:
@ -815,6 +852,8 @@ func (ab ArrayNodeBox) Unbox() ArrayNode {
return ab.BlockComment
case ab.Substitution != nil:
return ab.Substitution
case ab.Import != nil:
return ab.Import
case ab.Null != nil:
return ab.Null
case ab.Boolean != nil:
@ -849,6 +888,7 @@ type ValueBox struct {
BlockString *BlockString `json:"block_string,omitempty"`
Array *Array `json:"array,omitempty"`
Map *Map `json:"map,omitempty"`
Import *Import `json:"import,omitempty"`
}
func (vb ValueBox) Unbox() Value {
@ -871,6 +911,8 @@ func (vb ValueBox) Unbox() Value {
return vb.Array
case vb.Map != nil:
return vb.Map
case vb.Import != nil:
return vb.Import
default:
return nil
}
@ -897,6 +939,8 @@ func MakeValueBox(v Value) ValueBox {
vb.Array = v
case *Map:
vb.Map = v
case *Import:
vb.Import = v
}
return vb
}
@ -990,8 +1034,8 @@ type InterpolationBox struct {
// & is only special if it begins a key.
// - is only special if followed by another - in a key.
// ' " and | are only special if they begin an unquoted key or value.
var UnquotedKeySpecials = string([]rune{'#', ';', '\n', '\\', '{', '}', '[', ']', '\'', '"', '|', ':', '.', '-', '<', '>', '*', '&', '(', ')'})
var UnquotedValueSpecials = string([]rune{'#', ';', '\n', '\\', '{', '}', '[', ']', '\'', '"', '|', '$'})
var UnquotedKeySpecials = string([]rune{'#', ';', '\n', '\\', '{', '}', '[', ']', '\'', '"', '|', ':', '.', '-', '<', '>', '*', '&', '(', ')', '@'})
var UnquotedValueSpecials = string([]rune{'#', ';', '\n', '\\', '{', '}', '[', ']', '\'', '"', '|', '$', '@'})
// RawString returns s in a AST String node that can format s in the most aesthetically
// pleasing way.
@ -1040,8 +1084,33 @@ func RawString(s string, inKey bool) String {
return FlatUnquotedString(s)
}
func RawStringBox(s string, inKey bool) *StringBox {
return MakeValueBox(RawString(s, inKey)).StringBox()
}
func hasSurroundingWhitespace(s string) bool {
r, _ := utf8.DecodeRuneInString(s)
r2, _ := utf8.DecodeLastRuneInString(s)
return unicode.IsSpace(r) || unicode.IsSpace(r2)
}
func (s *Substitution) IDA() (ida []string) {
for _, el := range s.Path {
ida = append(ida, el.Unbox().ScalarString())
}
return ida
}
func (i *Import) IDA() (ida []string) {
for _, el := range i.Path[1:] {
ida = append(ida, el.Unbox().ScalarString())
}
return ida
}
func (i *Import) PathWithPre() string {
if len(i.Path) == 0 {
return ""
}
return path.Join(i.Pre, i.Path[0].Unbox().ScalarString())
}

View file

@ -329,6 +329,7 @@ func compile(ctx context.Context, ms *xmain.State, plugin d2plugin.Plugin, rende
Ruler: ruler,
ThemeID: renderOpts.ThemeID,
FontFamily: fontFamily,
InputPath: inputPath,
}
if renderOpts.Sketch {
opts.FontFamily = go2.Pointer(d2fonts.HandDrawn)

View file

@ -4,7 +4,9 @@ import (
"encoding/xml"
"fmt"
"io"
"io/fs"
"net/url"
"os"
"strconv"
"strings"
@ -21,21 +23,30 @@ import (
type CompileOptions struct {
UTF16 bool
// FS is the file system used for resolving imports in the d2 text.
// It should correspond to the root path.
FS fs.FS
}
func Compile(path string, r io.RuneReader, opts *CompileOptions) (*d2graph.Graph, error) {
func Compile(p string, r io.RuneReader, opts *CompileOptions) (*d2graph.Graph, error) {
if opts == nil {
opts = &CompileOptions{}
}
if opts.FS == nil {
opts.FS = os.DirFS("/")
}
ast, err := d2parser.Parse(path, r, &d2parser.ParseOptions{
ast, err := d2parser.Parse(p, r, &d2parser.ParseOptions{
UTF16: opts.UTF16,
})
if err != nil {
return nil, err
}
ir, err := d2ir.Compile(ast)
ir, err := d2ir.Compile(ast, &d2ir.CompileOptions{
UTF16: opts.UTF16,
FS: opts.FS,
})
if err != nil {
return nil, err
}
@ -50,7 +61,9 @@ func Compile(path string, r io.RuneReader, opts *CompileOptions) (*d2graph.Graph
}
func compileIR(ast *d2ast.Map, m *d2ir.Map) (*d2graph.Graph, error) {
c := &compiler{}
c := &compiler{
err: &d2parser.ParseError{},
}
g := d2graph.NewGraph()
g.AST = ast
@ -116,7 +129,7 @@ func (c *compiler) compileBoardsField(g *d2graph.Graph, ir *d2ir.Map, fieldName
}
type compiler struct {
err d2parser.ParseError
err *d2parser.ParseError
}
func (c *compiler) errorf(n d2ast.Node, f string, v ...interface{}) {
@ -264,17 +277,19 @@ func (c *compiler) compileField(obj *d2graph.Object, f *d2ir.Field) {
obj.Map = fr.Context.Key.Value.Map
}
}
scopeObjIDA := d2ir.BoardIDA(fr.Context.ScopeMap)
scopeObj := obj.Graph.Root.EnsureChildIDVal(scopeObjIDA)
obj.References = append(obj.References, d2graph.Reference{
r := d2graph.Reference{
Key: fr.KeyPath,
KeyPathIndex: fr.KeyPathIndex(),
MapKey: fr.Context.Key,
MapKeyEdgeIndex: fr.Context.EdgeIndex(),
Scope: fr.Context.Scope,
ScopeObj: scopeObj,
})
}
if fr.Context.ScopeMap != nil {
scopeObjIDA := d2ir.BoardIDA(fr.Context.ScopeMap)
r.ScopeObj = obj.Graph.Root.EnsureChildIDVal(scopeObjIDA)
}
obj.References = append(obj.References, r)
}
}
@ -617,15 +632,17 @@ func (c *compiler) compileEdge(obj *d2graph.Object, e *d2ir.Edge) {
edge.Label.MapKey = e.LastPrimaryKey()
for _, er := range e.References {
scopeObjIDA := d2ir.BoardIDA(er.Context.ScopeMap)
scopeObj := edge.Src.Graph.Root.EnsureChildIDVal(scopeObjIDA)
edge.References = append(edge.References, d2graph.EdgeReference{
r := d2graph.EdgeReference{
Edge: er.Context.Edge,
MapKey: er.Context.Key,
MapKeyEdgeIndex: er.Context.EdgeIndex(),
Scope: er.Context.Scope,
ScopeObj: scopeObj,
})
}
if er.Context.ScopeMap != nil {
scopeObjIDA := d2ir.BoardIDA(er.Context.ScopeMap)
r.ScopeObj = edge.Src.Graph.Root.EnsureChildIDVal(scopeObjIDA)
}
edge.References = append(edge.References, r)
}
}

View file

@ -1,6 +1,7 @@
package d2format
import (
"path"
"strconv"
"strings"
@ -62,6 +63,8 @@ func (p *printer) node(n d2ast.Node) {
p.blockString(n)
case *d2ast.Substitution:
p.substitution(n)
case *d2ast.Import:
p._import(n)
case *d2ast.Array:
p.array(n)
case *d2ast.Map:
@ -203,6 +206,19 @@ func (p *printer) substitution(s *d2ast.Substitution) {
p.sb.WriteByte('}')
}
func (p *printer) _import(i *d2ast.Import) {
if i.Spread {
p.sb.WriteString("...")
}
p.sb.WriteString("@")
pre := path.Clean(i.Pre)
if pre != "." {
p.sb.WriteString(pre)
p.sb.WriteRune('/')
}
p.path(i.Path)
}
func (p *printer) array(a *d2ast.Array) {
p.sb.WriteByte('[')
if !a.Range.OneLine() {

View file

@ -617,6 +617,38 @@ y
x <= y
`,
exp: `x <- = y
`,
},
{
name: "import/1",
in: `
x: @file.d2
`,
exp: `x: @file
`,
},
{
name: "import/2",
in: `
x: @file."d2"
`,
exp: `x: @file."d2"
`,
},
{
name: "import/3",
in: `
x: @./file
`,
exp: `x: @file
`,
},
{
name: "import/4",
in: `
x: @../file
`,
exp: `x: @../file
`,
},
}

View file

@ -1,6 +1,7 @@
package d2ir
import (
"io/fs"
"strings"
"oss.terrastruct.com/d2/d2ast"
@ -9,18 +10,46 @@ import (
)
type compiler struct {
err d2parser.ParseError
err *d2parser.ParseError
fs fs.FS
// importStack is used to detect cyclic imports.
importStack []string
// importCache enables reuse of files imported multiple times.
importCache map[string]*Map
utf16 bool
}
type CompileOptions struct {
UTF16 bool
// Pass nil to disable imports.
FS fs.FS
}
func (c *compiler) errorf(n d2ast.Node, f string, v ...interface{}) {
c.err.Errors = append(c.err.Errors, d2parser.Errorf(n, f, v...).(d2ast.Error))
}
func Compile(ast *d2ast.Map) (*Map, error) {
c := &compiler{}
func Compile(ast *d2ast.Map, opts *CompileOptions) (*Map, error) {
if opts == nil {
opts = &CompileOptions{}
}
c := &compiler{
err: &d2parser.ParseError{},
fs: opts.FS,
importCache: make(map[string]*Map),
utf16: opts.UTF16,
}
m := &Map{}
m.initRoot()
m.parent.(*Field).References[0].Context.Scope = ast
c.pushImportStack(&d2ast.Import{
Path: []*d2ast.StringBox{d2ast.RawStringBox(ast.GetRange().Path, true)},
})
defer c.popImportStack()
c.compileMap(m, ast)
c.compileClasses(m)
if !c.err.Empty() {
@ -85,6 +114,25 @@ func (c *compiler) compileMap(dst *Map, ast *d2ast.Map) {
Scope: ast,
ScopeMap: dst,
})
case n.Import != nil:
impn, ok := c._import(n.Import)
if !ok {
continue
}
if impn.Map() == nil {
c.errorf(n.Import, "cannot spread import non map into map")
continue
}
OverlayMap(dst, impn.Map())
if impnf, ok := impn.(*Field); ok {
if impnf.Primary_ != nil {
dstf := ParentField(dst)
if dstf != nil {
dstf.Primary_ = impnf.Primary_
}
}
}
case n.Substitution != nil:
panic("TODO")
}
@ -145,6 +193,46 @@ func (c *compiler) compileField(dst *Map, kp *d2ast.KeyPath, refctx *RefContext)
case BoardScenario, BoardStep:
c.compileClasses(f.Map())
}
} else if refctx.Key.Value.Import != nil {
n, ok := c._import(refctx.Key.Value.Import)
if !ok {
return
}
switch n := n.(type) {
case *Field:
if n.Primary_ != nil {
f.Primary_ = n.Primary_.Copy(f).(*Scalar)
}
if n.Composite != nil {
f.Composite = n.Composite.Copy(f).(Composite)
}
case *Map:
f.Composite = &Map{
parent: f,
}
switch NodeBoardKind(f) {
case BoardScenario:
c.overlay(ParentBoard(f).Map(), f)
case BoardStep:
stepsMap := ParentMap(f)
for i := range stepsMap.Fields {
if stepsMap.Fields[i] == f {
if i == 0 {
c.overlay(ParentBoard(f).Map(), f)
} else {
c.overlay(stepsMap.Fields[i-1].Map(), f)
}
break
}
}
}
OverlayMap(f.Map(), n)
c.updateLinks(f.Map())
switch NodeBoardKind(f) {
case BoardScenario, BoardStep:
c.compileClasses(f.Map())
}
}
} else if refctx.Key.Value.ScalarBox().Unbox() != nil {
// If the link is a board, we need to transform it into an absolute path.
if f.Name == "link" {
@ -157,6 +245,24 @@ func (c *compiler) compileField(dst *Map, kp *d2ast.KeyPath, refctx *RefContext)
}
}
func (c *compiler) updateLinks(m *Map) {
for _, f := range m.Fields {
if f.Name == "link" {
bida := BoardIDA(f)
aida := IDA(f)
if len(bida) != len(aida) {
prependIDA := aida[:len(aida)-len(bida)]
kp := d2ast.MakeKeyPath(prependIDA)
s := d2format.Format(kp) + strings.TrimPrefix(f.Primary_.Value.ScalarString(), "root")
f.Primary_.Value = d2ast.MakeValueBox(d2ast.FlatUnquotedString(s)).ScalarBox().Unbox()
}
}
if f.Map() != nil {
c.updateLinks(f.Map())
}
}
}
func (c *compiler) compileLink(refctx *RefContext) {
val := refctx.Key.Value.ScalarBox().Unbox().ScalarString()
link, err := d2parser.ParseKey(val)
@ -216,7 +322,7 @@ func (c *compiler) compileLink(refctx *RefContext) {
// Create the absolute path by appending scope path with value specified
scopeIDA = append(scopeIDA, linkIDA...)
kp := d2ast.MakeKeyPath(scopeIDA)
refctx.Key.Value = d2ast.MakeValueBox(d2ast.RawString(d2format.Format(kp), true))
refctx.Key.Value = d2ast.MakeValueBox(d2ast.FlatUnquotedString(d2format.Format(kp)))
}
func (c *compiler) compileEdges(refctx *RefContext) {
@ -330,6 +436,34 @@ func (c *compiler) compileArray(dst *Array, a *d2ast.Array) {
parent: dst,
Value: v,
}
case *d2ast.Import:
n, ok := c._import(v)
if !ok {
continue
}
switch n := n.(type) {
case *Field:
if v.Spread {
a, ok := n.Composite.(*Array)
if !ok {
c.errorf(v, "can only spread import array into array")
continue
}
dst.Values = append(dst.Values, a.Values...)
continue
}
if n.Composite != nil {
irv = n.Composite
} else {
irv = n.Primary_
}
case *Map:
if v.Spread {
c.errorf(v, "can only spread import array into array")
continue
}
irv = n
}
case *d2ast.Substitution:
// panic("TODO")
}

View file

@ -9,6 +9,7 @@ import (
"oss.terrastruct.com/util-go/assert"
"oss.terrastruct.com/util-go/diff"
"oss.terrastruct.com/util-go/mapfs"
"oss.terrastruct.com/d2/d2ast"
"oss.terrastruct.com/d2/d2ir"
@ -24,6 +25,7 @@ func TestCompile(t *testing.T) {
t.Run("layers", testCompileLayers)
t.Run("scenarios", testCompileScenarios)
t.Run("steps", testCompileSteps)
t.Run("imports", testCompileImports)
}
type testCase struct {
@ -45,10 +47,26 @@ func compile(t testing.TB, text string) (*d2ir.Map, error) {
t.Helper()
d2Path := fmt.Sprintf("%v.d2", t.Name())
ast, err := d2parser.Parse(d2Path, strings.NewReader(text), nil)
assert.Success(t, err)
return compileFS(t, d2Path, map[string]string{d2Path: text})
}
m, err := d2ir.Compile(ast)
func compileFS(t testing.TB, path string, mfs map[string]string) (*d2ir.Map, error) {
t.Helper()
ast, err := d2parser.Parse(path, strings.NewReader(mfs[path]), nil)
if err != nil {
return nil, err
}
fs, err := mapfs.New(mfs)
assert.Success(t, err)
t.Cleanup(func() {
err = fs.Close()
assert.Success(t, err)
})
m, err := d2ir.Compile(ast, &d2ir.CompileOptions{
FS: fs,
})
if err != nil {
return nil, err
}

156
d2ir/import.go Normal file
View file

@ -0,0 +1,156 @@
package d2ir
import (
"bufio"
"os"
"path"
"strings"
"oss.terrastruct.com/d2/d2ast"
"oss.terrastruct.com/d2/d2parser"
)
func (c *compiler) pushImportStack(imp *d2ast.Import) (string, bool) {
impPath := imp.PathWithPre()
if impPath == "" && imp.Range.Path != "" {
c.errorf(imp, "imports must specify a path to import")
return "", false
}
if len(c.importStack) > 0 {
if path.IsAbs(impPath) {
c.errorf(imp, "import paths must be relative")
return "", false
}
if path.Ext(impPath) != ".d2" {
impPath += ".d2"
}
// Imports are always relative to the importing file.
impPath = path.Join(path.Dir(c.importStack[len(c.importStack)-1]), impPath)
}
for i, p := range c.importStack {
if impPath == p {
c.errorf(imp, "detected cyclic import chain: %s", formatCyclicChain(c.importStack[i:]))
return "", false
}
}
c.importStack = append(c.importStack, impPath)
return impPath, true
}
func (c *compiler) popImportStack() {
c.importStack = c.importStack[:len(c.importStack)-1]
}
func formatCyclicChain(cyclicChain []string) string {
var b strings.Builder
for _, p := range cyclicChain {
b.WriteString(p)
b.WriteString(" -> ")
}
b.WriteString(cyclicChain[0])
return b.String()
}
// Returns either *Map or *Field.
func (c *compiler) _import(imp *d2ast.Import) (Node, bool) {
ir, ok := c.__import(imp)
if !ok {
return nil, false
}
nilScopeMap(ir)
if len(imp.IDA()) > 0 {
f := ir.GetField(imp.IDA()...)
if f == nil {
c.errorf(imp, "import key %q doesn't exist inside import", imp.IDA())
return nil, false
}
return f, true
}
return ir, true
}
func (c *compiler) __import(imp *d2ast.Import) (*Map, bool) {
impPath, ok := c.pushImportStack(imp)
if !ok {
return nil, false
}
defer c.popImportStack()
ir, ok := c.importCache[impPath]
if ok {
return ir, true
}
p := path.Clean(impPath)
if path.IsAbs(p) {
// Path cannot be absolute. DirFS does not accept absolute paths. We strip off the leading
// slash to make it relative to the root.
p = p[1:]
} else if c.fs == os.DirFS("/") {
wd, err := os.Getwd()
if err != nil {
c.errorf(imp, "failed to import %q: %v", impPath, err)
return nil, false
}
p = path.Join(wd, p)
// See above explanation.
if path.IsAbs(p) {
p = p[1:]
}
}
f, err := c.fs.Open(p)
if err != nil {
c.errorf(imp, "failed to import %q: %v", impPath, err)
return nil, false
}
defer f.Close()
ast, err := d2parser.Parse(impPath, bufio.NewReader(f), &d2parser.ParseOptions{
UTF16: c.utf16,
ParseError: c.err,
})
if err != nil {
return nil, false
}
ir = &Map{}
ir.initRoot()
ir.parent.(*Field).References[0].Context.Scope = ast
c.compileMap(ir, ast)
c.importCache[impPath] = ir
return ir, true
}
func nilScopeMap(n Node) {
switch n := n.(type) {
case *Map:
for _, f := range n.Fields {
nilScopeMap(f)
}
for _, e := range n.Edges {
nilScopeMap(e)
}
case *Edge:
for _, r := range n.References {
r.Context.ScopeMap = nil
}
if n.Map() != nil {
nilScopeMap(n.Map())
}
case *Field:
for _, r := range n.References {
r.Context.ScopeMap = nil
}
if n.Map() != nil {
nilScopeMap(n.Map())
}
}
}

214
d2ir/import_test.go Normal file
View file

@ -0,0 +1,214 @@
package d2ir_test
import (
"testing"
"oss.terrastruct.com/util-go/assert"
"oss.terrastruct.com/d2/d2ir"
)
func testCompileImports(t *testing.T) {
t.Parallel()
tca := []testCase{
{
name: "value",
run: func(t testing.TB) {
m, err := compileFS(t, "index.d2", map[string]string{
"index.d2": "x: @x.d2",
"x.d2": `shape: circle
label: meow`,
})
assert.Success(t, err)
assertQuery(t, m, 3, 0, nil, "")
assertQuery(t, m, 2, 0, nil, "x")
assertQuery(t, m, 0, 0, "circle", "x.shape")
assertQuery(t, m, 0, 0, "meow", "x.label")
},
},
{
name: "nested/map",
run: func(t testing.TB) {
m, err := compileFS(t, "index.d2", map[string]string{
"index.d2": "x: @x.y",
"x.d2": `y: {
shape: circle
label: meow
}`,
})
assert.Success(t, err)
assertQuery(t, m, 3, 0, nil, "")
assertQuery(t, m, 2, 0, nil, "x")
assertQuery(t, m, 0, 0, "circle", "x.shape")
assertQuery(t, m, 0, 0, "meow", "x.label")
},
},
{
name: "nested/array",
run: func(t testing.TB) {
m, err := compileFS(t, "index.d2", map[string]string{
"index.d2": "x: @x.y",
"x.d2": `y: [1, 2]`,
})
assert.Success(t, err)
assertQuery(t, m, 1, 0, nil, "")
x := assertQuery(t, m, 0, 0, nil, "x")
xf, ok := x.(*d2ir.Field)
assert.True(t, ok)
assert.Equal(t, `[1, 2]`, xf.Composite.String())
},
},
{
name: "nested/scalar",
run: func(t testing.TB) {
m, err := compileFS(t, "index.d2", map[string]string{
"index.d2": "x: @x.y",
"x.d2": `y: meow`,
})
assert.Success(t, err)
assertQuery(t, m, 1, 0, nil, "")
assertQuery(t, m, 0, 0, "meow", "x")
},
},
{
name: "boards",
run: func(t testing.TB) {
m, err := compileFS(t, "index.d2", map[string]string{
"index.d2": `x.link: layers.x; layers: { x: @x }`,
"x.d2": `y.link: layers.y; layers: { y: @y }`,
"y.d2": `meow`,
})
assert.Success(t, err)
assertQuery(t, m, 0, 0, "root.layers.x", "x.link")
assertQuery(t, m, 0, 0, "root.layers.x.layers.y", "layers.x.y.link")
},
},
{
name: "steps-inheritence",
run: func(t testing.TB) {
m, err := compileFS(t, "index.d2", map[string]string{
"index.d2": `z; steps: { 1: @x; 2: @y }; scenarios: { x: @x; y: @y }`,
"x.d2": `a`,
"y.d2": `b`,
})
assert.Success(t, err)
assertQuery(t, m, 2, 0, nil, "scenarios.x")
assertQuery(t, m, 2, 0, nil, "scenarios.y")
assertQuery(t, m, 2, 0, nil, "steps.1")
assertQuery(t, m, 3, 0, nil, "steps.2")
},
},
{
name: "spread",
run: func(t testing.TB) {
m, err := compileFS(t, "index.d2", map[string]string{
"index.d2": "...@x.d2",
"x.d2": "x: wowa",
})
assert.Success(t, err)
assertQuery(t, m, 1, 0, nil, "")
assertQuery(t, m, 0, 0, "wowa", "x")
},
},
{
name: "nested/spread",
run: func(t testing.TB) {
m, err := compileFS(t, "index.d2", map[string]string{
"index.d2": "...@x.y",
"x.d2": "y: { jon; jan }",
})
assert.Success(t, err)
assertQuery(t, m, 2, 0, nil, "")
assertQuery(t, m, 0, 0, nil, "jan")
assertQuery(t, m, 0, 0, nil, "jon")
},
},
{
name: "nested/spread_primary",
run: func(t testing.TB) {
m, err := compileFS(t, "index.d2", map[string]string{
"index.d2": "q: { ...@x.y }",
"x.d2": "y: meow { jon; jan }",
})
assert.Success(t, err)
assertQuery(t, m, 3, 0, nil, "")
assertQuery(t, m, 2, 0, "meow", "q")
assertQuery(t, m, 0, 0, nil, "q.jan")
assertQuery(t, m, 0, 0, nil, "q.jon")
},
},
}
runa(t, tca)
t.Run("errors", func(t *testing.T) {
tca := []testCase{
{
name: "not_exist",
run: func(t testing.TB) {
_, err := compileFS(t, "index.d2", map[string]string{
"index.d2": "...@x.d2",
})
assert.ErrorString(t, err, `index.d2:1:1: failed to import "x.d2": open x.d2: no such file or directory`)
},
},
{
name: "escape",
run: func(t testing.TB) {
_, err := compileFS(t, "index.d2", map[string]string{
"index.d2": "...@'./../x.d2'",
})
assert.ErrorString(t, err, `index.d2:1:1: failed to import "../x.d2": stat ../x.d2: invalid argument`)
},
},
{
name: "absolute",
run: func(t testing.TB) {
_, err := compileFS(t, "index.d2", map[string]string{
"index.d2": "...@/x.d2",
})
assert.ErrorString(t, err, `index.d2:1:1: import paths must be relative`)
},
},
{
name: "parse",
run: func(t testing.TB) {
_, err := compileFS(t, "index.d2", map[string]string{
"index.d2": "...@x.d2",
"x.d2": "x<><><<>q",
})
assert.ErrorString(t, err, `x.d2:1:1: connection missing destination
x.d2:1:4: connection missing source
x.d2:1:4: connection missing destination
x.d2:1:6: connection missing source
x.d2:1:6: connection missing destination
x.d2:1:7: connection missing source`)
},
},
{
name: "cyclic",
run: func(t testing.TB) {
_, err := compileFS(t, "index.d2", map[string]string{
"index.d2": "...@x",
"x.d2": "...@y",
"y.d2": "...@q",
"q.d2": "...@x",
})
assert.ErrorString(t, err, `q.d2:1:1: detected cyclic import chain: x.d2 -> y.d2 -> q.d2 -> x.d2`)
},
},
{
name: "spread_non_map",
run: func(t testing.TB) {
_, err := compileFS(t, "index.d2", map[string]string{
"index.d2": "...@x.y",
"x.d2": "y: meow",
})
assert.ErrorString(t, err, `index.d2:1:1: cannot spread import non map into map`)
},
},
}
runa(t, tca)
})
}

View file

@ -31,6 +31,8 @@ type CompileOptions struct {
// - pre-measured (web setting)
// TODO maybe some will want to configure code font too, but that's much lower priority
FontFamily *d2fonts.FontFamily
InputPath string
}
func Compile(ctx context.Context, input string, opts *CompileOptions) (*d2target.Diagram, *d2graph.Graph, error) {
@ -38,7 +40,7 @@ func Compile(ctx context.Context, input string, opts *CompileOptions) (*d2target
opts = &CompileOptions{}
}
g, err := d2compiler.Compile("", strings.NewReader(input), &d2compiler.CompileOptions{
g, err := d2compiler.Compile(opts.InputPath, strings.NewReader(input), &d2compiler.CompileOptions{
UTF16: opts.UTF16,
})
if err != nil {

View file

@ -347,7 +347,7 @@ func _set(g *d2graph.Graph, key string, tag, value *string) error {
}
}
ir, err := d2ir.Compile(g.AST)
ir, err := d2ir.Compile(g.AST, nil)
if err != nil {
return err
}

View file

@ -15,7 +15,8 @@ import (
)
type ParseOptions struct {
UTF16 bool
UTF16 bool
ParseError *ParseError
}
// Parse parses a .d2 Map in r.
@ -42,6 +43,10 @@ func Parse(path string, r io.RuneReader, opts *ParseOptions) (*d2ast.Map, error)
reader: r,
utf16: opts.UTF16,
err: opts.ParseError,
}
if p.err == nil {
p.err = &ParseError{}
}
m := p.parseMap(true)
@ -54,6 +59,7 @@ func Parse(path string, r io.RuneReader, opts *ParseOptions) (*d2ast.Map, error)
func ParseKey(key string) (*d2ast.KeyPath, error) {
p := &parser{
reader: strings.NewReader(key),
err: &ParseError{},
}
k := p.parseKey()
@ -69,6 +75,7 @@ func ParseKey(key string) (*d2ast.KeyPath, error) {
func ParseMapKey(mapKey string) (*d2ast.Key, error) {
p := &parser{
reader: strings.NewReader(mapKey),
err: &ParseError{},
}
mk := p.parseMapKey()
@ -84,6 +91,7 @@ func ParseMapKey(mapKey string) (*d2ast.Key, error) {
func ParseValue(value string) (d2ast.Value, error) {
p := &parser{
reader: strings.NewReader(value),
err: &ParseError{},
}
v := p.parseValue()
@ -117,18 +125,16 @@ type parser struct {
lookaheadPos d2ast.Position
ioerr bool
err ParseError
err *ParseError
inEdgeGroup bool
depth int
}
// TODO: remove ioerr, just sort (with Append) should be fine but filter non ast errors in API
// TODO: rename to Error and make existing Error a private type errorWithRange
type ParseError struct {
IOError *d2ast.Error `json:"ioerr"`
Errors []d2ast.Error `json:"errs"`
Errors []d2ast.Error `json:"errs"`
}
func Errorf(n d2ast.Node, f string, v ...interface{}) error {
@ -140,17 +146,17 @@ func Errorf(n d2ast.Node, f string, v ...interface{}) error {
}
}
func (pe ParseError) Empty() bool {
return pe.IOError == nil && len(pe.Errors) == 0
func (pe *ParseError) Empty() bool {
if pe == nil {
return true
}
return len(pe.Errors) == 0
}
func (pe ParseError) Error() string {
func (pe *ParseError) Error() string {
var sb strings.Builder
if pe.IOError != nil {
sb.WriteString(pe.IOError.Error())
}
for i, err := range pe.Errors {
if pe.IOError != nil || i > 0 {
if i > 0 {
sb.WriteByte('\n')
}
sb.WriteString(err.Error())
@ -191,14 +197,14 @@ func (p *parser) _readRune() (r rune, eof bool) {
if err != nil {
p.ioerr = true
if err != io.EOF {
p.err.IOError = &d2ast.Error{
p.err.Errors = append(p.err.Errors, d2ast.Error{
Range: d2ast.Range{
Path: p.path,
Start: p.readerPos,
End: p.readerPos,
},
Message: fmt.Sprintf("io error: %v", err),
}
})
}
p.rewind()
return 0, true
@ -355,7 +361,7 @@ func (p *parser) parseMap(isFileMap bool) *d2ast.Map {
Start: p.pos,
},
}
defer m.Range.End.From(&p.readerPos)
defer m.Range.End.From(&p.pos)
if !isFileMap {
m.Range.Start = m.Range.Start.Subtract('{', p.utf16)
@ -448,17 +454,30 @@ func (p *parser) parseMapNode(r rune) d2ast.MapNodeBox {
box.BlockComment = p.parseBlockComment()
return box
case '.':
s, eof := p.peekn(3)
s, eof := p.peekn(2)
if eof {
break
}
if s != "..$" {
if s != ".." {
p.rewind()
break
}
p.commit()
box.Substitution = p.parseSubstitution(true)
return box
r, eof := p.peek()
if eof {
break
}
if r == '$' {
p.commit()
box.Substitution = p.parseSubstitution(true)
return box
}
if r == '@' {
p.commit()
box.Import = p.parseImport(true)
return box
}
p.rewind()
break
}
p.replay(r)
@ -614,7 +633,7 @@ func (p *parser) parseMapKey() (mk *d2ast.Key) {
}
}()
// Check for ampersand.
// Check for ampersand/@.
r, eof := p.peek()
if eof {
return mk
@ -948,6 +967,9 @@ func (p *parser) parseKey() (k *d2ast.KeyPath) {
if s == nil {
return k
}
if sb.UnquotedString != nil && strings.HasPrefix(s.ScalarString(), "@") {
p.errorf(s.GetRange().Start, s.GetRange().End, "%s is not a valid import, did you mean ...%[2]s?", s.ScalarString())
}
if len(k.Path) == 0 {
k.Range.Start = s.GetRange().Start
@ -1024,6 +1046,14 @@ func (p *parser) parseUnquotedString(inKey bool) (s *d2ast.UnquotedString) {
s.Value = append(s.Value, d2ast.InterpolationBox{String: &sv, StringRaw: &rawv})
}()
_s, eof := p.peekn(4)
p.rewind()
if !eof {
if _s == "...@" {
p.errorf(p.pos, p.pos.AdvanceString("...@", p.utf16), "unquoted strings cannot begin with ...@ as that's import spread syntax")
}
}
for {
r, eof := p.peek()
if eof {
@ -1502,17 +1532,30 @@ func (p *parser) parseArrayNode(r rune) d2ast.ArrayNodeBox {
box.BlockComment = p.parseBlockComment()
return box
case '.':
s, eof := p.peekn(3)
s, eof := p.peekn(2)
if eof {
break
}
if s != "..$" {
if s != ".." {
p.rewind()
break
}
p.commit()
box.Substitution = p.parseSubstitution(true)
return box
r, eof := p.peek()
if eof {
break
}
if r == '$' {
p.commit()
box.Substitution = p.parseSubstitution(true)
return box
}
if r == '@' {
p.commit()
box.Import = p.parseImport(true)
return box
}
p.rewind()
break
}
p.replay(r)
@ -1529,6 +1572,7 @@ func (p *parser) parseArrayNode(r rune) d2ast.ArrayNodeBox {
box.BlockString = vbox.BlockString
box.Array = vbox.Array
box.Map = vbox.Map
box.Import = vbox.Import
return box
}
@ -1549,6 +1593,9 @@ func (p *parser) parseValue() d2ast.ValueBox {
case '{':
box.Map = p.parseMap(false)
return box
case '@':
box.Import = p.parseImport(false)
return box
}
p.replay(r)
@ -1659,6 +1706,48 @@ func (p *parser) parseSubstitution(spread bool) *d2ast.Substitution {
return subst
}
func (p *parser) parseImport(spread bool) *d2ast.Import {
imp := &d2ast.Import{
Range: d2ast.Range{
Path: p.path,
Start: p.pos.SubtractString("$", p.utf16),
},
Spread: spread,
}
defer imp.Range.End.From(&p.pos)
if imp.Spread {
imp.Range.Start = imp.Range.Start.SubtractString("...", p.utf16)
}
var pre strings.Builder
for {
r, eof := p.peek()
if eof {
break
}
if r != '.' && r != '/' {
p.rewind()
break
}
pre.WriteRune(r)
p.commit()
}
imp.Pre = pre.String()
k := p.parseKey()
if k == nil {
return imp
}
if k.Path[0].UnquotedString != nil && len(k.Path) > 1 && k.Path[1].UnquotedString != nil && k.Path[1].Unbox().ScalarString() == "d2" {
k.Path = append(k.Path[:1], k.Path[2:]...)
}
if k != nil {
imp.Path = k.Path
}
return imp
}
// func marshalKey(k *d2ast.Key) string {
// var sb strings.Builder
// for i, s := range k.Path {

View file

@ -13,20 +13,19 @@ import (
"oss.terrastruct.com/d2/d2parser"
)
type testCase struct {
name string
text string
assert func(t testing.TB, ast *d2ast.Map, err error)
}
// TODO: next step for parser is writing as many tests and grouping them nicely
// TODO: add assertions
// to layout *all* expected behavior.
func TestParse(t *testing.T) {
t.Parallel()
testCases := []struct {
name string
text string
assert func(t testing.TB, ast *d2ast.Map, err error)
// exp is in testdata/d2parser/TestParse/${name}.json
}{
var testCases = []testCase{
{
name: "empty",
text: ``,
@ -394,7 +393,99 @@ c-
},
}
for _, tc := range testCases {
t.Run("import", testImport)
runa(t, testCases)
}
func testImport(t *testing.T) {
t.Parallel()
tca := []testCase{
{
text: "x: @file",
assert: func(t testing.TB, ast *d2ast.Map, err error) {
assert.Success(t, err)
assert.Equal(t, "file", ast.Nodes[0].MapKey.Value.Import.Path[0].Unbox().ScalarString())
},
},
{
text: "x: @file.d2",
assert: func(t testing.TB, ast *d2ast.Map, err error) {
assert.Success(t, err)
assert.Equal(t, "file", ast.Nodes[0].MapKey.Value.Import.Path[0].Unbox().ScalarString())
},
},
{
text: "...@file.d2",
assert: func(t testing.TB, ast *d2ast.Map, err error) {
assert.Success(t, err)
assert.True(t, ast.Nodes[0].Import.Spread)
assert.Equal(t, "file", ast.Nodes[0].Import.Path[0].Unbox().ScalarString())
},
},
{
text: "x: [...@file.d2]",
assert: func(t testing.TB, ast *d2ast.Map, err error) {
assert.Success(t, err)
imp := ast.Nodes[0].MapKey.Value.Array.Nodes[0].Import
assert.True(t, imp.Spread)
assert.Equal(t, "file", imp.Path[0].Unbox().ScalarString())
},
},
{
text: "...@\"file\".d2",
assert: func(t testing.TB, ast *d2ast.Map, err error) {
assert.Success(t, err)
assert.True(t, ast.Nodes[0].Import.Spread)
assert.Equal(t, "file", ast.Nodes[0].Import.Path[0].Unbox().ScalarString())
assert.Equal(t, "d2", ast.Nodes[0].Import.Path[1].Unbox().ScalarString())
},
},
{
text: "...@file.\"d2\"",
assert: func(t testing.TB, ast *d2ast.Map, err error) {
assert.Success(t, err)
assert.True(t, ast.Nodes[0].Import.Spread)
assert.Equal(t, "file", ast.Nodes[0].Import.Path[0].Unbox().ScalarString())
assert.Equal(t, "d2", ast.Nodes[0].Import.Path[1].Unbox().ScalarString())
},
},
{
text: "...@../file",
assert: func(t testing.TB, ast *d2ast.Map, err error) {
assert.Success(t, err)
assert.True(t, ast.Nodes[0].Import.Spread)
assert.Equal(t, "../file", ast.Nodes[0].Import.PathWithPre())
},
},
{
text: "@file",
assert: func(t testing.TB, ast *d2ast.Map, err error) {
assert.ErrorString(t, err, "d2/testdata/d2parser/TestParse/import/#07.d2:1:1: @file is not a valid import, did you mean ...@file?")
},
},
{
text: "...@./../.././file",
assert: func(t testing.TB, ast *d2ast.Map, err error) {
assert.Success(t, err)
assert.True(t, ast.Nodes[0].Import.Spread)
assert.Equal(t, "../../file", ast.Nodes[0].Import.PathWithPre())
},
},
{
text: "meow: ...@file",
assert: func(t testing.TB, ast *d2ast.Map, err error) {
assert.ErrorString(t, err, "d2/testdata/d2parser/TestParse/import/#09.d2:1:7: unquoted strings cannot begin with ...@ as that's import spread syntax")
},
},
}
runa(t, tca)
}
func runa(t *testing.T, tca []testCase) {
for _, tc := range tca {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()

View file

@ -9,13 +9,14 @@ import (
"testing"
"time"
"oss.terrastruct.com/d2/d2cli"
"oss.terrastruct.com/d2/lib/pptx"
"oss.terrastruct.com/d2/lib/xgif"
"oss.terrastruct.com/util-go/assert"
"oss.terrastruct.com/util-go/diff"
"oss.terrastruct.com/util-go/xmain"
"oss.terrastruct.com/util-go/xos"
"oss.terrastruct.com/d2/d2cli"
"oss.terrastruct.com/d2/lib/pptx"
"oss.terrastruct.com/d2/lib/xgif"
)
func TestCLI_E2E(t *testing.T) {
@ -390,6 +391,64 @@ steps: {
assert.Testdata(t, ".svg", svg)
},
},
{
name: "import",
run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) {
writeFile(t, dir, "hello-world.d2", `x: @x; y: @y; ...@p`)
writeFile(t, dir, "x.d2", `shape: circle`)
writeFile(t, dir, "y.d2", `shape: square`)
writeFile(t, dir, "p.d2", `x -> y`)
err := runTestMain(t, ctx, dir, env, filepath.Join(dir, "hello-world.d2"))
assert.Success(t, err)
svg := readFile(t, dir, "hello-world.svg")
assert.Testdata(t, ".svg", svg)
},
},
{
name: "import_spread_nested",
run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) {
writeFile(t, dir, "hello-world.d2", `...@x.y`)
writeFile(t, dir, "x.d2", `y: { jon; jan }`)
err := runTestMain(t, ctx, dir, env, filepath.Join(dir, "hello-world.d2"))
assert.Success(t, err)
svg := readFile(t, dir, "hello-world.svg")
assert.Testdata(t, ".svg", svg)
},
},
{
name: "chain_import",
run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) {
writeFile(t, dir, "hello-world.d2", `...@x`)
writeFile(t, dir, "x.d2", `...@y`)
writeFile(t, dir, "y.d2", `meow`)
err := runTestMain(t, ctx, dir, env, filepath.Join(dir, "hello-world.d2"))
assert.Success(t, err)
svg := readFile(t, dir, "hello-world.svg")
assert.Testdata(t, ".svg", svg)
},
},
{
name: "board_import",
run: func(t *testing.T, ctx context.Context, dir string, env *xos.Env) {
writeFile(t, dir, "hello-world.d2", `x.link: layers.x; layers: { x: @x }`)
writeFile(t, dir, "x.d2", `y.link: layers.y; layers: { y: @y }`)
writeFile(t, dir, "y.d2", `meow`)
err := runTestMain(t, ctx, dir, env, filepath.Join(dir, "hello-world.d2"))
assert.Success(t, err)
t.Run("hello-world-x-y", func(t *testing.T) {
svg := readFile(t, dir, "hello-world/x/y.svg")
assert.Testdata(t, ".svg", svg)
})
t.Run("hello-world-x", func(t *testing.T) {
svg := readFile(t, dir, "hello-world/x/index.svg")
assert.Testdata(t, ".svg", svg)
})
t.Run("hello-world", func(t *testing.T) {
svg := readFile(t, dir, "hello-world/index.svg")
assert.Testdata(t, ".svg", svg)
})
},
},
}
ctx := context.Background()

View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" d2Version="v0.4.2-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 290 268"><svg id="d2-svg" class="d2-685498927" width="290" height="268" viewBox="-101 -101 290 268"><rect x="-101.000000" y="-101.000000" width="290.000000" height="268.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-685498927 .text-bold {
font-family: "d2-685498927-font-bold";
}
@font-face {
font-family: d2-685498927-font-bold;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-685498927 .fill-N1{fill:#0A0F25;}
.d2-685498927 .fill-N2{fill:#676C7E;}
.d2-685498927 .fill-N3{fill:#9499AB;}
.d2-685498927 .fill-N4{fill:#CFD2DD;}
.d2-685498927 .fill-N5{fill:#DEE1EB;}
.d2-685498927 .fill-N6{fill:#EEF1F8;}
.d2-685498927 .fill-N7{fill:#FFFFFF;}
.d2-685498927 .fill-B1{fill:#0D32B2;}
.d2-685498927 .fill-B2{fill:#0D32B2;}
.d2-685498927 .fill-B3{fill:#E3E9FD;}
.d2-685498927 .fill-B4{fill:#E3E9FD;}
.d2-685498927 .fill-B5{fill:#EDF0FD;}
.d2-685498927 .fill-B6{fill:#F7F8FE;}
.d2-685498927 .fill-AA2{fill:#4A6FF3;}
.d2-685498927 .fill-AA4{fill:#EDF0FD;}
.d2-685498927 .fill-AA5{fill:#F7F8FE;}
.d2-685498927 .fill-AB4{fill:#EDF0FD;}
.d2-685498927 .fill-AB5{fill:#F7F8FE;}
.d2-685498927 .stroke-N1{stroke:#0A0F25;}
.d2-685498927 .stroke-N2{stroke:#676C7E;}
.d2-685498927 .stroke-N3{stroke:#9499AB;}
.d2-685498927 .stroke-N4{stroke:#CFD2DD;}
.d2-685498927 .stroke-N5{stroke:#DEE1EB;}
.d2-685498927 .stroke-N6{stroke:#EEF1F8;}
.d2-685498927 .stroke-N7{stroke:#FFFFFF;}
.d2-685498927 .stroke-B1{stroke:#0D32B2;}
.d2-685498927 .stroke-B2{stroke:#0D32B2;}
.d2-685498927 .stroke-B3{stroke:#E3E9FD;}
.d2-685498927 .stroke-B4{stroke:#E3E9FD;}
.d2-685498927 .stroke-B5{stroke:#EDF0FD;}
.d2-685498927 .stroke-B6{stroke:#F7F8FE;}
.d2-685498927 .stroke-AA2{stroke:#4A6FF3;}
.d2-685498927 .stroke-AA4{stroke:#EDF0FD;}
.d2-685498927 .stroke-AA5{stroke:#F7F8FE;}
.d2-685498927 .stroke-AB4{stroke:#EDF0FD;}
.d2-685498927 .stroke-AB5{stroke:#F7F8FE;}
.d2-685498927 .background-color-N1{background-color:#0A0F25;}
.d2-685498927 .background-color-N2{background-color:#676C7E;}
.d2-685498927 .background-color-N3{background-color:#9499AB;}
.d2-685498927 .background-color-N4{background-color:#CFD2DD;}
.d2-685498927 .background-color-N5{background-color:#DEE1EB;}
.d2-685498927 .background-color-N6{background-color:#EEF1F8;}
.d2-685498927 .background-color-N7{background-color:#FFFFFF;}
.d2-685498927 .background-color-B1{background-color:#0D32B2;}
.d2-685498927 .background-color-B2{background-color:#0D32B2;}
.d2-685498927 .background-color-B3{background-color:#E3E9FD;}
.d2-685498927 .background-color-B4{background-color:#E3E9FD;}
.d2-685498927 .background-color-B5{background-color:#EDF0FD;}
.d2-685498927 .background-color-B6{background-color:#F7F8FE;}
.d2-685498927 .background-color-AA2{background-color:#4A6FF3;}
.d2-685498927 .background-color-AA4{background-color:#EDF0FD;}
.d2-685498927 .background-color-AA5{background-color:#F7F8FE;}
.d2-685498927 .background-color-AB4{background-color:#EDF0FD;}
.d2-685498927 .background-color-AB5{background-color:#F7F8FE;}
.d2-685498927 .color-N1{color:#0A0F25;}
.d2-685498927 .color-N2{color:#676C7E;}
.d2-685498927 .color-N3{color:#9499AB;}
.d2-685498927 .color-N4{color:#CFD2DD;}
.d2-685498927 .color-N5{color:#DEE1EB;}
.d2-685498927 .color-N6{color:#EEF1F8;}
.d2-685498927 .color-N7{color:#FFFFFF;}
.d2-685498927 .color-B1{color:#0D32B2;}
.d2-685498927 .color-B2{color:#0D32B2;}
.d2-685498927 .color-B3{color:#E3E9FD;}
.d2-685498927 .color-B4{color:#E3E9FD;}
.d2-685498927 .color-B5{color:#EDF0FD;}
.d2-685498927 .color-B6{color:#F7F8FE;}
.d2-685498927 .color-AA2{color:#4A6FF3;}
.d2-685498927 .color-AA4{color:#EDF0FD;}
.d2-685498927 .color-AA5{color:#F7F8FE;}
.d2-685498927 .color-AB4{color:#EDF0FD;}
.d2-685498927 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><g id="meow"><g class="shape" ><rect x="0.000000" y="0.000000" width="88.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="44.000000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">meow</text></g><mask id="d2-685498927" maskUnits="userSpaceOnUse" x="-101" y="-101" width="290" height="268">
<rect x="-101" y="-101" width="290" height="268" fill="white"></rect>
</mask></svg></svg>

After

Width:  |  Height:  |  Size: 8.7 KiB

View file

@ -0,0 +1,110 @@
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" d2Version="v0.4.2-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 305 285"><svg id="d2-svg" class="d2-2353227294" width="305" height="285" viewBox="-101 -118 305 285"><rect x="-101.000000" y="-118.000000" width="305.000000" height="285.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.appendix-icon {
filter: drop-shadow(0px 0px 32px rgba(31, 36, 58, 0.1));
}
.d2-2353227294 .text-bold {
font-family: "d2-2353227294-font-bold";
}
@font-face {
font-family: d2-2353227294-font-bold;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-2353227294 .fill-N1{fill:#0A0F25;}
.d2-2353227294 .fill-N2{fill:#676C7E;}
.d2-2353227294 .fill-N3{fill:#9499AB;}
.d2-2353227294 .fill-N4{fill:#CFD2DD;}
.d2-2353227294 .fill-N5{fill:#DEE1EB;}
.d2-2353227294 .fill-N6{fill:#EEF1F8;}
.d2-2353227294 .fill-N7{fill:#FFFFFF;}
.d2-2353227294 .fill-B1{fill:#0D32B2;}
.d2-2353227294 .fill-B2{fill:#0D32B2;}
.d2-2353227294 .fill-B3{fill:#E3E9FD;}
.d2-2353227294 .fill-B4{fill:#E3E9FD;}
.d2-2353227294 .fill-B5{fill:#EDF0FD;}
.d2-2353227294 .fill-B6{fill:#F7F8FE;}
.d2-2353227294 .fill-AA2{fill:#4A6FF3;}
.d2-2353227294 .fill-AA4{fill:#EDF0FD;}
.d2-2353227294 .fill-AA5{fill:#F7F8FE;}
.d2-2353227294 .fill-AB4{fill:#EDF0FD;}
.d2-2353227294 .fill-AB5{fill:#F7F8FE;}
.d2-2353227294 .stroke-N1{stroke:#0A0F25;}
.d2-2353227294 .stroke-N2{stroke:#676C7E;}
.d2-2353227294 .stroke-N3{stroke:#9499AB;}
.d2-2353227294 .stroke-N4{stroke:#CFD2DD;}
.d2-2353227294 .stroke-N5{stroke:#DEE1EB;}
.d2-2353227294 .stroke-N6{stroke:#EEF1F8;}
.d2-2353227294 .stroke-N7{stroke:#FFFFFF;}
.d2-2353227294 .stroke-B1{stroke:#0D32B2;}
.d2-2353227294 .stroke-B2{stroke:#0D32B2;}
.d2-2353227294 .stroke-B3{stroke:#E3E9FD;}
.d2-2353227294 .stroke-B4{stroke:#E3E9FD;}
.d2-2353227294 .stroke-B5{stroke:#EDF0FD;}
.d2-2353227294 .stroke-B6{stroke:#F7F8FE;}
.d2-2353227294 .stroke-AA2{stroke:#4A6FF3;}
.d2-2353227294 .stroke-AA4{stroke:#EDF0FD;}
.d2-2353227294 .stroke-AA5{stroke:#F7F8FE;}
.d2-2353227294 .stroke-AB4{stroke:#EDF0FD;}
.d2-2353227294 .stroke-AB5{stroke:#F7F8FE;}
.d2-2353227294 .background-color-N1{background-color:#0A0F25;}
.d2-2353227294 .background-color-N2{background-color:#676C7E;}
.d2-2353227294 .background-color-N3{background-color:#9499AB;}
.d2-2353227294 .background-color-N4{background-color:#CFD2DD;}
.d2-2353227294 .background-color-N5{background-color:#DEE1EB;}
.d2-2353227294 .background-color-N6{background-color:#EEF1F8;}
.d2-2353227294 .background-color-N7{background-color:#FFFFFF;}
.d2-2353227294 .background-color-B1{background-color:#0D32B2;}
.d2-2353227294 .background-color-B2{background-color:#0D32B2;}
.d2-2353227294 .background-color-B3{background-color:#E3E9FD;}
.d2-2353227294 .background-color-B4{background-color:#E3E9FD;}
.d2-2353227294 .background-color-B5{background-color:#EDF0FD;}
.d2-2353227294 .background-color-B6{background-color:#F7F8FE;}
.d2-2353227294 .background-color-AA2{background-color:#4A6FF3;}
.d2-2353227294 .background-color-AA4{background-color:#EDF0FD;}
.d2-2353227294 .background-color-AA5{background-color:#F7F8FE;}
.d2-2353227294 .background-color-AB4{background-color:#EDF0FD;}
.d2-2353227294 .background-color-AB5{background-color:#F7F8FE;}
.d2-2353227294 .color-N1{color:#0A0F25;}
.d2-2353227294 .color-N2{color:#676C7E;}
.d2-2353227294 .color-N3{color:#9499AB;}
.d2-2353227294 .color-N4{color:#CFD2DD;}
.d2-2353227294 .color-N5{color:#DEE1EB;}
.d2-2353227294 .color-N6{color:#EEF1F8;}
.d2-2353227294 .color-N7{color:#FFFFFF;}
.d2-2353227294 .color-B1{color:#0D32B2;}
.d2-2353227294 .color-B2{color:#0D32B2;}
.d2-2353227294 .color-B3{color:#E3E9FD;}
.d2-2353227294 .color-B4{color:#E3E9FD;}
.d2-2353227294 .color-B5{color:#EDF0FD;}
.d2-2353227294 .color-B6{color:#F7F8FE;}
.d2-2353227294 .color-AA2{color:#4A6FF3;}
.d2-2353227294 .color-AA4{color:#EDF0FD;}
.d2-2353227294 .color-AA5{color:#F7F8FE;}
.d2-2353227294 .color-AB4{color:#EDF0FD;}
.d2-2353227294 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><a href="y.svg" xlink:href="y.svg"><g id="y"><g class="shape" ><rect x="0.000000" y="0.000000" width="86.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="43.000000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">y</text><g transform="translate(70 -16)" class="appendix-icon"><svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_3440_35088111)">
<path d="M16 31.1109C24.3456 31.1109 31.1111 24.3454 31.1111 15.9998C31.1111 7.65415 24.3456 0.888672 16 0.888672C7.65436 0.888672 0.888885 7.65415 0.888885 15.9998C0.888885 24.3454 7.65436 31.1109 16 31.1109Z" fill="white" stroke="#DEE1EB"/>
<path d="M14.3909 16.7965C14.7364 17.2584 15.1772 17.6406 15.6834 17.9171C16.1896 18.1938 16.7494 18.3582 17.3248 18.3993C17.9001 18.4405 18.4777 18.3575 19.0181 18.1559C19.5586 17.9543 20.0492 17.6389 20.4571 17.2309L22.8708 14.8173C23.6036 14.0586 24.0089 13.0425 23.9998 11.9877C23.9906 10.933 23.5676 9.92404 22.8217 9.17821C22.0759 8.43237 21.067 8.00931 20.0123 8.00015C18.9575 7.99098 17.9413 8.39644 17.1827 9.1292L15.7988 10.505" stroke="#2E3346" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M17.609 15.1874C17.2635 14.7255 16.8227 14.3433 16.3165 14.0667C15.8103 13.7902 15.2505 13.6257 14.6752 13.5845C14.0998 13.5433 13.5223 13.6263 12.9819 13.8279C12.4414 14.0295 11.9506 14.345 11.5428 14.753L9.1292 17.1666C8.39644 17.9252 7.99098 18.9414 8.00015 19.9962C8.00931 21.0509 8.43237 22.0598 9.17821 22.8056C9.92405 23.5515 10.933 23.9745 11.9877 23.9837C13.0425 23.9928 14.0586 23.5875 14.8173 22.8547L16.193 21.4788" stroke="#2E3346" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_3440_35088111">
<rect width="32" height="32" fill="white"/>
</clipPath>
</defs>
</svg>
</g></g></a><mask id="d2-2353227294" maskUnits="userSpaceOnUse" x="-101" y="-118" width="305" height="285">
<rect x="-101" y="-118" width="305" height="285" fill="white"></rect>
</mask></svg></svg>

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -0,0 +1,110 @@
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" d2Version="v0.4.2-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 304 285"><svg id="d2-svg" class="d2-2067460405" width="304" height="285" viewBox="-101 -118 304 285"><rect x="-101.000000" y="-118.000000" width="304.000000" height="285.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.appendix-icon {
filter: drop-shadow(0px 0px 32px rgba(31, 36, 58, 0.1));
}
.d2-2067460405 .text-bold {
font-family: "d2-2067460405-font-bold";
}
@font-face {
font-family: d2-2067460405-font-bold;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-2067460405 .fill-N1{fill:#0A0F25;}
.d2-2067460405 .fill-N2{fill:#676C7E;}
.d2-2067460405 .fill-N3{fill:#9499AB;}
.d2-2067460405 .fill-N4{fill:#CFD2DD;}
.d2-2067460405 .fill-N5{fill:#DEE1EB;}
.d2-2067460405 .fill-N6{fill:#EEF1F8;}
.d2-2067460405 .fill-N7{fill:#FFFFFF;}
.d2-2067460405 .fill-B1{fill:#0D32B2;}
.d2-2067460405 .fill-B2{fill:#0D32B2;}
.d2-2067460405 .fill-B3{fill:#E3E9FD;}
.d2-2067460405 .fill-B4{fill:#E3E9FD;}
.d2-2067460405 .fill-B5{fill:#EDF0FD;}
.d2-2067460405 .fill-B6{fill:#F7F8FE;}
.d2-2067460405 .fill-AA2{fill:#4A6FF3;}
.d2-2067460405 .fill-AA4{fill:#EDF0FD;}
.d2-2067460405 .fill-AA5{fill:#F7F8FE;}
.d2-2067460405 .fill-AB4{fill:#EDF0FD;}
.d2-2067460405 .fill-AB5{fill:#F7F8FE;}
.d2-2067460405 .stroke-N1{stroke:#0A0F25;}
.d2-2067460405 .stroke-N2{stroke:#676C7E;}
.d2-2067460405 .stroke-N3{stroke:#9499AB;}
.d2-2067460405 .stroke-N4{stroke:#CFD2DD;}
.d2-2067460405 .stroke-N5{stroke:#DEE1EB;}
.d2-2067460405 .stroke-N6{stroke:#EEF1F8;}
.d2-2067460405 .stroke-N7{stroke:#FFFFFF;}
.d2-2067460405 .stroke-B1{stroke:#0D32B2;}
.d2-2067460405 .stroke-B2{stroke:#0D32B2;}
.d2-2067460405 .stroke-B3{stroke:#E3E9FD;}
.d2-2067460405 .stroke-B4{stroke:#E3E9FD;}
.d2-2067460405 .stroke-B5{stroke:#EDF0FD;}
.d2-2067460405 .stroke-B6{stroke:#F7F8FE;}
.d2-2067460405 .stroke-AA2{stroke:#4A6FF3;}
.d2-2067460405 .stroke-AA4{stroke:#EDF0FD;}
.d2-2067460405 .stroke-AA5{stroke:#F7F8FE;}
.d2-2067460405 .stroke-AB4{stroke:#EDF0FD;}
.d2-2067460405 .stroke-AB5{stroke:#F7F8FE;}
.d2-2067460405 .background-color-N1{background-color:#0A0F25;}
.d2-2067460405 .background-color-N2{background-color:#676C7E;}
.d2-2067460405 .background-color-N3{background-color:#9499AB;}
.d2-2067460405 .background-color-N4{background-color:#CFD2DD;}
.d2-2067460405 .background-color-N5{background-color:#DEE1EB;}
.d2-2067460405 .background-color-N6{background-color:#EEF1F8;}
.d2-2067460405 .background-color-N7{background-color:#FFFFFF;}
.d2-2067460405 .background-color-B1{background-color:#0D32B2;}
.d2-2067460405 .background-color-B2{background-color:#0D32B2;}
.d2-2067460405 .background-color-B3{background-color:#E3E9FD;}
.d2-2067460405 .background-color-B4{background-color:#E3E9FD;}
.d2-2067460405 .background-color-B5{background-color:#EDF0FD;}
.d2-2067460405 .background-color-B6{background-color:#F7F8FE;}
.d2-2067460405 .background-color-AA2{background-color:#4A6FF3;}
.d2-2067460405 .background-color-AA4{background-color:#EDF0FD;}
.d2-2067460405 .background-color-AA5{background-color:#F7F8FE;}
.d2-2067460405 .background-color-AB4{background-color:#EDF0FD;}
.d2-2067460405 .background-color-AB5{background-color:#F7F8FE;}
.d2-2067460405 .color-N1{color:#0A0F25;}
.d2-2067460405 .color-N2{color:#676C7E;}
.d2-2067460405 .color-N3{color:#9499AB;}
.d2-2067460405 .color-N4{color:#CFD2DD;}
.d2-2067460405 .color-N5{color:#DEE1EB;}
.d2-2067460405 .color-N6{color:#EEF1F8;}
.d2-2067460405 .color-N7{color:#FFFFFF;}
.d2-2067460405 .color-B1{color:#0D32B2;}
.d2-2067460405 .color-B2{color:#0D32B2;}
.d2-2067460405 .color-B3{color:#E3E9FD;}
.d2-2067460405 .color-B4{color:#E3E9FD;}
.d2-2067460405 .color-B5{color:#EDF0FD;}
.d2-2067460405 .color-B6{color:#F7F8FE;}
.d2-2067460405 .color-AA2{color:#4A6FF3;}
.d2-2067460405 .color-AA4{color:#EDF0FD;}
.d2-2067460405 .color-AA5{color:#F7F8FE;}
.d2-2067460405 .color-AB4{color:#EDF0FD;}
.d2-2067460405 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><a href="x/index.svg" xlink:href="x/index.svg"><g id="x"><g class="shape" ><rect x="0.000000" y="0.000000" width="85.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="42.500000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">x</text><g transform="translate(69 -16)" class="appendix-icon"><svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_3440_35088111)">
<path d="M16 31.1109C24.3456 31.1109 31.1111 24.3454 31.1111 15.9998C31.1111 7.65415 24.3456 0.888672 16 0.888672C7.65436 0.888672 0.888885 7.65415 0.888885 15.9998C0.888885 24.3454 7.65436 31.1109 16 31.1109Z" fill="white" stroke="#DEE1EB"/>
<path d="M14.3909 16.7965C14.7364 17.2584 15.1772 17.6406 15.6834 17.9171C16.1896 18.1938 16.7494 18.3582 17.3248 18.3993C17.9001 18.4405 18.4777 18.3575 19.0181 18.1559C19.5586 17.9543 20.0492 17.6389 20.4571 17.2309L22.8708 14.8173C23.6036 14.0586 24.0089 13.0425 23.9998 11.9877C23.9906 10.933 23.5676 9.92404 22.8217 9.17821C22.0759 8.43237 21.067 8.00931 20.0123 8.00015C18.9575 7.99098 17.9413 8.39644 17.1827 9.1292L15.7988 10.505" stroke="#2E3346" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M17.609 15.1874C17.2635 14.7255 16.8227 14.3433 16.3165 14.0667C15.8103 13.7902 15.2505 13.6257 14.6752 13.5845C14.0998 13.5433 13.5223 13.6263 12.9819 13.8279C12.4414 14.0295 11.9506 14.345 11.5428 14.753L9.1292 17.1666C8.39644 17.9252 7.99098 18.9414 8.00015 19.9962C8.00931 21.0509 8.43237 22.0598 9.17821 22.8056C9.92405 23.5515 10.933 23.9745 11.9877 23.9837C13.0425 23.9928 14.0586 23.5875 14.8173 22.8547L16.193 21.4788" stroke="#2E3346" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_3440_35088111">
<rect width="32" height="32" fill="white"/>
</clipPath>
</defs>
</svg>
</g></g></a><mask id="d2-2067460405" maskUnits="userSpaceOnUse" x="-101" y="-118" width="304" height="285">
<rect x="-101" y="-118" width="304" height="285" fill="white"></rect>
</mask></svg></svg>

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" d2Version="v0.4.2-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 290 268"><svg id="d2-svg" class="d2-685498927" width="290" height="268" viewBox="-101 -101 290 268"><rect x="-101.000000" y="-101.000000" width="290.000000" height="268.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-685498927 .text-bold {
font-family: "d2-685498927-font-bold";
}
@font-face {
font-family: d2-685498927-font-bold;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-685498927 .fill-N1{fill:#0A0F25;}
.d2-685498927 .fill-N2{fill:#676C7E;}
.d2-685498927 .fill-N3{fill:#9499AB;}
.d2-685498927 .fill-N4{fill:#CFD2DD;}
.d2-685498927 .fill-N5{fill:#DEE1EB;}
.d2-685498927 .fill-N6{fill:#EEF1F8;}
.d2-685498927 .fill-N7{fill:#FFFFFF;}
.d2-685498927 .fill-B1{fill:#0D32B2;}
.d2-685498927 .fill-B2{fill:#0D32B2;}
.d2-685498927 .fill-B3{fill:#E3E9FD;}
.d2-685498927 .fill-B4{fill:#E3E9FD;}
.d2-685498927 .fill-B5{fill:#EDF0FD;}
.d2-685498927 .fill-B6{fill:#F7F8FE;}
.d2-685498927 .fill-AA2{fill:#4A6FF3;}
.d2-685498927 .fill-AA4{fill:#EDF0FD;}
.d2-685498927 .fill-AA5{fill:#F7F8FE;}
.d2-685498927 .fill-AB4{fill:#EDF0FD;}
.d2-685498927 .fill-AB5{fill:#F7F8FE;}
.d2-685498927 .stroke-N1{stroke:#0A0F25;}
.d2-685498927 .stroke-N2{stroke:#676C7E;}
.d2-685498927 .stroke-N3{stroke:#9499AB;}
.d2-685498927 .stroke-N4{stroke:#CFD2DD;}
.d2-685498927 .stroke-N5{stroke:#DEE1EB;}
.d2-685498927 .stroke-N6{stroke:#EEF1F8;}
.d2-685498927 .stroke-N7{stroke:#FFFFFF;}
.d2-685498927 .stroke-B1{stroke:#0D32B2;}
.d2-685498927 .stroke-B2{stroke:#0D32B2;}
.d2-685498927 .stroke-B3{stroke:#E3E9FD;}
.d2-685498927 .stroke-B4{stroke:#E3E9FD;}
.d2-685498927 .stroke-B5{stroke:#EDF0FD;}
.d2-685498927 .stroke-B6{stroke:#F7F8FE;}
.d2-685498927 .stroke-AA2{stroke:#4A6FF3;}
.d2-685498927 .stroke-AA4{stroke:#EDF0FD;}
.d2-685498927 .stroke-AA5{stroke:#F7F8FE;}
.d2-685498927 .stroke-AB4{stroke:#EDF0FD;}
.d2-685498927 .stroke-AB5{stroke:#F7F8FE;}
.d2-685498927 .background-color-N1{background-color:#0A0F25;}
.d2-685498927 .background-color-N2{background-color:#676C7E;}
.d2-685498927 .background-color-N3{background-color:#9499AB;}
.d2-685498927 .background-color-N4{background-color:#CFD2DD;}
.d2-685498927 .background-color-N5{background-color:#DEE1EB;}
.d2-685498927 .background-color-N6{background-color:#EEF1F8;}
.d2-685498927 .background-color-N7{background-color:#FFFFFF;}
.d2-685498927 .background-color-B1{background-color:#0D32B2;}
.d2-685498927 .background-color-B2{background-color:#0D32B2;}
.d2-685498927 .background-color-B3{background-color:#E3E9FD;}
.d2-685498927 .background-color-B4{background-color:#E3E9FD;}
.d2-685498927 .background-color-B5{background-color:#EDF0FD;}
.d2-685498927 .background-color-B6{background-color:#F7F8FE;}
.d2-685498927 .background-color-AA2{background-color:#4A6FF3;}
.d2-685498927 .background-color-AA4{background-color:#EDF0FD;}
.d2-685498927 .background-color-AA5{background-color:#F7F8FE;}
.d2-685498927 .background-color-AB4{background-color:#EDF0FD;}
.d2-685498927 .background-color-AB5{background-color:#F7F8FE;}
.d2-685498927 .color-N1{color:#0A0F25;}
.d2-685498927 .color-N2{color:#676C7E;}
.d2-685498927 .color-N3{color:#9499AB;}
.d2-685498927 .color-N4{color:#CFD2DD;}
.d2-685498927 .color-N5{color:#DEE1EB;}
.d2-685498927 .color-N6{color:#EEF1F8;}
.d2-685498927 .color-N7{color:#FFFFFF;}
.d2-685498927 .color-B1{color:#0D32B2;}
.d2-685498927 .color-B2{color:#0D32B2;}
.d2-685498927 .color-B3{color:#E3E9FD;}
.d2-685498927 .color-B4{color:#E3E9FD;}
.d2-685498927 .color-B5{color:#EDF0FD;}
.d2-685498927 .color-B6{color:#F7F8FE;}
.d2-685498927 .color-AA2{color:#4A6FF3;}
.d2-685498927 .color-AA4{color:#EDF0FD;}
.d2-685498927 .color-AA5{color:#F7F8FE;}
.d2-685498927 .color-AB4{color:#EDF0FD;}
.d2-685498927 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><g id="meow"><g class="shape" ><rect x="0.000000" y="0.000000" width="88.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="44.000000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">meow</text></g><mask id="d2-685498927" maskUnits="userSpaceOnUse" x="-101" y="-101" width="290" height="268">
<rect x="-101" y="-101" width="290" height="268" fill="white"></rect>
</mask></svg></svg>

After

Width:  |  Height:  |  Size: 8.7 KiB

View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" d2Version="v0.4.2-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 271 437"><svg id="d2-svg" class="d2-1393279198" width="271" height="437" viewBox="-101 -101 271 437"><rect x="-101.000000" y="-101.000000" width="271.000000" height="437.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-1393279198 .text-bold {
font-family: "d2-1393279198-font-bold";
}
@font-face {
font-family: d2-1393279198-font-bold;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-1393279198 .fill-N1{fill:#0A0F25;}
.d2-1393279198 .fill-N2{fill:#676C7E;}
.d2-1393279198 .fill-N3{fill:#9499AB;}
.d2-1393279198 .fill-N4{fill:#CFD2DD;}
.d2-1393279198 .fill-N5{fill:#DEE1EB;}
.d2-1393279198 .fill-N6{fill:#EEF1F8;}
.d2-1393279198 .fill-N7{fill:#FFFFFF;}
.d2-1393279198 .fill-B1{fill:#0D32B2;}
.d2-1393279198 .fill-B2{fill:#0D32B2;}
.d2-1393279198 .fill-B3{fill:#E3E9FD;}
.d2-1393279198 .fill-B4{fill:#E3E9FD;}
.d2-1393279198 .fill-B5{fill:#EDF0FD;}
.d2-1393279198 .fill-B6{fill:#F7F8FE;}
.d2-1393279198 .fill-AA2{fill:#4A6FF3;}
.d2-1393279198 .fill-AA4{fill:#EDF0FD;}
.d2-1393279198 .fill-AA5{fill:#F7F8FE;}
.d2-1393279198 .fill-AB4{fill:#EDF0FD;}
.d2-1393279198 .fill-AB5{fill:#F7F8FE;}
.d2-1393279198 .stroke-N1{stroke:#0A0F25;}
.d2-1393279198 .stroke-N2{stroke:#676C7E;}
.d2-1393279198 .stroke-N3{stroke:#9499AB;}
.d2-1393279198 .stroke-N4{stroke:#CFD2DD;}
.d2-1393279198 .stroke-N5{stroke:#DEE1EB;}
.d2-1393279198 .stroke-N6{stroke:#EEF1F8;}
.d2-1393279198 .stroke-N7{stroke:#FFFFFF;}
.d2-1393279198 .stroke-B1{stroke:#0D32B2;}
.d2-1393279198 .stroke-B2{stroke:#0D32B2;}
.d2-1393279198 .stroke-B3{stroke:#E3E9FD;}
.d2-1393279198 .stroke-B4{stroke:#E3E9FD;}
.d2-1393279198 .stroke-B5{stroke:#EDF0FD;}
.d2-1393279198 .stroke-B6{stroke:#F7F8FE;}
.d2-1393279198 .stroke-AA2{stroke:#4A6FF3;}
.d2-1393279198 .stroke-AA4{stroke:#EDF0FD;}
.d2-1393279198 .stroke-AA5{stroke:#F7F8FE;}
.d2-1393279198 .stroke-AB4{stroke:#EDF0FD;}
.d2-1393279198 .stroke-AB5{stroke:#F7F8FE;}
.d2-1393279198 .background-color-N1{background-color:#0A0F25;}
.d2-1393279198 .background-color-N2{background-color:#676C7E;}
.d2-1393279198 .background-color-N3{background-color:#9499AB;}
.d2-1393279198 .background-color-N4{background-color:#CFD2DD;}
.d2-1393279198 .background-color-N5{background-color:#DEE1EB;}
.d2-1393279198 .background-color-N6{background-color:#EEF1F8;}
.d2-1393279198 .background-color-N7{background-color:#FFFFFF;}
.d2-1393279198 .background-color-B1{background-color:#0D32B2;}
.d2-1393279198 .background-color-B2{background-color:#0D32B2;}
.d2-1393279198 .background-color-B3{background-color:#E3E9FD;}
.d2-1393279198 .background-color-B4{background-color:#E3E9FD;}
.d2-1393279198 .background-color-B5{background-color:#EDF0FD;}
.d2-1393279198 .background-color-B6{background-color:#F7F8FE;}
.d2-1393279198 .background-color-AA2{background-color:#4A6FF3;}
.d2-1393279198 .background-color-AA4{background-color:#EDF0FD;}
.d2-1393279198 .background-color-AA5{background-color:#F7F8FE;}
.d2-1393279198 .background-color-AB4{background-color:#EDF0FD;}
.d2-1393279198 .background-color-AB5{background-color:#F7F8FE;}
.d2-1393279198 .color-N1{color:#0A0F25;}
.d2-1393279198 .color-N2{color:#676C7E;}
.d2-1393279198 .color-N3{color:#9499AB;}
.d2-1393279198 .color-N4{color:#CFD2DD;}
.d2-1393279198 .color-N5{color:#DEE1EB;}
.d2-1393279198 .color-N6{color:#EEF1F8;}
.d2-1393279198 .color-N7{color:#FFFFFF;}
.d2-1393279198 .color-B1{color:#0D32B2;}
.d2-1393279198 .color-B2{color:#0D32B2;}
.d2-1393279198 .color-B3{color:#E3E9FD;}
.d2-1393279198 .color-B4{color:#E3E9FD;}
.d2-1393279198 .color-B5{color:#EDF0FD;}
.d2-1393279198 .color-B6{color:#F7F8FE;}
.d2-1393279198 .color-AA2{color:#4A6FF3;}
.d2-1393279198 .color-AA4{color:#EDF0FD;}
.d2-1393279198 .color-AA5{color:#F7F8FE;}
.d2-1393279198 .color-AB4{color:#EDF0FD;}
.d2-1393279198 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><g id="x"><g class="shape" ><ellipse rx="34.500000" ry="34.500000" cx="34.500000" cy="34.500000" class="shape stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="34.500000" y="40.000000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">x</text></g><g id="y"><g class="shape" ><rect x="2.000000" y="169.000000" width="66.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="35.000000" y="207.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">y</text></g><g id="(x -&gt; y)[0]"><marker id="mk-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 34.980001 70.999900 C 34.599998 109.000000 34.500000 129.000000 34.500000 165.000000" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-3488378134)" mask="url(#d2-1393279198)" /></g><mask id="d2-1393279198" maskUnits="userSpaceOnUse" x="-101" y="-101" width="271" height="437">
<rect x="-101" y="-101" width="271" height="437" fill="white"></rect>
</mask></svg></svg>

After

Width:  |  Height:  |  Size: 9.3 KiB

View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" d2Version="v0.4.2-HEAD" preserveAspectRatio="xMinYMin meet" viewBox="0 0 399 268"><svg id="d2-svg" class="d2-3967102011" width="399" height="268" viewBox="-101 -101 399 268"><rect x="-101.000000" y="-101.000000" width="399.000000" height="268.000000" rx="0.000000" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
.d2-3967102011 .text-bold {
font-family: "d2-3967102011-font-bold";
}
@font-face {
font-family: d2-3967102011-font-bold;
src: url("data:application/font-woff;base64,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");
}]]></style><style type="text/css"><![CDATA[.shape {
shape-rendering: geometricPrecision;
stroke-linejoin: round;
}
.connection {
stroke-linecap: round;
stroke-linejoin: round;
}
.blend {
mix-blend-mode: multiply;
opacity: 0.5;
}
.d2-3967102011 .fill-N1{fill:#0A0F25;}
.d2-3967102011 .fill-N2{fill:#676C7E;}
.d2-3967102011 .fill-N3{fill:#9499AB;}
.d2-3967102011 .fill-N4{fill:#CFD2DD;}
.d2-3967102011 .fill-N5{fill:#DEE1EB;}
.d2-3967102011 .fill-N6{fill:#EEF1F8;}
.d2-3967102011 .fill-N7{fill:#FFFFFF;}
.d2-3967102011 .fill-B1{fill:#0D32B2;}
.d2-3967102011 .fill-B2{fill:#0D32B2;}
.d2-3967102011 .fill-B3{fill:#E3E9FD;}
.d2-3967102011 .fill-B4{fill:#E3E9FD;}
.d2-3967102011 .fill-B5{fill:#EDF0FD;}
.d2-3967102011 .fill-B6{fill:#F7F8FE;}
.d2-3967102011 .fill-AA2{fill:#4A6FF3;}
.d2-3967102011 .fill-AA4{fill:#EDF0FD;}
.d2-3967102011 .fill-AA5{fill:#F7F8FE;}
.d2-3967102011 .fill-AB4{fill:#EDF0FD;}
.d2-3967102011 .fill-AB5{fill:#F7F8FE;}
.d2-3967102011 .stroke-N1{stroke:#0A0F25;}
.d2-3967102011 .stroke-N2{stroke:#676C7E;}
.d2-3967102011 .stroke-N3{stroke:#9499AB;}
.d2-3967102011 .stroke-N4{stroke:#CFD2DD;}
.d2-3967102011 .stroke-N5{stroke:#DEE1EB;}
.d2-3967102011 .stroke-N6{stroke:#EEF1F8;}
.d2-3967102011 .stroke-N7{stroke:#FFFFFF;}
.d2-3967102011 .stroke-B1{stroke:#0D32B2;}
.d2-3967102011 .stroke-B2{stroke:#0D32B2;}
.d2-3967102011 .stroke-B3{stroke:#E3E9FD;}
.d2-3967102011 .stroke-B4{stroke:#E3E9FD;}
.d2-3967102011 .stroke-B5{stroke:#EDF0FD;}
.d2-3967102011 .stroke-B6{stroke:#F7F8FE;}
.d2-3967102011 .stroke-AA2{stroke:#4A6FF3;}
.d2-3967102011 .stroke-AA4{stroke:#EDF0FD;}
.d2-3967102011 .stroke-AA5{stroke:#F7F8FE;}
.d2-3967102011 .stroke-AB4{stroke:#EDF0FD;}
.d2-3967102011 .stroke-AB5{stroke:#F7F8FE;}
.d2-3967102011 .background-color-N1{background-color:#0A0F25;}
.d2-3967102011 .background-color-N2{background-color:#676C7E;}
.d2-3967102011 .background-color-N3{background-color:#9499AB;}
.d2-3967102011 .background-color-N4{background-color:#CFD2DD;}
.d2-3967102011 .background-color-N5{background-color:#DEE1EB;}
.d2-3967102011 .background-color-N6{background-color:#EEF1F8;}
.d2-3967102011 .background-color-N7{background-color:#FFFFFF;}
.d2-3967102011 .background-color-B1{background-color:#0D32B2;}
.d2-3967102011 .background-color-B2{background-color:#0D32B2;}
.d2-3967102011 .background-color-B3{background-color:#E3E9FD;}
.d2-3967102011 .background-color-B4{background-color:#E3E9FD;}
.d2-3967102011 .background-color-B5{background-color:#EDF0FD;}
.d2-3967102011 .background-color-B6{background-color:#F7F8FE;}
.d2-3967102011 .background-color-AA2{background-color:#4A6FF3;}
.d2-3967102011 .background-color-AA4{background-color:#EDF0FD;}
.d2-3967102011 .background-color-AA5{background-color:#F7F8FE;}
.d2-3967102011 .background-color-AB4{background-color:#EDF0FD;}
.d2-3967102011 .background-color-AB5{background-color:#F7F8FE;}
.d2-3967102011 .color-N1{color:#0A0F25;}
.d2-3967102011 .color-N2{color:#676C7E;}
.d2-3967102011 .color-N3{color:#9499AB;}
.d2-3967102011 .color-N4{color:#CFD2DD;}
.d2-3967102011 .color-N5{color:#DEE1EB;}
.d2-3967102011 .color-N6{color:#EEF1F8;}
.d2-3967102011 .color-N7{color:#FFFFFF;}
.d2-3967102011 .color-B1{color:#0D32B2;}
.d2-3967102011 .color-B2{color:#0D32B2;}
.d2-3967102011 .color-B3{color:#E3E9FD;}
.d2-3967102011 .color-B4{color:#E3E9FD;}
.d2-3967102011 .color-B5{color:#EDF0FD;}
.d2-3967102011 .color-B6{color:#F7F8FE;}
.d2-3967102011 .color-AA2{color:#4A6FF3;}
.d2-3967102011 .color-AA4{color:#EDF0FD;}
.d2-3967102011 .color-AA5{color:#F7F8FE;}
.d2-3967102011 .color-AB4{color:#EDF0FD;}
.d2-3967102011 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><g id="jon"><g class="shape" ><rect x="0.000000" y="0.000000" width="69.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="34.500000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">jon</text></g><g id="jan"><g class="shape" ><rect x="129.000000" y="0.000000" width="68.000000" height="66.000000" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="163.000000" y="38.500000" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">jan</text></g><mask id="d2-3967102011" maskUnits="userSpaceOnUse" x="-101" y="-101" width="399" height="268">
<rect x="-101" y="-101" width="399" height="268" fill="white"></rect>
</mask></svg></svg>

After

Width:  |  Height:  |  Size: 9.1 KiB

2
go.mod generated
View file

@ -27,7 +27,7 @@ require (
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2
gonum.org/v1/plot v0.12.0
nhooyr.io/websocket v1.8.7
oss.terrastruct.com/util-go v0.0.0-20230320053557-dcb5aac7d972
oss.terrastruct.com/util-go v0.0.0-20230604222829-11c3c60fec14
)
require (

4
go.sum generated
View file

@ -329,6 +329,6 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g=
nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
oss.terrastruct.com/util-go v0.0.0-20230320053557-dcb5aac7d972 h1:HS7fg2GzGsqRLApsoh7ztaLMvXzxSln/Hfz4wy4tIDA=
oss.terrastruct.com/util-go v0.0.0-20230320053557-dcb5aac7d972/go.mod h1:eMWv0sOtD9T2RUl90DLWfuShZCYp4NrsqNpI8eqO6U4=
oss.terrastruct.com/util-go v0.0.0-20230604222829-11c3c60fec14 h1:oy5vtt6O2qYxeSpqWhyevrdUenFfuhphixozUlpL6qY=
oss.terrastruct.com/util-go v0.0.0-20230604222829-11c3c60fec14/go.mod h1:eMWv0sOtD9T2RUl90DLWfuShZCYp4NrsqNpI8eqO6U4=
rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4=

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/3d_oval.d2,1:0:17-1:19:36",

View file

@ -27,7 +27,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/array-classes.d2,0:9:9-13:0:184",
"range": "d2/testdata/d2compiler/TestCompile/array-classes.d2,0:9:9-13:1:185",
"nodes": [
{
"map_key": {
@ -51,7 +51,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/array-classes.d2,1:15:26-5:2:85",
"range": "d2/testdata/d2compiler/TestCompile/array-classes.d2,1:15:26-5:3:86",
"nodes": [
{
"map_key": {
@ -185,7 +185,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/array-classes.d2,6:8:95-9:2:143",
"range": "d2/testdata/d2compiler/TestCompile/array-classes.d2,6:8:95-9:3:144",
"nodes": [
{
"map_key": {
@ -287,7 +287,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/array-classes.d2,10:8:153-12:1:182",
"range": "d2/testdata/d2compiler/TestCompile/array-classes.d2,10:8:153-12:2:183",
"nodes": [
{
"map_key": {
@ -361,7 +361,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/array-classes.d2,14:8:194-14:37:223",
"range": "d2/testdata/d2compiler/TestCompile/array-classes.d2,14:8:194-14:38:224",
"nodes": [
{
"map_key": {
@ -441,7 +441,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/array-classes.d2,15:7:232-15:36:261",
"range": "d2/testdata/d2compiler/TestCompile/array-classes.d2,15:7:232-15:37:262",
"nodes": [
{
"map_key": {
@ -544,7 +544,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/array-classes.d2,17:17:281-17:40:304",
"range": "d2/testdata/d2compiler/TestCompile/array-classes.d2,17:17:281-17:41:305",
"nodes": [
{
"map_key": {

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/bad-style-nesting.d2,0:12:12-0:17:17",

View file

@ -32,7 +32,7 @@
},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/basic_icon.d2,0:8:8-2:0:75",
"range": "d2/testdata/d2compiler/TestCompile/basic_icon.d2,0:8:8-2:1:76",
"nodes": [
{
"map_key": {

View file

@ -27,7 +27,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/basic_sequence.d2,0:3:3-2:0:31",
"range": "d2/testdata/d2compiler/TestCompile/basic_sequence.d2,0:3:3-2:1:32",
"nodes": [
{
"map_key": {

View file

@ -27,7 +27,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/basic_shape.d2,1:3:4-3:0:22",
"range": "d2/testdata/d2compiler/TestCompile/basic_shape.d2,1:3:4-3:1:23",
"nodes": [
{
"map_key": {

View file

@ -27,7 +27,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/basic_style.d2,1:3:4-3:0:26",
"range": "d2/testdata/d2compiler/TestCompile/basic_style.d2,1:3:4-3:1:27",
"nodes": [
{
"map_key": {

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/blank_underscore.d2,2:2:11-2:3:12",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/border-radius-negative.d2,2:23:30-2:25:32",

View file

@ -27,7 +27,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/class-shape-class.d2,0:9:9-4:0:48",
"range": "d2/testdata/d2compiler/TestCompile/class-shape-class.d2,0:9:9-4:1:49",
"nodes": [
{
"map_key": {
@ -51,7 +51,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/class-shape-class.d2,1:14:25-3:2:46",
"range": "d2/testdata/d2compiler/TestCompile/class-shape-class.d2,1:14:25-3:3:47",
"nodes": [
{
"map_key": {
@ -118,7 +118,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/class-shape-class.d2,6:8:59-9:0:97",
"range": "d2/testdata/d2compiler/TestCompile/class-shape-class.d2,6:8:59-9:1:98",
"nodes": [
{
"map_key": {

View file

@ -37,7 +37,7 @@
},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,0:17:17-6:0:80",
"range": "d2/testdata/d2compiler/TestCompile/class_paren.d2,0:17:17-6:1:81",
"nodes": [
{
"map_key": {

View file

@ -27,7 +27,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/class_style.d2,0:17:17-4:0:80",
"range": "d2/testdata/d2compiler/TestCompile/class_style.d2,0:17:17-4:1:81",
"nodes": [
{
"map_key": {

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/classes-internal-edge.d2,7:2:72-7:16:86",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/classes-unreserved.d2,2:4:26-2:8:30",

View file

@ -27,7 +27,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/classes.d2,0:9:9-10:0:145",
"range": "d2/testdata/d2compiler/TestCompile/classes.d2,0:9:9-10:1:146",
"nodes": [
{
"map_key": {
@ -51,7 +51,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/classes.d2,1:15:26-5:2:85",
"range": "d2/testdata/d2compiler/TestCompile/classes.d2,1:15:26-5:3:86",
"nodes": [
{
"map_key": {
@ -185,7 +185,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/classes.d2,6:8:95-9:2:143",
"range": "d2/testdata/d2compiler/TestCompile/classes.d2,6:8:95-9:3:144",
"nodes": [
{
"map_key": {
@ -292,7 +292,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/classes.d2,11:8:155-11:29:176",
"range": "d2/testdata/d2compiler/TestCompile/classes.d2,11:8:155-11:30:177",
"nodes": [
{
"map_key": {
@ -364,7 +364,7 @@
},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/classes.d2,12:11:189-12:49:227",
"range": "d2/testdata/d2compiler/TestCompile/classes.d2,12:11:189-12:50:228",
"nodes": [
{
"map_key": {
@ -470,7 +470,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/classes.d2,13:7:236-13:41:270",
"range": "d2/testdata/d2compiler/TestCompile/classes.d2,13:7:236-13:42:271",
"nodes": [
{
"map_key": {
@ -588,7 +588,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/classes.d2,15:17:290-15:31:304",
"range": "d2/testdata/d2compiler/TestCompile/classes.d2,15:17:290-15:32:305",
"nodes": [
{
"map_key": {

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/comma-array-class.d2,11:10:157-11:15:162",

View file

@ -27,7 +27,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/constraint_label.d2,0:4:4-3:0:37",
"range": "d2/testdata/d2compiler/TestCompile/constraint_label.d2,0:4:4-3:1:38",
"nodes": [
{
"map_key": {

View file

@ -27,7 +27,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/dimension_with_style.d2,0:3:3-3:0:41",
"range": "d2/testdata/d2compiler/TestCompile/dimension_with_style.d2,0:3:3-3:1:42",
"nodes": [
{
"map_key": {

View file

@ -27,7 +27,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_containers.d2,1:12:13-44:0:503",
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_containers.d2,1:12:13-44:1:504",
"nodes": [
{
"map_key": {
@ -51,7 +51,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_containers.d2,2:19:34-11:1:130",
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_containers.d2,2:19:34-11:2:131",
"nodes": [
{
"map_key": {
@ -137,7 +137,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_containers.d2,6:11:77-10:2:127",
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_containers.d2,6:11:77-10:3:128",
"nodes": [
{
"map_key": {
@ -262,7 +262,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_containers.d2,12:20:152-21:1:247",
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_containers.d2,12:20:152-21:2:248",
"nodes": [
{
"map_key": {
@ -377,7 +377,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_containers.d2,17:10:209-20:2:244",
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_containers.d2,17:10:209-20:3:245",
"nodes": [
{
"map_key": {
@ -473,7 +473,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_containers.d2,22:17:266-32:1:374",
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_containers.d2,22:17:266-32:2:375",
"nodes": [
{
"map_key": {
@ -588,7 +588,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_containers.d2,27:11:321-31:2:371",
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_containers.d2,27:11:321-31:3:372",
"nodes": [
{
"map_key": {
@ -713,7 +713,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_containers.d2,33:20:396-43:1:501",
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_containers.d2,33:20:396-43:2:502",
"nodes": [
{
"map_key": {
@ -828,7 +828,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_containers.d2,38:8:451-42:2:498",
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_containers.d2,38:8:451-42:3:499",
"nodes": [
{
"map_key": {

View file

@ -32,7 +32,7 @@
},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_nonimage.d2,0:8:8-4:0:52",
"range": "d2/testdata/d2compiler/TestCompile/dimensions_on_nonimage.d2,0:8:8-4:1:53",
"nodes": [
{
"map_key": {

View file

@ -50,7 +50,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,0:8:8-8:0:166",
"range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,0:8:8-8:1:167",
"nodes": [
{
"map_key": {
@ -84,7 +84,7 @@
},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,1:57:67-3:2:90",
"range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,1:57:67-3:3:91",
"nodes": [
{
"map_key": {
@ -179,7 +179,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,5:20:137-7:2:164",
"range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_fields.d2,5:20:137-7:3:165",
"nodes": [
{
"map_key": {

View file

@ -50,7 +50,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_primary.d2,0:8:8-2:0:67",
"range": "d2/testdata/d2compiler/TestCompile/edge_arrowhead_primary.d2,0:8:8-2:1:68",
"nodes": [
{
"map_key": {

View file

@ -87,7 +87,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:13:14-3:0:105",
"range": "d2/testdata/d2compiler/TestCompile/edge_chain_map.d2,1:13:14-3:1:106",
"nodes": [
{
"map_key": {

View file

@ -27,7 +27,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_column_index.d2,0:5:5-4:0:47",
"range": "d2/testdata/d2compiler/TestCompile/edge_column_index.d2,0:5:5-4:1:48",
"nodes": [
{
"map_key": {
@ -155,7 +155,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_column_index.d2,6:5:55-10:0:98",
"range": "d2/testdata/d2compiler/TestCompile/edge_column_index.d2,6:5:55-10:1:99",
"nodes": [
{
"map_key": {

View file

@ -50,7 +50,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,1:8:9-3:0:33",
"range": "d2/testdata/d2compiler/TestCompile/edge_exclusive_style.d2,1:8:9-3:1:34",
"nodes": [
{
"map_key": {

View file

@ -50,7 +50,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,0:8:8-3:0:51",
"range": "d2/testdata/d2compiler/TestCompile/edge_flat_label_arrowhead.d2,0:8:8-3:1:52",
"nodes": [
{
"comment": {

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/edge_in_column.d2,2:6:30-2:7:31",

View file

@ -101,7 +101,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,2:13:21-4:0:112",
"range": "d2/testdata/d2compiler/TestCompile/edge_index_map.d2,2:13:21-4:1:113",
"nodes": [
{
"map_key": {

View file

@ -27,7 +27,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,1:3:4-4:0:37",
"range": "d2/testdata/d2compiler/TestCompile/edge_index_nested.d2,1:3:4-4:1:38",
"nodes": [
{
"map_key": {

View file

@ -27,7 +27,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,1:3:4-3:0:19",
"range": "d2/testdata/d2compiler/TestCompile/edge_index_nested_cross_scope.d2,1:3:4-3:1:20",
"nodes": [
{
"map_key": {

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/edge_invalid_style.d2,1:2:12-1:9:19",

View file

@ -27,7 +27,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,1:3:4-3:0:15",
"range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested.d2,1:3:4-3:1:16",
"nodes": [
{
"map_key": {

View file

@ -73,7 +73,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,2:3:11-4:0:49",
"range": "d2/testdata/d2compiler/TestCompile/edge_key_group_flat_nested_underscore.d2,2:3:11-4:1:50",
"nodes": [
{
"map_key": {

View file

@ -73,7 +73,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,2:3:11-6:0:57",
"range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,2:3:11-6:1:58",
"nodes": [
{
"map_key": {
@ -147,7 +147,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,3:18:31-5:1:55",
"range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_flat_nested_underscore.d2,3:18:31-5:2:56",
"nodes": [
{
"map_key": {

View file

@ -73,7 +73,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,2:3:11-8:0:67",
"range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,2:3:11-8:1:68",
"nodes": [
{
"map_key": {
@ -147,7 +147,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,3:18:31-7:1:65",
"range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,3:18:31-7:2:66",
"nodes": [
{
"map_key": {
@ -171,7 +171,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,4:9:42-6:2:62",
"range": "d2/testdata/d2compiler/TestCompile/edge_key_group_map_nested_underscore.d2,4:9:42-6:3:63",
"nodes": [
{
"map_key": {

View file

@ -60,7 +60,7 @@
},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:21:21-0:40:40",
"range": "d2/testdata/d2compiler/TestCompile/edge_label_map.d2,0:21:21-0:41:41",
"nodes": [
{
"map_key": {

View file

@ -50,7 +50,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_map.d2,1:8:9-3:0:100",
"range": "d2/testdata/d2compiler/TestCompile/edge_map.d2,1:8:9-3:1:101",
"nodes": [
{
"map_key": {

View file

@ -50,7 +50,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,0:8:8-4:0:55",
"range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,0:8:8-4:1:56",
"nodes": [
{
"map_key": {
@ -74,7 +74,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,1:20:30-3:2:53",
"range": "d2/testdata/d2compiler/TestCompile/edge_map_arrowhead.d2,1:20:30-3:3:54",
"nodes": [
{
"map_key": {

View file

@ -117,7 +117,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,1:19:26-3:0:43",
"range": "d2/testdata/d2compiler/TestCompile/edge_map_group_semiflat.d2,1:19:26-3:1:44",
"nodes": [
{
"map_key": {

View file

@ -50,7 +50,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,1:8:9-5:0:43",
"range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,1:8:9-5:1:44",
"nodes": [
{
"map_key": {
@ -74,7 +74,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,2:9:20-4:2:41",
"range": "d2/testdata/d2compiler/TestCompile/edge_map_nested.d2,2:9:20-4:3:42",
"nodes": [
{
"map_key": {

View file

@ -50,7 +50,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,1:8:9-3:0:31",
"range": "d2/testdata/d2compiler/TestCompile/edge_map_nested_flat.d2,1:8:9-3:1:32",
"nodes": [
{
"map_key": {

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/edge_map_non_reserved.d2,2:2:13-2:3:14",

View file

@ -50,7 +50,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,0:8:8-2:0:44",
"range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,0:8:8-2:1:45",
"nodes": [
{
"map_key": {
@ -167,7 +167,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,3:30:76-5:0:95",
"range": "d2/testdata/d2compiler/TestCompile/edge_mixed_arrowhead.d2,3:30:76-5:1:96",
"nodes": [
{
"map_key": {

View file

@ -50,7 +50,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:8:8-0:43:43",
"range": "d2/testdata/d2compiler/TestCompile/edge_non_shape_arrowhead.d2,0:8:8-0:44:44",
"nodes": [
{
"map_key": {

View file

@ -117,7 +117,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,1:30:37-3:0:56",
"range": "d2/testdata/d2compiler/TestCompile/edge_semiflat_arrowhead.d2,1:30:37-3:1:57",
"nodes": [
{
"map_key": {

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/edge_to_style.d2,1:7:31-1:12:36",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/edge_unquoted_hex.d2,2:9:29-2:10:30",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/equal_dimensions_on_circle.d2,2:1:26-2:11:36",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/errors/missing_shape_icon.d2,0:0:0-0:14:14",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/errors/reserved_icon_style.d2,2:8:23-2:27:42",

View file

@ -27,7 +27,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/fill-pattern.d2,0:3:3-4:0:42",
"range": "d2/testdata/d2compiler/TestCompile/fill-pattern.d2,0:3:3-4:1:43",
"nodes": [
{
"map_key": {
@ -51,7 +51,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/fill-pattern.d2,1:8:13-3:2:40",
"range": "d2/testdata/d2compiler/TestCompile/fill-pattern.d2,1:8:13-3:3:41",
"nodes": [
{
"map_key": {

View file

@ -27,7 +27,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/grid.d2,0:5:5-3:0:42",
"range": "d2/testdata/d2compiler/TestCompile/grid.d2,0:5:5-3:1:43",
"nodes": [
{
"map_key": {

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/grid_edge.d2,2:1:22-2:7:28",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/grid_gap_negative.d2,1:17:24-1:21:28",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/grid_negative.d2,2:15:38-2:19:42",

View file

@ -27,7 +27,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/grid_nested.d2,0:5:5-15:0:123",
"range": "d2/testdata/d2compiler/TestCompile/grid_nested.d2,0:5:5-15:1:124",
"nodes": [
{
"map_key": {
@ -212,7 +212,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/grid_nested.d2,8:4:76-14:1:121",
"range": "d2/testdata/d2compiler/TestCompile/grid_nested.d2,8:4:76-14:2:122",
"nodes": [
{
"map_key": {

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/illegal-stroke-width.d2,1:22:28-1:24:30",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/image_children_Steps.d2,3:2:115-3:7:120",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/image_non_style.d2,3:2:115-3:6:119",

View file

@ -32,7 +32,7 @@
},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/image_style.d2,0:8:8-4:0:116",
"range": "d2/testdata/d2compiler/TestCompile/image_style.d2,0:8:8-4:1:117",
"nodes": [
{
"map_key": {

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/improper-class-ref.d2,0:6:6-0:11:11",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/invalid-fill-pattern.d2,2:18:33-2:23:38",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/invalid_direction.d2,1:13:18-1:21:26",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/keyword-container.d2,0:2:2-0:6:6",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/leaky_sequence.d2,4:0:37-4:8:45",

View file

@ -27,7 +27,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-key-nested.d2,0:3:3-2:0:24",
"range": "d2/testdata/d2compiler/TestCompile/link-board-key-nested.d2,0:3:3-2:1:25",
"nodes": [
{
"map_key": {
@ -61,7 +61,7 @@
},
"primary": {},
"value": {
"double_quoted_string": {
"unquoted_string": {
"range": ",0:0:0-0:0:0",
"value": [
{
@ -99,7 +99,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-key-nested.d2,3:8:34-7:0:54",
"range": "d2/testdata/d2compiler/TestCompile/link-board-key-nested.d2,3:8:34-7:1:55",
"nodes": [
{
"map_key": {
@ -123,7 +123,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-key-nested.d2,4:5:41-6:2:52",
"range": "d2/testdata/d2compiler/TestCompile/link-board-key-nested.d2,4:5:41-6:3:53",
"nodes": [
{
"map_key": {
@ -319,7 +319,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-key-nested.d2,0:3:3-2:0:24",
"range": "d2/testdata/d2compiler/TestCompile/link-board-key-nested.d2,0:3:3-2:1:25",
"nodes": [
{
"map_key": {
@ -353,7 +353,7 @@
},
"primary": {},
"value": {
"double_quoted_string": {
"unquoted_string": {
"range": ",0:0:0-0:0:0",
"value": [
{
@ -391,7 +391,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-key-nested.d2,3:8:34-7:0:54",
"range": "d2/testdata/d2compiler/TestCompile/link-board-key-nested.d2,3:8:34-7:1:55",
"nodes": [
{
"map_key": {
@ -415,7 +415,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-key-nested.d2,4:5:41-6:2:52",
"range": "d2/testdata/d2compiler/TestCompile/link-board-key-nested.d2,4:5:41-6:3:53",
"nodes": [
{
"map_key": {

View file

@ -70,7 +70,7 @@
},
"primary": {},
"value": {
"double_quoted_string": {
"unquoted_string": {
"range": ",0:0:0-0:0:0",
"value": [
{
@ -103,7 +103,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,3:8:66-7:0:112",
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,3:8:66-7:1:113",
"nodes": [
{
"map_key": {
@ -127,7 +127,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,4:7:75-6:2:110",
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,4:7:75-6:3:111",
"nodes": [
{
"map_key": {
@ -217,7 +217,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,9:11:126-13:0:174",
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,9:11:126-13:1:175",
"nodes": [
{
"map_key": {
@ -241,7 +241,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,10:9:137-12:2:172",
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,10:9:137-12:3:173",
"nodes": [
{
"map_key": {
@ -487,7 +487,7 @@
},
"primary": {},
"value": {
"double_quoted_string": {
"unquoted_string": {
"range": ",0:0:0-0:0:0",
"value": [
{
@ -520,7 +520,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,3:8:66-7:0:112",
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,3:8:66-7:1:113",
"nodes": [
{
"map_key": {
@ -544,7 +544,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,4:7:75-6:2:110",
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,4:7:75-6:3:111",
"nodes": [
{
"map_key": {
@ -634,7 +634,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,9:11:126-13:0:174",
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,9:11:126-13:1:175",
"nodes": [
{
"map_key": {
@ -658,7 +658,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,10:9:137-12:2:172",
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,10:9:137-12:3:173",
"nodes": [
{
"map_key": {
@ -948,7 +948,7 @@
},
"primary": {},
"value": {
"double_quoted_string": {
"unquoted_string": {
"range": ",0:0:0-0:0:0",
"value": [
{
@ -981,7 +981,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,3:8:66-7:0:112",
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,3:8:66-7:1:113",
"nodes": [
{
"map_key": {
@ -1005,7 +1005,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,4:7:75-6:2:110",
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,4:7:75-6:3:111",
"nodes": [
{
"map_key": {
@ -1095,7 +1095,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,9:11:126-13:0:174",
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,9:11:126-13:1:175",
"nodes": [
{
"map_key": {
@ -1119,7 +1119,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,10:9:137-12:2:172",
"range": "d2/testdata/d2compiler/TestCompile/link-board-mixed.d2,10:9:137-12:3:173",
"nodes": [
{
"map_key": {

View file

@ -37,7 +37,7 @@
},
"primary": {},
"value": {
"double_quoted_string": {
"unquoted_string": {
"range": ",0:0:0-0:0:0",
"value": [
{
@ -70,7 +70,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,1:8:34-9:0:100",
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,1:8:34-9:1:101",
"nodes": [
{
"map_key": {
@ -94,7 +94,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,2:5:41-8:2:98",
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,2:5:41-8:3:99",
"nodes": [
{
"map_key": {
@ -118,7 +118,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,3:12:55-7:4:94",
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,3:12:55-7:5:95",
"nodes": [
{
"map_key": {
@ -142,7 +142,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,4:9:66-6:6:88",
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,4:9:66-6:7:89",
"nodes": [
{
"map_key": {
@ -313,7 +313,7 @@
},
"primary": {},
"value": {
"double_quoted_string": {
"unquoted_string": {
"range": ",0:0:0-0:0:0",
"value": [
{
@ -346,7 +346,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,1:8:34-9:0:100",
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,1:8:34-9:1:101",
"nodes": [
{
"map_key": {
@ -370,7 +370,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,2:5:41-8:2:98",
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,2:5:41-8:3:99",
"nodes": [
{
"map_key": {
@ -394,7 +394,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,3:12:55-7:4:94",
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,3:12:55-7:5:95",
"nodes": [
{
"map_key": {
@ -418,7 +418,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,4:9:66-6:6:88",
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,4:9:66-6:7:89",
"nodes": [
{
"map_key": {
@ -529,7 +529,7 @@
},
"primary": {},
"value": {
"double_quoted_string": {
"unquoted_string": {
"range": ",0:0:0-0:0:0",
"value": [
{
@ -562,7 +562,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,1:8:34-9:0:100",
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,1:8:34-9:1:101",
"nodes": [
{
"map_key": {
@ -586,7 +586,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,2:5:41-8:2:98",
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,2:5:41-8:3:99",
"nodes": [
{
"map_key": {
@ -610,7 +610,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,3:12:55-7:4:94",
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,3:12:55-7:5:95",
"nodes": [
{
"map_key": {
@ -634,7 +634,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,4:9:66-6:6:88",
"range": "d2/testdata/d2compiler/TestCompile/link-board-nested.d2,4:9:66-6:7:89",
"nodes": [
{
"map_key": {

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/link-board-not-board.d2,1:0:4-1:18:22",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/link-board-not-found.d2,0:0:0-0:16:16",

View file

@ -37,7 +37,7 @@
},
"primary": {},
"value": {
"double_quoted_string": {
"unquoted_string": {
"range": ",0:0:0-0:0:0",
"value": [
{
@ -70,7 +70,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-ok.d2,1:8:25-5:0:41",
"range": "d2/testdata/d2compiler/TestCompile/link-board-ok.d2,1:8:25-5:1:42",
"nodes": [
{
"map_key": {
@ -94,7 +94,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-ok.d2,2:4:31-4:1:39",
"range": "d2/testdata/d2compiler/TestCompile/link-board-ok.d2,2:4:31-4:2:40",
"nodes": [
{
"map_key": {
@ -255,7 +255,7 @@
},
"primary": {},
"value": {
"double_quoted_string": {
"unquoted_string": {
"range": ",0:0:0-0:0:0",
"value": [
{
@ -288,7 +288,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-ok.d2,1:8:25-5:0:41",
"range": "d2/testdata/d2compiler/TestCompile/link-board-ok.d2,1:8:25-5:1:42",
"nodes": [
{
"map_key": {
@ -312,7 +312,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-ok.d2,2:4:31-4:1:39",
"range": "d2/testdata/d2compiler/TestCompile/link-board-ok.d2,2:4:31-4:2:40",
"nodes": [
{
"map_key": {

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore-not-found.d2,6:8:59-6:18:69",

View file

@ -50,7 +50,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,1:8:10-11:0:120",
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,1:8:10-11:1:121",
"nodes": [
{
"map_key": {
@ -74,7 +74,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,2:4:16-10:2:118",
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,2:4:16-10:3:119",
"nodes": [
{
"map_key": {
@ -121,7 +121,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,4:12:36-9:4:114",
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,4:12:36-9:5:115",
"nodes": [
{
"map_key": {
@ -145,7 +145,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,5:9:47-8:6:108",
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,5:9:47-8:7:109",
"nodes": [
{
"map_key": {
@ -179,7 +179,7 @@
},
"primary": {},
"value": {
"double_quoted_string": {
"unquoted_string": {
"range": ",0:0:0-0:0:0",
"value": [
{
@ -222,7 +222,7 @@
},
"primary": {},
"value": {
"double_quoted_string": {
"unquoted_string": {
"range": ",0:0:0-0:0:0",
"value": [
{
@ -378,7 +378,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,1:8:10-11:0:120",
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,1:8:10-11:1:121",
"nodes": [
{
"map_key": {
@ -402,7 +402,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,2:4:16-10:2:118",
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,2:4:16-10:3:119",
"nodes": [
{
"map_key": {
@ -449,7 +449,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,4:12:36-9:4:114",
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,4:12:36-9:5:115",
"nodes": [
{
"map_key": {
@ -473,7 +473,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,5:9:47-8:6:108",
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,5:9:47-8:7:109",
"nodes": [
{
"map_key": {
@ -507,7 +507,7 @@
},
"primary": {},
"value": {
"double_quoted_string": {
"unquoted_string": {
"range": ",0:0:0-0:0:0",
"value": [
{
@ -550,7 +550,7 @@
},
"primary": {},
"value": {
"double_quoted_string": {
"unquoted_string": {
"range": ",0:0:0-0:0:0",
"value": [
{
@ -706,7 +706,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,1:8:10-11:0:120",
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,1:8:10-11:1:121",
"nodes": [
{
"map_key": {
@ -730,7 +730,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,2:4:16-10:2:118",
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,2:4:16-10:3:119",
"nodes": [
{
"map_key": {
@ -777,7 +777,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,4:12:36-9:4:114",
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,4:12:36-9:5:115",
"nodes": [
{
"map_key": {
@ -801,7 +801,7 @@
"primary": {},
"value": {
"map": {
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,5:9:47-8:6:108",
"range": "d2/testdata/d2compiler/TestCompile/link-board-underscore.d2,5:9:47-8:7:109",
"nodes": [
{
"map_key": {
@ -835,7 +835,7 @@
},
"primary": {},
"value": {
"double_quoted_string": {
"unquoted_string": {
"range": ",0:0:0-0:0:0",
"value": [
{
@ -878,7 +878,7 @@
},
"primary": {},
"value": {
"double_quoted_string": {
"unquoted_string": {
"range": ",0:0:0-0:0:0",
"value": [
{

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/md_block_string_err.d2,3:18:50-3:24:56",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/near-invalid.d2,8:10:133-8:17:140",

View file

@ -1,7 +1,6 @@
{
"graph": null,
"err": {
"ioerr": null,
"errs": [
{
"range": "d2/testdata/d2compiler/TestCompile/near_bad_connected.d2,4:4:42-4:10:48",

Some files were not shown because too many files have changed in this diff Show more