@malloy-publisher/server 0.0.244 → 0.0.246
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -5
- package/dist/app/api-doc.yaml +323 -20
- package/dist/app/assets/{EnvironmentPage-BEvyNJlI.js → EnvironmentPage-EjXlK1AR.js} +1 -1
- package/dist/app/assets/{HomePage-BOJ5_n2P.js → HomePage-BDg82oe3.js} +1 -1
- package/dist/app/assets/{LightMode-DiRk-oG_.js → LightMode-CM8J0nPB.js} +1 -1
- package/dist/app/assets/{MainPage-CvWxTRF_.js → MainPage-CkkdimtC.js} +1 -1
- package/dist/app/assets/{MaterializationsPage-DTkN3KGF.js → MaterializationsPage-DvVS2HMi.js} +1 -1
- package/dist/app/assets/{ModelPage-C-Ds_tSI.js → ModelPage-Bz2je31A.js} +1 -1
- package/dist/app/assets/{PackagePage-C9kY78dt.js → PackagePage-BUJU3qB3.js} +1 -1
- package/dist/app/assets/{RouteError-dWMSDw8R.js → RouteError-oqZTfMol.js} +1 -1
- package/dist/app/assets/{ThemeEditorPage-EDVJy_ps.js → ThemeEditorPage-W-V8hngE.js} +1 -1
- package/dist/app/assets/{WorkbookPage-6kCZgXzD.js → WorkbookPage-IQFxsQGR.js} +1 -1
- package/dist/app/assets/{core-CbOoBenI.es-m46Eq2w-.js → core-BCwj9ZvB.es-C610H3gu.js} +1 -1
- package/dist/app/assets/{index-CzHda4nF.js → index-1xafiaYB.js} +1 -1
- package/dist/app/assets/{index-CmKKDEOJ.js → index-BUhTsFh9.js} +1 -1
- package/dist/app/assets/{index-B8MmVXwE.js → index-DJ-3RN5W.js} +4 -4
- package/dist/app/assets/{index-Bofgo-1r.js → index-Dxotbpnc.js} +1 -1
- package/dist/app/index.html +1 -1
- package/dist/instrumentation.mjs +10 -9
- package/dist/package_load_worker.mjs +209 -188
- package/dist/server.mjs +106862 -105526
- package/dist/sshcrypto-vd2k5hq9.node +0 -0
- package/package.json +4 -2
- package/publisher.config.example.bigquery.json +33 -0
- package/publisher.config.example.duckdb.json +23 -0
- package/dist/sshcrypto-8m50vnmb.node +0 -0
package/README.md
CHANGED
|
@@ -2,11 +2,53 @@
|
|
|
2
2
|
|
|
3
3
|
The Malloy Publisher Server is an Express.js server that provides an API for managing and accessing Malloy data models, packages, and queries
|
|
4
4
|
|
|
5
|
+
## Quick start
|
|
6
|
+
|
|
7
|
+
This section is self-contained: this README ships in the npm tarball, where most of the repository does not, so nothing here needs a file you do not have. Later sections are written for a clone and do point into the repository.
|
|
8
|
+
|
|
9
|
+
**New workspace?** One command scaffolds a package, the server config, the MCP wiring, and the agent skills:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm create @malloy-publisher/malloy-package@latest sales
|
|
13
|
+
npm start
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Run bare like that, the package comes with a small sample dataset, so there is something to query immediately. To start from a file of your own instead, add `-- --data ./orders.csv`, naming a delimited or Parquet/Excel file you actually have (the `--` is required, and the path is relative to where you run the command). Keep the `@latest`: `npm create` resolves through the npx cache, and an unversioned name silently reuses whatever old copy is on the machine.
|
|
17
|
+
|
|
18
|
+
**Existing directory of models?** Write a `publisher.config.json` beside a package directory that holds a `publisher.json`, then run the server pointing at it:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npx @malloy-publisher/server --server_root . --watch-env local
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
```json
|
|
25
|
+
{
|
|
26
|
+
"frozenConfig": false,
|
|
27
|
+
"environments": [
|
|
28
|
+
{
|
|
29
|
+
"name": "local",
|
|
30
|
+
"packages": [{ "name": "sales", "location": "./sales" }],
|
|
31
|
+
"connections": []
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
The config is read from `<server_root>/publisher.config.json` by default; `--config <path>` overrides it.
|
|
38
|
+
|
|
39
|
+
Three facts that are easy to get wrong:
|
|
40
|
+
|
|
41
|
+
- **A flat-file (CSV/Parquet/XLSX) package needs no `connections` entry at all.** Every loaded package automatically gets its own DuckDB sandbox connection named `duckdb`, which is what `duckdb.table('data/file.csv')` resolves against. That name is reserved: an environment-level connection named `duckdb` fails the whole environment at init (call an env-level DuckDB connection `shared_duckdb` or similar).
|
|
42
|
+
- **A package `location` is local only when it starts with `./`, `../`, `~/`, or `/`.** Write `./sales`, not `sales`: a bare name is read as a remote URI, and the package is skipped with `Invalid package path: "sales". Must be an absolute mounted path or a GCS/S3/GitHub URI.` in `loadErrors`. A `./` or `../` path resolves against the config file's directory; `~/` against your home directory.
|
|
43
|
+
- **Local authoring means `--watch-env <env>`.** Without it the server copies each local package into `publisher_data/` at boot and serves the copy, so edits to your source directory are never read — a reload recompiles the copy and still answers 200. Adding the flag to a later boot does not undo a copy already made: pass `--watch-env <env> --init` once to re-mount (it wipes `publisher_data/` and re-syncs from config), then plain `--watch-env` boots keep watching. `publisher_data/<env>/<pkg>` tells you which you got — a symlink is mounted, a real directory is a copy.
|
|
44
|
+
|
|
45
|
+
Poll `curl -s http://localhost:4000/api/v0/status` until `operationalState` is `"serving"`, then check `loadErrors` (absent when everything loaded). The MCP endpoint for agents is `http://localhost:4040/mcp`.
|
|
46
|
+
|
|
5
47
|
## Configuration
|
|
6
48
|
|
|
7
|
-
`publisher.config.json`
|
|
49
|
+
Two example configs ship in the npm package, beside this README: [`publisher.config.example.duckdb.json`](./publisher.config.example.duckdb.json) (the GitHub-hosted sample packages, no connection block) and [`publisher.config.example.bigquery.json`](./publisher.config.example.bigquery.json) (adds a BigQuery connection). Copy either one to `publisher.config.json` and point `--server_root` at its directory.
|
|
8
50
|
|
|
9
|
-
|
|
51
|
+
In a clone, the live `publisher.config.json` lives in this directory, and the repository root contains a symlink (`/publisher.config.json` → `./packages/server/publisher.config.json`) so that running the server from either location picks up the same config. Edit one and you've edited both.
|
|
10
52
|
|
|
11
53
|
### Remaining deprecation warnings
|
|
12
54
|
|
|
@@ -15,11 +57,11 @@ Removing the unused `trino` CLI direct dep (it pulled in `@google-cloud/translat
|
|
|
15
57
|
- **npm CLI tooling**: `npmlog`, `gauge`, `are-we-there-yet`, `glob@7/8/10`, `rimraf@3`, `tar@6.2.1`, `inflight`, `@npmcli/move-file`, `node-domexception`, `querystring` — pulled in by npm itself and by `node-pre-gyp`/`node-gyp`. Not actionable from this repo.
|
|
16
58
|
- **`uuid@8.x` / `uuid@9.x`**: surfaced across multiple transitives (Malloy, AWS SDKs, others). Resolves when each upstream bumps to `uuid@11`.
|
|
17
59
|
- **`q@1.5.1`**: pulled in via `thrift` → `@databricks/sql` → `@malloydata/db-databricks`. Resolves when Databricks upgrades `@databricks/sql` past the thrift dep, or when we replace the Databricks driver.
|
|
18
|
-
- **`aws-sdk@2.1693.0`**:
|
|
60
|
+
- **`aws-sdk@2.1693.0`**: no longer a direct dep (removed from `packages/server/package.json`); anything still surfacing it is transitive. The actual S3 consumer is `@aws-sdk/client-s3` v3.
|
|
19
61
|
|
|
20
62
|
## K6 Test Presets
|
|
21
63
|
|
|
22
|
-
The Malloy Publisher Server includes several K6 test presets to help you test its performance and stability.
|
|
64
|
+
The Malloy Publisher Server includes several K6 test presets to help you test its performance and stability. These live in the repository, not the npm package, so run them from a clone.
|
|
23
65
|
|
|
24
66
|
Below is a list of the available test presets:
|
|
25
67
|
|
|
@@ -124,7 +166,7 @@ For more information on how to configure OpenTelemetry collectors, please refer
|
|
|
124
166
|
|
|
125
167
|
## MCP Prompt Capability
|
|
126
168
|
|
|
127
|
-
Publisher's MCP interface exposes the bundled agent **skills**
|
|
169
|
+
Publisher's MCP interface exposes the bundled agent **skills** as **LLM-ready prompts**, so hosts that ingest MCP but do not load skill files can pull the same guidance. The skills are published separately as [`@malloy-publisher/skills`](https://www.npmjs.com/package/@malloy-publisher/skills); their source is [`skills/`](https://github.com/malloydata/publisher/tree/main/skills), and authoring guidance is in [`docs/agent-skills/`](https://github.com/malloydata/publisher/tree/main/docs/agent-skills).
|
|
128
170
|
|
|
129
171
|
List prompts:
|
|
130
172
|
|
package/dist/app/api-doc.yaml
CHANGED
|
@@ -2530,10 +2530,12 @@ components:
|
|
|
2530
2530
|
description:
|
|
2531
2531
|
Configured packages and environments that did not load, and why. A
|
|
2532
2532
|
load failure is not fatal to the server, so operationalState stays
|
|
2533
|
-
serving and the affected packages are
|
|
2534
|
-
|
|
2535
|
-
|
|
2536
|
-
|
|
2533
|
+
serving and the affected packages are absent from environments,
|
|
2534
|
+
unless the entry carries stale = true, in which case the package is
|
|
2535
|
+
still listed and still serving its last successful compile. This is
|
|
2536
|
+
the only place either difference is reported, so check it before
|
|
2537
|
+
treating a serving server as complete or current. Present only when
|
|
2538
|
+
something failed, so a healthy server omits the field.
|
|
2537
2539
|
items:
|
|
2538
2540
|
type: object
|
|
2539
2541
|
properties:
|
|
@@ -2551,6 +2553,24 @@ components:
|
|
|
2551
2553
|
message:
|
|
2552
2554
|
type: string
|
|
2553
2555
|
description: Why it did not load.
|
|
2556
|
+
stale:
|
|
2557
|
+
type: boolean
|
|
2558
|
+
description:
|
|
2559
|
+
When true, the package did load earlier and is still serving
|
|
2560
|
+
that last successful compile; the message is why its most
|
|
2561
|
+
recent reload (a watch-mode save, malloy_reloadPackage, or
|
|
2562
|
+
reload=true) failed. The served model is older than the files
|
|
2563
|
+
on disk. Absent on ordinary load failures. This array is the
|
|
2564
|
+
only place staleness is reported, because the package's entry
|
|
2565
|
+
under environments, and its own package resource, both read
|
|
2566
|
+
SERVING; join on the package name here to tell a current
|
|
2567
|
+
package from a stale one.
|
|
2568
|
+
failedAt:
|
|
2569
|
+
type: string
|
|
2570
|
+
format: date-time
|
|
2571
|
+
description:
|
|
2572
|
+
When the failed reload happened. Only present alongside
|
|
2573
|
+
stale = true.
|
|
2554
2574
|
frozenConfig:
|
|
2555
2575
|
type: boolean
|
|
2556
2576
|
description:
|
|
@@ -2753,8 +2773,19 @@ components:
|
|
|
2753
2773
|
location:
|
|
2754
2774
|
type: string
|
|
2755
2775
|
description:
|
|
2756
|
-
Package location
|
|
2757
|
-
|
|
2776
|
+
Package location. A LOCAL path must start with `./`, `../`, `~/`,
|
|
2777
|
+
or `/`; a `./` or `../` path resolves against the config file's
|
|
2778
|
+
directory, and `~/` against the home directory. Anything else is
|
|
2779
|
+
read as a remote URI (github, s3, gcs, https), so a bare name like
|
|
2780
|
+
`sales` is not local and the package is skipped with
|
|
2781
|
+
"Invalid package path" in the server's loadErrors. At boot a local
|
|
2782
|
+
package is COPIED into publisher_data/ and the copy is served, so
|
|
2783
|
+
edits to the source directory are not read; starting the server
|
|
2784
|
+
with `--watch-env <env>` mounts local packages in place (symlink)
|
|
2785
|
+
and live-reloads them instead. The mount is chosen when the
|
|
2786
|
+
environment is first loaded from config, so adding `--watch-env`
|
|
2787
|
+
to a later boot needs `--init` to re-mount a package already
|
|
2788
|
+
copied.
|
|
2758
2789
|
scope:
|
|
2759
2790
|
type: string
|
|
2760
2791
|
enum:
|
|
@@ -2812,9 +2843,55 @@ components:
|
|
|
2812
2843
|
findings: a `storage=` source not served from storage, a `#@ persist`
|
|
2813
2844
|
source that was not recognized as materializable, a persist-target
|
|
2814
2845
|
collision, and materialization-config problems that degrade
|
|
2815
|
-
attribution.
|
|
2816
|
-
|
|
2817
|
-
|
|
2846
|
+
attribution. Discovery findings: a model listed in `explores` whose
|
|
2847
|
+
export closure surfaces no sources or named queries, so it lists as
|
|
2848
|
+
empty and renders a blank page. Server-computed and read-only:
|
|
2849
|
+
ignored on create/update requests and only returned in responses.
|
|
2850
|
+
Present only when there are such findings.
|
|
2851
|
+
|
|
2852
|
+
|
|
2853
|
+
**Pre-aggregation contributes nothing to this array. A
|
|
2854
|
+
`#@ preaggregate` that cannot be honored is an ERROR, never a
|
|
2855
|
+
warning** — a 400 at publish or PATCH, and a load failure thereafter.
|
|
2856
|
+
Rejected are a `#@ preaggregate` anywhere but on a measure;
|
|
2857
|
+
a `#@ preaggregate` with no `grain=`;
|
|
2858
|
+
a grain naming anything but a dimension the base source itself
|
|
2859
|
+
declares, which rules out an inline time truncation such as
|
|
2860
|
+
`order_time.day`; a measure that cannot be correctly
|
|
2861
|
+
re-aggregated to a coarser grain, whether because its aggregate has no
|
|
2862
|
+
exact merge function (`count(distinct)`, `median`, percentiles, `mode`,
|
|
2863
|
+
and `avg` until it is decomposed) or because it carries its own filter,
|
|
2864
|
+
an ungrouping (`all`, `exclude`), or a required group-by; a measure
|
|
2865
|
+
whose expression cannot be POSITIVELY classified as re-aggregatable,
|
|
2866
|
+
which fails closed rather than being guessed at; a base source with a
|
|
2867
|
+
FAN-OUT join (`join_many` or `join_cross`), which can multiply rows,
|
|
2868
|
+
while a `join_one` is permitted and a measure aggregating through one
|
|
2869
|
+
is served normally; a base source that already fails persist eligibility (unbound
|
|
2870
|
+
parameters, `given` references, `#(authorize)` gates); `sharing=` or
|
|
2871
|
+
`schedule=` at the resource level; and a synthesized rollup name that
|
|
2872
|
+
collides with an existing model object. Each names the measure and the
|
|
2873
|
+
fix.
|
|
2874
|
+
|
|
2875
|
+
|
|
2876
|
+
Refusing rather than silently dropping the measure is the deliberate
|
|
2877
|
+
choice. A dropped measure is not served from the rollup at ANY grain,
|
|
2878
|
+
so the declaration would have no effect whatsoever while still reading
|
|
2879
|
+
as applied — and the build cost of the rollup would still be paid. An
|
|
2880
|
+
author who writes `#@ preaggregate` on a measure that cannot be rolled
|
|
2881
|
+
up has made a modeling mistake, and an error is where a mistake
|
|
2882
|
+
belongs.
|
|
2883
|
+
|
|
2884
|
+
|
|
2885
|
+
The same verdict is enforced at LOAD, not only at publish, so a
|
|
2886
|
+
package whose declarations stopped being honorable does not load at
|
|
2887
|
+
all: it is absent from its environment and reported in
|
|
2888
|
+
`ServerStatus.loadErrors`. Worth knowing because whether a measure can
|
|
2889
|
+
be re-aggregated is derived from the compiled model, so a Malloy
|
|
2890
|
+
version change can in principle reclassify a measure that published
|
|
2891
|
+
cleanly long before. That surfaces as a package that stops loading
|
|
2892
|
+
rather than as a package quietly serving without its rollups — louder,
|
|
2893
|
+
and deliberately so, since the alternative is paying for rollups that
|
|
2894
|
+
answer nothing.
|
|
2818
2895
|
items:
|
|
2819
2896
|
type: object
|
|
2820
2897
|
properties:
|
|
@@ -2850,15 +2927,28 @@ components:
|
|
|
2850
2927
|
description: >-
|
|
2851
2928
|
Controls whether the discovery surface is also a query boundary.
|
|
2852
2929
|
`"declared"` (the default) makes queryable == discoverable: when
|
|
2853
|
-
`explores` is declared, only `explores` model files
|
|
2854
|
-
|
|
2855
|
-
|
|
2856
|
-
|
|
2857
|
-
|
|
2858
|
-
|
|
2859
|
-
|
|
2860
|
-
|
|
2861
|
-
|
|
2930
|
+
`explores` is declared, only `explores` model files are valid query
|
|
2931
|
+
entry points, and the queryable sources are the union of those
|
|
2932
|
+
files' `export {}` closures — so a source exported by any listed
|
|
2933
|
+
file stays queryable whichever listed model path the request
|
|
2934
|
+
addresses it through. Admission is by declaration, not by name: a
|
|
2935
|
+
request clears only when the model it names resolves the name to the
|
|
2936
|
+
very source a listed file exported, so a same-named source declared
|
|
2937
|
+
in a hidden file is not admitted by the coincidence. Every other
|
|
2938
|
+
source still compiles, imports, joins, and extends but is not
|
|
2939
|
+
directly queryable (denied with 404).
|
|
2940
|
+
The `/compile` endpoint is exempt (compile is the authoring loop;
|
|
2941
|
+
the boundary is discovery curation, not access control — for
|
|
2942
|
+
confidentiality use `#(authorize)`, which gates compile too). A
|
|
2943
|
+
source that is both hidden and `#(authorize)`-gated still answers
|
|
2944
|
+
`/compile` with the generic 404, so the exemption cannot be used to
|
|
2945
|
+
enumerate gated names.
|
|
2946
|
+
`"all"` decouples the axes: `explores`/`export {}` gate discovery
|
|
2947
|
+
only and every compiled source stays directly queryable. When
|
|
2948
|
+
`explores` is absent there is no curated surface, so both modes are
|
|
2949
|
+
equivalent (everything queryable). Invalid values fall back to
|
|
2950
|
+
`"declared"`. Identity-based access is a separate concern — see
|
|
2951
|
+
`#(authorize)`.
|
|
2862
2952
|
manifestLocation:
|
|
2863
2953
|
type: ["string", "null"]
|
|
2864
2954
|
description: |
|
|
@@ -3799,7 +3889,14 @@ components:
|
|
|
3799
3889
|
description: Resource path to the connection
|
|
3800
3890
|
name:
|
|
3801
3891
|
type: string
|
|
3802
|
-
description:
|
|
3892
|
+
description:
|
|
3893
|
+
Name of the connection. The name `duckdb` is RESERVED for the
|
|
3894
|
+
per-package DuckDB sandbox every loaded package gets automatically;
|
|
3895
|
+
declaring an environment-level connection with that name fails the
|
|
3896
|
+
whole environment at init. A flat-file (CSV/Parquet/XLSX) package
|
|
3897
|
+
needs no connection entry at all — its models reach the sandbox as
|
|
3898
|
+
`duckdb.table('data/…')`. Name an environment-level DuckDB
|
|
3899
|
+
connection something else (e.g. `shared_duckdb`).
|
|
3803
3900
|
type:
|
|
3804
3901
|
type: string
|
|
3805
3902
|
description: Type of database connection
|
|
@@ -4773,6 +4870,45 @@ components:
|
|
|
4773
4870
|
type: string
|
|
4774
4871
|
dialect:
|
|
4775
4872
|
type: string
|
|
4873
|
+
origin:
|
|
4874
|
+
type: string
|
|
4875
|
+
enum: [persist, preaggregate]
|
|
4876
|
+
default: persist
|
|
4877
|
+
description: >-
|
|
4878
|
+
Which authoring annotation produced this plan entry. `persist` — the
|
|
4879
|
+
modeler wrote `#@ persist` on the source; every entry on a deployment
|
|
4880
|
+
that uses no pre-aggregation, and the meaning of an absent value.
|
|
4881
|
+
`preaggregate` — the modeler wrote `#@ preaggregate` on measures of
|
|
4882
|
+
`preaggregate.baseSourceName`, and the publisher SYNTHESIZED this
|
|
4883
|
+
rollup source to serve them.
|
|
4884
|
+
|
|
4885
|
+
|
|
4886
|
+
Note that BOTH kinds carry a `#@ persist` annotation by the time they
|
|
4887
|
+
reach this plan, because synthesis emits one (see `annotationFields`).
|
|
4888
|
+
So this reports which surface the AUTHOR used, not which annotation
|
|
4889
|
+
sits on the source — which is the question worth answering, since a
|
|
4890
|
+
`preaggregate` entry's `name` appears in no model file and without
|
|
4891
|
+
this field an operator or orchestrator sees a source nobody wrote with
|
|
4892
|
+
no way to tell it from one they did.
|
|
4893
|
+
|
|
4894
|
+
|
|
4895
|
+
Everything downstream is deliberately indifferent to it: a synthesized
|
|
4896
|
+
entry is built, identified, manifested, shared and garbage-collected
|
|
4897
|
+
exactly like a hand-written one.
|
|
4898
|
+
preaggregate:
|
|
4899
|
+
oneOf:
|
|
4900
|
+
- $ref: "#/components/schemas/PreaggregatePlan"
|
|
4901
|
+
- type: "null"
|
|
4902
|
+
description: >-
|
|
4903
|
+
What the synthesized rollup covers: the base source it was derived
|
|
4904
|
+
from, the one grain it is built at, and the measures served there.
|
|
4905
|
+
Present only when `origin` is `preaggregate`; null otherwise.
|
|
4906
|
+
|
|
4907
|
+
|
|
4908
|
+
Coverage is complete by construction — a measure that cannot be
|
|
4909
|
+
correctly re-aggregated is refused at publish rather than dropped
|
|
4910
|
+
from the rollup — so there is no per-measure omission list to
|
|
4911
|
+
reconcile against the model.
|
|
4776
4912
|
sourceEntityId:
|
|
4777
4913
|
type: string
|
|
4778
4914
|
description: >-
|
|
@@ -4811,6 +4947,14 @@ components:
|
|
|
4811
4947
|
scope modes. (Per-source `sharing`/`schedule` were retired: scope is
|
|
4812
4948
|
a single package-level mode and a schedule is package-root-only —
|
|
4813
4949
|
declaring either on a source is a publish-time manifest error.)
|
|
4950
|
+
|
|
4951
|
+
|
|
4952
|
+
A synthesized rollup (`origin: preaggregate`) declares nothing of its
|
|
4953
|
+
own and gets no freshness policy of its own: it INHERITS its base's,
|
|
4954
|
+
so what is reported here is the base source's effective objective
|
|
4955
|
+
resolved by the rule above. A rollup and its base therefore go stale
|
|
4956
|
+
together, which is what makes "serve the base when the rollup is
|
|
4957
|
+
stale" a safe degradation rather than a change of answer.
|
|
4814
4958
|
queryMetadata:
|
|
4815
4959
|
oneOf:
|
|
4816
4960
|
- $ref: "#/components/schemas/QueryMetadata"
|
|
@@ -4865,15 +5009,142 @@ components:
|
|
|
4865
5009
|
a dangling or stale name is rejected rather than deferred to a build.
|
|
4866
5010
|
Neither participates in `sourceEntityId`: adding a watermark to an
|
|
4867
5011
|
existing source must not re-address its table.
|
|
5012
|
+
|
|
5013
|
+
|
|
5014
|
+
For a synthesized rollup (`origin: preaggregate`) the annotation was
|
|
5015
|
+
generated by the publisher rather than authored, so this reports what
|
|
5016
|
+
synthesis emitted. It is still the annotation that governs the build,
|
|
5017
|
+
which is why it is reported the same way: a rollup is an ordinary
|
|
5018
|
+
persist source whose `#@ persist` nobody typed.
|
|
4868
5019
|
modelPath:
|
|
4869
5020
|
type: string
|
|
4870
|
-
description:
|
|
5021
|
+
description: >-
|
|
4871
5022
|
Package-relative path of the `.malloy` model that declares this
|
|
4872
5023
|
source (e.g. `order_rollup.malloy`). The source's sourceID embeds an
|
|
4873
5024
|
absolute `file://` modelURL with no package boundary, so this is the
|
|
4874
5025
|
only place the relative path is exposed; callers use it to deep-link
|
|
4875
5026
|
the source back to its model.
|
|
4876
5027
|
|
|
5028
|
+
|
|
5029
|
+
A synthesized rollup (`origin: preaggregate`) is declared by no model,
|
|
5030
|
+
so this is the model of its base — the file holding the
|
|
5031
|
+
`#@ preaggregate` annotations it was synthesized from, which is where
|
|
5032
|
+
an author would go to change it.
|
|
5033
|
+
|
|
5034
|
+
PreaggregatePlan:
|
|
5035
|
+
type: object
|
|
5036
|
+
description: >-
|
|
5037
|
+
Provenance for a rollup source synthesized from `#@ preaggregate`
|
|
5038
|
+
annotations. A query never names a rollup, never changes shape because one
|
|
5039
|
+
exists, and gets the same answer whether one is used or not, so this is
|
|
5040
|
+
the only place the set of rollups and the coverage of each is visible at
|
|
5041
|
+
all.
|
|
5042
|
+
|
|
5043
|
+
|
|
5044
|
+
**This object describes ONE rollup table, at ONE grain.** A rollup is a
|
|
5045
|
+
single `GROUP BY`, so a grain is a property of the table, not of the
|
|
5046
|
+
individual measures in it: `grainDimensions` lists the dimensions of that
|
|
5047
|
+
one grain, and `measures` are the measures served at it.
|
|
5048
|
+
|
|
5049
|
+
|
|
5050
|
+
That inverts how the grain was authored, which is worth knowing before
|
|
5051
|
+
reading a plan. The modeler declares per measure — `#@ preaggregate
|
|
5052
|
+
grain="order_day, category"` — and may declare a measure at SEVERAL grains
|
|
5053
|
+
by writing several annotation lines on it, each of which is its own rollup.
|
|
5054
|
+
The publisher then packs every measure declaring the same (grain,
|
|
5055
|
+
connection, base source) into a single synthesized source, because ten
|
|
5056
|
+
measures at one grain should be one table and one CTAS rather than ten. So
|
|
5057
|
+
the plan has one entry per DISTINCT grain declared anywhere on the source,
|
|
5058
|
+
which is neither the number of annotated measures nor the number of
|
|
5059
|
+
annotations: a measure declared at two grains appears in two entries, and
|
|
5060
|
+
two measures sharing a grain appear in one. To recover the per-measure view
|
|
5061
|
+
that was written, iterate `buildPlan.sources`, keep the `origin:
|
|
5062
|
+
preaggregate` entries, and invert each entry's grain-to-measures pairing.
|
|
5063
|
+
|
|
5064
|
+
|
|
5065
|
+
Choosing between two rollups and one at the combined grain is a size
|
|
5066
|
+
judgement, not a correctness one — see `grainDimensions`.
|
|
5067
|
+
required: [baseSourceName, grainDimensions, measures]
|
|
5068
|
+
properties:
|
|
5069
|
+
baseSourceName:
|
|
5070
|
+
type: string
|
|
5071
|
+
description: >-
|
|
5072
|
+
The source whose measures carry the `#@ preaggregate` annotations this
|
|
5073
|
+
rollup was synthesized from. Queries name THIS source; the rollup is
|
|
5074
|
+
selected behind it, or bypassed, per grain coverage.
|
|
5075
|
+
grainDimensions:
|
|
5076
|
+
type: array
|
|
5077
|
+
items:
|
|
5078
|
+
type: string
|
|
5079
|
+
description: >-
|
|
5080
|
+
The dimensions of the ONE grain this rollup is built at — the parsed
|
|
5081
|
+
form of a single `grain=` annotation value, so `grain="order_day,
|
|
5082
|
+
category"` reports as two entries here and not as two grains.
|
|
5083
|
+
|
|
5084
|
+
|
|
5085
|
+
**Every entry is a dimension the base source itself declares**, never
|
|
5086
|
+
a truncation written inline. `grain="order_time.day"` is refused at
|
|
5087
|
+
publish: a stored column of truncated values either shadows the base's
|
|
5088
|
+
own `order_time` and answers untruncated queries from truncated rows,
|
|
5089
|
+
or is named something no query references and serves nothing. So time
|
|
5090
|
+
grains are reached by declaring `dimension: order_day is
|
|
5091
|
+
order_time.day` on the source and naming `order_day` here.
|
|
5092
|
+
|
|
5093
|
+
|
|
5094
|
+
**Sorted, and canonically so.** Synthesis derives the rollup's name
|
|
5095
|
+
and identity from the sorted grain, so two authors who write the same
|
|
5096
|
+
dimensions in different orders get one table rather than two. Compare
|
|
5097
|
+
grains as sets using this list; never by the annotation's original
|
|
5098
|
+
string, which is not canonical.
|
|
5099
|
+
|
|
5100
|
+
|
|
5101
|
+
A query can be answered here only if this grain covers it: every
|
|
5102
|
+
dimension the query groups by is in this list, or is a coarser
|
|
5103
|
+
truncation of one (a `month` of a stored `order_day` is derivable and
|
|
5104
|
+
does route; a `day` of a stored `order_month` is not). Which makes the
|
|
5105
|
+
set of grains ACROSS a package the whole performance story, and the
|
|
5106
|
+
reason adding a rollup per query shape is the documented way to spend
|
|
5107
|
+
more on builds than you save.
|
|
5108
|
+
|
|
5109
|
+
|
|
5110
|
+
Note that covering does not require an exact match: a query grouping
|
|
5111
|
+
by a SUBSET of these dimensions — or by none of them — is served here
|
|
5112
|
+
too, by re-aggregating across the ones it omits. So one rollup at the
|
|
5113
|
+
finest grain an author needs does subsume every coarser one, and a
|
|
5114
|
+
combined grain is often the economical choice.
|
|
5115
|
+
|
|
5116
|
+
|
|
5117
|
+
That subsumption is about coverage, though, not cost, and it is why a
|
|
5118
|
+
measure may still be declared at several grains. A combined grain has
|
|
5119
|
+
roughly the PRODUCT of its dimensions' cardinalities, so
|
|
5120
|
+
`customer_id, order_day` can approach the base table's row count and
|
|
5121
|
+
save almost nothing, while `order_day` alone is tiny. Two rollups then
|
|
5122
|
+
beat one, each query reading the smallest that covers it, at the price
|
|
5123
|
+
of two tables to build and refresh. Correctness is identical either
|
|
5124
|
+
way; the choice is size against build cost.
|
|
5125
|
+
measures:
|
|
5126
|
+
type: array
|
|
5127
|
+
items:
|
|
5128
|
+
type: string
|
|
5129
|
+
description: >-
|
|
5130
|
+
The measures served at this rollup's grain, under their original names
|
|
5131
|
+
— the names a query uses, not the names of the partial-aggregate
|
|
5132
|
+
columns stored to serve them. A query using only these, at a grain
|
|
5133
|
+
this rollup covers, is eligible to be served from its table.
|
|
5134
|
+
|
|
5135
|
+
|
|
5136
|
+
These are the measures whose `#@ preaggregate` named THIS grain. A
|
|
5137
|
+
measure declared at a different grain is not missing: it is in the
|
|
5138
|
+
plan entry for that grain. Do not read this list as the base source's
|
|
5139
|
+
full set of pre-aggregated measures — that is the union of these lists
|
|
5140
|
+
across every entry sharing a `baseSourceName`.
|
|
5141
|
+
|
|
5142
|
+
|
|
5143
|
+
**Every measure that declared this grain is here.** There is no
|
|
5144
|
+
partial rollup and no per-measure omission to check: a measure that
|
|
5145
|
+
cannot be correctly re-aggregated is refused at publish, so a rollup
|
|
5146
|
+
that exists carries everything that asked to be in it.
|
|
5147
|
+
|
|
4877
5148
|
Realization:
|
|
4878
5149
|
type: string
|
|
4879
5150
|
enum: [SNAPSHOT, COPY]
|
|
@@ -5117,8 +5388,40 @@ components:
|
|
|
5117
5388
|
properties:
|
|
5118
5389
|
sourceEntityId:
|
|
5119
5390
|
type: string
|
|
5391
|
+
error:
|
|
5392
|
+
type: [string, "null"]
|
|
5393
|
+
description: >-
|
|
5394
|
+
Why this source failed to materialize, in the words the warehouse or
|
|
5395
|
+
compiler reported. Present only on a source that failed; absent on one
|
|
5396
|
+
that built, whose table the remaining fields describe. A build that
|
|
5397
|
+
loses some of its sources still returns the ones that succeeded, so an
|
|
5398
|
+
entry carrying this is how a consumer tells a failed source from a
|
|
5399
|
+
healthy one.
|
|
5120
5400
|
sourceName:
|
|
5121
5401
|
type: string
|
|
5402
|
+
description: >-
|
|
5403
|
+
The persist source this table was built for. Convenience only:
|
|
5404
|
+
`sourceEntityId` is the identity, and this is the human-readable label
|
|
5405
|
+
beside it.
|
|
5406
|
+
|
|
5407
|
+
|
|
5408
|
+
**It may name no source in any model file.** A pre-aggregation rollup
|
|
5409
|
+
is a persist source the publisher synthesized, so its name is
|
|
5410
|
+
generated (see `PersistSourcePlan.origin`). Match on
|
|
5411
|
+
`sourceEntityId`; do not resolve this against a package's models and
|
|
5412
|
+
treat a miss as a corrupt manifest.
|
|
5413
|
+
origin:
|
|
5414
|
+
type: string
|
|
5415
|
+
enum: [persist, preaggregate]
|
|
5416
|
+
default: persist
|
|
5417
|
+
description: >-
|
|
5418
|
+
Mirrors `PersistSourcePlan.origin` for the source this entry was built
|
|
5419
|
+
from: `persist` for a source the modeler wrote `#@ persist` on, which
|
|
5420
|
+
is the meaning of an absent value, and `preaggregate` for a rollup
|
|
5421
|
+
synthesized from `#@ preaggregate` measures. Repeated here because a
|
|
5422
|
+
manifest travels without its build plan, and a consumer holding only
|
|
5423
|
+
the manifest otherwise cannot tell why it holds a table for a source
|
|
5424
|
+
that does not appear in the package.
|
|
5122
5425
|
materializedTableId:
|
|
5123
5426
|
type: string
|
|
5124
5427
|
description: Echoes the caller-assigned id from the BuildInstruction.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$ as r,H as t,j as e,a1 as i,aa as o}from"./index-
|
|
1
|
+
import{$ as r,H as t,j as e,a1 as i,aa as o}from"./index-DJ-3RN5W.js";function m(){const s=r(),{environmentName:n}=t();if(n){const a=i({environmentName:n});return e.jsx(o,{onSelectPackage:s,resourceUri:a})}else return e.jsx("div",{children:e.jsx("h2",{children:"Missing environment name"})})}export{m as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$ as n,j as t,e as o}from"./index-
|
|
1
|
+
import{$ as n,j as t,e as o}from"./index-DJ-3RN5W.js";function s(){const e=n();return t.jsx(o,{onClickEnvironment:e})}export{s as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c,j as s}from"./index-
|
|
1
|
+
import{c,j as s}from"./index-DJ-3RN5W.js";const t=c(s.jsx("path",{d:"M12 3c-4.97 0-9 4.03-9 9s4.03 9 9 9 9-4.03 9-9c0-.46-.04-.92-.1-1.36-.98 1.37-2.58 2.26-4.4 2.26-2.98 0-5.4-2.42-5.4-5.4 0-1.81.89-3.42 2.26-4.4-.44-.06-.9-.1-1.36-.1"})),a=c(s.jsx("path",{d:"M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5M2 13h2c.55 0 1-.45 1-1s-.45-1-1-1H2c-.55 0-1 .45-1 1s.45 1 1 1m18 0h2c.55 0 1-.45 1-1s-.45-1-1-1h-2c-.55 0-1 .45-1 1s.45 1 1 1M11 2v2c0 .55.45 1 1 1s1-.45 1-1V2c0-.55-.45-1-1-1s-1 .45-1 1m0 18v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1s-1 .45-1 1M5.99 4.58c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0s.39-1.03 0-1.41zm12.37 12.37c-.39-.39-1.03-.39-1.41 0-.39.39-.39 1.03 0 1.41l1.06 1.06c.39.39 1.03.39 1.41 0 .39-.39.39-1.03 0-1.41zm1.06-10.96c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0zM7.05 18.36c.39-.39.39-1.03 0-1.41-.39-.39-1.03-.39-1.41 0l-1.06 1.06c-.39.39-.39 1.03 0 1.41s1.03.39 1.41 0z"}));export{t as D,a as L};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{u as Pe,g as Ee,r as u,R as Ce,a as Ie,c as S,j as t,s as M,B as Me,m as J,b as oe,d as le,f as ce,h as de,i as ze,k as O,l as pe,T as U,n as Z,o as Te,p as De,q as Re,t as ue,v as Be,w as se,x as Le,y as He,z as $e,A,C as $,M as Ne,P as Ae,D as We,E as Oe,S as Ve,F as Ue,G as Q,I as V,H as he,$ as q,J as f,K as Qe,L as xe,N as F,O as Fe,Q as Xe,U as ae,V as fe,W as me,X as ge,Y as Ye,Z as _e,_ as Ke}from"./index-
|
|
1
|
+
import{u as Pe,g as Ee,r as u,R as Ce,a as Ie,c as S,j as t,s as M,B as Me,m as J,b as oe,d as le,f as ce,h as de,i as ze,k as O,l as pe,T as U,n as Z,o as Te,p as De,q as Re,t as ue,v as Be,w as se,x as Le,y as He,z as $e,A,C as $,M as Ne,P as Ae,D as We,E as Oe,S as Ve,F as Ue,G as Q,I as V,H as he,$ as q,J as f,K as Qe,L as xe,N as F,O as Fe,Q as Xe,U as ae,V as fe,W as me,X as ge,Y as Ye,Z as _e,_ as Ke}from"./index-DJ-3RN5W.js";import{D as Ge,L as Je}from"./LightMode-CM8J0nPB.js";function Ze(e,r,n,o,s){const[a,i]=u.useState(()=>s&&n?n(e).matches:o?o(e).matches:r);return Ie(()=>{if(!n)return;const c=n(e),h=()=>{i(c.matches)};return h(),c.addEventListener("change",h),()=>{c.removeEventListener("change",h)}},[e,n]),a}const qe={...Ce},ye=qe.useSyncExternalStore;function et(e,r,n,o,s){const a=u.useCallback(()=>r,[r]),i=u.useMemo(()=>{if(s&&n)return()=>n(e).matches;if(o!==null){const{matches:p}=o(e);return()=>p}return a},[a,e,o,s,n]),[c,h]=u.useMemo(()=>{if(n===null)return[a,()=>()=>{}];const p=n(e);return[()=>p.matches,m=>(p.addEventListener("change",m),()=>{p.removeEventListener("change",m)})]},[a,n,e]);return ye(h,c,i)}function be(e={}){const{themeId:r}=e;return function(o,s={}){let a=Pe();a&&r&&(a=a[r]||a);const i=typeof window<"u"&&typeof window.matchMedia<"u",{defaultMatches:c=!1,matchMedia:h=i?window.matchMedia:null,ssrMatchMedia:x=null,noSsr:p=!1}=Ee({name:"MuiUseMediaQuery",props:s,theme:a});let m=typeof o=="function"?o(a):o;return m=m.replace(/^@media( ?)/m,""),m.includes("print")&&console.warn(["MUI: You have provided a `print` query to the `useMediaQuery` hook.","Using the print media query to modify print styles can lead to unexpected results.","Consider using the `displayPrint` field in the `sx` prop instead.","More information about `displayPrint` on our docs: https://mui.com/system/display/#display-in-print."].join(`
|
|
2
2
|
`)),(ye!==void 0?et:Ze)(m,c,h,x,p)}}be();const tt=S(t.jsx("path",{d:"M6 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm12 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-6 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"})),rt=M(Me,{name:"MuiBreadcrumbCollapsed"})(J(({theme:e})=>({display:"flex",marginLeft:`calc(${e.spacing(1)} * 0.5)`,marginRight:`calc(${e.spacing(1)} * 0.5)`,...e.palette.mode==="light"?{backgroundColor:e.palette.grey[100],color:e.palette.grey[700]}:{backgroundColor:e.palette.grey[700],color:e.palette.grey[100]},borderRadius:2,"&:hover, &:focus":{...e.palette.mode==="light"?{backgroundColor:e.palette.grey[200]}:{backgroundColor:e.palette.grey[600]}},"&:active":{boxShadow:e.shadows[0],...e.palette.mode==="light"?{backgroundColor:oe(e.palette.grey[200],.12)}:{backgroundColor:oe(e.palette.grey[600],.12)}}}))),nt=M(tt)({width:24,height:16});function ot(e){const{slots:r={},slotProps:n={},...o}=e,s=e;return t.jsx("li",{children:t.jsx(rt,{focusRipple:!0,...o,ownerState:s,children:t.jsx(nt,{as:r.CollapsedIcon,ownerState:s,...n.collapsedIcon})})})}function st(e){return ce("MuiBreadcrumbs",e)}const at=le("MuiBreadcrumbs",["root","ol","li","separator"]),it=e=>{const{classes:r}=e;return pe({root:["root"],li:["li"],ol:["ol"],separator:["separator"]},st,r)},lt=M(U,{name:"MuiBreadcrumbs",slot:"Root",overridesResolver:(e,r)=>[{[`& .${at.li}`]:r.li},r.root]})({}),ct=M("ol",{name:"MuiBreadcrumbs",slot:"Ol"})({display:"flex",flexWrap:"wrap",alignItems:"center",padding:0,margin:0,listStyle:"none"}),dt=M("li",{name:"MuiBreadcrumbs",slot:"Separator"})({display:"flex",userSelect:"none",marginLeft:8,marginRight:8});function pt(e,r,n,o){return e.reduce((s,a,i)=>(i<e.length-1?s=s.concat(a,t.jsx(dt,{"aria-hidden":!0,className:r,ownerState:o,children:n},`separator-${i}`)):s.push(a),s),[])}const ut=u.forwardRef(function(r,n){const o=de({props:r,name:"MuiBreadcrumbs"}),{children:s,className:a,component:i="nav",slots:c={},slotProps:h={},expandText:x="Show path",itemsAfterCollapse:p=1,itemsBeforeCollapse:m=1,maxItems:y=8,separator:P="/",...H}=o,[z,E]=u.useState(!1),v={...o,component:i,expanded:z,expandText:x,itemsAfterCollapse:p,itemsBeforeCollapse:m,maxItems:y,separator:P},C=it(v),T=ze({elementType:c.CollapsedIcon,externalSlotProps:h.collapsedIcon,ownerState:v}),j=u.useRef(null),k=d=>{const w=()=>{E(!0);const b=j.current.querySelector("a[href],button,[tabindex]");b&&b.focus()};return m+p>=d.length?d:[...d.slice(0,m),t.jsx(ot,{"aria-label":x,slots:{CollapsedIcon:c.CollapsedIcon},slotProps:{collapsedIcon:T},onClick:w},"ellipsis"),...d.slice(d.length-p,d.length)]},D=u.Children.toArray(s).filter(d=>u.isValidElement(d)).map((d,w)=>t.jsx("li",{className:C.li,children:d},`child-${w}`));return t.jsx(lt,{ref:n,component:i,color:"textSecondary",className:O(C.root,a),ownerState:v,...H,children:t.jsx(ct,{className:C.ol,ref:j,ownerState:v,children:pt(z||y&&D.length<=y?D:k(D),C.separator,P,v)})})});function ht(e,r,n){const o=r.getBoundingClientRect(),s=n&&n.getBoundingClientRect(),a=ue(r);let i;if(r.fakeTransform)i=r.fakeTransform;else{const x=a.getComputedStyle(r);i=x.getPropertyValue("-webkit-transform")||x.getPropertyValue("transform")}let c=0,h=0;if(i&&i!=="none"&&typeof i=="string"){const x=i.split("(")[1].split(")")[0].split(",");c=parseInt(x[4],10),h=parseInt(x[5],10)}return e==="left"?s?`translateX(${s.right+c-o.left}px)`:`translateX(${a.innerWidth+c-o.left}px)`:e==="right"?s?`translateX(-${o.right-s.left-c}px)`:`translateX(-${o.left+o.width-c}px)`:e==="up"?s?`translateY(${s.bottom+h-o.top}px)`:`translateY(${a.innerHeight+h-o.top}px)`:s?`translateY(-${o.top-s.top+o.height-h}px)`:`translateY(-${o.top+o.height-h}px)`}function xt(e){return typeof e=="function"?e():e}function W(e,r,n){const o=xt(n),s=ht(e,r,o);s&&(r.style.webkitTransform=s,r.style.transform=s)}const ft=u.forwardRef(function(r,n){const o=Z(),s={enter:o.transitions.easing.easeOut,exit:o.transitions.easing.sharp},a={enter:o.transitions.duration.enteringScreen,exit:o.transitions.duration.leavingScreen},{addEndListener:i,appear:c=!0,children:h,container:x,direction:p="down",easing:m=s,in:y,onEnter:P,onEntered:H,onEntering:z,onExit:E,onExited:v,onExiting:C,style:T,timeout:j=a,TransitionComponent:k=Te,...D}=r,d=u.useRef(null),w=De(Re(h),d,n),b=l=>g=>{l&&(g===void 0?l(d.current):l(d.current,g))},X=b((l,g)=>{W(p,l,x),Le(l),P&&P(l,g)}),te=b((l,g)=>{const L=se({timeout:j,style:T,easing:m},{mode:"enter"});l.style.webkitTransition=o.transitions.create("-webkit-transform",{...L}),l.style.transition=o.transitions.create("transform",{...L}),l.style.webkitTransform="none",l.style.transform="none",z&&z(l,g)}),R=b(H),B=b(C),I=b(l=>{const g=se({timeout:j,style:T,easing:m},{mode:"exit"});l.style.webkitTransition=o.transitions.create("-webkit-transform",g),l.style.transition=o.transitions.create("transform",g),W(p,l,x),E&&E(l)}),Y=b(l=>{l.style.webkitTransition="",l.style.transition="",v&&v(l)}),_=l=>{i&&i(d.current,l)},N=u.useCallback(()=>{d.current&&W(p,d.current,x)},[p,x]);return u.useEffect(()=>{if(y||p==="down"||p==="right")return;const l=Be(()=>{d.current&&W(p,d.current,x)}),g=ue(d.current);return g.addEventListener("resize",l),()=>{l.clear(),g.removeEventListener("resize",l)}},[p,y,x]),u.useEffect(()=>{y||N()},[y,N]),t.jsx(k,{nodeRef:d,onEnter:X,onEntered:R,onEntering:te,onExit:I,onExited:Y,onExiting:B,addEndListener:_,appear:c,in:y,timeout:j,...D,children:(l,{ownerState:g,...L})=>u.cloneElement(h,{ref:w,style:{visibility:l==="exited"&&!y?"hidden":void 0,...T,...h.props.style},...L})})});function mt(e){return ce("MuiDrawer",e)}le("MuiDrawer",["root","docked","paper","anchorLeft","anchorRight","anchorTop","anchorBottom","paperAnchorLeft","paperAnchorRight","paperAnchorTop","paperAnchorBottom","paperAnchorDockedLeft","paperAnchorDockedRight","paperAnchorDockedTop","paperAnchorDockedBottom","modal"]);const ve=(e,r)=>{const{ownerState:n}=e;return[r.root,(n.variant==="permanent"||n.variant==="persistent")&&r.docked,r.modal]},gt=e=>{const{classes:r,anchor:n,variant:o}=e,s={root:["root",`anchor${$(n)}`],docked:[(o==="permanent"||o==="persistent")&&"docked"],modal:["modal"],paper:["paper",`paperAnchor${$(n)}`,o!=="temporary"&&`paperAnchorDocked${$(n)}`]};return pe(s,mt,r)},yt=M(Ne,{name:"MuiDrawer",slot:"Root",overridesResolver:ve})(J(({theme:e})=>({zIndex:(e.vars||e).zIndex.drawer}))),bt=M("div",{shouldForwardProp:We,name:"MuiDrawer",slot:"Docked",skipVariantsResolver:!1,overridesResolver:ve})({flex:"0 0 auto"}),vt=M(Ae,{name:"MuiDrawer",slot:"Paper",overridesResolver:(e,r)=>{const{ownerState:n}=e;return[r.paper,r[`paperAnchor${$(n.anchor)}`],n.variant!=="temporary"&&r[`paperAnchorDocked${$(n.anchor)}`]]}})(J(({theme:e})=>({overflowY:"auto",display:"flex",flexDirection:"column",height:"100%",flex:"1 0 auto",zIndex:(e.vars||e).zIndex.drawer,WebkitOverflowScrolling:"touch",position:"fixed",top:0,outline:0,variants:[{props:{anchor:"left"},style:{left:0}},{props:{anchor:"top"},style:{top:0,left:0,right:0,height:"auto",maxHeight:"100%"}},{props:{anchor:"right"},style:{right:0}},{props:{anchor:"bottom"},style:{top:"auto",left:0,bottom:0,right:0,height:"auto",maxHeight:"100%"}},{props:({ownerState:r})=>r.anchor==="left"&&r.variant!=="temporary",style:{borderRight:`1px solid ${(e.vars||e).palette.divider}`}},{props:({ownerState:r})=>r.anchor==="top"&&r.variant!=="temporary",style:{borderBottom:`1px solid ${(e.vars||e).palette.divider}`}},{props:({ownerState:r})=>r.anchor==="right"&&r.variant!=="temporary",style:{borderLeft:`1px solid ${(e.vars||e).palette.divider}`}},{props:({ownerState:r})=>r.anchor==="bottom"&&r.variant!=="temporary",style:{borderTop:`1px solid ${(e.vars||e).palette.divider}`}}]}))),je={left:"right",right:"left",top:"down",bottom:"up"};function jt(e){return["left","right"].includes(e)}function kt({direction:e},r){return e==="rtl"&&jt(r)?je[r]:r}const wt=u.forwardRef(function(r,n){const o=de({props:r,name:"MuiDrawer"}),s=Z(),a=He(),i={enter:s.transitions.duration.enteringScreen,exit:s.transitions.duration.leavingScreen},{anchor:c="left",BackdropProps:h,children:x,className:p,elevation:m=16,hideBackdrop:y=!1,ModalProps:{BackdropProps:P,...H}={},onClose:z,open:E=!1,PaperProps:v={},SlideProps:C,TransitionComponent:T,transitionDuration:j=i,variant:k="temporary",slots:D={},slotProps:d={},...w}=o,b=u.useRef(!1);u.useEffect(()=>{b.current=!0},[]);const X=kt({direction:a?"rtl":"ltr"},c),R={...o,anchor:c,elevation:m,open:E,variant:k,...w},B=gt(R),I={slots:{transition:T,...D},slotProps:{paper:v,transition:C,...d,backdrop:$e(d.backdrop||{...h,...P},{transitionDuration:j})}},[Y,_]=A("root",{ref:n,elementType:yt,className:O(B.root,B.modal,p),shouldForwardComponentProp:!0,ownerState:R,externalForwardedProps:{...I,...w,...H},additionalProps:{open:E,onClose:z,hideBackdrop:y,slots:{backdrop:I.slots.backdrop},slotProps:{backdrop:I.slotProps.backdrop}}}),[N,l]=A("paper",{elementType:vt,shouldForwardComponentProp:!0,className:O(B.paper,v.className),ownerState:R,externalForwardedProps:I,additionalProps:{elevation:k==="temporary"?m:0,square:!0,...k==="temporary"&&{role:"dialog","aria-modal":"true"}}}),[g,L]=A("docked",{elementType:bt,ref:n,className:O(B.root,B.docked,p),ownerState:R,externalForwardedProps:I,additionalProps:w}),[we,Se]=A("transition",{elementType:ft,ownerState:R,externalForwardedProps:I,additionalProps:{in:E,direction:je[X],timeout:j,appear:b.current}}),re=t.jsx(N,{...l,children:x});if(k==="permanent")return t.jsx(g,{...L,children:re});const ne=t.jsx(we,{...Se,children:re});return k==="persistent"?t.jsx(g,{...L,children:ne}):t.jsx(Y,{..._,children:ne})}),St=be({themeId:Oe}),Pt=S([t.jsx("path",{d:"M19 5v14H5V5zm0-2H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2"},"0"),t.jsx("path",{d:"M14 17H7v-2h7zm3-4H7v-2h10zm0-4H7V7h10z"},"1")]),Et=S(t.jsx("path",{d:"M10.85 12.65h2.3L12 9zM20 8.69V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12zM14.3 16l-.7-2h-3.2l-.7 2H7.8L11 7h2l3.2 9z"})),Ct=S(t.jsx("path",{d:"M10 6 8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"})),It=S(t.jsx("path",{d:"M9.4 16.6 4.8 12l4.6-4.6L8 6l-6 6 6 6zm5.2 0 4.6-4.6-4.6-4.6L16 6l6 6-6 6z"})),Mt=S(t.jsx("path",{d:"m9.17 6 2 2H20v10H4V6zM10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8z"})),zt=S(t.jsx("path",{d:"m12 5.69 5 4.5V18h-2v-6H9v6H7v-7.81zM12 3 2 12h3v8h6v-6h2v6h6v-8h3z"})),Tt=S(t.jsx("path",{d:"M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3z"})),Dt=S([t.jsx("path",{d:"M12 22C6.49 22 2 17.51 2 12S6.49 2 12 2s10 4.04 10 9c0 3.31-2.69 6-6 6h-1.77c-.28 0-.5.22-.5.5 0 .12.05.23.13.33.41.47.64 1.06.64 1.67 0 1.38-1.12 2.5-2.5 2.5m0-18c-4.41 0-8 3.59-8 8s3.59 8 8 8c.28 0 .5-.22.5-.5 0-.16-.08-.28-.14-.35-.41-.46-.63-1.05-.63-1.65 0-1.38 1.12-2.5 2.5-2.5H16c2.21 0 4-1.79 4-4 0-3.86-3.59-7-8-7"},"0"),t.jsx("circle",{cx:"6.5",cy:"11.5",r:"1.5"},"1"),t.jsx("circle",{cx:"9.5",cy:"7.5",r:"1.5"},"2"),t.jsx("circle",{cx:"14.5",cy:"7.5",r:"1.5"},"3"),t.jsx("circle",{cx:"17.5",cy:"11.5",r:"1.5"},"4")]);function G(e){return t.jsxs(Ve,{...e,viewBox:"0 0 24 24",sx:{fill:"none",...e.sx},children:[t.jsx("rect",{x:"3.25",y:"4.75",width:"17.5",height:"14.5",rx:"2.25",stroke:"currentColor",strokeWidth:"1.5"}),t.jsx("line",{x1:"8.5",y1:"5",x2:"8.5",y2:"19",stroke:"currentColor",strokeWidth:"1.5"})]})}const Rt={light:"dark",dark:"auto",auto:"light"},ie={light:"Light mode (click for dark)",dark:"Dark mode (click for auto)",auto:"Auto mode (follows OS, click for light)"};function Bt(){const{mode:e,userChoice:r,setMode:n,allowUserToggle:o}=Ue();if(!o)return null;const s=r??e,a=Rt[s],i=s==="auto"?Et:s==="dark"?Ge:Je;return t.jsx(Q,{title:ie[s],children:t.jsx(V,{"aria-label":ie[s],onClick:()=>n(a),size:"small",children:t.jsx(i,{fontSize:"small"})})})}function K({label:e,onClick:r}){return t.jsx(Qe,{clickable:!0,onClick:r,label:e,size:"small","aria-label":`Navigate to ${e}`,sx:n=>({backgroundColor:"background.paper",color:"text.primary",fontWeight:500,fontSize:"0.875rem",height:32,cursor:"pointer",borderRadius:"4px",maxWidth:320,"& .MuiChip-label":{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},"&:hover":{backgroundColor:n.palette.mode==="dark"?"rgba(255, 255, 255, 0.08)":"grey.100"}})})}function Lt(){const e=he(),r=e["*"],n=q();return!e.environmentName&&!e.packageName&&!r?null:t.jsx(f,{sx:{display:"flex",alignItems:"center",minWidth:0},children:t.jsxs(ut,{"aria-label":"breadcrumb",separator:t.jsx(Ct,{sx:{fontSize:14,color:"text.secondary"}}),children:[e.environmentName&&t.jsx(K,{label:e.environmentName,onClick:o=>n(`/${e.environmentName}/`,o)}),e.packageName&&t.jsx(K,{label:e.packageName,onClick:o=>n(`/${e.environmentName}/${e.packageName}/`,o)}),r&&t.jsx(K,{label:r,onClick:o=>n(`/${e.environmentName}/${e.packageName}/${r}`,o)})]})})}const Ht=260,$t=64;function ke({isCollapsed:e,onToggleCollapse:r,logoHeader:n}){return t.jsxs(f,{sx:{height:"100dvh",width:e?$t:Ht,flexShrink:0,display:"flex",flexDirection:"column",backgroundColor:"background.paper",transition:"width 0.2s cubic-bezier(0.4, 0, 0.2, 1)",overflow:"hidden"},children:[t.jsx(Nt,{isCollapsed:e,onToggleCollapse:r,logoHeader:n}),t.jsxs(f,{sx:{flex:1,overflowY:"auto",overflowX:"hidden",py:1},children:[t.jsx(At,{isCollapsed:e}),t.jsx(Wt,{isCollapsed:e}),t.jsx(Ot,{isCollapsed:e})]}),t.jsx(Vt,{isCollapsed:e})]})}function Nt({isCollapsed:e,onToggleCollapse:r,logoHeader:n}){const o=q();return n?t.jsxs(f,{sx:{height:56,display:"flex",alignItems:"center",justifyContent:"space-between",px:e?0:2,flexShrink:0},children:[n,t.jsx(V,{size:"small",onClick:r,"aria-label":e?"Expand sidebar":"Collapse sidebar",children:t.jsx(G,{fontSize:"small"})})]}):t.jsxs(f,{sx:{minHeight:56,display:"flex",flexDirection:e?"column":"row",alignItems:"center",justifyContent:e?"center":"space-between",gap:e?.5:0,py:e?1:0,px:e?0:2,flexShrink:0},children:[t.jsxs(f,{onClick:s=>o("/",s),sx:{display:"flex",alignItems:"center",gap:1,cursor:"pointer",minWidth:0},children:[t.jsx(f,{component:"img",src:"/logo.svg",alt:"Malloy",sx:{width:24,height:24,flexShrink:0}}),!e&&t.jsx(U,{variant:"subtitle1",sx:{color:"text.primary",fontWeight:500,letterSpacing:"-0.025em",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:"Malloy Publisher"})]}),t.jsx(Q,{title:e?"Expand sidebar":"Collapse sidebar",placement:"right",children:t.jsx(V,{size:"small",onClick:r,"aria-label":e?"Expand sidebar":"Collapse sidebar",children:t.jsx(G,{fontSize:"small"})})})]})}function At({isCollapsed:e}){const n=xe().pathname==="/";return t.jsx(F,{sx:{py:0},children:t.jsx(ee,{icon:t.jsx(zt,{fontSize:"small"}),label:"Home",to:"/",selected:n,isCollapsed:e})})}function Wt({isCollapsed:e}){const{apiClients:r}=Fe(),n=he(),{data:o}=Xe({queryKey:["environments"],queryFn:()=>r.environments.listEnvironments()}),s=o?.data??[];return s.length===0?null:t.jsxs(f,{sx:{mt:1},children:[!e&&t.jsx(U,{variant:"caption",sx:{display:"block",px:3,py:1,color:"text.secondary",fontWeight:500,textTransform:"uppercase",fontSize:"0.6875rem",letterSpacing:"0.5px"},children:"Environments"}),t.jsx(F,{sx:{py:0},children:s.map(a=>{const i=a.name??"";return t.jsx(ee,{icon:t.jsx(Mt,{fontSize:"small"}),label:i,to:`/${i}`,selected:n.environmentName===i,isCollapsed:e},i)})})]})}function Ot({isCollapsed:e}){const n=xe().pathname.startsWith("/settings/theme");return t.jsxs(f,{sx:{mt:1},children:[!e&&t.jsx(U,{variant:"caption",sx:{display:"block",px:3,py:1,color:"text.secondary",fontWeight:500,textTransform:"uppercase",fontSize:"0.6875rem",letterSpacing:"0.5px"},children:"Settings"}),t.jsx(F,{sx:{py:0},children:t.jsx(ee,{icon:t.jsx(Dt,{fontSize:"small"}),label:"Visualization theme",to:"/settings/theme",selected:n,isCollapsed:e})})]})}function Vt({isCollapsed:e}){const r=[{label:"Malloy Docs",href:ae.docsHome,icon:t.jsx(Pt,{fontSize:"small"}),external:!0},{label:"Publisher Docs",href:ae.publishing,icon:t.jsx(Tt,{fontSize:"small"}),external:!0},{label:"Publisher API",href:"/api-doc.html",icon:t.jsx(It,{fontSize:"small"}),external:!1}];return t.jsx(F,{sx:{py:1},children:r.map(n=>t.jsx(Ut,{label:n.label,href:n.href,icon:n.icon,external:n.external,isCollapsed:e},n.label))})}function ee({icon:e,label:r,to:n,selected:o,isCollapsed:s}){const a=q(),i=t.jsxs(fe,{selected:o,onClick:c=>a(n,c),sx:{justifyContent:s?"center":"flex-start",px:s?0:2},children:[t.jsx(me,{sx:{minWidth:s?0:36,justifyContent:"center",color:o?"text.primary":"text.secondary"},children:e}),!s&&t.jsx(ge,{primary:r,primaryTypographyProps:{variant:"body2",sx:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}}})]});return s?t.jsx(Q,{title:r,placement:"right",children:t.jsx(f,{children:i})}):i}function Ut({label:e,href:r,icon:n,external:o,isCollapsed:s}){const a=t.jsxs(fe,{component:"a",href:r,target:o?"_blank":void 0,rel:o?"noopener noreferrer":void 0,sx:{justifyContent:s?"center":"flex-start",px:s?0:2},children:[t.jsx(me,{sx:{minWidth:s?0:36,justifyContent:"center",color:"text.secondary"},children:n}),!s&&t.jsx(ge,{primary:e,primaryTypographyProps:{variant:"body2",sx:{color:"text.secondary",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}}})]});return s?t.jsx(Q,{title:e,placement:"right",children:t.jsx(f,{children:a})}):a}function Qt({open:e,onClose:r,logoHeader:n}){return t.jsx(wt,{anchor:"left",open:e,onClose:r,ModalProps:{keepMounted:!0},sx:{display:{xs:"block",md:"none"},"& .MuiDrawer-paper":{boxSizing:"border-box",width:260}},children:t.jsx(ke,{isCollapsed:!1,onToggleCollapse:r,logoHeader:n})})}function Yt({headerProps:e}){const r=Z(),n=St(r.breakpoints.up("md")),[o,s]=u.useState(!1),[a,i]=u.useState(!1);return u.useEffect(()=>{n&&o&&s(!1)},[n,o]),t.jsxs(f,{sx:{height:"100dvh",display:"flex",flexDirection:"row",bgcolor:"background.default"},children:[n&&t.jsx(ke,{isCollapsed:a,onToggleCollapse:()=>i(c=>!c),logoHeader:e?.logoHeader}),t.jsxs(f,{component:"main",sx:{flex:1,display:"flex",flexDirection:"column",minWidth:0},children:[t.jsxs(f,{sx:{flexShrink:0,display:"flex",alignItems:"center",justifyContent:"space-between",height:Ye.headerHeight,px:{xs:1,md:3},backgroundColor:"background.default"},children:[t.jsx(f,{sx:{display:{xs:"flex",md:"none"},alignItems:"center",mr:1},children:t.jsx(V,{size:"small",onClick:()=>s(!0),"aria-label":"Open navigation",children:t.jsx(G,{fontSize:"small"})})}),t.jsx(f,{sx:{flex:1,minWidth:0,display:"flex",alignItems:"center"},children:t.jsx(Lt,{})}),t.jsxs(f,{id:"header-actions-portal",sx:{display:"flex",alignItems:"center",flexShrink:0,gap:1},children:[t.jsx(Bt,{}),e?.endCap]})]}),t.jsx(f,{sx:{flex:1,overflow:"auto",minWidth:320,minHeight:0},children:t.jsx(u.Suspense,{fallback:t.jsx(Ke,{}),children:t.jsx(_e,{})})})]}),t.jsx(Qt,{open:o,onClose:()=>s(!1),logoHeader:e?.logoHeader})]})}export{Yt as default};
|
package/dist/app/assets/{MaterializationsPage-DTkN3KGF.js → MaterializationsPage-DvVS2HMi.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{H as r,$ as t,j as e,a1 as c,a9 as o}from"./index-
|
|
1
|
+
import{H as r,$ as t,j as e,a1 as c,a9 as o}from"./index-DJ-3RN5W.js";function m(){const{environmentName:a,packageName:n}=r(),s=t();if(a)if(n){const i=c({environmentName:a,packageName:n});return e.jsx(o,{onClickPackageFile:s,resourceUri:i})}else return e.jsx("div",{children:e.jsx("h2",{children:"Missing package name"})});else return e.jsx("div",{children:e.jsx("h2",{children:"Missing environment name"})})}export{m as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{H as f,L as u,$ as v,O as k,j as e,a0 as W,a1 as p,a2 as $,J as s,a3 as b,a4 as F,a5 as R,T as o,a6 as t,a7 as d}from"./index-
|
|
1
|
+
import{H as f,L as u,$ as v,O as k,j as e,a0 as W,a1 as p,a2 as $,J as s,a3 as b,a4 as F,a5 as R,T as o,a6 as t,a7 as d}from"./index-DJ-3RN5W.js";function O(){const a=f(),n=a["*"],{search:h,hash:x}=u(),g=v(),{server:j}=k();if(!a.environmentName)return e.jsx("div",{children:e.jsx("h2",{children:"Missing environment name"})});if(!a.packageName)return e.jsx("div",{children:e.jsx("h2",{children:"Missing package name"})});if(n?.startsWith("pages/")&&!n.endsWith(".malloy")&&!n.endsWith(".malloynb")){const r=`data-apps/${n.slice(6)}`,c=encodeURIComponent(a.environmentName),N=encodeURIComponent(a.packageName);return e.jsx(W,{to:`/${c}/${N}/${r}${h}${x}`,replace:!0})}const i={p:3,maxWidth:1200,mx:"auto"};if(n?.startsWith("data-apps/")&&!n.endsWith(".malloy")&&!n.endsWith(".malloynb")){const r=n.slice(10),c=p({environmentName:a.environmentName,packageName:a.packageName,modelPath:r});return e.jsx($,{resourceUri:c})}const m=p({environmentName:a.environmentName,packageName:a.packageName,modelPath:n});if(n?.endsWith(".malloy"))return e.jsx(s,{sx:i,children:e.jsx(b,{resourceUri:m,runOnDemand:!0,maxResultSize:512*1024})});if(n?.endsWith(".malloynb"))return e.jsx(s,{sx:i,children:e.jsx(F,{resourceUri:m,maxResultSize:1024*1024,onNavigate:g})});const y=/\.[^./]+$/.test(n??""),l=R({server:j,environmentName:a.environmentName,packageName:a.packageName,path:n??""});return e.jsxs(s,{sx:i,children:[e.jsx(o,{variant:"h6",sx:{fontWeight:600},children:"Nothing to open at this path"}),e.jsxs(o,{variant:"body2",color:"text.secondary",sx:{mt:1},children:[e.jsx(s,{component:"span",sx:{fontFamily:t},children:n})," ","does not name a"," ",e.jsx(s,{component:"span",sx:{fontFamily:t},children:".malloy"})," ","or"," ",e.jsx(s,{component:"span",sx:{fontFamily:t},children:".malloynb"})," ","file in package"," ",e.jsx(s,{component:"span",sx:{fontFamily:t},children:a.packageName}),". This address opens"," ",e.jsx(s,{component:"span",sx:{fontFamily:t},children:".malloy"})," ","and"," ",e.jsx(s,{component:"span",sx:{fontFamily:t},children:".malloynb"})," ","files."]}),y&&e.jsxs(o,{variant:"body2",color:"text.secondary",sx:{mt:1},children:["A file from the package's"," ",e.jsx(s,{component:"span",sx:{fontFamily:t},children:"public/"})," ","directory is served at ",e.jsx(d,{href:l,children:l}),"."]}),e.jsxs(o,{variant:"body2",color:"text.secondary",sx:{mt:1},children:[e.jsxs(d,{href:`/${encodeURIComponent(a.environmentName)}/${encodeURIComponent(a.packageName)}`,children:["Back to ",a.packageName]})," ","lists this package's models, notebooks, and data apps."]})]})}export{O as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{H as r,$ as t,j as e,a1 as c,a8 as o}from"./index-
|
|
1
|
+
import{H as r,$ as t,j as e,a1 as c,a8 as o}from"./index-DJ-3RN5W.js";function l(){const{environmentName:a,packageName:n}=r(),s=t();if(a)if(n){const i=c({environmentName:a,packageName:n});return e.jsx(o,{onClickPackageFile:s,resourceUri:i})}else return e.jsx("div",{children:e.jsx("h2",{children:"Missing package name"})});else return e.jsx("div",{children:e.jsx("h2",{children:"Missing environment name"})})}export{l as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ab as o,j as r,ac as s,ad as n,J as t,T as a}from"./index-
|
|
1
|
+
import{ab as o,j as r,ac as s,ad as n,J as t,T as a}from"./index-DJ-3RN5W.js";function x(){const e=o();return console.error(e),r.jsx(s,{maxWidth:"lg",component:"main",sx:{display:"flex",flexDirection:"column",my:2,gap:0},children:r.jsxs(n,{sx:{m:"auto",flexDirection:"column"},children:[r.jsx(t,{sx:{height:"300px"}}),r.jsx("img",{src:"/error.png"}),r.jsx(a,{variant:"subtitle1",children:"An unexpected error occurred"})]})})}export{x as default};
|