@reddb-io/ui 0.3.0 → 0.3.1

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.
Files changed (96) hide show
  1. package/build/_app/immutable/assets/0.DgbuWrJy.css +1 -0
  2. package/build/_app/immutable/assets/AnalyticsView.BLAJezw4.css +1 -0
  3. package/build/_app/immutable/assets/{Workspace.CvP5De7i.css → Workspace.DM2E1WiF.css} +1 -1
  4. package/build/_app/immutable/chunks/85-Fh5Zp.js +404 -0
  5. package/build/_app/immutable/chunks/{C9rXzYLu.js → 8zg2gJwV.js} +1 -1
  6. package/build/_app/immutable/chunks/B5euRbKa.js +1 -0
  7. package/build/_app/immutable/chunks/BRIMmWzq.js +1 -0
  8. package/build/_app/immutable/chunks/BgOTHNR5.js +1 -0
  9. package/build/_app/immutable/chunks/Bq4DTWK2.js +2 -0
  10. package/build/_app/immutable/chunks/Btd6PFkC.js +1 -0
  11. package/build/_app/immutable/chunks/CGFL56WJ.js +1 -0
  12. package/build/_app/immutable/chunks/CJFJ501n.js +18 -0
  13. package/build/_app/immutable/chunks/CLBx21Hz.js +2 -0
  14. package/build/_app/immutable/chunks/CnD4hwxC.js +1106 -0
  15. package/build/_app/immutable/chunks/DCJ0QyYH.js +1 -0
  16. package/build/_app/immutable/chunks/DQCYUNtS.js +1 -0
  17. package/build/_app/immutable/chunks/DRlh90Cv.js +1 -0
  18. package/build/_app/immutable/chunks/{C278awGv.js → DV9PDoM3.js} +1 -1
  19. package/build/_app/immutable/entry/app.BDog2y0J.js +2 -0
  20. package/build/_app/immutable/entry/start.D1J45dq5.js +1 -0
  21. package/build/_app/immutable/nodes/0.BTrC4th2.js +1 -0
  22. package/build/_app/immutable/nodes/1.Ds1Tbjsm.js +1 -0
  23. package/build/_app/immutable/nodes/10.D_FCLs0Z.js +96 -0
  24. package/build/_app/immutable/nodes/12.DPE6v6Zf.js +3 -0
  25. package/build/_app/immutable/nodes/14.CAG5_cGP.js +1 -0
  26. package/build/_app/immutable/nodes/15.CcJlZGxa.js +60 -0
  27. package/build/_app/immutable/nodes/8.CAG5_cGP.js +1 -0
  28. package/build/_app/version.json +1 -1
  29. package/build/index.html +18 -15
  30. package/dist/embed/AnalyticsView-D8z1Nsed.js +23337 -0
  31. package/dist/embed/AnalyticsView-D8z1Nsed.js.map +1 -0
  32. package/dist/embed/RedUiEmbedRoot-CtqTd_FG.js +31302 -0
  33. package/dist/embed/RedUiEmbedRoot-CtqTd_FG.js.map +1 -0
  34. package/dist/embed/index-0hA141D2.js +85 -0
  35. package/dist/embed/index-0hA141D2.js.map +1 -0
  36. package/dist/embed/index-client-BeiP-va5.js +3303 -0
  37. package/dist/embed/index-client-BeiP-va5.js.map +1 -0
  38. package/dist/embed/index-w1Qo_uW0.js +677 -0
  39. package/dist/embed/index-w1Qo_uW0.js.map +1 -0
  40. package/dist/embed/index.js +1 -1
  41. package/dist/embed/{sigma.esm-D5yoExsH.js → sigma.esm-qqKBpvin.js} +2 -2
  42. package/dist/embed/{sigma.esm-D5yoExsH.js.map → sigma.esm-qqKBpvin.js.map} +1 -1
  43. package/package.json +5 -3
  44. package/src/app.css +86 -20
  45. package/src/lib/AnalyticsView.svelte +209 -0
  46. package/src/lib/AskView.svelte +255 -0
  47. package/src/lib/ClusterView.svelte +415 -95
  48. package/src/lib/CommandPalette.svelte +2 -0
  49. package/src/lib/GlobalProgressBar.svelte +9 -0
  50. package/src/lib/MetricChart.svelte +85 -0
  51. package/src/lib/QueryEditor.svelte +48 -7
  52. package/src/lib/ResultsPane.svelte +76 -8
  53. package/src/lib/SchemaTree.svelte +25 -1
  54. package/src/lib/SecurityView.svelte +176 -65
  55. package/src/lib/SettingsView.svelte +1111 -254
  56. package/src/lib/Topbar.svelte +29 -1
  57. package/src/lib/Workspace.svelte +18 -3
  58. package/src/lib/activity.svelte.ts +44 -35
  59. package/src/lib/collection-preview.ts +14 -0
  60. package/src/lib/connections.svelte.ts +73 -4
  61. package/src/lib/index.ts +3 -0
  62. package/src/lib/permission-gate.ts +120 -0
  63. package/src/lib/policies.ts +136 -0
  64. package/src/lib/query-tabs.svelte.ts +132 -53
  65. package/src/lib/reddb/analytics.ts +208 -0
  66. package/src/lib/reddb/ask.ts +123 -0
  67. package/src/lib/reddb/client.ts +159 -58
  68. package/src/lib/reddb/cluster-status.ts +306 -0
  69. package/src/lib/reddb/index.ts +3 -0
  70. package/src/lib/reddb/local-url-provider.ts +32 -1
  71. package/src/lib/reddb/redwire-ws-spike.ts +590 -0
  72. package/src/lib/router.svelte.ts +12 -0
  73. package/src/lib/settings-authoring-client.ts +336 -0
  74. package/src/lib/settings-sections.ts +292 -196
  75. package/build/_app/immutable/assets/0.DQDLkSdR.css +0 -1
  76. package/build/_app/immutable/chunks/65XjEwaF.js +0 -367
  77. package/build/_app/immutable/chunks/BGcIe2ep.js +0 -2
  78. package/build/_app/immutable/chunks/BjFADNkA.js +0 -992
  79. package/build/_app/immutable/chunks/BrvvOVaJ.js +0 -1
  80. package/build/_app/immutable/chunks/D9CTkMjK.js +0 -1
  81. package/build/_app/immutable/chunks/oiO4RLqp.js +0 -1
  82. package/build/_app/immutable/chunks/pDJnDxXM.js +0 -1
  83. package/build/_app/immutable/entry/app.DdaMXHAv.js +0 -2
  84. package/build/_app/immutable/entry/start.-MLBtQXB.js +0 -1
  85. package/build/_app/immutable/nodes/0.Ysoz3Y3h.js +0 -1
  86. package/build/_app/immutable/nodes/1.C2jbGTOJ.js +0 -1
  87. package/build/_app/immutable/nodes/12.DQG5zpEx.js +0 -60
  88. package/build/_app/immutable/nodes/8.CrHI4F9p.js +0 -134
  89. package/dist/embed/RedUiEmbedRoot-BwFUA5X-.js +0 -28624
  90. package/dist/embed/RedUiEmbedRoot-BwFUA5X-.js.map +0 -1
  91. package/dist/embed/index-DGhgtnaK.js +0 -577
  92. package/dist/embed/index-DGhgtnaK.js.map +0 -1
  93. package/dist/embed/index-client-ItCEU64C.js +0 -3087
  94. package/dist/embed/index-client-ItCEU64C.js.map +0 -1
  95. /package/build/_app/immutable/assets/{12.Dblyk0Kr.css → 15.Dblyk0Kr.css} +0 -0
  96. /package/build/_app/immutable/nodes/{10.CAG5_cGP.js → 13.CAG5_cGP.js} +0 -0
