diff --git a/CLAUDE.md b/CLAUDE.md index b78a1ba..0683ffb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -83,14 +83,23 @@ The ports are not line-for-line identical. Current intentional/known gaps: `"main"` for bare references, and tries implicit extensions / index files. It does not implement Node's full module-resolution algorithm (e.g. conditional `"exports"`). -- **No virtual filesystem in Go.** The TS resolvers accept a `ctx.meta.fs` - (used by tests via `memfs`); the Go resolvers use the OS filesystem - directly. +- **Virtual filesystem injection differs in shape.** Both ports let the + file/pkg resolvers read from an injected filesystem instead of the OS (the + default in both). TS uses `ctx.meta.fs` — a `node:fs` subset (e.g. `memfs`) + keyed by absolute paths. Go uses `MultiSourceOptions.FS` or `ctx.Meta["fs"]` + — an `io/fs.FS` (e.g. `testing/fstest.MapFS`) keyed by relative, + slash-separated paths (`fs.ValidPath`). Because an `io/fs.FS` is rooted and + relative, a Go reference under an injected FS resolves relative to the FS + root, not as an absolute path. - **No `.js` processor in Go.** Executing JavaScript modules is Node-specific. -- **Base-path resolution.** The Go plugin resolves a reference against - `opts.Path` once, before calling the resolver; it does not yet track each - parent file's directory for relative nested includes the way the TS - `resolvePathSpec` does via `ctx.meta.multisource.path`. + +Nested relative includes have parity: like TS, the Go plugin threads each +loaded source's full path through `ctx.Meta["multisource"]["path"]`, so a +relative reference inside a loaded source resolves against *that* source's own +directory (a → b → c, at any depth), and sibling loads are independent. The +base path for a top-level parse is still `opts.Path` (Go's equivalent of +seeding `ctx.meta.multisource.path` in TS); from there each nested source's +directory is tracked automatically. If you close any of these gaps, update this list and both `doc/` files. diff --git a/doc/multisource-go.md b/doc/multisource-go.md index af403e4..67cebdb 100644 --- a/doc/multisource-go.md +++ b/doc/multisource-go.md @@ -113,13 +113,17 @@ out, _ := j.Parse(`{cfg: @"some-pkg/config.jsonic"}`) A bare package reference (`@"some-pkg"`) resolves via the package's `package.json` `"main"`, falling back to index files. +A relative reference (`@"./x"`, `@"../x"`) found *inside* a source loaded from a +package resolves against that source's own directory — not as a package name — +so a package can pull in its own sibling files. + ### Supply a custom resolver Implement the `Resolver` function type. It must populate `Resolution.Found` and — if found — `Src` and `Full`: ```go -httpResolver := func(spec multisource.PathSpec, _ *multisource.MultiSourceOptions) multisource.Resolution { +httpResolver := func(spec multisource.PathSpec, _ *multisource.MultiSourceOptions, _ *jsonic.Context) multisource.Resolution { body := httpGet(spec.Full) return multisource.Resolution{ PathSpec: spec, @@ -130,6 +134,34 @@ httpResolver := func(spec multisource.PathSpec, _ *multisource.MultiSourceOption j := multisource.MakeJsonic(multisource.MultiSourceOptions{Resolver: httpResolver}) ``` +### Resolve from an in-memory filesystem (hermetic tests) + +The file and pkg resolvers read from the OS by default. Supply an `io/fs.FS` +(for example `testing/fstest.MapFS`) via `FS` to read from memory instead — handy +for hermetic tests, mirroring the `ctx.meta.fs` injection used by the TypeScript +tests. Paths under an injected FS are relative and slash-separated (see +`fs.ValidPath`), so they resolve relative to the FS root: + +```go +fsys := fstest.MapFS{ + "main.jsonic": &fstest.MapFile{Data: []byte(`{child:@"./sub/child.jsonic"}`)}, + "sub/child.jsonic": &fstest.MapFile{Data: []byte(`{v:99}`)}, +} +j := multisource.MakeJsonic(multisource.MultiSourceOptions{ + Resolver: multisource.MakeFileResolver(), + FS: fsys, +}) +out, _ := j.Parse(`@"./main.jsonic"`) +// out == map[string]any{"child": map[string]any{"v": float64(99)}} +``` + +A per-parse override can also be passed as `ctx.Meta["fs"]` via `ParseMeta`, +matching the TypeScript `j('...', { fs })` form: + +```go +out, _ := j.ParseMeta(`@"./main.jsonic"`, map[string]any{"fs": fsys}) +``` + ### Register a processor for a new file kind Processors fill in `res.Val` from `res.Src`. Register them under the kind @@ -139,7 +171,7 @@ Processors fill in `res.Val` from `res.Src`. Register them under the kind j := multisource.MakeJsonic(multisource.MultiSourceOptions{ Resolver: multisource.MakeMemResolver(files), Processor: map[string]multisource.Processor{ - "yaml": func(res *multisource.Resolution, _ *multisource.MultiSourceOptions, _ *jsonic.Jsonic) { + "yaml": func(res *multisource.Resolution, _ *multisource.MultiSourceOptions, _ *jsonic.Context, _ *jsonic.Jsonic) { res.Val = parseYAML(res.Src) }, }, @@ -186,16 +218,41 @@ All added alternates share the `multisource` group tag, supplied via the 1. The directive action reads the reference — a string, or a map with a `path` key. -2. `ResolvePathSpec` normalises the string into a `PathSpec` (kind, base, +2. The base directory is chosen: `opts.Path` for a top-level parse, or the + directory of the enclosing source for a nested reference (see below). +3. `ResolvePathSpec` normalises the string into a `PathSpec` (kind, base, full, abs). -3. The configured `Resolver` attempts to load the source, optionally +4. The configured `Resolver` attempts to load the source, optionally trying implicit extensions and `index.` variants. -4. A `Processor` is selected from `Processor[kind]` (or the default +5. A `Processor` is selected from `Processor[kind]` (or the default processor for unknown kinds) and converts the source string to a Go value. -5. The value is spliced into the surrounding parse tree; at pair level, +6. The value is spliced into the surrounding parse tree; at pair level, a map value is merged into the parent. +### Nested relative references + +When a loaded source itself contains references, each relative reference +resolves against the directory of the source that contains it — not against the +top-level `opts.Path`. This mirrors the canonical TypeScript plugin. + +The mechanism: before processing a loaded source, the plugin records that +source's full path in `ctx.Meta["multisource"]["path"]` (and pushes the +previous path onto `ctx.Meta["multisource"]["parents"]`). `JsonicProcessor` +threads this meta into the nested parse via `ParseMeta`, so when the nested +parse encounters a reference, the base directory is taken from the enclosing +source's path. The parent parse context is copied rather than mutated, so this +works at any nesting depth and sibling loads remain independent. + +For example, with `main.jsonic` containing `child:@"./sub/child.jsonic"` and +`sub/child.jsonic` containing `grand:@"./grand.jsonic"`, the `./grand.jsonic` +reference resolves to `sub/grand.jsonic` (relative to `child.jsonic`), not to a +top-level `grand.jsonic`. + +This holds for every resolver: a relative reference inside a source loaded by +`MakePkgResolver` resolves against that source's directory too, rather than +being treated as a `node_modules` package name. + ## Reference @@ -233,6 +290,7 @@ Convenience wrapper around `MakeJsonic().Parse(src)`. | `MarkChar` | `string` | `"@"` | Directive open character. | | `Processor` | `map[string]Processor` | `json`, `jsonic`, `jsc`, default | Per-kind source transformers. | | `ImplicitExt` | `[]string` | `[".jsonic", ".jsc", ".json"]` | Extensions tried when omitted. | +| `FS` | `fs.FS` | `nil` (OS filesystem) | Filesystem for file/pkg resolvers. | ### Resolvers and processors @@ -286,7 +344,18 @@ type Resolution struct { Search []string } -type Resolver func(spec PathSpec, opts *MultiSourceOptions) Resolution +type Resolver func(spec PathSpec, opts *MultiSourceOptions, ctx *jsonic.Context) Resolution -type Processor func(res *Resolution, opts *MultiSourceOptions, j *jsonic.Jsonic) +type Processor func(res *Resolution, opts *MultiSourceOptions, ctx *jsonic.Context, j *jsonic.Jsonic) ``` + +The `ctx` passed to a `Resolver` lets it read a per-parse filesystem from +`ctx.Meta["fs"]` (an `io/fs.FS`); resolvers fall back to `opts.FS` and then the +OS filesystem. + +`ctx.Meta` carries the parse metadata for the current load, including a +`"multisource"` entry whose `"path"` is the full path of the source being +processed and whose `"parents"` is the chain of enclosing source paths. A +processor that re-parses source (as `JsonicProcessor` does, via `ParseMeta`) +must thread `ctx.Meta` through so that relative references inside the source +resolve against the source's own directory. diff --git a/doc/multisource-ts.md b/doc/multisource-ts.md index 02f7477..bd4c24f 100644 --- a/doc/multisource-ts.md +++ b/doc/multisource-ts.md @@ -161,6 +161,23 @@ When a reference has no explicit extension, the resolver walks the `path/index + ext`. The first existing source wins; the detected kind determines which processor is used. +### Nested relative references + +When a loaded source itself contains references, each relative reference +resolves against the directory of the source that contains it — not against the +top-level `path` option. The plugin records each loaded source's full path in +`ctx.meta.multisource.path` (and the chain of enclosing paths in +`ctx.meta.multisource.parents`); the jsonic processor threads this meta into +the nested parse (`jsonic(res.src, ctx.meta)`), and `resolvePathSpec` uses the +enclosing source's directory as the base. So with `main.jsonic` containing +`child:@"./sub/child.jsonic"` and `sub/child.jsonic` containing +`grand:@"./grand.jsonic"`, the `./grand.jsonic` reference resolves to +`sub/grand.jsonic` (relative to `child.jsonic`), at any nesting depth. + +This holds for every resolver: a relative reference inside a source loaded by +`makePkgResolver` resolves against that source's directory too, rather than +being treated as a `node_modules` package name. + ### Directive-level grammar multisource registers three grammar tweaks under the `multisource` group diff --git a/go/fs_test.go b/go/fs_test.go new file mode 100644 index 0000000..8da2286 --- /dev/null +++ b/go/fs_test.go @@ -0,0 +1,157 @@ +/* Copyright (c) 2025 Richard Rodger, MIT License */ + +package multisource + +import ( + "testing" + "testing/fstest" +) + +// mapFS builds an in-memory fs.FS (testing/fstest.MapFS) from a path -> content +// map. It is the Go counterpart to the memfs used by the TypeScript tests. +func mapFS(files map[string]string) fstest.MapFS { + m := make(fstest.MapFS, len(files)) + for k, v := range files { + m[k] = &fstest.MapFile{Data: []byte(v)} + } + return m +} + +// TestFileResolverFS checks that the file resolver reads from an injected +// io/fs.FS (via MultiSourceOptions.FS) instead of the OS, covering explicit +// extensions, implicit extensions, index files, JSON, and a sub-directory base. +func TestFileResolverFS(t *testing.T) { + fsys := mapFS(map[string]string{ + "a.jsonic": `{a:1}`, + "b.jsonic": `{b:2}`, + "mod/index.jsonic": `{m:3}`, + "data/cfg.json": `{"k":4}`, + }) + + j := MakeJsonic(MultiSourceOptions{Resolver: MakeFileResolver(), FS: fsys}) + + cases := []struct { + src string + want any + }{ + {`{x:@a.jsonic}`, map[string]any{"a": float64(1)}}, // explicit ext + {`{x:@b}`, map[string]any{"b": float64(2)}}, // implicit ext + {`{x:@mod}`, map[string]any{"m": float64(3)}}, // index file + {`{x:@"data/cfg.json"}`, map[string]any{"k": float64(4)}}, // json, sub-dir + } + for _, c := range cases { + r, err := j.Parse(c.src) + if err != nil { + t.Fatalf("%s: %v", c.src, err) + } + m, _ := r.(map[string]any) + assert(t, c.src, m["x"], c.want) + } +} + +// TestFileResolverFSViaMeta checks the per-parse filesystem override passed as +// ctx.Meta["fs"], mirroring the TypeScript j('...', { fs }). The fs must also +// propagate to nested loads (threaded through the copied parse meta). +func TestFileResolverFSViaMeta(t *testing.T) { + fsys := mapFS(map[string]string{ + "main.jsonic": `{child:@"./sub/c.jsonic"}`, + "sub/c.jsonic": `{v:7}`, + }) + + // No instance-level FS: the filesystem comes from the parse meta only. + j := MakeJsonic(MultiSourceOptions{Resolver: MakeFileResolver()}) + + r, err := j.ParseMeta(`@"./main.jsonic"`, map[string]any{"fs": fsys}) + if err != nil { + t.Fatal(err) + } + assert(t, "fs-via-meta", r, map[string]any{ + "child": map[string]any{"v": float64(7)}, + }) +} + +// TestPkgResolverFS checks that the pkg resolver reads from an injected +// io/fs.FS, covering a sub-path reference, an index file, and package.json +// "main". +func TestPkgResolverFS(t *testing.T) { + fsys := mapFS(map[string]string{ + "node_modules/mypkg/zed.jsonic": `{zed:99}`, + "node_modules/idxpkg/index.jsonic": `{i:5}`, + "node_modules/mainpkg/package.json": `{"main":"main.jsonic"}`, + "node_modules/mainpkg/main.jsonic": `{z:11}`, + }) + + j := MakeJsonic(MultiSourceOptions{ + Resolver: MakePkgResolver(PkgResolverOptions{Paths: []string{"."}}), + FS: fsys, + }) + + cases := []struct { + src string + want any + }{ + {`{c:@"mypkg/zed.jsonic"}`, map[string]any{"zed": float64(99)}}, // sub-path + {`{c:@"idxpkg"}`, map[string]any{"i": float64(5)}}, // index + {`{c:@"mainpkg"}`, map[string]any{"z": float64(11)}}, // "main" + } + for _, c := range cases { + r, err := j.Parse(c.src) + if err != nil { + t.Fatalf("%s: %v", c.src, err) + } + m, _ := r.(map[string]any) + assert(t, c.src, m["c"], c.want) + } +} + +// TestPkgResolverFSWalkUp checks that, with an injected filesystem, the pkg +// resolver still walks up parent directories to find node_modules. +func TestPkgResolverFSWalkUp(t *testing.T) { + fsys := mapFS(map[string]string{ + "node_modules/mypkg/zed.jsonic": `{zed:99}`, + // The reference is resolved from a nested starting directory. + "a/b/c/.keep": ``, + }) + + j := MakeJsonic(MultiSourceOptions{ + Resolver: MakePkgResolver(PkgResolverOptions{Paths: []string{"a/b/c"}}), + FS: fsys, + }) + + r, err := j.Parse(`{c:@"mypkg/zed.jsonic"}`) + if err != nil { + t.Fatal(err) + } + m, _ := r.(map[string]any) + assert(t, "pkg-fs-walkup", m["c"], map[string]any{"zed": float64(99)}) +} + +// TestPkgResolverRelativeInPkg checks that a relative reference (./x, ../x) +// found *inside* a source loaded from a package resolves against that source's +// own directory rather than being treated as a node_modules package name. +// Covers an explicit extension, an implicit extension, and a sub-directory. +func TestPkgResolverRelativeInPkg(t *testing.T) { + fsys := mapFS(map[string]string{ + "node_modules/relpkg/index.jsonic": `{a:1, b:@"./child.jsonic", c:@"./leaf", d:@"./sub/deep.jsonic"}`, + "node_modules/relpkg/child.jsonic": `{x:10}`, + "node_modules/relpkg/leaf.jsonic": `{y:20}`, + "node_modules/relpkg/sub/deep.jsonic": `{z:30}`, + }) + + j := MakeJsonic(MultiSourceOptions{ + Resolver: MakePkgResolver(PkgResolverOptions{Paths: []string{"."}}), + FS: fsys, + }) + + r, err := j.Parse(`{r:@"relpkg"}`) + if err != nil { + t.Fatal(err) + } + m, _ := r.(map[string]any) + assert(t, "pkg-relative-internal", m["r"], map[string]any{ + "a": float64(1), + "b": map[string]any{"x": float64(10)}, + "c": map[string]any{"y": float64(20)}, + "d": map[string]any{"z": float64(30)}, + }) +} diff --git a/go/multisource.go b/go/multisource.go index 976770e..777f017 100644 --- a/go/multisource.go +++ b/go/multisource.go @@ -4,6 +4,7 @@ package multisource import ( "encoding/json" + "io/fs" "path" "strings" @@ -20,6 +21,17 @@ type MultiSourceOptions struct { MarkChar string Processor map[string]Processor ImplicitExt []string + + // FS is an optional filesystem for the file and pkg resolvers to read + // from. When nil, the OS filesystem is used. Supplying an in-memory + // implementation (for example testing/fstest.MapFS) makes resolution + // hermetic. A per-parse override may also be passed as ctx.Meta["fs"], + // mirroring the TypeScript ctx.meta.fs injection point. + // + // Note: an io/fs.FS uses relative, slash-separated paths (see fs.ValidPath), + // so when FS is set the base Path and references resolve relative to the + // FS root rather than as absolute OS paths. + FS fs.FS } // PathSpec represents a normalized path to a source. @@ -40,22 +52,32 @@ type Resolution struct { Search []string // List of searched paths. } -// Resolver finds source content for a given path spec. -type Resolver func(spec PathSpec, opts *MultiSourceOptions) Resolution +// Resolver finds source content for a given path spec. The ctx carries the +// parse metadata (ctx.Meta); resolvers may read ctx.Meta["fs"] for a per-parse +// filesystem override. Mirrors the TypeScript Resolver, which receives the +// parse Context. +type Resolver func(spec PathSpec, opts *MultiSourceOptions, ctx *jsonic.Context) Resolution // Processor converts resolved source content into a value. -type Processor func(res *Resolution, opts *MultiSourceOptions, j *jsonic.Jsonic) +// +// The ctx carries the parse metadata for this load (ctx.Meta), including the +// multisource entry whose "path" is the full path of the source being +// processed. Processors that re-parse source (see JsonicProcessor) must thread +// ctx.Meta through so that nested relative references resolve against this +// source's own directory. This mirrors the TypeScript Processor, which +// receives the parse Context. +type Processor func(res *Resolution, opts *MultiSourceOptions, ctx *jsonic.Context, j *jsonic.Jsonic) // NONE represents an unknown or missing extension. const NONE = "" // DefaultProcessor returns the raw source string as the value. -func DefaultProcessor(res *Resolution, opts *MultiSourceOptions, j *jsonic.Jsonic) { +func DefaultProcessor(res *Resolution, opts *MultiSourceOptions, ctx *jsonic.Context, j *jsonic.Jsonic) { res.Val = res.Src } // JSONProcessor parses JSON source content. -func JSONProcessor(res *Resolution, opts *MultiSourceOptions, j *jsonic.Jsonic) { +func JSONProcessor(res *Resolution, opts *MultiSourceOptions, ctx *jsonic.Context, j *jsonic.Jsonic) { if res.Src == "" { res.Val = nil return @@ -69,12 +91,22 @@ func JSONProcessor(res *Resolution, opts *MultiSourceOptions, j *jsonic.Jsonic) } // JsonicProcessor parses source content using jsonic. -func JsonicProcessor(res *Resolution, opts *MultiSourceOptions, j *jsonic.Jsonic) { +// +// It threads ctx.Meta (which records this source's full path under the +// multisource entry) into the nested parse via ParseMeta, so that relative +// references inside res.Src resolve against this source's own directory rather +// than the top-level base path. Mirrors the canonical TypeScript jsonic +// processor, which calls jsonic(res.src, ctx.meta). +func JsonicProcessor(res *Resolution, opts *MultiSourceOptions, ctx *jsonic.Context, j *jsonic.Jsonic) { if res.Src == "" { res.Val = nil return } - val, err := j.Parse(res.Src) + var meta map[string]any + if ctx != nil { + meta = ctx.Meta + } + val, err := j.ParseMeta(res.Src, meta) if err != nil { res.Val = res.Src return @@ -82,9 +114,10 @@ func JsonicProcessor(res *Resolution, opts *MultiSourceOptions, j *jsonic.Jsonic res.Val = val } -// MakeMemResolver creates a resolver that looks up paths in a map. +// MakeMemResolver creates a resolver that looks up paths in a map. It reads +// from its own in-memory map and ignores ctx / opts.FS. func MakeMemResolver(files map[string]string) Resolver { - return func(spec PathSpec, opts *MultiSourceOptions) Resolution { + return func(spec PathSpec, opts *MultiSourceOptions, ctx *jsonic.Context) Resolution { res := Resolution{ PathSpec: spec, Found: false, diff --git a/go/multisource_test.go b/go/multisource_test.go index 6cc8c95..9a8dde3 100644 --- a/go/multisource_test.go +++ b/go/multisource_test.go @@ -250,7 +250,7 @@ func TestCustomProcessor(t *testing.T) { "data.csv": "a,b,c", } - csvProc := func(res *Resolution, opts *MultiSourceOptions, j *jsonic.Jsonic) { + csvProc := func(res *Resolution, opts *MultiSourceOptions, ctx *jsonic.Context, j *jsonic.Jsonic) { parts := make([]any, 0) for _, s := range splitCSV(res.Src) { parts = append(parts, s) diff --git a/go/nested_test.go b/go/nested_test.go new file mode 100644 index 0000000..f3f9c69 --- /dev/null +++ b/go/nested_test.go @@ -0,0 +1,169 @@ +/* Copyright (c) 2025 Richard Rodger, MIT License */ + +package multisource + +import ( + "os" + "path/filepath" + "strings" + "testing" + + jsonic "github.com/jsonicjs/jsonic/go" +) + +// TestNestedRelativeLoad checks that a relative reference *inside* a loaded +// file resolves against that file's own directory (a -> b -> c, across +// directories), mirroring the canonical TypeScript behaviour. Uses an in-memory +// fs.FS so the test is hermetic (cf. the memfs-based TS test). +func TestNestedRelativeLoad(t *testing.T) { + fsys := mapFS(map[string]string{ + "main.jsonic": `{top:1, child:@"./sub/child.jsonic"}`, + "sub/child.jsonic": `{mid:2, grand:@"./grand.jsonic"}`, + "sub/grand.jsonic": `{v:99}`, + }) + + j := MakeJsonic(MultiSourceOptions{Resolver: MakeFileResolver(), FS: fsys}) + r, err := j.Parse(`@"./main.jsonic"`) + if err != nil { + t.Fatal(err) + } + assert(t, "nested-relative", r, map[string]any{ + "top": float64(1), + "child": map[string]any{ + "mid": float64(2), + "grand": map[string]any{ + "v": float64(99), + }, + }, + }) +} + +// TestNestedRelativeSiblingDirs checks that two references loaded from the same +// parent each resolve their *own* relative references against their own +// directory. Both children load "./inner.jsonic", but from different +// directories, so they must pick up different files. This proves the base path +// is tracked per-source and that resolving one reference does not leak into a +// sibling (the parent context is copied, not mutated). +func TestNestedRelativeSiblingDirs(t *testing.T) { + fsys := mapFS(map[string]string{ + "main.jsonic": `{a:@"./aa/a.jsonic", b:@"./bb/b.jsonic"}`, + "aa/a.jsonic": `{x:@"./inner.jsonic"}`, + "aa/inner.jsonic": `{n:11}`, + "bb/b.jsonic": `{y:@"./inner.jsonic"}`, + "bb/inner.jsonic": `{n:22}`, + }) + + j := MakeJsonic(MultiSourceOptions{Resolver: MakeFileResolver(), FS: fsys}) + r, err := j.Parse(`@"./main.jsonic"`) + if err != nil { + t.Fatal(err) + } + assert(t, "sibling-dirs", r, map[string]any{ + "a": map[string]any{"x": map[string]any{"n": float64(11)}}, + "b": map[string]any{"y": map[string]any{"n": float64(22)}}, + }) +} + +// TestNestedRelativeMemFlat checks that nested references through flat (no +// directory) in-memory keys keep resolving as bare keys (a -> b -> c). Mirrors +// the TypeScript "deps" test. This guards the in-memory resolver against a +// directory-stripping regression: a parent key like "a.jsc" must yield an +// empty base (not "."), so a bare nested reference like "@b.jsc" still matches. +func TestNestedRelativeMemFlat(t *testing.T) { + files := map[string]string{ + "a.jsc": `a:1,b:@b.jsc,x:99`, + "b.jsc": `b:2,c:@c`, + "c/index.jsc": `c:3`, + } + + j := MakeJsonic(MultiSourceOptions{Resolver: MakeMemResolver(files)}) + r, err := j.Parse(`@a`) + if err != nil { + t.Fatal(err) + } + assert(t, "mem-flat-nested", r, map[string]any{ + "a": float64(1), + "b": map[string]any{ + "b": float64(2), + "c": map[string]any{"c": float64(3)}, + }, + "x": float64(99), + }) +} + +// TestNestedSourcePathMeta checks that the full path of the source being +// processed, and the chain of enclosing parents, are threaded through ctx.Meta +// (under the "multisource" entry), mirroring the canonical TypeScript +// ctx.meta.multisource.{path,parents}. A custom processor inspects the meta it +// receives. +func TestNestedSourcePathMeta(t *testing.T) { + fsys := mapFS(map[string]string{ + "main.jsonic": `{child:@"./sub/c.probe"}`, + "sub/c.probe": `probe-content`, + }) + + var gotPath string + var gotParents []string + probe := func(res *Resolution, _ *MultiSourceOptions, ctx *jsonic.Context, _ *jsonic.Jsonic) { + if ms, ok := ctx.Meta["multisource"].(map[string]any); ok { + gotPath, _ = ms["path"].(string) + gotParents, _ = ms["parents"].([]string) + } + res.Val = res.Src + } + + j := MakeJsonic(MultiSourceOptions{ + Resolver: MakeFileResolver(), + FS: fsys, + Processor: map[string]Processor{ + NONE: DefaultProcessor, + "jsonic": JsonicProcessor, + "probe": probe, + }, + }) + if _, err := j.Parse(`@"./main.jsonic"`); err != nil { + t.Fatal(err) + } + + if !strings.HasSuffix(filepath.ToSlash(gotPath), "sub/c.probe") { + t.Fatalf("threaded path: want suffix sub/c.probe, got %q", gotPath) + } + if len(gotParents) != 1 || !strings.HasSuffix(filepath.ToSlash(gotParents[0]), "main.jsonic") { + t.Fatalf("threaded parents: want [.../main.jsonic], got %#v", gotParents) + } +} + +// TestNestedRelativeLoadOSFiles is the on-disk counterpart of +// TestNestedRelativeLoad: it exercises nested relative resolution against real +// OS files (absolute paths from filepath.Abs), confirming the directory +// tracking works for the default OS filesystem as well as an injected fs.FS. +func TestNestedRelativeLoadOSFiles(t *testing.T) { + dir := t.TempDir() + sub := filepath.Join(dir, "sub") + if err := os.MkdirAll(sub, 0o755); err != nil { + t.Fatal(err) + } + write := func(p, s string) { + if err := os.WriteFile(p, []byte(s), 0o644); err != nil { + t.Fatal(err) + } + } + write(filepath.Join(dir, "main.jsonic"), `{top:1, child:@"./sub/child.jsonic"}`) + write(filepath.Join(sub, "child.jsonic"), `{mid:2, grand:@"./grand.jsonic"}`) + write(filepath.Join(sub, "grand.jsonic"), `{v:99}`) + + j := MakeJsonic(MultiSourceOptions{Resolver: MakeFileResolver(), Path: dir}) + r, err := j.Parse(`@"./main.jsonic"`) + if err != nil { + t.Fatal(err) + } + assert(t, "nested-relative-os", r, map[string]any{ + "top": float64(1), + "child": map[string]any{ + "mid": float64(2), + "grand": map[string]any{ + "v": float64(99), + }, + }, + }) +} diff --git a/go/plugin.go b/go/plugin.go index 014e8b0..39059a1 100644 --- a/go/plugin.go +++ b/go/plugin.go @@ -4,6 +4,7 @@ package multisource import ( "fmt" + "strings" directive "github.com/jsonicjs/directive/go" jsonic "github.com/jsonicjs/jsonic/go" @@ -54,7 +55,7 @@ func MultiSource(j *jsonic.Jsonic, pluginOpts map[string]any) error { } } - res := resolveSource(pathStr, opts, j) + res := resolveSource(pathStr, opts, ctx, j) from := "" if rule.Parent != nil && rule.Parent != jsonic.NoRule { @@ -131,16 +132,104 @@ func MultiSource(j *jsonic.Jsonic, pluginOpts map[string]any) error { } // resolveSource resolves a multisource path and returns the processed value. -func resolveSource(pathStr string, opts *MultiSourceOptions, j *jsonic.Jsonic) any { - spec := ResolvePathSpec(pathStr, opts.Path) - res := opts.Resolver(spec, opts) +// +// Relative references resolve against the directory of the *current* source. +// For a top-level parse that is opts.Path; for a reference loaded from inside +// another source it is that source's own directory. The current source's full +// path is threaded through ctx.Meta["multisource"]["path"], mirroring the +// canonical TypeScript @jsonic/multisource (ctx.meta.multisource.path). This +// makes nested loads (a -> b -> c) resolve each relative reference against the +// source that contains it, at any nesting depth, without mutating the shared +// options. Sibling loads are unaffected because the parent context is copied, +// not modified. +func resolveSource(pathStr string, opts *MultiSourceOptions, ctx *jsonic.Context, j *jsonic.Jsonic) any { + base := opts.Path + if parent := metaSourcePath(ctx); parent != "" { + base = sourceDir(parent) + } + + spec := ResolvePathSpec(pathStr, base) + res := opts.Resolver(spec, opts, ctx) if !res.Found { return nil } + // Process in a child context whose meta records this source's full path, so + // any relative references inside res.Src resolve against this source's + // directory. The parent context (and its meta) are left unmodified. + childCtx := *ctx + childCtx.Meta = childMeta(ctx.Meta, &res) + proc := getProcessor(res.Kind, opts.Processor) - proc(&res, opts, j) + proc(&res, opts, &childCtx, j) return res.Val } + +// metaSourcePath returns the full path of the source currently being parsed, +// as threaded through ctx.Meta["multisource"]["path"]. It is empty for a +// top-level parse (no enclosing source). +func metaSourcePath(ctx *jsonic.Context) string { + if ctx == nil || ctx.Meta == nil { + return "" + } + ms, ok := ctx.Meta["multisource"].(map[string]any) + if !ok { + return "" + } + p, _ := ms["path"].(string) + return p +} + +// sourceDir returns the directory portion of a source path, used as the base +// for relative references found inside that source. A path with no separator +// (an in-memory resolver key such as "a.jsonic") yields "", so bare nested +// references resolve plainly — matching the TypeScript mem resolvefolder. A +// path that contains separators yields everything up to the last one (its +// containing directory), matching the TypeScript file/pkg resolvefolder for a +// loaded file. +func sourceDir(p string) string { + i := strings.LastIndexAny(p, `/\`) + if i < 0 { + return "" + } + if i == 0 { + return p[:1] // filesystem root: keep the separator + } + return p[:i] +} + +// childMeta returns a copy of the parent parse meta with the multisource entry +// updated to record path (the full path of the source about to be processed) +// and parents (the chain of enclosing source paths). The parent map is not +// mutated. Mirrors the meta construction in the TypeScript plugin action. +func childMeta(parent map[string]any, res *Resolution) map[string]any { + child := make(map[string]any, len(parent)+1) + for k, v := range parent { + child[k] = v + } + + var prevMS map[string]any + if m, ok := parent["multisource"].(map[string]any); ok { + prevMS = m + } + + var parents []string + if ps, ok := prevMS["parents"].([]string); ok { + parents = append(parents, ps...) + } + if prev, ok := prevMS["path"].(string); ok && prev != "" { + parents = append(parents, prev) + } + + ms := make(map[string]any, len(prevMS)+2) + for k, v := range prevMS { + ms[k] = v + } + ms["path"] = res.Full + ms["parents"] = parents + + child["multisource"] = ms + return child +} diff --git a/go/resolver.go b/go/resolver.go index 510e7cf..5f4ec7d 100644 --- a/go/resolver.go +++ b/go/resolver.go @@ -4,8 +4,13 @@ package multisource import ( "encoding/json" + "io/fs" "os" + "path" "path/filepath" + "strings" + + jsonic "github.com/jsonicjs/jsonic/go" ) // FileResolverOptions configures MakeFileResolver. @@ -18,17 +23,23 @@ type FileResolverOptions struct { // MakeFileResolver creates a resolver that loads sources from the filesystem. // -// It mirrors the TypeScript makeFileResolver: the reference is resolved to an -// absolute path; when the path has no extension, implicit extensions and index +// It mirrors the TypeScript makeFileResolver: the reference is resolved to a +// canonical path; when the path has no extension, implicit extensions and index // files are tried; and a preload map (full path -> content) is consulted before -// touching disk. +// touching the filesystem. +// +// By default sources are read from the OS filesystem and references resolve to +// absolute paths. When a filesystem is supplied (via MultiSourceOptions.FS or +// ctx.Meta["fs"]) sources are read from it instead, with references resolved as +// relative, slash-separated paths under the filesystem root — mirroring the +// TypeScript ctx.meta.fs injection point. func MakeFileResolver(opts ...FileResolverOptions) Resolver { var o FileResolverOptions if len(opts) > 0 { o = opts[0] } - return func(spec PathSpec, mopts *MultiSourceOptions) Resolution { + return func(spec PathSpec, mopts *MultiSourceOptions, ctx *jsonic.Context) Resolution { // A pathfinder transforms the raw reference before resolution. if o.PathFinder != nil { spec = ResolvePathSpec(o.PathFinder(spec.Path), spec.Base) @@ -39,10 +50,9 @@ func MakeFileResolver(opts ...FileResolverOptions) Resolver { return res } - full := spec.Full - if abs, err := filepath.Abs(full); err == nil { - full = abs - } + v := resolveVFS(mopts, ctx) + + full := v.canon(spec.Full) res.Full = full potentials := buildPotentials(full, mopts.ImplicitExt) @@ -56,7 +66,7 @@ func MakeFileResolver(opts ...FileResolverOptions) Resolver { res.Found = true return res } - if src, ok := loadFile(p); ok { + if src, ok := v.readFile(p); ok { res.Full = p res.Kind = extKind(p) res.Src = src @@ -73,7 +83,8 @@ func MakeFileResolver(opts ...FileResolverOptions) Resolver { type PkgResolverOptions struct { // Paths lists directories whose node_modules folders are searched; each is // also walked upwards. When empty, the resolver walks up from the current - // working directory. + // working directory (OS filesystem) or from the root "." (injected + // filesystem). Paths []string } @@ -85,38 +96,68 @@ type PkgResolverOptions struct { // package.json "main" for bare references, and tries implicit extensions and // index files. It does not implement Node's full module-resolution algorithm // (for example, conditional "exports"). +// +// Like the file resolver, it reads from the OS by default and from an injected +// filesystem (MultiSourceOptions.FS or ctx.Meta["fs"]) when one is supplied. func MakePkgResolver(opts ...PkgResolverOptions) Resolver { var o PkgResolverOptions if len(opts) > 0 { o = opts[0] } - return func(spec PathSpec, mopts *MultiSourceOptions) Resolution { + return func(spec PathSpec, mopts *MultiSourceOptions, ctx *jsonic.Context) Resolution { res := Resolution{PathSpec: spec, Found: false} ref := spec.Path if ref == "" { return res } + v := resolveVFS(mopts, ctx) + + // A relative reference (./x, ../x) found inside a source loaded from a + // package is not a package name: resolve it against the containing + // source's directory via spec.Full, exactly as the file resolver does. + // Mirrors the TypeScript pkg resolver, whose fallback search resolves + // ps.full (base + path) rather than treating it as a bare package. + if isRelativeRef(ref) && spec.Full != "" { + full := v.canon(spec.Full) + potentials := buildPotentials(full, mopts.ImplicitExt) + res.Search = potentials + for _, p := range potentials { + if src, ok := v.readFile(p); ok { + res.Full = p + res.Kind = extKind(p) + res.Src = src + res.Found = true + return res + } + } + return res + } + var roots []string if len(o.Paths) > 0 { roots = o.Paths - } else if cwd, err := os.Getwd(); err == nil { - roots = []string{cwd} + } else if _, isOS := v.(osVFS); isOS { + if cwd, err := os.Getwd(); err == nil { + roots = []string{cwd} + } + } else { + roots = []string{"."} } seen := map[string]bool{} var search []string for _, root := range roots { - for _, dir := range ancestorDirs(root) { - nm := filepath.Join(dir, "node_modules") + for _, dir := range ancestors(v, root) { + nm := v.join(dir, "node_modules") if seen[nm] { continue } seen[nm] = true - if full, src, ok := resolveInPkgDir(nm, ref, mopts.ImplicitExt, &search); ok { + if full, src, ok := resolveInPkgDir(v, nm, ref, mopts.ImplicitExt, &search); ok { res.Full = full res.Kind = extKind(full) res.Src = src @@ -132,31 +173,40 @@ func MakePkgResolver(opts ...PkgResolverOptions) Resolver { } } +// isRelativeRef reports whether ref is an explicit relative reference (./x or +// ../x). Such a reference is resolved against the containing source's directory +// (via spec.Full) rather than treated as a node_modules package name. +func isRelativeRef(ref string) bool { + return ref == "." || ref == ".." || + strings.HasPrefix(ref, "./") || strings.HasPrefix(ref, "../") || + strings.HasPrefix(ref, `.\`) || strings.HasPrefix(ref, `..\`) +} + // resolveInPkgDir resolves a package reference inside a node_modules directory, // trying the reference directly (with implicit extensions and index files) and // then the target package's package.json "main". -func resolveInPkgDir(nodeModules, ref string, exts []string, search *[]string) (full, src string, found bool) { - target := filepath.Join(nodeModules, filepath.FromSlash(ref)) +func resolveInPkgDir(v vfs, nodeModules, ref string, exts []string, search *[]string) (full, src string, found bool) { + target := v.join(nodeModules, ref) for _, p := range buildPotentials(target, exts) { *search = append(*search, p) - if s, ok := loadFile(p); ok { + if s, ok := v.readFile(p); ok { return p, s, true } } // Bare package reference: honour package.json "main". - pkgJSON := filepath.Join(target, "package.json") + pkgJSON := v.join(target, "package.json") *search = append(*search, pkgJSON) - if data, err := os.ReadFile(pkgJSON); err == nil { + if data, ok := v.readFile(pkgJSON); ok { var meta struct { Main string `json:"main"` } - if json.Unmarshal(data, &meta) == nil && meta.Main != "" { - mainPath := filepath.Join(target, filepath.FromSlash(meta.Main)) + if json.Unmarshal([]byte(data), &meta) == nil && meta.Main != "" { + mainPath := v.join(target, meta.Main) for _, p := range buildPotentials(mainPath, exts) { *search = append(*search, p) - if s, ok := loadFile(p); ok { + if s, ok := v.readFile(p); ok { return p, s, true } } @@ -166,8 +216,80 @@ func resolveInPkgDir(nodeModules, ref string, exts []string, search *[]string) ( return "", "", false } -// loadFile reads a file, reporting whether it was read successfully. A failed -// read is treated as the source not existing. +// vfs is the minimal read-only filesystem view used by the file and pkg +// resolvers. osVFS uses the OS filesystem (absolute paths); ioVFS adapts an +// injected io/fs.FS (relative, slash-separated paths), for example +// testing/fstest.MapFS. This is the Go counterpart to the TypeScript +// ctx.meta.fs abstraction. +type vfs interface { + // readFile reads the file at a canonical path; ok reports existence. + readFile(p string) (string, bool) + // join joins path elements in this filesystem's convention. + join(parts ...string) string + // dir returns the parent directory of p. + dir(p string) string + // canon returns the canonical lookup form of a (possibly relative) path. + canon(p string) string +} + +// resolveVFS selects the filesystem view: a per-parse ctx.Meta["fs"] override, +// then MultiSourceOptions.FS, then the OS filesystem. +func resolveVFS(opts *MultiSourceOptions, ctx *jsonic.Context) vfs { + if ctx != nil && ctx.Meta != nil { + if f, ok := ctx.Meta["fs"].(fs.FS); ok && f != nil { + return ioVFS{f} + } + } + if opts != nil && opts.FS != nil { + return ioVFS{opts.FS} + } + return osVFS{} +} + +// osVFS reads from the OS filesystem using absolute, OS-native paths. +type osVFS struct{} + +func (osVFS) readFile(p string) (string, bool) { return loadFile(p) } +func (osVFS) join(parts ...string) string { return filepath.Join(parts...) } +func (osVFS) dir(p string) string { return filepath.Dir(p) } +func (osVFS) canon(p string) string { + if abs, err := filepath.Abs(p); err == nil { + return abs + } + return p +} + +// ioVFS reads from an injected io/fs.FS using relative, slash-separated paths. +type ioVFS struct{ fsys fs.FS } + +func (v ioVFS) readFile(p string) (string, bool) { + name := fsClean(p) + if !fs.ValidPath(name) { + return "", false + } + b, err := fs.ReadFile(v.fsys, name) + if err != nil { + return "", false + } + return string(b), true +} +func (ioVFS) join(parts ...string) string { return fsClean(path.Join(parts...)) } +func (ioVFS) dir(p string) string { return path.Dir(fsClean(p)) } +func (ioVFS) canon(p string) string { return fsClean(p) } + +// fsClean normalizes a path into an io/fs.FS name: slash-separated, with "." +// and ".." resolved and any leading slash removed. An empty result becomes ".". +func fsClean(p string) string { + p = path.Clean(filepath.ToSlash(p)) + p = strings.TrimPrefix(p, "/") + if p == "" { + return "." + } + return p +} + +// loadFile reads a file from the OS, reporting whether it was read +// successfully. A failed read is treated as the source not existing. func loadFile(p string) (string, bool) { b, err := os.ReadFile(p) if err != nil { @@ -176,15 +298,16 @@ func loadFile(p string) (string, bool) { return string(b), true } -// ancestorDirs returns dir followed by each of its parent directories. -func ancestorDirs(dir string) []string { +// ancestors returns dir followed by each of its parent directories, using the +// directory convention of the given filesystem view. +func ancestors(v vfs, dir string) []string { if dir == "" { return nil } var dirs []string for { dirs = append(dirs, dir) - parent := filepath.Dir(dir) + parent := v.dir(dir) if parent == dir { break } diff --git a/ts/dist-test/multisource.test.js b/ts/dist-test/multisource.test.js index ef49d76..894556b 100644 --- a/ts/dist-test/multisource.test.js +++ b/ts/dist-test/multisource.test.js @@ -392,6 +392,19 @@ const path_1 = require("@jsonic/path"); // then node_modules walk (no virtual fs) finds the package node_assert_1.default.deepEqual(j1('z:@"jsonic-multisource-pkg-test/zed.jsonic"', { multisource: { path: process.cwd() } }), { z: { zed: 99 } }); }); + (0, node_test_1.test)('pkg-relative-ref', () => { + const Path = require('node:path'); + const j1 = jsonic_1.Jsonic.make().use(multisource_1.MultiSource, { + resolver: (0, pkg_1.makePkgResolver)({ require }) + }); + // A relative reference (./x) is resolved against the containing source's + // directory, not treated as a node_modules package name. The reference + // inside the loaded file (rel/outer.jsonic -> ./inner.jsonic) likewise + // resolves against that file's own directory. The base is seeded via a real + // anchor file so resolvefolder() yields the test directory. + const anchor = Path.resolve(__dirname, '../test/t01.jsonic'); + node_assert_1.default.deepEqual(j1('@"./rel/outer.jsonic"', { multisource: { path: anchor } }), { o: 1, inner: { v: 7 } }); + }); (0, node_test_1.test)('file-implicit', () => { let j0 = jsonic_1.Jsonic.make().use(multisource_1.MultiSource, { resolver: (0, file_1.makeFileResolver)(), @@ -560,5 +573,38 @@ const path_1 = require("@jsonic/path"); }); node_assert_1.default.deepEqual(filemap, {}); }); + (0, node_test_1.test)('nested-relative-dirs', () => { + // A relative reference *inside* a loaded file resolves against that file's + // own directory (main -> sub/child -> sub/grand), across directories. + const { fs } = (0, memfs_1.memfs)({ + 'main.jsonic': '{top:1, child:@"./sub/child.jsonic"}', + sub: { + 'child.jsonic': '{mid:2, grand:@"./grand.jsonic"}', + 'grand.jsonic': '{v:99}', + }, + }); + const j = jsonic_1.Jsonic.make().use(multisource_1.MultiSource, { resolver: (0, file_1.makeFileResolver)() }); + node_assert_1.default.deepEqual(j('@"./main.jsonic"', { fs, multisource: { path: '/' } }), { top: 1, child: { mid: 2, grand: { v: 99 } } }); + }); + (0, node_test_1.test)('nested-relative-sibling-dirs', () => { + // Two references loaded from the same parent each resolve their own + // relative reference against their own directory. Both children load + // "./inner.jsonic" but from different directories, so they pick up + // different files — proving the base is tracked per-source and a sibling + // load is unaffected. + const { fs } = (0, memfs_1.memfs)({ + 'main.jsonic': '{a:@"./aa/a.jsonic", b:@"./bb/b.jsonic"}', + aa: { + 'a.jsonic': '{x:@"./inner.jsonic"}', + 'inner.jsonic': '{n:11}', + }, + bb: { + 'b.jsonic': '{y:@"./inner.jsonic"}', + 'inner.jsonic': '{n:22}', + }, + }); + const j = jsonic_1.Jsonic.make().use(multisource_1.MultiSource, { resolver: (0, file_1.makeFileResolver)() }); + node_assert_1.default.deepEqual(j('@"./main.jsonic"', { fs, multisource: { path: '/' } }), { a: { x: { n: 11 } }, b: { y: { n: 22 } } }); + }); }); //# sourceMappingURL=multisource.test.js.map \ No newline at end of file diff --git a/ts/dist-test/multisource.test.js.map b/ts/dist-test/multisource.test.js.map index 98021d0..1e7030f 100644 --- a/ts/dist-test/multisource.test.js.map +++ b/ts/dist-test/multisource.test.js.map @@ -1 +1 @@ -{"version":3,"file":"multisource.test.js","sourceRoot":"","sources":["../test/multisource.test.ts"],"names":[],"mappings":";AAAA,gFAAgF;;;;;AAEhF,yCAA0C;AAC1C,8DAAgC;AAEhC,iCAA6B;AAE7B,mCAA+B;AAE/B,qDAAmF;AACnF,iEAAiE;AACjE,8CAAsD;AACtD,gDAAwD;AACxD,8CAAsD;AACtD,uCAAmC;AAGnC,IAAA,oBAAQ,EAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAA,gBAAI,EAAC,OAAO,EAAE,GAAG,EAAE;QACjB,MAAM,CAAC,GAAuB;YAC5B,QAAQ,EAAE,IAAA,qBAAe,EAAC;gBACxB,UAAU,EAAE,KAAK;gBACjB,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,SAAS;gBACnB,kCAAkC;gBAClC,OAAO,EAAE,KAAK;gBACd,aAAa,EAAE,KAAK;gBACpB,eAAe,EAAE,KAAK;aACvB,CAAC;YACF,eAAe;YACf,qDAAqD;YACrD,KAAK;SACN,CAAA;QACD,MAAM,CAAC,GAAG,eAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,yBAAW,EAAE,CAAC,CAAC,CAAA;QAE3C,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC7D,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC1D,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACvD,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC3D,4DAA4D;QAC5D,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACtD,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACtD,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAEtD,qBAAM,CAAC,SAAS,CACd,CAAC,CAAC;;;;;;;GAOL,CAAC,EACE;YACA,CAAC,EAAE;gBACD,CAAC,EAAE;oBACD,CAAC,EAAE,CAAC;iBACL;gBACD,CAAC,EAAE;oBACD,CAAC,EAAE,CAAC;iBACL;gBACD,CAAC,EAAE,KAAK;gBACR,CAAC,EAAE;oBACD,CAAC,EAAE,CAAC;iBACL;gBACD,OAAO;gBACP,UAAU;gBACV,KAAK;aACN;YACD,CAAC,EAAE,CAAC;SACL,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,UAAU,EAAE,GAAG,EAAE;QACpB,MAAM,CAAC,GAAuB;YAC5B,QAAQ,EAAE,IAAA,qBAAe,EAAC;gBACxB,UAAU,EAAE,KAAK;aAClB,CAAC;SACH,CAAA;QACD,MAAM,CAAC,GAAG,eAAM,CAAC,IAAI,EAAE;YACrB,+BAA+B;aAC9B,GAAG,CAAC,yBAAW,EAAE,CAAC,CAAC,CAAA;QAGtB,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACrD,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAEnD,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC/D,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAE7D,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,uBAAuB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACzE,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAEvE,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC9D,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAE5D,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC/D,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAE7D,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAIF,IAAA,gBAAI,EAAC,UAAU,EAAE,GAAG,EAAE;QACpB,MAAM,CAAC,GAAuB;YAC5B,QAAQ,EAAE,IAAA,qBAAe,EAAC;gBACxB,UAAU,EAAE,KAAK;gBACjB,UAAU,EAAE,aAAa;gBACzB,UAAU,EAAE,KAAK;aAClB,CAAC;SACH,CAAA;QACD,MAAM,CAAC,GAAG,eAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,yBAAW,EAAE,CAAC,CAAC,CAAA;QAE3C,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC7D,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAE9D,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC1C,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACpD,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC9D,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAEpD,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC1E,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACvD,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACjE,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC3E,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAEjE,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACrE,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,uBAAuB,CAAC,EAAE;YAC3C,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YACvB,CAAC,EAAE,CAAC;SACL,CAAC,CAAA;QAEF,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,+BAA+B,CAAC,EAAE;YACnD,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;SAC9B,CAAC,CAAA;QACF,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,uBAAuB,CAAC,EAAE;YAC3C,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;SAC9B,CAAC,CAAA;QAEF,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,mCAAmC,CAAC,EAAE;YACvD,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YAC7B,CAAC,EAAE,CAAC;SACL,CAAC,CAAA;QACF,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC,EAAE;YAC/C,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;YAC7B,CAAC,EAAE,CAAC;SACL,CAAC,CAAA;QAEF,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,EAAE;YACzC,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;SACL,CAAC,CAAA;QAEF,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,0BAA0B,CAAC,EAAE;YAC9C,CAAC,EAAE,EAAE;YACL,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;SACL,CAAC,CAAA;QACF,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,0BAA0B,CAAC,EAAE;YAC9C,CAAC,EAAE,EAAE;YACL,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;SACL,CAAC,CAAA;QAEF,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,0BAA0B,CAAC,EAAE;YAC9C,CAAC,EAAE,EAAE;YACL,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;SACL,CAAC,CAAA;QACF,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,4BAA4B,CAAC,EAAE;YAChD,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;YACZ,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;SACL,CAAC,CAAA;IAEJ,CAAC,CAAC,CAAA;IAEF,IAAA,gBAAI,EAAC,MAAM,EAAE,GAAG,EAAE;QAChB,MAAM,CAAC,GAAuB;YAC5B,QAAQ,EAAE,IAAA,qBAAe,EAAC;gBACxB,OAAO,EAAE,mBAAmB;gBAC5B,OAAO,EAAE,UAAU;gBACnB,aAAa,EAAE,KAAK;aACrB,CAAC;SACH,CAAA;QACD,MAAM,CAAC,GAAG,eAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,yBAAW,EAAE,CAAC,CAAC,CAAA;QAE3C,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAEpE,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QACxE,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC9E,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,EAAE;YAC9D,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,CAAC,EAAE,EAAE;SACN,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,aAAa,EAAE,GAAG,EAAE;QACvB,MAAM,CAAC,GAAuB;YAC5B,QAAQ,EAAE,IAAA,qBAAe,EAAC,EAAE,CAAC;SAC9B,CAAA;QACD,MAAM,CAAC,GAAG,eAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,yBAAW,EAAE,CAAC,CAAC,CAAA;QAE3C,YAAY;QACZ,qBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,8BAA8B,CAAC,CAAA;QAE9D,qBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,YAAY,EAAE,GAAG,EAAE;QACtB,MAAM,CAAC,GAAuB;YAC5B,QAAQ,EAAE,IAAA,uBAAgB,GAAE;SAC7B,CAAA;QACD,MAAM,CAAC,GAAG,eAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,yBAAW,EAAE,CAAC,CAAC,CAAA;QAE3C,qBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CACjB,CAAC,CAAC,qBAAqB,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,EAC9D,iBAAiB,CAAC,CAAA;QAEpB,IAAI,IAAI,GAAG,EAAE,CAAA;QACb,IAAI,CAAC;YACH,CAAC,CAAC,qBAAqB,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAA;QACtE,CAAC;QACD,OAAO,CAAM,EAAE,CAAC;YACd,iBAAiB;YACjB,mDAAmD;YACnD,qBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAA;YAC1C,qBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;YACpD,qBAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,YAAY,EAAE,GAAG,EAAE;QACtB,IAAI,EAAE,GAAG,eAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,yBAAW,EAAE;YACtC,QAAQ,EAAE,IAAA,uBAAgB,GAAE;SAC7B,CAAC,CAAA;QAEF,IAAI,IAAI,GAAG,EAAE,CAAA;QACb,qBAAM,CAAC,SAAS,CACd,EAAE,CAAC,6BAA6B,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,EAC7E,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACxB,qCAAqC;QAErC,qBAAM,CAAC,SAAS,CACd,EAAE,CAAC,6BAA6B,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,EACvE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAGxB,qBAAM,CAAC,SAAS,CACd,EAAE,CAAC,uBAAuB,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,EACjE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAEX,qBAAM,CAAC,SAAS,CACd,EAAE,CAAC,2BAA2B,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,EACrE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAEjB,qBAAM,CAAC,SAAS,CACd,EAAE,CAAC,2BAA2B,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,EACrE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAEjB,qBAAM,CAAC,SAAS,CACd,EAAE,CAAC,+BAA+B,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,EACzE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAEvB,qBAAM,CAAC,SAAS,CACd,EAAE,CAAC,sDAAsD,EACvD,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,EACvC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAGvB,qBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,6BAA6B,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,EACxE,WAAW,CACZ,CAAA;QAED,qBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,6BAA6B,EAAE,EAAE,CAAC,EAAE,WAAW,CAAC,CAAA;QAEvE,qBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,6BAA6B,CAAC,EAAE,WAAW,CAAC,CAAA;QAEnE,IAAI,GAAG,EAAE,CAAA;QACT,qBAAM,CAAC,SAAS,CACd,EAAE,CAAC,iCAAiC,EAAE;YACpC,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;SACvC,CAAC,EACF,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,WAAW,EAAE,GAAG,EAAE;QACrB,IAAI,EAAE,GAAG,eAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,yBAAW,EAAE;YACtC,QAAQ,EAAE,IAAA,uBAAgB,GAAE;SAC7B,CAAC,CAAA;QAEF,IAAI,IAAI,GAAG,EAAE,CAAA;QACb,qBAAM,CAAC,SAAS,CACd,EAAE,CAAC,6BAA6B,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,EAC7E,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACxB,qCAAqC;QAErC,IAAI,GAAG,EAAE,CAAA;QACT,qBAAM,CAAC,SAAS,CACd,EAAE,CAAC,yBAAyB,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,EACzE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAExB,IAAI,GAAG,EAAE,CAAA;QACT,qBAAM,CAAC,SAAS,CACd,EAAE,CAAC,2BAA2B,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,EAC3E,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAExB,IAAI,GAAG,EAAE,CAAA;QACT,qBAAM,CAAC,SAAS,CACd,EAAE,CAAC,uEAAuE,EAAE;YAC1E,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;SACvC,CAAC,EACF,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAElD,IAAI,GAAG,EAAE,CAAA;QACT,qBAAM,CAAC,SAAS,CACd,EAAE,CAAC,oBAAoB,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,EACpE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,YAAY,EAAE,GAAG,EAAE;QACtB,IAAI,EAAE,GAAG,eAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,yBAAW,EAAE;YACtC,QAAQ,EAAE,IAAA,uBAAgB,GAAE;YAC5B,SAAS,EAAE;gBACT,GAAG,EAAE,QAAQ;aACd;SACF,CAAC,CAAA;QAEF,IAAI,IAAI,GAAG,EAAE,CAAA;QACb,qBAAM,CAAC,SAAS,CACd,EAAE,CAAC,oBAAoB,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,EACpE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACb,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,MAAM,EAAE,GAAG,EAAE;QAChB,MAAM,CAAC,GAAuB;YAC5B,QAAQ,EAAE,IAAA,qBAAe,EAAC;gBACxB,UAAU,EAAE,OAAO;aACpB,CAAC;YACF,eAAe;YACf,qDAAqD;YACrD,KAAK;SACN,CAAA;QACD,MAAM,CAAC,GAAG,eAAM,CAAC,IAAI,EAAE;aACpB,GAAG,CAAC,yBAAW,EAAE,CAAC,CAAC;aACnB,GAAG,CAAC,WAAI,CAAC;aACT,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACd,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE;gBACxB,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE;oBACjB,IAAI,QAAQ,KAAK,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC/B,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;oBAC1B,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEJ,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE;YACrC,CAAC,EAAE,EAAE;YACL,CAAC,EAAE;gBACD,CAAC,EAAE,GAAG;gBACN,CAAC,EAAE;oBACD,CAAC,EAAE,KAAK;oBACR,CAAC,EAAE;wBACD,CAAC,EAAE,OAAO;wBACV,CAAC,EAAE,CAAC;qBACL;iBACF;aACF;SACF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,OAAO,EAAE,GAAG,EAAE;QACjB,MAAM,EAAE,GAAG,eAAM,CAAC,IAAI,EAAE;aACrB,GAAG,CAAC,yBAAW,EAAE;YAChB,QAAQ,EAAE,IAAA,uBAAgB,GAAE;SAC7B,CAAC,CAAA;QAEJ,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,IAAA,aAAK,EAAC;YACxB,UAAU,EAAE,GAAG;YACf,YAAY,EAAE;gBACZ,GAAG,EAAE;oBACH,UAAU,EAAE,GAAG;iBAChB;aACF;SACF,CAAC,CAAA;QAEF,kCAAkC;QAElC,qBAAM,CAAC,SAAS,CAAC,EAAE,CAAC,oBAAoB,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE;YACjD,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;SACX,CAAC,CAAA;QAEF,qBAAM,CAAC,SAAS,CAAC,EAAE,CAAC,mBAAmB,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE;YAC5E,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;SACX,CAAC,CAAA;QAGF,MAAM,EAAE,GAAG,eAAM,CAAC,IAAI,EAAE;aACrB,GAAG,CAAC,yBAAW,EAAE;YAChB,QAAQ,EAAE,IAAA,qBAAe,EAAC,EAAE,OAAO,EAAE,CAAC;SACvC,CAAC,CAAA;QAEJ,qBAAM,CAAC,SAAS,CAAC,EAAE,CAAC,iDAAiD,EACnE,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE;YACnC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;SACrB,CAAC,CAAA;QAEJ,0CAA0C;QAC1C,sFAAsF;QACtF,eAAe;QACf,KAAK;IACP,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,mBAAmB,EAAE,GAAG,EAAE;QAC7B,MAAM,EAAE,GAAG,eAAM,CAAC,IAAI,EAAE;aACrB,GAAG,CAAC,yBAAW,EAAE;YAChB,QAAQ,EAAE,IAAA,qBAAe,EAAC;gBACxB,OAAO,EAAE,CAAC,SAAS,GAAG,KAAK,CAAC;aAC7B,CAAC;SACH,CAAC,CAAA;QAEJ,qBAAM,CAAC,SAAS,CAAC,EAAE,CAAC,iDAAiD,EACnE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,oBAAoB,EAAE,GAAG,EAAE;QAC9B,MAAM,EAAE,GAAG,eAAM,CAAC,IAAI,EAAE;aACrB,GAAG,CAAC,yBAAW,EAAE;YAChB,QAAQ,EAAE,IAAA,qBAAe,EAAC;gBACxB,OAAO,EAAE,SAAS,GAAG,KAAK;aAC3B,CAAC;SACH,CAAC,CAAA;QAEJ,qBAAM,CAAC,SAAS,CAAC,EAAE,CAAC,iDAAiD,EACnE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,yBAAyB,EAAE,GAAG,EAAE;QACnC,MAAM,EAAE,EAAE,EAAE,GAAG,IAAA,aAAK,EAAC;YACnB,aAAa,EAAE,SAAS;SACzB,CAAC,CAAA;QAEF,MAAM,EAAE,GAAG,eAAM,CAAC,IAAI,EAAE;aACrB,GAAG,CAAC,yBAAW,EAAE;YAChB,QAAQ,EAAE,IAAA,qBAAe,EAAC,EAAE,OAAO,EAAE,CAAC;SACvC,CAAC,CAAA;QAEJ,qBAAM,CAAC,SAAS,CAAC,EAAE,CAAC,uBAAuB,EACzC,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IACnE,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,aAAa,EAAE,GAAG,EAAE;QACvB,MAAM,EAAE,GAAG,eAAM,CAAC,IAAI,EAAE;aACrB,GAAG,CAAC,yBAAW,EAAE;YAChB,QAAQ,EAAE,IAAA,qBAAe,EAAC,EAAE,OAAO,EAAE,CAAC;SACvC,CAAC,CAAA;QAEJ,qBAAM,CAAC,SAAS,CAAC,EAAE,CAAC,kCAAkC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,wBAAwB,EAAE,GAAG,EAAE;QAClC,MAAM,EAAE,GAAG,eAAM,CAAC,IAAI,EAAE;aACrB,GAAG,CAAC,yBAAW,EAAE;YAChB,QAAQ,EAAE,IAAA,qBAAe,EAAC,EAAE,OAAO,EAAE,CAAC;SACvC,CAAC,CAAA;QAEJ,kFAAkF;QAClF,MAAM,QAAQ,GAAG,SAAS,GAAG,kBAAkB,CAAA;QAC/C,qBAAM,CAAC,SAAS,CAAC,EAAE,CAAC,6CAA6C,EAC/D,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,cAAc,EAAE,GAAG,EAAE;QACxB,MAAM,QAAQ,GAAQ;YACpB,UAAU,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAA,CAAC,CAAC;YAC/C,YAAY,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;SAC1C,CAAA;QAED,MAAM,EAAE,GAAG,eAAM,CAAC,IAAI,EAAE;aACrB,GAAG,CAAC,yBAAW,EAAE;YAChB,QAAQ,EAAE,IAAA,qBAAe,EAAC,EAAE,OAAO,EAAE,CAAC;SACvC,CAAC,CAAA;QAEJ,qBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,0BAA0B,EAC/C,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,WAAW,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,kBAAkB,EAAE,GAAG,EAAE;QAC5B,MAAM,OAAO,GAAQ;YACnB,UAAU,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;YACrD,YAAY,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAA,CAAC,CAAC;YACrD,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;SAC1C,CAAA;QAED,MAAM,EAAE,GAAG,eAAM,CAAC,IAAI,EAAE;aACrB,GAAG,CAAC,yBAAW,EAAE;YAChB,QAAQ,EAAE,IAAA,qBAAe,EAAC,EAAE,OAAO,EAAE,CAAC;SACvC,CAAC,CAAA;QAEJ,sEAAsE;QACtE,qBAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,EACxC,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,WAAW,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,uBAAuB,EAAE,GAAG,EAAE;QACjC,MAAM,EAAE,GAAG,eAAM,CAAC,IAAI,EAAE;aACrB,GAAG,CAAC,yBAAW,EAAE;YAChB,QAAQ,EAAE,IAAA,qBAAe,EAAC;gBACxB,OAAO,EAAE,CAAC,cAAc,CAAC;aAC1B,CAAC;SACH,CAAC,CAAA;QAEJ,gDAAgD;QAChD,2DAA2D;QAC3D,qBAAM,CAAC,SAAS,CAAC,EAAE,CAAC,6CAA6C,EAC/D,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;IAClE,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,eAAe,EAAE,GAAG,EAAE;QACzB,IAAI,EAAE,GAAG,eAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,yBAAW,EAAE;YACtC,QAAQ,EAAE,IAAA,uBAAgB,GAAE;SAC7B,CAAC,CAAA;QAEF,4EAA4E;QAC5E,qBAAM,CAAC,SAAS,CACd,EAAE,CAAC,cAAc,EACf,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,EAAE,CAAC,EACrD,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAC1B,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,iBAAiB,EAAE,GAAG,EAAE;QAC3B,IAAI,EAAE,GAAG,eAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,yBAAW,EAAE;YACtC,QAAQ,EAAE,IAAA,uBAAgB,EAAC,CAAC,IAAS,EAAE,EAAE;gBACvC,OAAO,UAAU,GAAG,IAAI,CAAA;YAC1B,CAAC,CAAC;SACH,CAAC,CAAA;QAEF,qBAAM,CAAC,SAAS,CACd,EAAE,CAAC,iBAAiB,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,EAC3D,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IACpB,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,aAAa,EAAE,GAAG,EAAE;QACvB,MAAM,CAAC,GAAuB;YAC5B,QAAQ,EAAE,IAAA,qBAAe,EAAC;gBACxB,UAAU,EAAE,KAAK;aAClB,CAAC;SACH,CAAA;QACD,MAAM,CAAC,GAAG,eAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,yBAAW,EAAE,CAAC,CAAC,CAAA;QAE3C,8EAA8E;QAC9E,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,OAAO,EAAE,GAAG,EAAE;QACjB,MAAM,CAAC,GAAuB;YAC5B,QAAQ,EAAE,IAAA,qBAAe,EAAC;gBACxB,UAAU,EAAE,KAAK;aAClB,CAAC;SACH,CAAA;QACD,MAAM,CAAC,GAAG,eAAM,CAAC,IAAI,EAAE;aACpB,GAAG,CAAC,yBAAW,EAAE,CAAC,CAAC,CAAA;QAEtB,CAAC,CAAC,OAAO,CAAC;YACR,GAAG,EAAE;gBACH,KAAK,EAAE,CAAC,IAAS,EAAE,IAAS,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC;aAC/D;SACF,CAAC,CAAA;QAEF,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,QAAQ,EAAE,GAAG,EAAE;QAClB,MAAM,CAAC,GAAuB;YAC5B,QAAQ,EAAE,IAAA,qBAAe,EAAC;gBACxB,UAAU,EAAE,KAAK;aAClB,CAAC;SACH,CAAA;QACD,MAAM,CAAC,GAAG,eAAM,CAAC,IAAI,EAAE;aACpB,GAAG,CAAC,yBAAW,EAAE,CAAC,CAAC,CAAA;QAEtB,CAAC,CAAC,OAAO,CAAC;YACR,GAAG,EAAE;gBACH,MAAM,EAAE,KAAY;aACrB;SACF,CAAC,CAAA;QAEF,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,mBAAmB,EAAE,GAAG,EAAE;QAC7B,IAAI,EAAE,GAAG,eAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,yBAAW,EAAE;YACtC,QAAQ,EAAE,IAAA,uBAAgB,GAAE;SAC7B,CAAC,CAAA;QAEF,yEAAyE;QACzE,IAAI,IAAI,GAAG,EAAE,CAAA;QACb,qBAAM,CAAC,SAAS,CACd,EAAE,CAAC,yBAAyB,EAAE,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,EACzE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAC1B,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,iBAAiB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,GAAuB;YAC5B,QAAQ,EAAE,CAAC,KAAU,EAAE,MAAW,EAAE,KAAU,EAAE,IAAS,EAAE,EAAE,CAAC,CAAC;gBAC7D,IAAI,EAAE,QAAQ;gBACd,GAAG,EAAE,KAAK;gBACV,KAAK,EAAE,IAAI;gBACX,GAAG,EAAE,SAAS;gBACd,IAAI,EAAE,SAAS;aAChB,CAAC;SACH,CAAA;QACD,MAAM,CAAC,GAAG,eAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,yBAAW,EAAE,CAAC,CAAC,CAAA;QAE3C,qDAAqD;QACrD,qBAAM,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,eAAe,EAAE,GAAG,EAAE;QACzB,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;QAEjC,iCAAiC;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;QAErD,MAAM,OAAO,GAAG,IAAA,0BAAY,EAAC;YAC3B,OAAO,EAAE,CAAC,OAAO,CAAC;YAClB,GAAG,EAAE,CAAC,SAAS,CAAC;SACjB,CAAC,CAAA;QAEF,4CAA4C;QAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACjC,qBAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,wCAAwC,CAAC,CAAA;QAEpE,+BAA+B;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;QACnD,qBAAM,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,gCAAgC,CAAC,CAAA;QAC7D,qBAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC3E,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,oBAAoB,EAAE,GAAG,EAAE;QAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;QAErD,qCAAqC;QACrC,MAAM,UAAU,GAAG,IAAA,0BAAY,EAAC,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACvD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC3C,qBAAM,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACvD,qBAAM,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACrD,qBAAM,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAEpD,oBAAoB;QACpB,MAAM,KAAK,GAAG,IAAA,0BAAY,EAAC,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAChE,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACjC,qBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAC9C,qBAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,mBAAmB,EAAE,GAAG,EAAE;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;QAErD,yDAAyD;QACzD,MAAM,OAAO,GAAG,IAAA,0BAAY,EAAC,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;QACtE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACrC,qBAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAC9C,4CAA4C,CAAC,CAAA;QAE/C,uCAAuC;QACvC,MAAM,OAAO,GAAG,IAAA,0BAAY,EAAC;YAC3B,OAAO,EAAE,CAAC,OAAO,CAAC;YAClB,GAAG,EAAE,CAAC,SAAS,CAAC;YAChB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACrC,qBAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAC7C,qCAAqC,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,uBAAuB,EAAE,GAAG,EAAE;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;QAErD,4BAA4B;QAC5B,MAAM,OAAO,GAAG,IAAA,0BAAY,EAAC;YAC3B,OAAO,EAAE,CAAC,OAAO,CAAC;YAClB,GAAG,EAAE,CAAC,SAAS,CAAC;YAChB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAA;QAEF,8CAA8C;QAC9C,MAAM,CAAC,GAAuB;YAC5B,QAAQ,EAAE,IAAA,uBAAgB,EAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;YAChD,IAAI,EAAE,OAAO;SACd,CAAA;QACD,MAAM,CAAC,GAAG,eAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,yBAAW,EAAE,CAAC,CAAC,CAAA;QAE3C,MAAM,MAAM,GAAG,CAAC,CAAC,eAAe,CAAC,CAAA;QACjC,qBAAM,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,0BAA0B,EAAE,GAAG,EAAE;QACpC,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAE3C,+CAA+C;QAC/C,MAAM,QAAQ,GAAG,IAAA,0BAAY,EAAC,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;QACvE,MAAM,OAAO,GAAG,IAAA,0BAAY,EAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;QAErE,qBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,kCAAkC,CAAC,CAAA;QAC/E,qBAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,6BAA6B,CAAC,CAAA;QAEzE,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,IAAA,0BAAY,EAAC;YAC5B,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;YAC1B,GAAG,EAAE,CAAC,SAAS,CAAC;SACjB,CAAC,CAAA;QACF,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC1C,qBAAM,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAA;QAC9D,qBAAM,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;IAGF,IAAA,gBAAI,EAAC,wBAAwB,EAAE,GAAG,EAAE;QAClC,4CAA4C;QAC5C,MAAM,OAAO,GAAG,IAAA,0BAAY,EAAC;YAC3B,OAAO,EAAE,CAAC,0BAA0B,CAAC;SACtC,CAAC,CAAA;QACF,qBAAM,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;AAEJ,CAAC,CAAC,CAAA"} \ No newline at end of file +{"version":3,"file":"multisource.test.js","sourceRoot":"","sources":["../test/multisource.test.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/ts/dist/resolver/pkg.js b/ts/dist/resolver/pkg.js index fd86c7a..041067f 100644 --- a/ts/dist/resolver/pkg.js +++ b/ts/dist/resolver/pkg.js @@ -62,6 +62,28 @@ function makePkgResolver(options) { let ps = (0, multisource_1.resolvePathSpec)(popts, ctx, foundSpec, resolvefolder); let src = undefined; let search = []; + // A relative reference (./x, ../x) inside a source loaded from a package is + // not a package name: resolve it against the containing source's directory + // via ps.full, exactly as the file resolver does (this also works over an + // injected fs). Bare package references fall through to the require / + // node_modules resolution below. + if (null != ps.path && isRelativeRef(ps.path) && null != ps.full) { + let full = Path.resolve(ps.full); + let potentials = [full]; + if (multisource_1.NONE === ps.kind) { + potentials.push(...(0, mem_1.buildPotentials)({ ...ps, full }, popts, (...s) => Path.resolve(s.reduce((a, p) => Path.join(a, p))))); + } + for (let path of potentials) { + search.push(path); + src = load(path, fs); + if (null != src) { + ps.full = path; + ps.kind = (path.match(/\.([^.]*)$/) || [multisource_1.NONE, multisource_1.NONE])[1]; + break; + } + } + return { ...ps, src, found: null != src, search }; + } if (null != ps.path) { try { ps.full = useRequire.resolve(ps.path, requireOptions); @@ -136,6 +158,14 @@ function makePkgResolver(options) { return res; }; } +// isRelativeRef reports whether ref is an explicit relative reference (./x or +// ../x). Such a reference is resolved against the containing source's directory +// (via ps.full) rather than treated as a node_modules package name. +function isRelativeRef(ref) { + return ref === '.' || ref === '..' || + ref.startsWith('./') || ref.startsWith('../') || + ref.startsWith('.\\') || ref.startsWith('..\\'); +} function resolvefolder(path, fs) { if ('string' !== typeof path) { return path; diff --git a/ts/dist/resolver/pkg.js.map b/ts/dist/resolver/pkg.js.map index d28f163..6ffe65d 100644 --- a/ts/dist/resolver/pkg.js.map +++ b/ts/dist/resolver/pkg.js.map @@ -1 +1 @@ -{"version":3,"file":"pkg.js","sourceRoot":"","sources":["../../src/resolver/pkg.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"pkg.js","sourceRoot":"","sources":["../../src/resolver/pkg.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/ts/src/resolver/pkg.ts b/ts/src/resolver/pkg.ts index bb265f5..8f647ce 100644 --- a/ts/src/resolver/pkg.ts +++ b/ts/src/resolver/pkg.ts @@ -49,6 +49,30 @@ export function makePkgResolver(options: { let src = undefined let search: string[] = [] + // A relative reference (./x, ../x) inside a source loaded from a package is + // not a package name: resolve it against the containing source's directory + // via ps.full, exactly as the file resolver does (this also works over an + // injected fs). Bare package references fall through to the require / + // node_modules resolution below. + if (null != ps.path && isRelativeRef(ps.path) && null != ps.full) { + let full = Path.resolve(ps.full) + let potentials = [full] + if (NONE === ps.kind) { + potentials.push(...buildPotentials({ ...ps, full }, popts, + (...s) => Path.resolve(s.reduce((a, p) => Path.join(a, p))))) + } + for (let path of potentials) { + search.push(path) + src = load(path, fs) + if (null != src) { + ps.full = path + ps.kind = (path.match(/\.([^.]*)$/) || [NONE, NONE])[1] + break + } + } + return { ...ps, src, found: null != src, search } + } + if (null != ps.path) { try { ps.full = useRequire.resolve(ps.path, requireOptions) @@ -141,6 +165,15 @@ export function makePkgResolver(options: { } +// isRelativeRef reports whether ref is an explicit relative reference (./x or +// ../x). Such a reference is resolved against the containing source's directory +// (via ps.full) rather than treated as a node_modules package name. +function isRelativeRef(ref: string): boolean { + return ref === '.' || ref === '..' || + ref.startsWith('./') || ref.startsWith('../') || + ref.startsWith('.\\') || ref.startsWith('..\\') +} + function resolvefolder(path: string, fs: FST) { if ('string' !== typeof path) { return path diff --git a/ts/test/multisource.test.ts b/ts/test/multisource.test.ts index b78f442..f4e69b1 100644 --- a/ts/test/multisource.test.ts +++ b/ts/test/multisource.test.ts @@ -538,6 +538,25 @@ describe('multisource', () => { }) + test('pkg-relative-ref', () => { + const Path = require('node:path') + const j1 = Jsonic.make().use(MultiSource, { + resolver: makePkgResolver({ require }) + }) + + // A relative reference (./x) is resolved against the containing source's + // directory, not treated as a node_modules package name. The reference + // inside the loaded file (rel/outer.jsonic -> ./inner.jsonic) likewise + // resolves against that file's own directory. The base is seeded via a real + // anchor file so resolvefolder() yields the test directory. + const anchor = Path.resolve(__dirname, '../test/t01.jsonic') + assert.deepEqual( + j1('@"./rel/outer.jsonic"', { multisource: { path: anchor } }), + { o: 1, inner: { v: 7 } } + ) + }) + + test('file-implicit', () => { let j0 = Jsonic.make().use(MultiSource, { resolver: makeFileResolver(), @@ -763,4 +782,51 @@ describe('multisource', () => { assert.deepEqual(filemap, {}) }) + + test('nested-relative-dirs', () => { + // A relative reference *inside* a loaded file resolves against that file's + // own directory (main -> sub/child -> sub/grand), across directories. + const { fs } = memfs({ + 'main.jsonic': '{top:1, child:@"./sub/child.jsonic"}', + sub: { + 'child.jsonic': '{mid:2, grand:@"./grand.jsonic"}', + 'grand.jsonic': '{v:99}', + }, + }) + + const j = Jsonic.make().use(MultiSource, { resolver: makeFileResolver() }) + + assert.deepEqual( + j('@"./main.jsonic"', { fs, multisource: { path: '/' } }), + { top: 1, child: { mid: 2, grand: { v: 99 } } } + ) + }) + + + test('nested-relative-sibling-dirs', () => { + // Two references loaded from the same parent each resolve their own + // relative reference against their own directory. Both children load + // "./inner.jsonic" but from different directories, so they pick up + // different files — proving the base is tracked per-source and a sibling + // load is unaffected. + const { fs } = memfs({ + 'main.jsonic': '{a:@"./aa/a.jsonic", b:@"./bb/b.jsonic"}', + aa: { + 'a.jsonic': '{x:@"./inner.jsonic"}', + 'inner.jsonic': '{n:11}', + }, + bb: { + 'b.jsonic': '{y:@"./inner.jsonic"}', + 'inner.jsonic': '{n:22}', + }, + }) + + const j = Jsonic.make().use(MultiSource, { resolver: makeFileResolver() }) + + assert.deepEqual( + j('@"./main.jsonic"', { fs, multisource: { path: '/' } }), + { a: { x: { n: 11 } }, b: { y: { n: 22 } } } + ) + }) + }) diff --git a/ts/test/rel/inner.jsonic b/ts/test/rel/inner.jsonic new file mode 100644 index 0000000..df22cd4 --- /dev/null +++ b/ts/test/rel/inner.jsonic @@ -0,0 +1 @@ +{v:7} diff --git a/ts/test/rel/outer.jsonic b/ts/test/rel/outer.jsonic new file mode 100644 index 0000000..9ab283c --- /dev/null +++ b/ts/test/rel/outer.jsonic @@ -0,0 +1 @@ +{o:1, inner:@"./inner.jsonic"}