From 34fd37de970abd3941cd1730ed61a6b054d5393d Mon Sep 17 00:00:00 2001 From: Alexander Wang Date: Sat, 29 Mar 2025 17:31:51 -0600 Subject: [PATCH 1/3] implement level filter --- d2compiler/compile_test.go | 27 + d2ir/compile.go | 20 + .../TestCompile2/globs/level-filter.exp.json | 508 ++++++++++++++++++ 3 files changed, 555 insertions(+) create mode 100644 testdata/d2compiler/TestCompile2/globs/level-filter.exp.json diff --git a/d2compiler/compile_test.go b/d2compiler/compile_test.go index e373a4cd9..0871d4b33 100644 --- a/d2compiler/compile_test.go +++ b/d2compiler/compile_test.go @@ -5641,6 +5641,33 @@ d: { assert.Equal(t, "yellow", g.Objects[4].Attributes.Style.Stroke.Value) }, }, + { + name: "level-filter", + run: func(t *testing.T) { + g, _ := assertCompile(t, ` +**: { + &level: 0 + style.fill: red +} +**: { + &level: 1 + style.stroke: yellow +} +a.b.c +`, ``) + assert.Equal(t, "a", g.Objects[0].ID) + assert.Equal(t, "red", g.Objects[0].Attributes.Style.Fill.Value) + assert.Equal(t, (*d2graph.Scalar)(nil), g.Objects[0].Attributes.Style.Stroke) + + assert.Equal(t, "b", g.Objects[1].ID) + assert.Equal(t, "yellow", g.Objects[1].Attributes.Style.Stroke.Value) + assert.Equal(t, (*d2graph.Scalar)(nil), g.Objects[1].Attributes.Style.Fill) + + assert.Equal(t, "c", g.Objects[2].ID) + assert.Equal(t, (*d2graph.Scalar)(nil), g.Objects[2].Attributes.Style.Fill) + assert.Equal(t, (*d2graph.Scalar)(nil), g.Objects[2].Attributes.Style.Stroke) + }, + }, { name: "connected-filter", run: func(t *testing.T) { diff --git a/d2ir/compile.go b/d2ir/compile.go index 45672d4bb..47031ddfe 100644 --- a/d2ir/compile.go +++ b/d2ir/compile.go @@ -851,6 +851,26 @@ func (c *compiler) ampersandFilter(refctx *RefContext) bool { f := refctx.ScopeMap.Parent().(*Field) isLeaf := f.Map() == nil || !f.Map().IsContainer() return isLeaf == boolVal + case "level": + raw := refctx.Key.Value.ScalarBox().Unbox().ScalarString() + levelVal, err := strconv.Atoi(raw) + if err != nil { + c.errorf(refctx.Key, `&level must be a non-negative integer, got %q`, raw) + return false + } + if levelVal < 0 { + c.errorf(refctx.Key, `&level must be a non-negative integer, got %d`, levelVal) + return false + } + + f := refctx.ScopeMap.Parent().(*Field) + level := 0 + parent := ParentField(f) + for parent != nil && parent.Name.ScalarString() != "root" && NodeBoardKind(parent) == "" { + level++ + parent = ParentField(parent) + } + return level == levelVal case "connected": raw := refctx.Key.Value.ScalarBox().Unbox().ScalarString() boolVal, err := strconv.ParseBool(raw) diff --git a/testdata/d2compiler/TestCompile2/globs/level-filter.exp.json b/testdata/d2compiler/TestCompile2/globs/level-filter.exp.json new file mode 100644 index 000000000..0c1939d87 --- /dev/null +++ b/testdata/d2compiler/TestCompile2/globs/level-filter.exp.json @@ -0,0 +1,508 @@ +{ + "graph": { + "name": "", + "isFolderOnly": false, + "ast": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,0:0:0-10:0:88", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,1:0:1-4:1:38", + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,1:0:1-1:2:3", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,1:0:1-1:2:3", + "value": [ + { + "string": "**", + "raw_string": "**" + } + ], + "pattern": [ + "*", + "", + "*" + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,1:4:5-4:1:38", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,2:2:9-2:11:18", + "ampersand": true, + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,2:3:10-2:8:15", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,2:3:10-2:8:15", + "value": [ + { + "string": "level", + "raw_string": "level" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,2:10:17-2:11:18", + "raw": "0", + "value": "0" + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,3:2:21-3:17:36", + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,3:2:21-3:12:31", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,3:2:21-3:7:26", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,3:8:27-3:12:31", + "value": [ + { + "string": "fill", + "raw_string": "fill" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,3:14:33-3:17:36", + "value": [ + { + "string": "red", + "raw_string": "red" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,5:0:39-8:1:81", + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,5:0:39-5:2:41", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,5:0:39-5:2:41", + "value": [ + { + "string": "**", + "raw_string": "**" + } + ], + "pattern": [ + "*", + "", + "*" + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,5:4:43-8:1:81", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,6:2:47-6:11:56", + "ampersand": true, + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,6:3:48-6:8:53", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,6:3:48-6:8:53", + "value": [ + { + "string": "level", + "raw_string": "level" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "number": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,6:10:55-6:11:56", + "raw": "1", + "value": "1" + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,7:2:59-7:22:79", + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,7:2:59-7:14:71", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,7:2:59-7:7:64", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,7:8:65-7:14:71", + "value": [ + { + "string": "stroke", + "raw_string": "stroke" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,7:16:73-7:22:79", + "value": [ + { + "string": "yellow", + "raw_string": "yellow" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,9:0:82-9:5:87", + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,9:0:82-9:5:87", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,9:0:82-9:1:83", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,9:2:84-9:3:85", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,9:4:86-9:5:87", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + "edges": null, + "objects": [ + { + "id": "a", + "id_val": "a", + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,9:0:82-9:5:87", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,9:0:82-9:1:83", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,9:2:84-9:3:85", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,9:4:86-9:5:87", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": -1 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": { + "fill": { + "value": "red" + } + }, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + { + "id": "b", + "id_val": "b", + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,9:0:82-9:5:87", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,9:0:82-9:1:83", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,9:2:84-9:3:85", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,9:4:86-9:5:87", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 1, + "map_key_edge_index": -1 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": { + "stroke": { + "value": "yellow" + } + }, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + { + "id": "c", + "id_val": "c", + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,9:0:82-9:5:87", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,9:0:82-9:1:83", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,9:2:84-9:3:85", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/level-filter.d2,9:4:86-9:5:87", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 2, + "map_key_edge_index": -1 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + } + ] + }, + "err": null +} From 3d4cc716113b907a237047c496a9a4af4a2243cd Mon Sep 17 00:00:00 2001 From: Alexander Wang Date: Sat, 29 Mar 2025 17:33:18 -0600 Subject: [PATCH 2/3] next --- ci/release/changelogs/next.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ci/release/changelogs/next.md b/ci/release/changelogs/next.md index 902660519..6841ef632 100644 --- a/ci/release/changelogs/next.md +++ b/ci/release/changelogs/next.md @@ -2,7 +2,9 @@ - Icons: connections can include icons [#12](https://github.com/terrastruct/d2/issues/12) - Syntax: `suspend`/`unsuspend` to define models and instantiate them [#2394](https://github.com/terrastruct/d2/pull/2394) -- Globs: support for filtering edges based on properties of endpoint nodes (e.g., `&src.style.fill: blue`) [#2395](https://github.com/terrastruct/d2/pull/2395) +- Globs: + - support for filtering edges based on properties of endpoint nodes (e.g., `&src.style.fill: blue`) [#2395](https://github.com/terrastruct/d2/pull/2395) + - `level` filter implemented [#2473](https://github.com/terrastruct/d2/pull/2473) - Render: - markdown, latex, and code can be used as object labels [#2204](https://github.com/terrastruct/d2/pull/2204) - `shape: c4-person` to render a person shape like what the C4 model prescribes [#2397](https://github.com/terrastruct/d2/pull/2397) From 07b3d5e4648d2e0920071d6f1663751ce24d87d3 Mon Sep 17 00:00:00 2001 From: Alexander Wang Date: Sun, 30 Mar 2025 08:08:10 -0600 Subject: [PATCH 3/3] add test for and ampersand --- d2compiler/compile_test.go | 31 + .../TestCompile2/globs/and-filter.exp.json | 750 ++++++++++++++++++ 2 files changed, 781 insertions(+) create mode 100644 testdata/d2compiler/TestCompile2/globs/and-filter.exp.json diff --git a/d2compiler/compile_test.go b/d2compiler/compile_test.go index 0871d4b33..5a56d1e89 100644 --- a/d2compiler/compile_test.go +++ b/d2compiler/compile_test.go @@ -5687,6 +5687,37 @@ c assert.Equal(t, (*d2graph.Scalar)(nil), g.Objects[2].Attributes.Style.Fill) }, }, + { + name: "and-filter", + run: func(t *testing.T) { + g, _ := assertCompile(t, ` +*: { + &shape: person + &connected: true + style.fill: red +} +(** -> **)[*]: { + &src: a + &dst: c + style.stroke: yellow +} +a -> b +a.shape: person +a -> c +`, ``) + assert.Equal(t, "a", g.Objects[0].ID) + assert.Equal(t, "red", g.Objects[0].Attributes.Style.Fill.Value) + assert.Equal(t, "b", g.Objects[1].ID) + assert.Equal(t, (*d2graph.Scalar)(nil), g.Objects[1].Attributes.Style.Fill) + assert.Equal(t, "c", g.Objects[2].ID) + assert.Equal(t, (*d2graph.Scalar)(nil), g.Objects[2].Attributes.Style.Fill) + + assert.Equal(t, "(a -> b)[0]", g.Edges[0].AbsID()) + assert.Equal(t, (*d2graph.Scalar)(nil), g.Edges[0].Attributes.Style.Stroke) + assert.Equal(t, "(a -> c)[0]", g.Edges[1].AbsID()) + assert.Equal(t, "yellow", g.Edges[1].Attributes.Style.Stroke.Value) + }, + }, { name: "glob-filter", run: func(t *testing.T) { diff --git a/testdata/d2compiler/TestCompile2/globs/and-filter.exp.json b/testdata/d2compiler/TestCompile2/globs/and-filter.exp.json new file mode 100644 index 000000000..84ab92222 --- /dev/null +++ b/testdata/d2compiler/TestCompile2/globs/and-filter.exp.json @@ -0,0 +1,750 @@ +{ + "graph": { + "name": "", + "isFolderOnly": false, + "ast": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,0:0:0-14:0:154", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,1:0:1-5:1:61", + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,1:0:1-1:1:2", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,1:0:1-1:1:2", + "value": [ + { + "string": "*", + "raw_string": "*" + } + ], + "pattern": [ + "*" + ] + } + } + ] + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,1:3:4-5:1:61", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,2:2:8-2:16:22", + "ampersand": true, + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,2:3:9-2:8:14", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,2:3:9-2:8:14", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,2:10:16-2:16:22", + "value": [ + { + "string": "person", + "raw_string": "person" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,3:2:25-3:18:41", + "ampersand": true, + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,3:3:26-3:12:35", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,3:3:26-3:12:35", + "value": [ + { + "string": "connected", + "raw_string": "connected" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "boolean": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,3:14:37-3:18:41", + "value": true + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,4:2:44-4:17:59", + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,4:2:44-4:12:54", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,4:2:44-4:7:49", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,4:8:50-4:12:54", + "value": [ + { + "string": "fill", + "raw_string": "fill" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,4:14:56-4:17:59", + "value": [ + { + "string": "red", + "raw_string": "red" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,6:0:62-10:1:123", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,6:1:63-6:9:71", + "src": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,6:1:63-6:3:65", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,6:1:63-6:3:65", + "value": [ + { + "string": "**", + "raw_string": "**" + } + ], + "pattern": [ + "*", + "", + "*" + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,6:7:69-6:9:71", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,6:7:69-6:9:71", + "value": [ + { + "string": "**", + "raw_string": "**" + } + ], + "pattern": [ + "*", + "", + "*" + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "edge_index": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,6:10:72-6:13:75", + "int": null, + "glob": true + }, + "primary": {}, + "value": { + "map": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,6:15:77-10:1:123", + "nodes": [ + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,7:2:81-7:9:88", + "ampersand": true, + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,7:3:82-7:6:85", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,7:3:82-7:6:85", + "value": [ + { + "string": "src", + "raw_string": "src" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,7:8:87-7:9:88", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,8:2:91-8:9:98", + "ampersand": true, + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,8:3:92-8:6:95", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,8:3:92-8:6:95", + "value": [ + { + "string": "dst", + "raw_string": "dst" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,8:8:97-8:9:98", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,9:2:101-9:22:121", + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,9:2:101-9:14:113", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,9:2:101-9:7:106", + "value": [ + { + "string": "style", + "raw_string": "style" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,9:8:107-9:14:113", + "value": [ + { + "string": "stroke", + "raw_string": "stroke" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,9:16:115-9:22:121", + "value": [ + { + "string": "yellow", + "raw_string": "yellow" + } + ] + } + } + } + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,11:0:124-11:6:130", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,11:0:124-11:6:130", + "src": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,11:0:124-11:1:125", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,11:0:124-11:1:125", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,11:5:129-11:6:130", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,11:5:129-11:6:130", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,12:0:131-12:15:146", + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,12:0:131-12:7:138", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,12:0:131-12:1:132", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,12:2:133-12:7:138", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "primary": {}, + "value": { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,12:9:140-12:15:146", + "value": [ + { + "string": "person", + "raw_string": "person" + } + ] + } + } + } + }, + { + "map_key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,13:0:147-13:6:153", + "edges": [ + { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,13:0:147-13:6:153", + "src": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,13:0:147-13:1:148", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,13:0:147-13:1:148", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "src_arrow": "", + "dst": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,13:5:152-13:6:153", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,13:5:152-13:6:153", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "dst_arrow": ">" + } + ], + "primary": {}, + "value": {} + } + } + ] + }, + "root": { + "id": "", + "id_val": "", + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + "edges": [ + { + "index": 0, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + { + "index": 0, + "isCurve": false, + "src_arrow": false, + "dst_arrow": true, + "references": [ + { + "map_key_edge_index": 0 + }, + { + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": { + "stroke": { + "value": "yellow" + } + }, + "near_key": null, + "shape": { + "value": "" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + } + ], + "objects": [ + { + "id": "a", + "id_val": "a", + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,11:0:124-11:1:125", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,11:0:124-11:1:125", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,12:0:131-12:7:138", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,12:0:131-12:1:132", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + }, + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,12:2:133-12:7:138", + "value": [ + { + "string": "shape", + "raw_string": "shape" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": -1 + }, + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,13:0:147-13:1:148", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,13:0:147-13:1:148", + "value": [ + { + "string": "a", + "raw_string": "a" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "a" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": { + "fill": { + "value": "red" + } + }, + "near_key": null, + "shape": { + "value": "person" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + { + "id": "b", + "id_val": "b", + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,11:5:129-11:6:130", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,11:5:129-11:6:130", + "value": [ + { + "string": "b", + "raw_string": "b" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "b" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + }, + { + "id": "c", + "id_val": "c", + "references": [ + { + "key": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,13:5:152-13:6:153", + "path": [ + { + "unquoted_string": { + "range": "d2/testdata/d2compiler/TestCompile2/globs/and-filter.d2,13:5:152-13:6:153", + "value": [ + { + "string": "c", + "raw_string": "c" + } + ] + } + } + ] + }, + "key_path_index": 0, + "map_key_edge_index": 0 + } + ], + "attributes": { + "label": { + "value": "c" + }, + "labelDimensions": { + "width": 0, + "height": 0 + }, + "style": {}, + "near_key": null, + "shape": { + "value": "rectangle" + }, + "direction": { + "value": "" + }, + "constraint": null + }, + "zIndex": 0 + } + ] + }, + "err": null +}