@@ -0,0 +1,85 @@
1
+ import { invoke as d } from "./core-QuRYvMt8.js";
2
+ const u = "Request cancelled";
3
+ async function k(R, e) {
4
+ const t = e == null ? void 0 : e.signal;
5
+ if (t != null && t.aborted)
6
+ throw new Error(u);
7
+ const v = e == null ? void 0 : e.maxRedirections, E = e == null ? void 0 : e.connectTimeout, A = e == null ? void 0 : e.proxy, g = e == null ? void 0 : e.danger;
8
+ e && (delete e.maxRedirections, delete e.connectTimeout, delete e.proxy, delete e.danger);
9
+ const o = e != null && e.headers ? e.headers instanceof Headers ? e.headers : new Headers(e.headers) : new Headers(), c = new Request(R, e), f = await c.arrayBuffer(), x = f.byteLength !== 0 ? Array.from(new Uint8Array(f)) : null;
10
+ for (const [r, a] of c.headers)
11
+ o.get(r) || o.set(r, a);
12
+ const H = (o instanceof Headers ? Array.from(o.entries()) : Array.isArray(o) ? o : Object.entries(o)).map(([r, a]) => [
13
+ r,
14
+ // we need to ensure we have all header values as strings
15
+ // eslint-disable-next-line
16
+ typeof a == "string" ? a : a.toString()
17
+ ]);
18
+ if (t != null && t.aborted)
19
+ throw new Error(u);
20
+ const h = await d("plugin:http|fetch", {
21
+ clientConfig: {
22
+ method: c.method,
23
+ url: c.url,
24
+ headers: H,
25
+ data: x,
26
+ maxRedirections: v,
27
+ connectTimeout: E,
28
+ proxy: A,
29
+ danger: g
30
+ }
31
+ }), y = () => d("plugin:http|fetch_cancel", { rid: h });
32
+ if (t != null && t.aborted)
33
+ throw y(), new Error(u);
34
+ t == null || t.addEventListener("abort", () => void y());
35
+ const { status: p, statusText: _, url: b, headers: w, rid: m } = await d("plugin:http|fetch_send", {
36
+ rid: h
37
+ }), l = () => d("plugin:http|fetch_cancel_body", { rid: m }), L = async (r) => {
38
+ let a;
39
+ try {
40
+ a = await d("plugin:http|fetch_read_body", {
41
+ rid: m
42
+ });
43
+ } catch (T) {
44
+ r.error(T), l();
45
+ return;
46
+ }
47
+ const n = new Uint8Array(a), C = n[n.byteLength - 1], P = n.slice(0, n.byteLength - 1);
48
+ if (C === 1) {
49
+ r.close();
50
+ return;
51
+ }
52
+ r.enqueue(P);
53
+ }, O = [101, 103, 204, 205, 304].includes(p) ? null : new ReadableStream({
54
+ start: (r) => {
55
+ t == null || t.addEventListener("abort", () => {
56
+ r.error(u), l();
57
+ });
58
+ },
59
+ pull: (r) => L(r),
60
+ cancel: () => {
61
+ l();
62
+ }
63
+ }), s = new Response(O, {
64
+ status: p,
65
+ statusText: _
66
+ });
67
+ Object.defineProperty(s, "url", { value: b, writable: !1 }), Object.defineProperty(s, "headers", {
68
+ value: new Headers(w),
69
+ writable: !1
70
+ });
71
+ const j = s.clone.bind(s);
72
+ return Object.defineProperty(s, "clone", {
73
+ value: () => {
74
+ const r = j();
75
+ return Object.defineProperty(r, "url", { value: b, writable: !1 }), Object.defineProperty(r, "headers", {
76
+ value: new Headers(w),
77
+ writable: !1
78
+ }), r;
79
+ }
80
+ }), s;
81
+ }
82
+ export {
83
+ k as fetch
84
+ };
85
+ //# sourceMappingURL=index-0hA141D2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-0hA141D2.js","sources":["../../../../node_modules/.pnpm/@tauri-apps+plugin-http@2.5.9/node_modules/@tauri-apps/plugin-http/dist-js/index.js"],"sourcesContent":["import { invoke } from '@tauri-apps/api/core';\n\n// Copyright 2019-2023 Tauri Programme within The Commons Conservancy\n// SPDX-License-Identifier: Apache-2.0\n// SPDX-License-Identifier: MIT\n/**\n * Make HTTP requests with the Rust backend.\n *\n * ## Security\n *\n * This API has a scope configuration that forces you to restrict the URLs that can be accessed using glob patterns.\n *\n * For instance, this scope configuration only allows making HTTP requests to all subdomains for `tauri.app` except for `https://private.tauri.app`:\n * ```json\n * {\n * \"permissions\": [\n * {\n * \"identifier\": \"http:default\",\n * \"allow\": [{ \"url\": \"https://*.tauri.app\" }],\n * \"deny\": [{ \"url\": \"https://private.tauri.app\" }]\n * }\n * ]\n * }\n * ```\n * Trying to execute any API with a URL not configured on the scope results in a promise rejection due to denied access.\n *\n * @module\n */\nconst ERROR_REQUEST_CANCELLED = 'Request cancelled';\n/**\n * Fetch a resource from the network. It returns a `Promise` that resolves to the\n * `Response` to that `Request`, whether it is successful or not.\n *\n * @example\n * ```typescript\n * const response = await fetch(\"http://my.json.host/data.json\");\n * console.log(response.status); // e.g. 200\n * console.log(response.statusText); // e.g. \"OK\"\n * const jsonData = await response.json();\n * ```\n *\n * @since 2.0.0\n */\nasync function fetch(input, init) {\n // Optimistically check for abort signal and avoid doing any work\n const signal = init?.signal;\n if (signal?.aborted) {\n throw new Error(ERROR_REQUEST_CANCELLED);\n }\n const maxRedirections = init?.maxRedirections;\n const connectTimeout = init?.connectTimeout;\n const proxy = init?.proxy;\n const danger = init?.danger;\n // Remove these fields before creating the request\n if (init) {\n delete init.maxRedirections;\n delete init.connectTimeout;\n delete init.proxy;\n delete init.danger;\n }\n const headers = init?.headers\n ? init.headers instanceof Headers\n ? init.headers\n : new Headers(init.headers)\n : new Headers();\n const req = new Request(input, init);\n const buffer = await req.arrayBuffer();\n const data = buffer.byteLength !== 0 ? Array.from(new Uint8Array(buffer)) : null;\n // append new headers created by the browser `Request` implementation,\n // if not already declared by the caller of this function\n for (const [key, value] of req.headers) {\n if (!headers.get(key)) {\n headers.set(key, value);\n }\n }\n const headersArray = headers instanceof Headers\n ? Array.from(headers.entries())\n : Array.isArray(headers)\n ? headers\n : Object.entries(headers);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const mappedHeaders = headersArray.map(([name, val]) => [\n name,\n // we need to ensure we have all header values as strings\n // eslint-disable-next-line\n typeof val === 'string' ? val : val.toString()\n ]);\n // Optimistically check for abort signal and avoid doing any work on the Rust side\n if (signal?.aborted) {\n throw new Error(ERROR_REQUEST_CANCELLED);\n }\n const rid = await invoke('plugin:http|fetch', {\n clientConfig: {\n method: req.method,\n url: req.url,\n headers: mappedHeaders,\n data,\n maxRedirections,\n connectTimeout,\n proxy,\n danger\n }\n });\n const abort = () => invoke('plugin:http|fetch_cancel', { rid });\n // Optimistically check for abort signal\n // and avoid doing any work after doing intial work on the Rust side\n if (signal?.aborted) {\n // we don't care about the result of this proimse\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n abort();\n throw new Error(ERROR_REQUEST_CANCELLED);\n }\n signal?.addEventListener('abort', () => void abort());\n const { status, statusText, url, headers: responseHeaders, rid: responseRid } = await invoke('plugin:http|fetch_send', {\n rid\n });\n const dropBody = () => {\n return invoke('plugin:http|fetch_cancel_body', { rid: responseRid });\n };\n const readChunk = async (controller) => {\n let data;\n try {\n data = await invoke('plugin:http|fetch_read_body', {\n rid: responseRid\n });\n }\n catch (e) {\n // close the stream if an error occurs\n // and drop the body on Rust side\n controller.error(e);\n void dropBody();\n return;\n }\n const dataUint8 = new Uint8Array(data);\n const lastByte = dataUint8[dataUint8.byteLength - 1];\n const actualData = dataUint8.slice(0, dataUint8.byteLength - 1);\n // close when the signal to close (last byte is 1) is sent from the IPC.\n if (lastByte === 1) {\n controller.close();\n return;\n }\n controller.enqueue(actualData);\n };\n // no body for 101, 103, 204, 205 and 304\n // see https://fetch.spec.whatwg.org/#null-body-status\n const body = [101, 103, 204, 205, 304].includes(status)\n ? null\n : new ReadableStream({\n start: (controller) => {\n // listen for abort events to cancel reading\n signal?.addEventListener('abort', () => {\n controller.error(ERROR_REQUEST_CANCELLED);\n void dropBody();\n });\n },\n pull: (controller) => readChunk(controller),\n cancel: () => {\n // Ensure body resources are released on stream cancellation\n void dropBody();\n }\n });\n const res = new Response(body, {\n status,\n statusText\n });\n // `Response.url` cannot be set via the constructor, so we define it manually\n Object.defineProperty(res, 'url', { value: url, writable: false });\n // Expose `set-cookie` via `response.headers` (and `getSetCookie()` where\n // supported). This is not Fetch-spec compliant for network responses in\n // browsers, where `set-cookie` is treated as a forbidden response\n // header and is generally not readable from JavaScript.\n Object.defineProperty(res, 'headers', {\n value: new Headers(responseHeaders),\n writable: false\n });\n // Patch clone() per-instance so cloning preserves the overridden properties\n const originalClone = res.clone.bind(res);\n Object.defineProperty(res, 'clone', {\n value: () => {\n const cloned = originalClone();\n Object.defineProperty(cloned, 'url', { value: url, writable: false });\n Object.defineProperty(cloned, 'headers', {\n value: new Headers(responseHeaders),\n writable: false\n });\n return cloned;\n }\n });\n return res;\n}\n\nexport { fetch };\n"],"names":["ERROR_REQUEST_CANCELLED","fetch","input","init","signal","maxRedirections","connectTimeout","proxy","danger","headers","req","buffer","data","key","value","mappedHeaders","name","val","rid","invoke","abort","status","statusText","url","responseHeaders","responseRid","dropBody","readChunk","controller","e","dataUint8","lastByte","actualData","body","res","originalClone","cloned"],"mappings":"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","x_google_ignoreList":[0]}