@nbt-dev/components 0.1.5 → 0.1.7
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/dist/{chunk-5JKRR7HY.js → chunk-WLGJKJF4.js} +53 -24
- package/dist/chunk-WLGJKJF4.js.map +7 -0
- package/dist/core/index.d.ts +3 -1
- package/dist/core/use-permissions-api.d.ts +30 -0
- package/dist/core/use-workflows.d.ts +13 -18
- package/dist/editor/index.js +1 -1
- package/dist/editor/nbt-editor.d.ts +2 -0
- package/dist/index.js +81 -46
- package/dist/index.js.map +4 -4
- package/package.json +2 -1
- package/src/core/index.ts +3 -2
- package/src/core/use-permissions-api.ts +111 -0
- package/src/core/use-workflows.ts +32 -66
- package/src/editor/lsp-extensions.ts +6 -4
- package/src/editor/nbt-editor.tsx +53 -17
- package/dist/chunk-5JKRR7HY.js.map +0 -7
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
// src/editor/nbt-editor.tsx
|
|
4
4
|
import React from "react";
|
|
5
|
-
import { Compartment, EditorState, Prec } from "@codemirror/state";
|
|
5
|
+
import { Compartment, EditorState, Prec as Prec2 } from "@codemirror/state";
|
|
6
6
|
import {
|
|
7
7
|
EditorView as EditorView3,
|
|
8
8
|
keymap as keymap2,
|
|
9
9
|
lineNumbers,
|
|
10
10
|
drawSelection,
|
|
11
|
+
rectangularSelection,
|
|
12
|
+
crosshairCursor,
|
|
11
13
|
highlightActiveLine
|
|
12
14
|
} from "@codemirror/view";
|
|
13
15
|
import {
|
|
@@ -25,6 +27,7 @@ import {
|
|
|
25
27
|
import { lintGutter } from "@codemirror/lint";
|
|
26
28
|
import { searchKeymap } from "@codemirror/search";
|
|
27
29
|
import { completionKeymap, closeBrackets } from "@codemirror/autocomplete";
|
|
30
|
+
import { vscodeKeymap } from "@replit/codemirror-vscode-keymap";
|
|
28
31
|
|
|
29
32
|
// src/editor/nbt-language.ts
|
|
30
33
|
import {
|
|
@@ -365,6 +368,7 @@ function themeExtension(id) {
|
|
|
365
368
|
}
|
|
366
369
|
|
|
367
370
|
// src/editor/lsp-extensions.ts
|
|
371
|
+
import { Prec } from "@codemirror/state";
|
|
368
372
|
import {
|
|
369
373
|
ViewPlugin,
|
|
370
374
|
hoverTooltip,
|
|
@@ -482,7 +486,7 @@ function lspExtensions(client, uri, onGotoDefinition) {
|
|
|
482
486
|
}
|
|
483
487
|
};
|
|
484
488
|
});
|
|
485
|
-
const gotoDef = keymap.of([
|
|
489
|
+
const gotoDef = Prec.high(keymap.of([
|
|
486
490
|
{
|
|
487
491
|
key: "F12",
|
|
488
492
|
run: (view) => {
|
|
@@ -504,10 +508,12 @@ function lspExtensions(client, uri, onGotoDefinition) {
|
|
|
504
508
|
return true;
|
|
505
509
|
}
|
|
506
510
|
}
|
|
507
|
-
]);
|
|
511
|
+
]));
|
|
508
512
|
return [
|
|
509
513
|
syncPlugin,
|
|
510
|
-
|
|
514
|
+
// The active keymap (vscode or stock CM) owns completion keys; disable
|
|
515
|
+
// autocompletion's own bindings so they don't double up / conflict.
|
|
516
|
+
autocompletion({ override: [completionSource], defaultKeymap: false }),
|
|
511
517
|
hover,
|
|
512
518
|
gotoDef
|
|
513
519
|
];
|
|
@@ -523,11 +529,28 @@ function sizingTheme(fontSize) {
|
|
|
523
529
|
});
|
|
524
530
|
}
|
|
525
531
|
function indentConfig(tabSize) {
|
|
526
|
-
return
|
|
532
|
+
return Prec2.high([
|
|
527
533
|
indentUnit2.of(" ".repeat(tabSize)),
|
|
528
534
|
EditorState.tabSize.of(tabSize)
|
|
529
535
|
]);
|
|
530
536
|
}
|
|
537
|
+
function keymapExtension(mode) {
|
|
538
|
+
if (mode === "codemirror") {
|
|
539
|
+
return keymap2.of([
|
|
540
|
+
...defaultKeymap,
|
|
541
|
+
...historyKeymap,
|
|
542
|
+
...searchKeymap,
|
|
543
|
+
...completionKeymap,
|
|
544
|
+
indentWithTab
|
|
545
|
+
]);
|
|
546
|
+
}
|
|
547
|
+
return [
|
|
548
|
+
keymap2.of(vscodeKeymap),
|
|
549
|
+
// VSCode adds a cursor with Alt-click (Alt-drag → box select, already wired
|
|
550
|
+
// via rectangularSelection); CM6's default is Ctrl/Cmd-click.
|
|
551
|
+
EditorView3.clickAddsSelectionRange.of((e) => e.altKey)
|
|
552
|
+
];
|
|
553
|
+
}
|
|
531
554
|
var NbtEditor = ({
|
|
532
555
|
uri,
|
|
533
556
|
value,
|
|
@@ -539,7 +562,8 @@ var NbtEditor = ({
|
|
|
539
562
|
theme = "vscodeDark",
|
|
540
563
|
fontSize = 12,
|
|
541
564
|
lineWrap = false,
|
|
542
|
-
tabSize = 2
|
|
565
|
+
tabSize = 2,
|
|
566
|
+
keymap: keymapMode = "vscode"
|
|
543
567
|
}) => {
|
|
544
568
|
const hostRef = React.useRef(null);
|
|
545
569
|
const viewRef = React.useRef(null);
|
|
@@ -552,8 +576,9 @@ var NbtEditor = ({
|
|
|
552
576
|
const themeComp = React.useRef(new Compartment());
|
|
553
577
|
const wrapComp = React.useRef(new Compartment());
|
|
554
578
|
const indentComp = React.useRef(new Compartment());
|
|
555
|
-
const
|
|
556
|
-
settingsRef
|
|
579
|
+
const keymapComp = React.useRef(new Compartment());
|
|
580
|
+
const settingsRef = React.useRef({ theme, fontSize, lineWrap, tabSize, keymapMode });
|
|
581
|
+
settingsRef.current = { theme, fontSize, lineWrap, tabSize, keymapMode };
|
|
557
582
|
React.useEffect(() => {
|
|
558
583
|
const host = hostRef.current;
|
|
559
584
|
if (!host) return;
|
|
@@ -562,6 +587,9 @@ var NbtEditor = ({
|
|
|
562
587
|
lineNumbers(),
|
|
563
588
|
history(),
|
|
564
589
|
drawSelection(),
|
|
590
|
+
rectangularSelection(),
|
|
591
|
+
crosshairCursor(),
|
|
592
|
+
EditorState.allowMultipleSelections.of(true),
|
|
565
593
|
highlightActiveLine(),
|
|
566
594
|
bracketMatching(),
|
|
567
595
|
closeBrackets(),
|
|
@@ -571,20 +599,20 @@ var NbtEditor = ({
|
|
|
571
599
|
indentComp.current.of(indentConfig(s.tabSize)),
|
|
572
600
|
themeComp.current.of([sizingTheme(s.fontSize), themeExtension(s.theme)]),
|
|
573
601
|
wrapComp.current.of(s.lineWrap ? EditorView3.lineWrapping : []),
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
602
|
+
// Save wins over whichever keymap set is active — kept out of the swappable
|
|
603
|
+
// compartment so a mode change can't drop it.
|
|
604
|
+
Prec2.high(
|
|
605
|
+
keymap2.of([
|
|
606
|
+
{
|
|
607
|
+
key: "Mod-s",
|
|
608
|
+
run: (view2) => {
|
|
609
|
+
onSaveRef.current?.(view2.state.doc.toString());
|
|
610
|
+
return true;
|
|
611
|
+
}
|
|
580
612
|
}
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
...searchKeymap,
|
|
585
|
-
...completionKeymap,
|
|
586
|
-
indentWithTab
|
|
587
|
-
]),
|
|
613
|
+
])
|
|
614
|
+
),
|
|
615
|
+
keymapComp.current.of(keymapExtension(s.keymapMode)),
|
|
588
616
|
EditorView3.updateListener.of((u) => {
|
|
589
617
|
if (u.docChanged) onChangeRef.current?.(u.state.doc.toString());
|
|
590
618
|
}),
|
|
@@ -615,10 +643,11 @@ var NbtEditor = ({
|
|
|
615
643
|
themeExtension(theme)
|
|
616
644
|
]),
|
|
617
645
|
wrapComp.current.reconfigure(lineWrap ? EditorView3.lineWrapping : []),
|
|
618
|
-
indentComp.current.reconfigure(indentConfig(tabSize))
|
|
646
|
+
indentComp.current.reconfigure(indentConfig(tabSize)),
|
|
647
|
+
keymapComp.current.reconfigure(keymapExtension(keymapMode))
|
|
619
648
|
]
|
|
620
649
|
});
|
|
621
|
-
}, [theme, fontSize, lineWrap, tabSize]);
|
|
650
|
+
}, [theme, fontSize, lineWrap, tabSize, keymapMode]);
|
|
622
651
|
return /* @__PURE__ */ jsx("div", { ref: hostRef, className: "h-full min-h-0 overflow-hidden" });
|
|
623
652
|
};
|
|
624
653
|
|
|
@@ -816,4 +845,4 @@ export {
|
|
|
816
845
|
NbtEditor,
|
|
817
846
|
NbtLspClient
|
|
818
847
|
};
|
|
819
|
-
//# sourceMappingURL=chunk-
|
|
848
|
+
//# sourceMappingURL=chunk-WLGJKJF4.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/editor/nbt-editor.tsx", "../src/editor/nbt-language.ts", "../src/editor/editor-themes.ts", "../src/editor/lsp-extensions.ts", "../src/editor/lsp-client.ts"],
|
|
4
|
+
"sourcesContent": ["// CodeMirror 6 React wrapper for one NBT buffer. Recreated per uri (keyed by\n// the host); owns the EditorView lifecycle, Ctrl+S save, and the LSP wiring.\n// Theme / font size / line-wrap / tab size are live-tunable via compartments so\n// changing a setting doesn't blow away cursor + scroll.\n\nimport React from \"react\";\nimport { Compartment, EditorState, Prec, type Extension } from \"@codemirror/state\";\nimport {\n EditorView,\n keymap,\n lineNumbers,\n drawSelection,\n rectangularSelection,\n crosshairCursor,\n highlightActiveLine,\n} from \"@codemirror/view\";\nimport {\n defaultKeymap,\n history,\n historyKeymap,\n indentWithTab,\n} from \"@codemirror/commands\";\nimport {\n syntaxHighlighting,\n defaultHighlightStyle,\n bracketMatching,\n indentUnit,\n} from \"@codemirror/language\";\nimport { lintGutter } from \"@codemirror/lint\";\nimport { searchKeymap } from \"@codemirror/search\";\nimport { completionKeymap, closeBrackets } from \"@codemirror/autocomplete\";\nimport { vscodeKeymap } from \"@replit/codemirror-vscode-keymap\";\nimport { nbtLanguageSupport } from \"./nbt-language\";\nimport { themeExtension } from \"./editor-themes\";\nimport { lspExtensions, type GotoDefHandler } from \"./lsp-extensions\";\nimport { NbtLspClient } from \"./lsp-client\";\n\n// Sizing only \u2014 the selected color theme owns the rest. Built per font-size so\n// the theme compartment can carry both.\nfunction sizingTheme(fontSize: number) {\n return EditorView.theme({\n \"&\": { height: \"100%\", fontSize: `${fontSize}px` },\n \".cm-content\": { fontFamily: \"ui-monospace, monospace\" },\n \"&.cm-focused\": { outline: \"none\" },\n });\n}\n\n// `Prec.high` so this wins the indentUnit/tabSize facets over the\n// `indentUnit.of(\" \")` baked into nbtLanguageSupport().\nfunction indentConfig(tabSize: number) {\n return Prec.high([\n indentUnit.of(\" \".repeat(tabSize)),\n EditorState.tabSize.of(tabSize),\n ]);\n}\n\nexport type EditorKeymap = \"vscode\" | \"codemirror\";\n\n// The mode-specific bindings, swapped live via a compartment. `vscode` is the\n// full VSCode set (multi-cursor, history, search, completion, folding \u2014 all of\n// it) INCLUDING the Alt-click / Alt-drag modifier for adding cursors (CM6\n// defaults that to Ctrl/Cmd). `codemirror` is the stock CM6 stack \u2014 keyboard\n// bindings plus the default Mod-click modifier. The Mod-s save is NOT here \u2014\n// it's a separate high-prec binding so it survives the swap and wins over both.\nfunction keymapExtension(mode: EditorKeymap): Extension {\n if (mode === \"codemirror\") {\n return keymap.of([\n ...defaultKeymap,\n ...historyKeymap,\n ...searchKeymap,\n ...completionKeymap,\n indentWithTab,\n ]);\n }\n return [\n keymap.of(vscodeKeymap),\n // VSCode adds a cursor with Alt-click (Alt-drag \u2192 box select, already wired\n // via rectangularSelection); CM6's default is Ctrl/Cmd-click.\n EditorView.clickAddsSelectionRange.of((e) => e.altKey),\n ];\n}\n\nexport type NbtEditorProps = {\n uri: string;\n value: string;\n readOnly?: boolean;\n lsp?: NbtLspClient | null;\n onChange?: (text: string) => void;\n onSave?: (text: string) => void;\n onGotoDefinition?: GotoDefHandler;\n theme?: string;\n fontSize?: number;\n lineWrap?: boolean;\n tabSize?: number;\n keymap?: EditorKeymap;\n};\n\nexport const NbtEditor: React.FC<NbtEditorProps> = ({\n uri,\n value,\n readOnly = false,\n lsp,\n onChange,\n onSave,\n onGotoDefinition,\n theme = \"vscodeDark\",\n fontSize = 12,\n lineWrap = false,\n tabSize = 2,\n keymap: keymapMode = \"vscode\",\n}) => {\n const hostRef = React.useRef<HTMLDivElement | null>(null);\n const viewRef = React.useRef<EditorView | null>(null);\n\n // Latest callbacks without recreating the view.\n const onChangeRef = React.useRef(onChange);\n onChangeRef.current = onChange;\n const onSaveRef = React.useRef(onSave);\n onSaveRef.current = onSave;\n const onGotoRef = React.useRef(onGotoDefinition);\n onGotoRef.current = onGotoDefinition;\n\n // Live-tunable settings live in compartments. Keep the latest values in a ref\n // so a view rebuild (new uri/mode) seeds the right config without listing the\n // settings in the create-effect deps.\n const themeComp = React.useRef(new Compartment());\n const wrapComp = React.useRef(new Compartment());\n const indentComp = React.useRef(new Compartment());\n const keymapComp = React.useRef(new Compartment());\n const settingsRef = React.useRef({ theme, fontSize, lineWrap, tabSize, keymapMode });\n settingsRef.current = { theme, fontSize, lineWrap, tabSize, keymapMode };\n\n React.useEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n\n const s = settingsRef.current;\n const extensions = [\n lineNumbers(),\n history(),\n drawSelection(),\n rectangularSelection(),\n crosshairCursor(),\n EditorState.allowMultipleSelections.of(true),\n highlightActiveLine(),\n bracketMatching(),\n closeBrackets(),\n lintGutter(),\n syntaxHighlighting(defaultHighlightStyle, { fallback: true }),\n nbtLanguageSupport(),\n indentComp.current.of(indentConfig(s.tabSize)),\n themeComp.current.of([sizingTheme(s.fontSize), themeExtension(s.theme)]),\n wrapComp.current.of(s.lineWrap ? EditorView.lineWrapping : []),\n // Save wins over whichever keymap set is active \u2014 kept out of the swappable\n // compartment so a mode change can't drop it.\n Prec.high(\n keymap.of([\n {\n key: \"Mod-s\",\n run: (view) => {\n onSaveRef.current?.(view.state.doc.toString());\n return true;\n },\n },\n ]),\n ),\n keymapComp.current.of(keymapExtension(s.keymapMode)),\n EditorView.updateListener.of((u) => {\n if (u.docChanged) onChangeRef.current?.(u.state.doc.toString());\n }),\n EditorState.readOnly.of(readOnly),\n ];\n if (lsp && !readOnly) {\n extensions.push(\n lspExtensions(lsp, uri, (defUri, line) => onGotoRef.current?.(defUri, line)),\n );\n }\n\n const view = new EditorView({\n state: EditorState.create({ doc: value, extensions }),\n parent: host,\n });\n viewRef.current = view;\n return () => {\n view.destroy();\n viewRef.current = null;\n };\n // Recreate per buffer identity / mode; `value` is only the initial doc.\n // Settings changes are handled by the reconfigure effect below.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [uri, readOnly, lsp]);\n\n // Retune the live view when a setting changes \u2014 no destroy, so cursor/scroll\n // survive.\n React.useEffect(() => {\n const view = viewRef.current;\n if (!view) return;\n view.dispatch({\n effects: [\n themeComp.current.reconfigure([\n sizingTheme(fontSize),\n themeExtension(theme),\n ]),\n wrapComp.current.reconfigure(lineWrap ? EditorView.lineWrapping : []),\n indentComp.current.reconfigure(indentConfig(tabSize)),\n keymapComp.current.reconfigure(keymapExtension(keymapMode)),\n ],\n });\n }, [theme, fontSize, lineWrap, tabSize, keymapMode]);\n\n return <div ref={hostRef} className=\"h-full min-h-0 overflow-hidden\" />;\n};\n", "// NBT syntax highlighting for CodeMirror 6 \u2014 a StreamLanguage tokenizer ported\n// from the console tokenizer (modules/lang_common/scan.jai) and the VSCode\n// grammar (editors/vscode/nbt/syntaxes/nbt.tmLanguage.json). Highlighting is\n// local; everything semantic (diagnostics/completion/hover) comes via the LSP.\n\nimport {\n StreamLanguage,\n LanguageSupport,\n indentUnit,\n type StreamParser,\n} from \"@codemirror/language\";\n\nconst KEYWORDS = new Set([\n \"entity\", \"enum\", \"struct\", \"const\", \"export\", \"extends\",\n \"fn\", \"on\", \"action\", \"activity\", \"task\", \"variant\", \"workflow\", \"command\",\n \"middleware\", \"schedule\", \"every\", \"jai\",\n \"migration\", \"test\", \"mock\", \"assert\",\n \"cartridge\", \"service\", \"component\", \"app\", \"route\", \"layout\",\n \"import\", \"from\",\n \"if\", \"elif\", \"else\", \"while\", \"for\", \"in\", \"return\", \"break\", \"continue\",\n \"delete\", \"defer\", \"print\", \"sleep\", \"fail\",\n]);\n\nconst TYPES = new Set([\n \"string\", \"bool\", \"ulid\", \"document\", \"dict\", \"blob\", \"DateTime\",\n \"u8\", \"u16\", \"u32\", \"u64\", \"s8\", \"s16\", \"s32\", \"s64\",\n \"int\", \"integer\", \"float\", \"float64\", \"f32\", \"f64\", \"double\",\n \"time\", \"bytes\", \"any\", \"name\", \"ref\",\n]);\n\ntype NbtState = {\n tripleString: boolean;\n};\n\n// NBT strings carry NO escapes (scan.jai consumes to the bare closing quote),\n// so a backslash before a quote does not extend the string.\nfunction eatSingleLineString(stream: StringStream, quote: string): string {\n while (!stream.eol()) {\n if (stream.next() === quote) break;\n }\n return \"string\";\n}\n\ntype StringStream = Parameters<StreamParser<NbtState>[\"token\"]>[0];\n\nconst nbtParser: StreamParser<NbtState> = {\n name: \"nbt\",\n startState: () => ({ tripleString: false }),\n token(stream, state) {\n if (state.tripleString) {\n while (!stream.eol()) {\n if (stream.match('\"\"\"')) {\n state.tripleString = false;\n return \"string\";\n }\n stream.next();\n }\n return \"string\";\n }\n\n if (stream.eatSpace()) return null;\n\n const ch = stream.peek();\n if (ch == null) return null;\n\n if (ch === \"#\") {\n stream.skipToEnd();\n return \"comment\";\n }\n\n if (stream.match('\"\"\"')) {\n state.tripleString = true;\n // Rest of line is string body unless it closes on the same line.\n while (!stream.eol()) {\n if (stream.match('\"\"\"')) {\n state.tripleString = false;\n return \"string\";\n }\n stream.next();\n }\n return \"string\";\n }\n\n if (ch === '\"') {\n stream.next();\n return eatSingleLineString(stream, '\"');\n }\n if (ch === \"'\") {\n // Like the scanner: only a string opener when not glued to an identifier\n // (lets contractions inside docs pass).\n const before = stream.string.charAt(stream.pos - 1);\n if (!/[A-Za-z0-9_]/.test(before)) {\n stream.next();\n return eatSingleLineString(stream, \"'\");\n }\n stream.next();\n return null;\n }\n\n // f-strings: f\"...\" \u2014 body highlighted as a string (interpolation holes\n // are cosmetic only).\n if (ch === \"f\" && stream.string.charAt(stream.pos + 1) === '\"') {\n stream.next();\n stream.next();\n return eatSingleLineString(stream, '\"');\n }\n\n // @attr / @@attr\n if (ch === \"@\") {\n stream.next();\n stream.eat(\"@\");\n stream.eatWhile(/[A-Za-z0-9_]/);\n return \"meta\";\n }\n\n // Numbers. The optional fraction backtracks on `0..9` ranges (matches \"0\",\n // not \"0.\").\n if (/\\d/.test(ch)) {\n stream.match(/^\\d+(\\.\\d+)?/);\n return \"number\";\n }\n\n if (/[A-Za-z_]/.test(ch)) {\n stream.eatWhile(/[A-Za-z0-9_]/);\n const word = stream.current();\n if (word === \"true\" || word === \"false\") return \"atom\";\n if (KEYWORDS.has(word)) return \"keyword\";\n if (TYPES.has(word)) return \"typeName\";\n if (/^[A-Z]/.test(word)) return \"typeName\"; // entity/enum references\n return \"variableName\";\n }\n\n if (/[+\\-*/=<>!&|?.,:;]/.test(ch)) {\n stream.next();\n stream.eatWhile(/[+\\-*/=<>!&|.]/);\n return \"operator\";\n }\n\n stream.next();\n return null;\n },\n languageData: {\n commentTokens: { line: \"#\" },\n },\n};\n\nexport const nbtLanguage = StreamLanguage.define(nbtParser);\n\nexport function nbtLanguageSupport(): LanguageSupport {\n return new LanguageSupport(nbtLanguage, [indentUnit.of(\" \")]);\n}\n", "// Preloaded CodeMirror color themes for the NBT editor. \"default\" matches the\n// devtools panel chrome via its CSS variables (the editor renders inside the\n// .nimbit-devtools subtree, so these resolve to the scoped tokens); the rest\n// come from `thememirror`. Color only \u2014 sizing (font size/family/height) is\n// applied separately by the editor so it can follow the font-size setting.\n\nimport { EditorView } from \"@codemirror/view\";\nimport type { Extension } from \"@codemirror/state\";\nimport { HighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { tags as t } from \"@lezer/highlight\";\nimport {\n amy,\n ayuLight,\n barf,\n bespin,\n birdsOfParadise,\n boysAndGirls,\n clouds,\n cobalt,\n coolGlow,\n dracula,\n espresso,\n noctisLilac,\n rosePineDawn,\n smoothy,\n solarizedLight,\n tomorrow,\n} from \"thememirror\";\n\nconst defaultTheme = EditorView.theme(\n {\n \"&\": {\n backgroundColor: \"var(--background)\",\n color: \"var(--foreground)\",\n },\n \".cm-gutters\": {\n backgroundColor: \"var(--background)\",\n color: \"var(--muted-foreground)\",\n borderRight: \"1px solid var(--border)\",\n },\n \".cm-activeLine\": {\n backgroundColor: \"color-mix(in srgb, var(--accent) 35%, transparent)\",\n },\n \".cm-tooltip\": {\n backgroundColor: \"var(--popover)\",\n color: \"var(--popover-foreground)\",\n border: \"1px solid var(--border)\",\n },\n },\n { dark: true },\n);\n\n// \"Nimbit Dark\" \u2014 the brand theme, matching the marketing hero's code panel:\n// brand-yellow keywords, pink @-directives, foreground type names, muted-italic\n// comments. Unlike `default` it ships its own HighlightStyle (so syntax colors\n// are branded, not CodeMirror's fallback) and uses fixed colors so it looks the\n// same regardless of the surrounding CSS variables. The NBT StreamLanguage emits\n// standard token names (\"keyword\"/\"typeName\"/\"meta\"/\u2026 in nbt-language.ts) which\n// map to these Lezer tags.\nconst nimbitDarkChrome = EditorView.theme(\n {\n \"&\": { backgroundColor: \"#0b0b0e\", color: \"#e4e4e7\" },\n \".cm-content\": { caretColor: \"#facc15\" },\n \".cm-cursor, .cm-dropCursor\": { borderLeftColor: \"#facc15\" },\n \"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection\":\n { backgroundColor: \"rgba(250, 204, 21, 0.18)\" },\n \".cm-gutters\": {\n backgroundColor: \"#0b0b0e\",\n color: \"#52525b\",\n borderRight: \"1px solid rgba(255, 255, 255, 0.06)\",\n },\n \".cm-activeLine\": { backgroundColor: \"rgba(250, 204, 21, 0.06)\" },\n \".cm-activeLineGutter\": { backgroundColor: \"rgba(250, 204, 21, 0.06)\", color: \"#a1a1aa\" },\n \".cm-tooltip\": {\n backgroundColor: \"#18181b\",\n color: \"#e4e4e7\",\n border: \"1px solid rgba(255, 255, 255, 0.1)\",\n },\n \".cm-tooltip-autocomplete ul li[aria-selected]\": {\n backgroundColor: \"rgba(250, 204, 21, 0.15)\",\n color: \"#fafafa\",\n },\n },\n { dark: true },\n);\n\nconst nimbitDarkHighlight = HighlightStyle.define([\n { tag: t.keyword, color: \"#facc15\", fontWeight: \"500\" }, // entity, enum, \u2026\n { tag: [t.typeName, t.className, t.tagName], color: \"#e5e7eb\", fontWeight: \"500\" }, // types + entity refs\n { tag: [t.propertyName, t.variableName, t.attributeName], color: \"#cbd5e1\" }, // field names\n { tag: [t.string, t.special(t.string)], color: \"#fde047\" },\n { tag: [t.number, t.bool, t.atom, t.null], color: \"#fbbf24\" }, // numbers, true/false\n { tag: [t.meta, t.annotation], color: \"#f472b6\", fontWeight: \"500\" }, // @relation, @@index, \u2026\n { tag: t.comment, color: \"#71717a\", fontStyle: \"italic\" },\n { tag: [t.operator, t.punctuation, t.separator], color: \"#a1a1aa\" },\n { tag: t.invalid, color: \"#f87171\" },\n]);\n\nconst nimbitDark: Extension = [nimbitDarkChrome, syntaxHighlighting(nimbitDarkHighlight)];\n\n// \"VS Code Dark+\" \u2014 a faithful port of VS Code's default dark theme (Dark+):\n// #1e1e1e canvas, #d4d4d4 text, blue keywords, teal types, salmon strings,\n// light-green numbers, light-blue fields, yellow decorators, green comments. The\n// chrome (cursor/selection/gutter/tooltip) uses VS Code's editor token colors so\n// the editor reads like a VS Code window regardless of the surrounding panel.\nconst vscodeDarkChrome = EditorView.theme(\n {\n \"&\": { backgroundColor: \"#1e1e1e\", color: \"#d4d4d4\" },\n \".cm-content\": { caretColor: \"#aeafad\" },\n \".cm-cursor, .cm-dropCursor\": { borderLeftColor: \"#aeafad\" },\n \"&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection\":\n { backgroundColor: \"#264f78\" },\n \".cm-gutters\": {\n backgroundColor: \"#1e1e1e\",\n color: \"#858585\",\n border: \"none\",\n },\n \".cm-activeLine\": { backgroundColor: \"rgba(255, 255, 255, 0.04)\" },\n \".cm-activeLineGutter\": { backgroundColor: \"transparent\", color: \"#c6c6c6\" },\n \".cm-selectionMatch\": { backgroundColor: \"rgba(255, 255, 255, 0.07)\" },\n \"&.cm-focused .cm-matchingBracket\": {\n backgroundColor: \"transparent\",\n outline: \"1px solid #888888\",\n },\n \".cm-tooltip\": {\n backgroundColor: \"#252526\",\n color: \"#d4d4d4\",\n border: \"1px solid #454545\",\n },\n \".cm-tooltip-autocomplete ul li[aria-selected]\": {\n backgroundColor: \"#04395e\",\n color: \"#ffffff\",\n },\n },\n { dark: true },\n);\n\nconst vscodeDarkHighlight = HighlightStyle.define([\n { tag: t.keyword, color: \"#569cd6\" }, // entity, enum, import, \u2026 (storage/keyword blue)\n { tag: [t.typeName, t.className, t.tagName], color: \"#4ec9b0\" }, // types + entity refs (teal)\n { tag: [t.propertyName, t.variableName, t.attributeName], color: \"#9cdcfe\" }, // field names (light blue)\n { tag: [t.function(t.variableName), t.function(t.propertyName)], color: \"#dcdcaa\" }, // calls (yellow)\n { tag: [t.string, t.special(t.string)], color: \"#ce9178\" }, // strings (salmon)\n { tag: t.number, color: \"#b5cea8\" }, // numeric literals (light green)\n { tag: [t.bool, t.atom, t.null], color: \"#569cd6\" }, // true/false/null (keyword blue)\n { tag: [t.meta, t.annotation], color: \"#dcdcaa\" }, // @relation, @@index, \u2026 (decorator yellow)\n { tag: t.comment, color: \"#6a9955\" }, // comments (green, not italic \u2014 matches Dark+)\n { tag: [t.operator, t.punctuation, t.separator], color: \"#d4d4d4\" },\n { tag: t.invalid, color: \"#f44747\" },\n]);\n\nconst vscodeDark: Extension = [vscodeDarkChrome, syntaxHighlighting(vscodeDarkHighlight)];\n\nexport type EditorTheme = { id: string; label: string; extension: Extension };\n\nexport const EDITOR_THEMES: EditorTheme[] = [\n { id: \"vscodeDark\", label: \"VS Code Dark+\", extension: vscodeDark },\n { id: \"default\", label: \"Default (panel)\", extension: defaultTheme },\n { id: \"nimbitDark\", label: \"Nimbit Dark\", extension: nimbitDark },\n { id: \"dracula\", label: \"Dracula\", extension: dracula },\n { id: \"tomorrow\", label: \"Tomorrow\", extension: tomorrow },\n { id: \"cobalt\", label: \"Cobalt\", extension: cobalt },\n { id: \"espresso\", label: \"Espresso\", extension: espresso },\n { id: \"barf\", label: \"Barf\", extension: barf },\n { id: \"bespin\", label: \"Bespin\", extension: bespin },\n { id: \"birdsOfParadise\", label: \"Birds of Paradise\", extension: birdsOfParadise },\n { id: \"boysAndGirls\", label: \"Boys and Girls\", extension: boysAndGirls },\n { id: \"coolGlow\", label: \"Cool Glow\", extension: coolGlow },\n { id: \"amy\", label: \"Amy\", extension: amy },\n { id: \"ayuLight\", label: \"Ayu Light\", extension: ayuLight },\n { id: \"clouds\", label: \"Clouds\", extension: clouds },\n { id: \"noctisLilac\", label: \"Noctis Lilac\", extension: noctisLilac },\n { id: \"rosePineDawn\", label: \"Ros\u00E9 Pine Dawn\", extension: rosePineDawn },\n { id: \"smoothy\", label: \"Smoothy\", extension: smoothy },\n { id: \"solarizedLight\", label: \"Solarized Light\", extension: solarizedLight },\n];\n\nconst byId = new Map(EDITOR_THEMES.map((t) => [t.id, t.extension]));\n\nexport function themeExtension(id: string): Extension {\n return byId.get(id) ?? EDITOR_THEMES[0].extension;\n}\n", "// CodeMirror extensions wiring an editor buffer to the NbtLspClient:\n// full-text didChange sync (debounced), pushed publishDiagnostics \u2192 lint,\n// completion, hover, and F12 go-to-definition.\n\nimport { Prec, type Extension, type Text } from \"@codemirror/state\";\nimport {\n EditorView,\n ViewPlugin,\n type ViewUpdate,\n hoverTooltip,\n keymap,\n} from \"@codemirror/view\";\nimport {\n autocompletion,\n type CompletionContext,\n type CompletionResult,\n} from \"@codemirror/autocomplete\";\nimport { setDiagnostics, type Diagnostic } from \"@codemirror/lint\";\nimport {\n NbtLspClient,\n type LspDiagnostic,\n type LspPosition,\n type LspCompletionItem,\n type LspLocation,\n} from \"./lsp-client\";\n\nfunction toLspPos(doc: Text, offset: number): LspPosition {\n const line = doc.lineAt(offset);\n return { line: line.number - 1, character: offset - line.from };\n}\n\nfunction fromLspPos(doc: Text, pos: LspPosition): number {\n const lineNo = Math.min(Math.max(pos.line + 1, 1), doc.lines);\n const line = doc.line(lineNo);\n return Math.min(line.from + Math.max(pos.character, 0), line.to);\n}\n\nfunction toCmDiagnostics(doc: Text, diags: LspDiagnostic[]): Diagnostic[] {\n return diags.map((d) => {\n const from = fromLspPos(doc, d.range.start);\n let to = fromLspPos(doc, d.range.end);\n if (to <= from) to = Math.min(from + 1, doc.length);\n const severity =\n d.severity === 2 ? \"warning\" : d.severity === 3 || d.severity === 4 ? \"info\" : \"error\";\n return { from, to, severity, message: d.message, source: d.source ?? \"nbt\" };\n });\n}\n\n// LSP CompletionItemKind \u2192 CM completion type (drives the icon).\nfunction completionType(kind?: number): string {\n switch (kind) {\n case 3: return \"function\";\n case 5: return \"property\";\n case 13: return \"enum\";\n case 14: return \"keyword\";\n case 22: return \"class\";\n default: return \"variable\";\n }\n}\n\nexport type GotoDefHandler = (uri: string, line: number) => void;\n\nexport function lspExtensions(\n client: NbtLspClient,\n uri: string,\n onGotoDefinition?: GotoDefHandler,\n): Extension[] {\n // Sync + diagnostics plugin. didOpen on create, debounced didChange,\n // diagnostics pushed by the server are dispatched into the lint state.\n const syncPlugin = ViewPlugin.fromClass(\n class {\n private timer: ReturnType<typeof setTimeout> | null = null;\n private unsubscribe: () => void;\n\n constructor(readonly view: EditorView) {\n client.didOpen(uri, view.state.doc.toString());\n this.unsubscribe = client.onDiagnostics(uri, (diags) => {\n const cm = toCmDiagnostics(this.view.state.doc, diags);\n this.view.dispatch(setDiagnostics(this.view.state, cm));\n });\n }\n\n update(u: ViewUpdate) {\n if (!u.docChanged) return;\n if (this.timer) clearTimeout(this.timer);\n this.timer = setTimeout(() => {\n this.timer = null;\n client.didChange(uri, this.view.state.doc.toString());\n }, 200);\n }\n\n destroy() {\n if (this.timer) {\n clearTimeout(this.timer);\n client.didChange(uri, this.view.state.doc.toString());\n }\n this.unsubscribe();\n }\n },\n );\n\n const completionSource = async (\n ctx: CompletionContext,\n ): Promise<CompletionResult | null> => {\n const word = ctx.matchBefore(/\\w*/);\n if (!word) return null;\n if (word.from === word.to && !ctx.explicit) {\n // Only fire automatically right after a trigger character.\n const before = ctx.state.doc.sliceString(Math.max(0, ctx.pos - 1), ctx.pos);\n if (before !== \".\" && before !== \":\" && before !== '\"') return null;\n }\n // Flush any pending edit so the server completes against the live buffer.\n client.didChange(uri, ctx.state.doc.toString());\n let result;\n try {\n result = await client.completion(uri, toLspPos(ctx.state.doc, ctx.pos));\n } catch {\n return null;\n }\n const items: LspCompletionItem[] = Array.isArray(result)\n ? result\n : (result?.items ?? []);\n if (items.length === 0) return null;\n return {\n from: word.from,\n options: items.map((it) => ({\n label: it.label,\n type: completionType(it.kind),\n detail: it.detail,\n })),\n };\n };\n\n const hover = hoverTooltip(async (view, pos) => {\n let result;\n try {\n result = await client.hover(uri, toLspPos(view.state.doc, pos));\n } catch {\n return null;\n }\n const value = result?.contents?.value;\n if (!value) return null;\n return {\n pos,\n create: () => {\n const dom = document.createElement(\"pre\");\n dom.className = \"nbt-hover-tooltip\";\n dom.style.cssText =\n \"margin:0;padding:6px 8px;max-width:480px;white-space:pre-wrap;font-size:11px;\";\n // Server emits fenced markdown code blocks; strip the fences, show text.\n dom.textContent = value.replace(/```\\w*\\n?/g, \"\");\n return { dom };\n },\n };\n });\n\n const gotoDef = Prec.high(keymap.of([\n {\n key: \"F12\",\n run: (view) => {\n const pos = toLspPos(view.state.doc, view.state.selection.main.head);\n client\n .definition(uri, pos)\n .then((result) => {\n const loc: LspLocation | null = Array.isArray(result)\n ? (result[0] ?? null)\n : result;\n if (!loc?.uri) return;\n if (loc.uri === uri) {\n const off = fromLspPos(view.state.doc, loc.range.start);\n view.dispatch({\n selection: { anchor: off },\n scrollIntoView: true,\n });\n } else {\n onGotoDefinition?.(loc.uri, loc.range.start.line);\n }\n })\n .catch(() => {});\n return true;\n },\n },\n ]));\n\n return [\n syncPlugin,\n // The active keymap (vscode or stock CM) owns completion keys; disable\n // autocompletion's own bindings so they don't double up / conflict.\n autocompletion({ override: [completionSource], defaultKeymap: false }),\n hover,\n gotoDef,\n ];\n}\n", "// Minimal LSP client over WebSocket for the console's dev-mode nbt_lsp bridge\n// (/_console/dev/lsp). One JSON-RPC message per WS text frame \u2014 no\n// Content-Length framing (the bridge's write_proc emits bare JSON).\n//\n// Hand-rolled on purpose: the server speaks ~10 methods with full-text sync,\n// and a library client (codemirror-languageserver) would drag transitive\n// runtime deps into every host app.\n\nexport type LspPosition = { line: number; character: number };\nexport type LspRange = { start: LspPosition; end: LspPosition };\nexport type LspDiagnostic = {\n range: LspRange;\n severity?: number; // 1=error 2=warning 3=info 4=hint\n message: string;\n source?: string;\n};\nexport type LspCompletionItem = {\n label: string;\n kind?: number;\n detail?: string;\n};\nexport type LspLocation = { uri: string; range: LspRange };\n\ntype Pending = {\n resolve: (v: unknown) => void;\n reject: (e: Error) => void;\n};\n\nexport class NbtLspClient {\n private url: string;\n private rootUri: string | null = null;\n private ws: WebSocket | null = null;\n private nextId = 1;\n private pending = new Map<number, Pending>();\n private diagHandlers = new Map<string, (d: LspDiagnostic[]) => void>();\n // Open buffers, kept for replay across reconnects.\n private docs = new Map<string, { text: string; version: number }>();\n private ready = false;\n private queue: string[] = [];\n private closed = false;\n private retryMs = 500;\n\n constructor(url: string) {\n this.url = url;\n this.connect();\n }\n\n dispose() {\n this.closed = true;\n this.ws?.close();\n this.pending.forEach((p) => p.reject(new Error(\"lsp client disposed\")));\n this.pending.clear();\n }\n\n private connect() {\n if (this.closed) return;\n const ws = new WebSocket(this.url);\n this.ws = ws;\n ws.onopen = () => {\n this.retryMs = 500;\n if (this.rootUri) this.sendInitialize(this.rootUri);\n };\n ws.onmessage = (ev) => {\n if (typeof ev.data !== \"string\") return;\n this.onMessage(ev.data);\n };\n ws.onclose = () => {\n this.ready = false;\n this.ws = null;\n for (const p of this.pending.values())\n p.reject(new Error(\"lsp connection closed\"));\n this.pending.clear();\n if (!this.closed) {\n setTimeout(() => this.connect(), this.retryMs);\n this.retryMs = Math.min(this.retryMs * 2, 10_000);\n }\n };\n }\n\n // Called once by the host with file://<projectRoot>; also re-sent after every\n // reconnect, followed by didOpen replays for tracked buffers.\n initialize(rootUri: string) {\n this.rootUri = rootUri;\n if (this.ws?.readyState === WebSocket.OPEN) this.sendInitialize(rootUri);\n }\n\n private sendInitialize(rootUri: string) {\n const id = this.nextId++;\n this.pending.set(id, {\n resolve: () => {\n this.sendRaw({ jsonrpc: \"2.0\", method: \"initialized\", params: {} });\n this.ready = true;\n for (const [uri, d] of this.docs) {\n this.sendRaw({\n jsonrpc: \"2.0\",\n method: \"textDocument/didOpen\",\n params: {\n textDocument: {\n uri,\n languageId: \"nbt\",\n version: d.version,\n text: d.text,\n },\n },\n });\n }\n const q = this.queue;\n this.queue = [];\n for (const m of q) this.ws?.send(m);\n },\n reject: () => {},\n });\n this.ws?.send(\n JSON.stringify({\n jsonrpc: \"2.0\",\n id,\n method: \"initialize\",\n params: { rootUri },\n }),\n );\n }\n\n private sendRaw(msg: object) {\n const s = JSON.stringify(msg);\n if (this.ready && this.ws?.readyState === WebSocket.OPEN) this.ws.send(s);\n else this.queue.push(s);\n }\n\n private onMessage(data: string) {\n let msg: any;\n try {\n msg = JSON.parse(data);\n } catch {\n return;\n }\n if (msg.id != null && (msg.result !== undefined || msg.error)) {\n const p = this.pending.get(msg.id);\n if (!p) return;\n this.pending.delete(msg.id);\n if (msg.error) p.reject(new Error(msg.error.message ?? \"lsp error\"));\n else p.resolve(msg.result);\n return;\n }\n if (msg.method === \"textDocument/publishDiagnostics\") {\n const uri = msg.params?.uri as string;\n const handler = this.diagHandlers.get(uri);\n if (handler) handler((msg.params?.diagnostics ?? []) as LspDiagnostic[]);\n }\n }\n\n request<T>(method: string, params: object): Promise<T> {\n const id = this.nextId++;\n const p = new Promise<T>((resolve, reject) => {\n this.pending.set(id, { resolve: resolve as Pending[\"resolve\"], reject });\n });\n this.sendRaw({ jsonrpc: \"2.0\", id, method, params });\n return p;\n }\n\n onDiagnostics(uri: string, handler: (d: LspDiagnostic[]) => void): () => void {\n this.diagHandlers.set(uri, handler);\n return () => {\n if (this.diagHandlers.get(uri) === handler) this.diagHandlers.delete(uri);\n };\n }\n\n didOpen(uri: string, text: string) {\n const existing = this.docs.get(uri);\n if (existing) {\n // Re-opening an already-tracked buffer (tab switch) \u2014 just resync.\n this.didChange(uri, text);\n return;\n }\n this.docs.set(uri, { text, version: 1 });\n this.sendRaw({\n jsonrpc: \"2.0\",\n method: \"textDocument/didOpen\",\n params: { textDocument: { uri, languageId: \"nbt\", version: 1, text } },\n });\n }\n\n didChange(uri: string, text: string) {\n const d = this.docs.get(uri);\n if (!d) return this.didOpen(uri, text);\n if (d.text === text) return;\n d.text = text;\n d.version += 1;\n this.sendRaw({\n jsonrpc: \"2.0\",\n method: \"textDocument/didChange\",\n params: {\n textDocument: { uri, version: d.version },\n contentChanges: [{ text }],\n },\n });\n }\n\n didClose(uri: string) {\n if (!this.docs.delete(uri)) return;\n this.sendRaw({\n jsonrpc: \"2.0\",\n method: \"textDocument/didClose\",\n params: { textDocument: { uri } },\n });\n }\n\n completion(uri: string, pos: LspPosition): Promise<{ items: LspCompletionItem[] } | LspCompletionItem[] | null> {\n return this.request(\"textDocument/completion\", {\n textDocument: { uri },\n position: pos,\n });\n }\n\n hover(uri: string, pos: LspPosition): Promise<{ contents?: { value?: string } } | null> {\n return this.request(\"textDocument/hover\", {\n textDocument: { uri },\n position: pos,\n });\n }\n\n definition(uri: string, pos: LspPosition): Promise<LspLocation | LspLocation[] | null> {\n return this.request(\"textDocument/definition\", {\n textDocument: { uri },\n position: pos,\n });\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Prec", "EditorView", "keymap", "syntaxHighlighting", "indentUnit", "t", "EditorView", "Prec", "indentUnit", "keymap", "syntaxHighlighting", "view"]
|
|
7
|
+
}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -7,7 +7,9 @@ export { useLiveBulkRegistry } from "./use-cartridge-info";
|
|
|
7
7
|
export type { BulkEntity, BulkRegistry, LiveRegistryState, } from "./use-cartridge-info";
|
|
8
8
|
export { useGsheetsApi } from "./use-gsheets";
|
|
9
9
|
export type { GsheetSyncConfig, GsheetSaveInput } from "./use-gsheets";
|
|
10
|
+
export { usePermissionsApi } from "./use-permissions-api";
|
|
11
|
+
export type { CartPermissions, UserGrant, PermUser, PermissionsState } from "./use-permissions-api";
|
|
10
12
|
export { useWorkflowsApi, isWfTerminal, WF_TERMINAL } from "./use-workflows";
|
|
11
|
-
export type { WfStatus, WfListItem, WfExecution, WfEvent, WfDetail,
|
|
13
|
+
export type { WfStatus, WfListItem, WfExecution, WfEvent, WfDetail, WfBundleSource, WfExecReply, } from "./use-workflows";
|
|
12
14
|
export { getDevToolsToken, setDevToolsToken, clearDevToolsToken, authHeaders, fetchWhoAmI, devToolsSignIn, devToolsSignUp, devToolsSignOut, wsAuthProtocols, fetchDevtoolsSettings, saveDevtoolsSettings, } from "./auth";
|
|
13
15
|
export type { WhoAmI } from "./auth";
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export type CartPermissions = {
|
|
2
|
+
slug: string;
|
|
3
|
+
permissions: string[];
|
|
4
|
+
roles: {
|
|
5
|
+
name: string;
|
|
6
|
+
perms: string[];
|
|
7
|
+
}[];
|
|
8
|
+
};
|
|
9
|
+
export type UserGrant = {
|
|
10
|
+
cart: string;
|
|
11
|
+
role: string;
|
|
12
|
+
};
|
|
13
|
+
export type PermUser = {
|
|
14
|
+
id: string;
|
|
15
|
+
email: string;
|
|
16
|
+
name: string;
|
|
17
|
+
capsVersion: number;
|
|
18
|
+
roles: UserGrant[];
|
|
19
|
+
caps: string[];
|
|
20
|
+
};
|
|
21
|
+
export type PermissionsState = {
|
|
22
|
+
carts: CartPermissions[];
|
|
23
|
+
users: PermUser[];
|
|
24
|
+
loading: boolean;
|
|
25
|
+
error: string | null;
|
|
26
|
+
refresh: () => void;
|
|
27
|
+
assign: (userId: string, cart: string, role: string) => Promise<void>;
|
|
28
|
+
revoke: (userId: string, cart: string, role: string) => Promise<void>;
|
|
29
|
+
};
|
|
30
|
+
export declare function usePermissionsApi(): PermissionsState;
|
|
@@ -8,6 +8,8 @@ export type WfListItem = {
|
|
|
8
8
|
updatedAt: number;
|
|
9
9
|
lane: string;
|
|
10
10
|
deployVersion: number;
|
|
11
|
+
branchId?: string;
|
|
12
|
+
trigger?: string;
|
|
11
13
|
};
|
|
12
14
|
export type WfExecution = {
|
|
13
15
|
id: string;
|
|
@@ -21,6 +23,10 @@ export type WfExecution = {
|
|
|
21
23
|
deployVersion: number;
|
|
22
24
|
createdAt: number;
|
|
23
25
|
updatedAt: number;
|
|
26
|
+
branchId?: string;
|
|
27
|
+
trigger?: string;
|
|
28
|
+
startedUs?: string | number;
|
|
29
|
+
endedUs?: string | number;
|
|
24
30
|
};
|
|
25
31
|
export type WfEvent = {
|
|
26
32
|
id: string;
|
|
@@ -30,25 +36,18 @@ export type WfEvent = {
|
|
|
30
36
|
target?: string;
|
|
31
37
|
op?: string;
|
|
32
38
|
payload?: string;
|
|
39
|
+
createdAt: number;
|
|
40
|
+
tsUs?: number;
|
|
41
|
+
loc?: string;
|
|
33
42
|
};
|
|
34
43
|
export type WfDetail = {
|
|
35
44
|
execution: WfExecution;
|
|
36
45
|
events: WfEvent[];
|
|
37
46
|
};
|
|
38
|
-
export type
|
|
39
|
-
writes: number;
|
|
40
|
-
reads: number;
|
|
41
|
-
emails: number;
|
|
42
|
-
fetches: number;
|
|
43
|
-
emits: number;
|
|
44
|
-
retries: number;
|
|
45
|
-
async_inflight: number;
|
|
46
|
-
async_peak: number;
|
|
47
|
-
};
|
|
48
|
-
export type WfVersion = {
|
|
47
|
+
export type WfBundleSource = {
|
|
49
48
|
version: number;
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
preludeLines: number;
|
|
50
|
+
source: string;
|
|
52
51
|
};
|
|
53
52
|
export type WfExecReply = {
|
|
54
53
|
id: string;
|
|
@@ -59,10 +58,6 @@ export type WfExecReply = {
|
|
|
59
58
|
};
|
|
60
59
|
export declare function isWfTerminal(status: string): boolean;
|
|
61
60
|
export declare function useWorkflowsApi(): {
|
|
62
|
-
|
|
63
|
-
getExecution: (id: string) => Promise<WfDetail>;
|
|
64
|
-
getStats: () => Promise<WfStats>;
|
|
65
|
-
getVersions: () => Promise<WfVersion[]>;
|
|
61
|
+
getBundleSource: (version: number) => Promise<WfBundleSource>;
|
|
66
62
|
cancel: (id: string) => Promise<WfExecReply>;
|
|
67
|
-
advance: (id: string) => Promise<WfExecReply>;
|
|
68
63
|
};
|
package/dist/editor/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { type GotoDefHandler } from "./lsp-extensions";
|
|
3
3
|
import { NbtLspClient } from "./lsp-client";
|
|
4
|
+
export type EditorKeymap = "vscode" | "codemirror";
|
|
4
5
|
export type NbtEditorProps = {
|
|
5
6
|
uri: string;
|
|
6
7
|
value: string;
|
|
@@ -13,5 +14,6 @@ export type NbtEditorProps = {
|
|
|
13
14
|
fontSize?: number;
|
|
14
15
|
lineWrap?: boolean;
|
|
15
16
|
tabSize?: number;
|
|
17
|
+
keymap?: EditorKeymap;
|
|
16
18
|
};
|
|
17
19
|
export declare const NbtEditor: React.FC<NbtEditorProps>;
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
nbtLanguage,
|
|
8
8
|
nbtLanguageSupport,
|
|
9
9
|
themeExtension
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-WLGJKJF4.js";
|
|
11
11
|
import {
|
|
12
12
|
DiagramView,
|
|
13
13
|
EntityNode,
|
|
@@ -163,8 +163,80 @@ function useGsheetsApi() {
|
|
|
163
163
|
return useMemo(() => ({ list, save, syncNow, remove }), [list, save, syncNow, remove]);
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
+
// src/core/use-permissions-api.ts
|
|
167
|
+
import { useCallback as useCallback2, useEffect as useEffect2, useState as useState2 } from "react";
|
|
168
|
+
function usePermissionsApi() {
|
|
169
|
+
const { apiBaseUrl } = useDevToolsConfig();
|
|
170
|
+
const [carts, setCarts] = useState2([]);
|
|
171
|
+
const [users, setUsers] = useState2([]);
|
|
172
|
+
const [loading, setLoading] = useState2(true);
|
|
173
|
+
const [error, setError] = useState2(null);
|
|
174
|
+
const [nonce, setNonce] = useState2(0);
|
|
175
|
+
const refresh = useCallback2(() => setNonce((n) => n + 1), []);
|
|
176
|
+
useEffect2(() => {
|
|
177
|
+
const ac = new AbortController();
|
|
178
|
+
let cancelled = false;
|
|
179
|
+
setLoading(true);
|
|
180
|
+
setError(null);
|
|
181
|
+
(async () => {
|
|
182
|
+
try {
|
|
183
|
+
const [pr, ur] = await Promise.all([
|
|
184
|
+
fetch(`${apiBaseUrl}/_console/permissions`, {
|
|
185
|
+
signal: ac.signal,
|
|
186
|
+
credentials: "include",
|
|
187
|
+
headers: authHeaders()
|
|
188
|
+
}),
|
|
189
|
+
fetch(`${apiBaseUrl}/_console/users`, {
|
|
190
|
+
signal: ac.signal,
|
|
191
|
+
credentials: "include",
|
|
192
|
+
headers: authHeaders()
|
|
193
|
+
})
|
|
194
|
+
]);
|
|
195
|
+
if (!pr.ok) throw new Error(`permissions HTTP ${pr.status}`);
|
|
196
|
+
if (!ur.ok) throw new Error(`users HTTP ${ur.status}`);
|
|
197
|
+
const pdata = await pr.json();
|
|
198
|
+
const udata = await ur.json();
|
|
199
|
+
if (cancelled) return;
|
|
200
|
+
setCarts(Array.isArray(pdata.carts) ? pdata.carts : []);
|
|
201
|
+
setUsers(Array.isArray(udata) ? udata : []);
|
|
202
|
+
} catch (e) {
|
|
203
|
+
if (cancelled || e.name === "AbortError") return;
|
|
204
|
+
setError(e instanceof Error ? e.message : String(e));
|
|
205
|
+
} finally {
|
|
206
|
+
if (!cancelled) setLoading(false);
|
|
207
|
+
}
|
|
208
|
+
})();
|
|
209
|
+
return () => {
|
|
210
|
+
cancelled = true;
|
|
211
|
+
ac.abort();
|
|
212
|
+
};
|
|
213
|
+
}, [apiBaseUrl, nonce]);
|
|
214
|
+
const mutate = useCallback2(
|
|
215
|
+
async (path, userId, cart, role) => {
|
|
216
|
+
const r = await fetch(`${apiBaseUrl}${path}`, {
|
|
217
|
+
method: "POST",
|
|
218
|
+
credentials: "include",
|
|
219
|
+
headers: authHeaders({ "content-type": "application/json" }),
|
|
220
|
+
body: JSON.stringify({ userId, cart, role })
|
|
221
|
+
});
|
|
222
|
+
if (!r.ok) throw new Error(`HTTP ${r.status}`);
|
|
223
|
+
refresh();
|
|
224
|
+
},
|
|
225
|
+
[apiBaseUrl, refresh]
|
|
226
|
+
);
|
|
227
|
+
const assign = useCallback2(
|
|
228
|
+
(userId, cart, role) => mutate("/_console/roles/assign", userId, cart, role),
|
|
229
|
+
[mutate]
|
|
230
|
+
);
|
|
231
|
+
const revoke = useCallback2(
|
|
232
|
+
(userId, cart, role) => mutate("/_console/roles/revoke", userId, cart, role),
|
|
233
|
+
[mutate]
|
|
234
|
+
);
|
|
235
|
+
return { carts, users, loading, error, refresh, assign, revoke };
|
|
236
|
+
}
|
|
237
|
+
|
|
166
238
|
// src/core/use-workflows.ts
|
|
167
|
-
import { useCallback as
|
|
239
|
+
import { useCallback as useCallback3, useMemo as useMemo2 } from "react";
|
|
168
240
|
var WF_TERMINAL = ["COMPLETED", "FAILED", "CANCELLED", "CONTINUED"];
|
|
169
241
|
async function jsonOrThrow2(r) {
|
|
170
242
|
const body = await r.json().catch(() => ({}));
|
|
@@ -176,43 +248,16 @@ function isWfTerminal(status) {
|
|
|
176
248
|
}
|
|
177
249
|
function useWorkflowsApi() {
|
|
178
250
|
const { apiBaseUrl } = useDevToolsConfig();
|
|
179
|
-
const
|
|
180
|
-
async () => jsonOrThrow2(
|
|
181
|
-
await fetch(`${apiBaseUrl}/_console/wf`, {
|
|
251
|
+
const getBundleSource = useCallback3(
|
|
252
|
+
async (version) => jsonOrThrow2(
|
|
253
|
+
await fetch(`${apiBaseUrl}/_console/wf/source?version=${encodeURIComponent(String(version))}`, {
|
|
182
254
|
credentials: "include",
|
|
183
255
|
headers: authHeaders()
|
|
184
256
|
})
|
|
185
257
|
),
|
|
186
258
|
[apiBaseUrl]
|
|
187
259
|
);
|
|
188
|
-
const
|
|
189
|
-
async (id) => jsonOrThrow2(
|
|
190
|
-
await fetch(`${apiBaseUrl}/_console/wf/${encodeURIComponent(id)}`, {
|
|
191
|
-
credentials: "include",
|
|
192
|
-
headers: authHeaders()
|
|
193
|
-
})
|
|
194
|
-
),
|
|
195
|
-
[apiBaseUrl]
|
|
196
|
-
);
|
|
197
|
-
const getStats = useCallback2(
|
|
198
|
-
async () => jsonOrThrow2(
|
|
199
|
-
await fetch(`${apiBaseUrl}/_console/wf/stats`, {
|
|
200
|
-
credentials: "include",
|
|
201
|
-
headers: authHeaders()
|
|
202
|
-
})
|
|
203
|
-
),
|
|
204
|
-
[apiBaseUrl]
|
|
205
|
-
);
|
|
206
|
-
const getVersions = useCallback2(
|
|
207
|
-
async () => jsonOrThrow2(
|
|
208
|
-
await fetch(`${apiBaseUrl}/_console/wf/versions`, {
|
|
209
|
-
credentials: "include",
|
|
210
|
-
headers: authHeaders()
|
|
211
|
-
})
|
|
212
|
-
),
|
|
213
|
-
[apiBaseUrl]
|
|
214
|
-
);
|
|
215
|
-
const cancel = useCallback2(
|
|
260
|
+
const cancel = useCallback3(
|
|
216
261
|
async (id) => jsonOrThrow2(
|
|
217
262
|
await fetch(`${apiBaseUrl}/_console/wf/cancel`, {
|
|
218
263
|
method: "POST",
|
|
@@ -223,20 +268,9 @@ function useWorkflowsApi() {
|
|
|
223
268
|
),
|
|
224
269
|
[apiBaseUrl]
|
|
225
270
|
);
|
|
226
|
-
const advance = useCallback2(
|
|
227
|
-
async (id) => jsonOrThrow2(
|
|
228
|
-
await fetch(`${apiBaseUrl}/_console/wf/advance`, {
|
|
229
|
-
method: "POST",
|
|
230
|
-
credentials: "include",
|
|
231
|
-
headers: authHeaders({ "content-type": "application/json" }),
|
|
232
|
-
body: JSON.stringify({ id })
|
|
233
|
-
})
|
|
234
|
-
),
|
|
235
|
-
[apiBaseUrl]
|
|
236
|
-
);
|
|
237
271
|
return useMemo2(
|
|
238
|
-
() => ({
|
|
239
|
-
[
|
|
272
|
+
() => ({ getBundleSource, cancel }),
|
|
273
|
+
[getBundleSource, cancel]
|
|
240
274
|
);
|
|
241
275
|
}
|
|
242
276
|
export {
|
|
@@ -275,6 +309,7 @@ export {
|
|
|
275
309
|
useDevToolsConfig,
|
|
276
310
|
useGsheetsApi,
|
|
277
311
|
useLiveBulkRegistry,
|
|
312
|
+
usePermissionsApi,
|
|
278
313
|
useWorkflowsApi,
|
|
279
314
|
wsAuthProtocols,
|
|
280
315
|
wsBaseFrom
|