@party-stack/ontology-devtools 0.6.2 → 0.7.0
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 +195 -0
- package/lib/DisclosureSummary.d.ts +7 -0
- package/lib/DisclosureSummary.d.ts.map +1 -0
- package/lib/DisclosureSummary.js +20 -0
- package/lib/DisclosureSummary.js.map +1 -0
- package/lib/NativeQueryCode.d.ts +7 -0
- package/lib/NativeQueryCode.d.ts.map +1 -0
- package/lib/NativeQueryCode.js +35 -0
- package/lib/NativeQueryCode.js.map +1 -0
- package/lib/OntologyDevtools.d.ts +11 -50
- package/lib/OntologyDevtools.d.ts.map +1 -1
- package/lib/OntologyDevtools.js +310 -626
- package/lib/OntologyDevtools.js.map +1 -1
- package/lib/OntologyIcons.d.ts +14 -0
- package/lib/OntologyIcons.d.ts.map +1 -0
- package/lib/OntologyIcons.js +22 -0
- package/lib/OntologyIcons.js.map +1 -0
- package/lib/PanelBoundary.d.ts +10 -0
- package/lib/PanelBoundary.d.ts.map +1 -0
- package/lib/PanelBoundary.js +67 -0
- package/lib/PanelBoundary.js.map +1 -0
- package/lib/Pinned.d.ts +14 -0
- package/lib/Pinned.d.ts.map +1 -0
- package/lib/Pinned.js +142 -0
- package/lib/Pinned.js.map +1 -0
- package/lib/PinnedFamily.d.ts +13 -0
- package/lib/PinnedFamily.d.ts.map +1 -0
- package/lib/PinnedFamily.js +105 -0
- package/lib/PinnedFamily.js.map +1 -0
- package/lib/Queries.d.ts +12 -0
- package/lib/Queries.d.ts.map +1 -0
- package/lib/Queries.js +147 -0
- package/lib/Queries.js.map +1 -0
- package/lib/QueryOwners.d.ts +7 -0
- package/lib/QueryOwners.d.ts.map +1 -0
- package/lib/QueryOwners.js +46 -0
- package/lib/QueryOwners.js.map +1 -0
- package/lib/QueryPills.d.ts +17 -0
- package/lib/QueryPills.d.ts.map +1 -0
- package/lib/QueryPills.js +37 -0
- package/lib/QueryPills.js.map +1 -0
- package/lib/QueryPushdown.d.ts +26 -0
- package/lib/QueryPushdown.d.ts.map +1 -0
- package/lib/QueryPushdown.js +380 -0
- package/lib/QueryPushdown.js.map +1 -0
- package/lib/QueryTokens.d.ts +25 -0
- package/lib/QueryTokens.d.ts.map +1 -0
- package/lib/QueryTokens.js +49 -0
- package/lib/QueryTokens.js.map +1 -0
- package/lib/QueryView.d.ts +37 -0
- package/lib/QueryView.d.ts.map +1 -0
- package/lib/QueryView.js +547 -0
- package/lib/QueryView.js.map +1 -0
- package/lib/SchemaView.d.ts +8 -0
- package/lib/SchemaView.d.ts.map +1 -0
- package/lib/SchemaView.js +213 -0
- package/lib/SchemaView.js.map +1 -0
- package/lib/Storage.d.ts +17 -0
- package/lib/Storage.d.ts.map +1 -0
- package/lib/Storage.js +205 -0
- package/lib/Storage.js.map +1 -0
- package/lib/Tracing.d.ts +7 -0
- package/lib/Tracing.d.ts.map +1 -0
- package/lib/Tracing.js +344 -0
- package/lib/Tracing.js.map +1 -0
- package/lib/attribution/Highlight.d.ts +9 -0
- package/lib/attribution/Highlight.d.ts.map +1 -0
- package/lib/attribution/Highlight.js +73 -0
- package/lib/attribution/Highlight.js.map +1 -0
- package/lib/attribution/index.d.ts +12 -0
- package/lib/attribution/index.d.ts.map +1 -0
- package/lib/attribution/index.js +31 -0
- package/lib/attribution/index.js.map +1 -0
- package/lib/attribution/registry.d.ts +16 -0
- package/lib/attribution/registry.d.ts.map +1 -0
- package/lib/attribution/registry.js +31 -0
- package/lib/attribution/registry.js.map +1 -0
- package/lib/attribution/tanstack.d.ts +11 -0
- package/lib/attribution/tanstack.d.ts.map +1 -0
- package/lib/attribution/tanstack.js +81 -0
- package/lib/attribution/tanstack.js.map +1 -0
- package/lib/chrome.d.ts +9 -0
- package/lib/chrome.d.ts.map +1 -0
- package/lib/chrome.js +41 -0
- package/lib/chrome.js.map +1 -0
- package/lib/diagnostics.d.ts +15 -0
- package/lib/diagnostics.d.ts.map +1 -0
- package/lib/diagnostics.js +31 -0
- package/lib/diagnostics.js.map +1 -0
- package/lib/index.d.ts +4 -2
- package/lib/index.js +3 -1
- package/lib/plugin.d.ts +11 -0
- package/lib/plugin.d.ts.map +1 -0
- package/lib/plugin.js +62 -0
- package/lib/plugin.js.map +1 -0
- package/lib/queryIR.d.ts +9 -0
- package/lib/queryIR.d.ts.map +1 -0
- package/lib/queryIR.js +69 -0
- package/lib/queryIR.js.map +1 -0
- package/lib/replicationActivity.d.ts +52 -0
- package/lib/replicationActivity.d.ts.map +1 -0
- package/lib/replicationActivity.js +54 -0
- package/lib/replicationActivity.js.map +1 -0
- package/lib/schemaLayout.d.ts +35 -0
- package/lib/schemaLayout.d.ts.map +1 -0
- package/lib/schemaLayout.js +75 -0
- package/lib/schemaLayout.js.map +1 -0
- package/lib/styles.js +6 -0
- package/lib/styles.js.map +1 -0
- package/lib/traceTimeline.d.ts +15 -0
- package/lib/traceTimeline.d.ts.map +1 -0
- package/lib/traceTimeline.js +36 -0
- package/lib/traceTimeline.js.map +1 -0
- package/lib/traceWaterfall.d.ts +25 -0
- package/lib/traceWaterfall.d.ts.map +1 -0
- package/lib/traceWaterfall.js +70 -0
- package/lib/traceWaterfall.js.map +1 -0
- package/lib/typeDisplayName.d.ts +5 -0
- package/lib/typeDisplayName.d.ts.map +1 -0
- package/lib/typeDisplayName.js +28 -0
- package/lib/typeDisplayName.js.map +1 -0
- package/lib/types.d.ts +17 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +1 -0
- package/lib/vite/index.d.ts +18 -0
- package/lib/vite/index.d.ts.map +1 -0
- package/lib/vite/index.js +148 -0
- package/lib/vite/index.js.map +1 -0
- package/package.json +25 -8
- package/lib/styles.css +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryView.js","names":["Fragment","exhaustive"],"sources":["../src/QueryView.tsx"],"sourcesContent":["import { resolveRelatedLink, isRelatedFromForeignKeySource } from \"@party-stack/ontology/utils\";\nimport { Link2 } from \"lucide-react\";\nimport { Fragment } from \"react\";\nimport { DisclosureSummary } from \"./DisclosureSummary.js\";\nimport { ObjectTypeIcon } from \"./OntologyIcons.js\";\nimport { OperandToken, QuerySubject, nullOrderLabel } from \"./QueryTokens.js\";\nimport { typeDisplayName } from \"./typeDisplayName.js\";\nimport type { Load } from \"./diagnostics.js\";\nimport type {\n Expression,\n ObjectTypeDef,\n OntologyIR,\n Query,\n QueryDocument,\n QuerySelection,\n} from \"@party-stack/ontology\";\n\ntype Scope = Readonly<Record<string, ObjectTypeDef | undefined>>;\ntype Annotations = NonNullable<Load[\"pushdown\"]>[\"predicates\"];\ninterface ExpressionProps {\n expression: Expression;\n scope?: Scope;\n ir?: OntologyIR;\n compactBinding?: string;\n annotations?: Annotations;\n path?: readonly number[];\n pattern?: boolean;\n showFields?: boolean;\n}\nconst operators = {\n eq: \"=\",\n ne: \"≠\",\n lt: \"<\",\n lte: \"≤\",\n gt: \">\",\n gte: \"≥\",\n in: \"in\",\n contains: \"contains\",\n like: \"matches\",\n ilike: \"matches (ignore case)\",\n add: \"+\",\n subtract: \"−\",\n multiply: \"×\",\n divide: \"÷\",\n};\nfunction isBinary(\n expression: Expression\n): expression is Extract<Expression, { kind: keyof typeof operators }> {\n return expression.kind in operators;\n}\nconst executionLabels = {\n source: \"Pushed down\",\n candidate: \"Approximate pushdown\",\n adapter: \"Not pushed down\",\n engine: \"Not pushed down\",\n};\nconst executionDescriptions = {\n source: \"Translated to a native source condition; the adapter may also verify returned rows.\",\n candidate: \"The source narrows candidates; the adapter evaluates the exact condition.\",\n engine: \"Evaluated by the query engine after loading candidates.\",\n adapter: \"Evaluated in the adapter; this condition was not sent to the source.\",\n};\n\nfunction fieldPath(expression: Expression): { root: Expression; path: string[] } {\n if (expression.kind !== \"getAt\") return { root: expression, path: [] };\n const parent = fieldPath(expression.value.source);\n return { root: parent.root, path: [...parent.path, ...expression.value.path] };\n}\n\n/** All portable expression variants retain their structure, including correlated queries. */\nexport function QueryExpression({\n expression,\n scope = {},\n ir,\n compactBinding,\n annotations,\n path = [],\n pattern,\n showFields = true,\n}: ExpressionProps) {\n const child = (value: Expression, index = 0, childPattern = false) => (\n <QueryExpression\n expression={value}\n scope={scope}\n ir={ir}\n compactBinding={compactBinding}\n annotations={annotations}\n path={[...path, index]}\n pattern={childPattern}\n showFields={showFields}\n />\n );\n if (expression.kind === \"literal\") {\n const value = expression.value.value;\n if (Array.isArray(value))\n return (\n <div className=\"ps-query-values\">\n <span className=\"ps-query-operator\">[</span>\n {value.map((item, index) => (\n <QueryExpression\n key={index}\n expression={{ kind: \"literal\", value: { value: item } }}\n />\n ))}\n <span className=\"ps-query-operator\">]</span>\n </div>\n );\n if (value !== null && typeof value === \"object\" && !(value instanceof Date))\n return (\n <div className=\"ps-query-branches\">\n {Object.entries(value).map(([name, item]) => (\n <div key={name} className=\"ps-query-selection\">\n <span className=\"ps-query-output\">{name}</span>\n <span className=\"ps-query-operator\">:</span>\n <QueryExpression expression={{ kind: \"literal\", value: { value: item } }} />\n </div>\n ))}\n </div>\n );\n return <OperandToken value={value} pattern={pattern} />;\n }\n if (expression.kind === \"getAt\") {\n const { root, path: fields } = fieldPath(expression);\n if (\n root.kind === \"localReference\" ||\n root.kind === \"contextReference\" ||\n root.kind === \"inputReference\"\n ) {\n const object = root.kind === \"localReference\" ? scope[root.value.name] : undefined;\n const name = fields\n .map((field, index) =>\n index === 0\n ? (object?.properties.find((property) => property.name === field)?.displayName ??\n field)\n : field\n )\n .join(\".\");\n const prefix =\n root.kind === \"localReference\"\n ? root.value.name === compactBinding\n ? \"\"\n : `${root.value.name}.`\n : `${root.kind === \"inputReference\" ? \"input\" : \"context\"}.${root.value.name}.`;\n return (\n <span className=\"ps-query-field\">\n {prefix}\n {name}\n </span>\n );\n }\n return (\n <div className=\"ps-query-comparison\">\n {child(expression.value.source)}\n <span className=\"ps-query-field\">.{expression.value.path.join(\".\")}</span>\n </div>\n );\n }\n if (\n expression.kind === \"localReference\" ||\n expression.kind === \"contextReference\" ||\n expression.kind === \"inputReference\"\n )\n return (\n <span className=\"ps-query-field\">\n {expression.kind === \"localReference\"\n ? \"\"\n : expression.kind === \"contextReference\"\n ? \"context.\"\n : \"input.\"}\n {expression.value.name}\n </span>\n );\n if (expression.kind === \"and\" || expression.kind === \"or\" || expression.kind === \"not\") {\n const terms =\n expression.kind === \"not\" ? [expression.value.expression] : expression.value.expressions;\n if (!terms.length)\n return (\n <span className=\"ps-query-keyword\">{expression.kind === \"and\" ? \"All rows\" : \"No rows\"}</span>\n );\n return (\n <div className=\"ps-query-group\" aria-label={expression.kind.toUpperCase()}>\n <span className=\"ps-query-connector\">{expression.kind.toUpperCase()}</span>\n <div className=\"ps-query-branches\">\n {terms.map((term, index) => (\n <Fragment key={index}>{child(term, index)}</Fragment>\n ))}\n </div>\n </div>\n );\n }\n if (isBinary(expression)) {\n const execution = annotations?.find(\n (annotation) =>\n annotation.path.length === path.length &&\n annotation.path.every((part, index) => part === path[index])\n )?.execution;\n const nullish =\n (expression.kind === \"eq\" || expression.kind === \"ne\") &&\n expression.value.right.kind === \"literal\" &&\n (expression.value.right.value.value === null || expression.value.right.value.value === undefined);\n return (\n <div className=\"ps-query-comparison\" data-execution={execution}>\n {child(expression.value.left)}\n <span className=\"ps-query-operator\">\n {nullish ? (expression.kind === \"ne\" ? \"is not\" : \"is\") : operators[expression.kind]}\n </span>\n {child(expression.value.right, 1, expression.kind === \"like\" || expression.kind === \"ilike\")}\n {execution && (\n <span className=\"ps-query-execution-label\" title={executionDescriptions[execution]}>\n {executionLabels[execution]}\n </span>\n )}\n </div>\n );\n }\n switch (expression.kind) {\n case \"lookup\":\n return (\n <div className=\"ps-query-comparison\">\n <span className=\"ps-query-operator\">lookup</span>\n {child(expression.value.reference)}\n </div>\n );\n case \"related\":\n return (\n <div className=\"ps-query-comparison\">\n {child(expression.value.source)}\n <span className=\"ps-query-operator\">→</span>\n <span className=\"ps-query-field\">{expression.value.link}</span>\n </div>\n );\n case \"concat\":\n case \"coalesce\":\n return (\n <div className=\"ps-query-group\">\n <span className=\"ps-query-connector\">{expression.kind}</span>\n <div className=\"ps-query-branches\">\n {expression.value.expressions.map((value, index) => (\n <Fragment key={index}>{child(value, index)}</Fragment>\n ))}\n </div>\n </div>\n );\n case \"struct\":\n return (\n <div className=\"ps-query-branches\">\n {expression.value.fields.map((field, index) => (\n <div className=\"ps-query-clause\" key={index}>\n <span className=\"ps-query-output\">{field.name}</span>\n {child(field.value, index)}\n </div>\n ))}\n </div>\n );\n case \"map\":\n return (\n <div className=\"ps-query-group\">\n <span className=\"ps-query-connector\">map</span>\n <div className=\"ps-query-branches\">\n {child(expression.value.source)}\n <div className=\"ps-query-clause\">\n <span className=\"ps-query-field\">{expression.value.binding}</span>\n <span className=\"ps-query-operator\">→</span>\n <QueryExpression\n expression={expression.value.body}\n scope={{ ...scope, [expression.value.binding]: undefined }}\n ir={ir}\n compactBinding={compactBinding}\n />\n </div>\n </div>\n </div>\n );\n case \"uuid\":\n case \"now\":\n return <span className=\"ps-query-field\">{expression.kind}()</span>;\n case \"case\":\n return (\n <div className=\"ps-query-group\">\n <span className=\"ps-query-connector\">CASE</span>\n <div className=\"ps-query-branches\">\n {expression.value.branches.map((branch, index) => (\n <div key={index} className=\"ps-query-clause\">\n <span className=\"ps-query-keyword\">when</span>\n {child(branch.condition, index)}\n <span className=\"ps-query-keyword\">then</span>\n {child(branch.result, index)}\n </div>\n ))}\n <div className=\"ps-query-clause\">\n <span className=\"ps-query-keyword\">else</span>\n {child(expression.value.else)}\n </div>\n </div>\n </div>\n );\n case \"exists\":\n return (\n <div className=\"ps-query-group\">\n <span className=\"ps-query-connector\">EXISTS</span>\n <QueryView query={expression.value.query} ir={ir} scope={scope} showFields={showFields} />\n </div>\n );\n default: {\n const exhaustive: never = expression;\n return exhaustive;\n }\n }\n}\n\nfunction Selections({\n select,\n ir,\n scope,\n showFields,\n}: {\n select: readonly QuerySelection[];\n ir?: OntologyIR;\n scope: Scope;\n showFields: boolean;\n}) {\n const visible = select.filter((selection) => showFields || hasQueryNode(selection));\n if (!visible.length) return null;\n return (\n <div className=\"ps-query-selections\">\n {visible.map((selection, index) => {\n switch (selection.kind) {\n case \"sub\":\n return (\n <QueryView\n key={index}\n query={selection.value.query}\n label={selection.value.name}\n cardinality={selection.value.cardinality}\n ir={ir}\n scope={scope}\n showFields={showFields}\n />\n );\n case \"field\":\n return (\n <div className=\"ps-query-selection\" key={index}>\n <span className=\"ps-query-output\">{selection.value.name}</span>\n <span className=\"ps-query-operator\">←</span>\n <QueryExpression\n expression={selection.value.expression}\n scope={scope}\n ir={ir}\n />\n </div>\n );\n case \"selectCase\":\n return (\n <div className=\"ps-query-selection-case\" key={index}>\n {selection.value.branches.map((branch, branchIndex) => (\n <div key={branchIndex}>\n <div className=\"ps-query-clause\">\n <span className=\"ps-query-connector\">WHEN</span>\n <QueryExpression\n expression={branch.condition}\n scope={scope}\n ir={ir}\n showFields={showFields}\n />\n </div>\n <Selections\n select={branch.select}\n ir={ir}\n scope={scope}\n showFields={showFields}\n />\n </div>\n ))}\n {selection.value.else && (\n <div>\n <span className=\"ps-query-connector\">ELSE</span>\n <Selections\n select={selection.value.else}\n ir={ir}\n scope={scope}\n showFields={showFields}\n />\n </div>\n )}\n </div>\n );\n }\n })}\n </div>\n );\n}\n\nfunction hasQueryNode(selection: QuerySelection): boolean {\n return (\n selection.kind === \"sub\" ||\n (selection.kind === \"selectCase\" &&\n (selection.value.branches.some((branch) => branch.select.some(hasQueryNode)) ||\n (selection.value.else?.some(hasQueryNode) ?? false)))\n );\n}\n\nexport function QueryView({\n query,\n ir,\n object,\n scope = {},\n label,\n cardinality,\n compact = false,\n showSubject = true,\n showFields = true,\n annotations,\n}: {\n query: Query;\n ir?: OntologyIR;\n object?: ObjectTypeDef;\n scope?: Scope;\n label?: string;\n cardinality?: \"one\" | \"many\";\n compact?: boolean;\n showSubject?: boolean;\n showFields?: boolean;\n annotations?: Annotations;\n}) {\n const relation = query.from.source.related;\n const owner = relation?.source.kind === \"localReference\" ? scope[relation.source.value.name] : undefined;\n const link = ir && owner && relation && resolveRelatedLink(ir, owner.name, relation.link);\n const endpoint =\n link && owner && relation\n ? isRelatedFromForeignKeySource(link, owner.name, relation.link)\n ? link.target\n : link.source\n : undefined;\n const target = endpoint?.objectType ?? query.from.source.objectType;\n const type = object ?? ir?.objectTypes.find((type) => type.name === target);\n const bindings = { ...scope, [query.from.binding]: type };\n const expressionProps = {\n scope: bindings,\n ir,\n compactBinding: compact ? query.from.binding : undefined,\n showFields,\n };\n const subject = showSubject && <QuerySubject object={type} objectType={target ?? \"Related objects\"} />;\n const clauses = (\n <>\n {relation && (\n <div className=\"ps-query-relation\">\n <span className=\"ps-query-keyword\">From</span>\n <span className=\"ps-query-relation-origin\">\n {owner && (\n <>\n <ObjectTypeIcon className=\"ps-query-object-icon\" objectType={owner} />\n <span>{owner.displayName ?? owner.name}</span>\n </>\n )}\n <QueryExpression expression={relation.source} scope={scope} ir={ir} />\n </span>\n <span className=\"ps-query-keyword\">via</span>\n <span\n className=\"ps-query-link\"\n title={\n relation.source.kind === \"localReference\"\n ? `${relation.source.value.name}.${relation.link}${target ? ` → ${target}` : \"\"}`\n : relation.link\n }\n >\n <Link2 size={13} aria-hidden />\n {endpoint?.displayName ?? relation.link}\n </span>\n </div>\n )}\n {query.where ? (\n <div className={compact ? \"ps-query-sentence\" : \"ps-query-clause\"}>\n {compact && subject}\n <span className=\"ps-query-keyword\">where</span>\n <QueryExpression\n {...expressionProps}\n expression={query.where}\n annotations={annotations}\n />\n </div>\n ) : !relation ? (\n <div className=\"ps-query-sentence\">\n {compact && subject}\n <span className=\"ps-query-keyword\">\n {compact && showSubject ? \"— all rows\" : \"All rows\"}\n </span>\n </div>\n ) : null}\n {query.orderBy?.map((order, index) => (\n <div className=\"ps-query-clause\" key={index}>\n <span className=\"ps-query-keyword\">order by</span>\n <QueryExpression {...expressionProps} expression={order.expression} />\n <span className=\"ps-query-operator\">\n {order.direction === \"desc\" ? \"descending\" : \"ascending\"}\n {nullOrderLabel(order)}\n </span>\n </div>\n ))}\n {query.page?.limit !== undefined && (\n <div className=\"ps-query-clause\">\n <span className=\"ps-query-keyword\">limit</span>\n <OperandToken value={query.page.limit} />\n </div>\n )}\n {query.page?.offset !== undefined && (\n <div className=\"ps-query-clause\">\n <span className=\"ps-query-keyword\">offset</span>\n <OperandToken value={query.page.offset} />\n </div>\n )}\n {query.page?.after && (\n <div className=\"ps-query-clause\">\n <span className=\"ps-query-keyword\">after</span>\n <OperandToken value={query.page.after.key} />\n <div className=\"ps-query-values\">\n {query.page.after.values.map((value, index) => (\n <OperandToken key={index} value={value} />\n ))}\n </div>\n </div>\n )}\n </>\n );\n if (compact) return <div className=\"ps-query-expression\">{clauses}</div>;\n return (\n <details className=\"ps-query-node\" open>\n <DisclosureSummary>\n {label && <span className=\"ps-query-output\">{label}</span>}\n {subject}\n <span className=\"ps-query-binding\">as {query.from.binding}</span>\n {cardinality && <span className=\"ps-query-cardinality\">{cardinality}</span>}\n {query.from.source.ontology && (\n <span className=\"ps-query-binding\">in {query.from.source.ontology}</span>\n )}\n </DisclosureSummary>\n <div className=\"ps-query-node-body\">\n {clauses}\n <Selections select={query.select} ir={ir} scope={bindings} showFields={showFields} />\n </div>\n </details>\n );\n}\n\nexport function QueryDocumentView({\n query,\n ir,\n showFields = true,\n}: {\n query: QueryDocument;\n ir: OntologyIR;\n showFields?: boolean;\n}) {\n return (\n <div className=\"ps-query-document\" aria-label=\"Pinned query graph\">\n {query.inputs && query.inputs.length > 0 && (\n <div className=\"ps-query-input-definitions\">\n <span className=\"ps-query-keyword\">inputs</span>\n {query.inputs.map((input) => (\n <span key={input.name} className=\"ps-query-field\">\n {input.name}: {typeDisplayName(input.type)}\n </span>\n ))}\n </div>\n )}\n <Selections select={query.select} ir={ir} scope={{}} showFields={showFields} />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { OntologyIR } from "@party-stack/ontology";
|
|
2
|
+
//#region src/SchemaView.d.ts
|
|
3
|
+
export declare function SchemaView({ ir, theme }: {
|
|
4
|
+
ir: OntologyIR;
|
|
5
|
+
theme: "dark" | "light";
|
|
6
|
+
}): import("react").JSX.Element;
|
|
7
|
+
//#endregion
|
|
8
|
+
//# sourceMappingURL=SchemaView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaView.d.ts","names":[],"sources":["../src/SchemaView.tsx"],"mappings":";;wBAsFgB,aAAa,IAAI;EAAW,IAAI;EAAY;oBAAyB,IAAA"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { ObjectTypeIcon } from "./OntologyIcons.js";
|
|
2
|
+
import { layoutSchema, schemaLinkLabel, schemaRelationship } from "./schemaLayout.js";
|
|
3
|
+
import { typeDisplayName } from "./typeDisplayName.js";
|
|
4
|
+
import { KeyRound, X } from "lucide-react";
|
|
5
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { useEffect, useMemo, useState } from "react";
|
|
7
|
+
import { Background, Controls, Handle, MarkerType, Position, ReactFlow, useNodesInitialized, useNodesState, useReactFlow, useStore } from "@xyflow/react";
|
|
8
|
+
//#region src/SchemaView.tsx
|
|
9
|
+
function ObjectCard({ data }) {
|
|
10
|
+
const properties = [...data.object.properties].sort((a, b) => Number(b.name === data.object.primaryKey) - Number(a.name === data.object.primaryKey));
|
|
11
|
+
return /* @__PURE__ */ jsxs("article", {
|
|
12
|
+
className: "ps-schema-card",
|
|
13
|
+
children: [
|
|
14
|
+
data.incoming.map((id, index) => /* @__PURE__ */ jsx(Handle, {
|
|
15
|
+
id,
|
|
16
|
+
type: "target",
|
|
17
|
+
position: Position.Left,
|
|
18
|
+
isConnectable: false,
|
|
19
|
+
style: { top: 62 + (index + 1) / (data.incoming.length + 1) * 100 }
|
|
20
|
+
}, id)),
|
|
21
|
+
/* @__PURE__ */ jsxs("header", { children: [
|
|
22
|
+
/* @__PURE__ */ jsx(ObjectTypeIcon, {
|
|
23
|
+
className: "ps-schema-object-icon",
|
|
24
|
+
objectType: data.object
|
|
25
|
+
}),
|
|
26
|
+
/* @__PURE__ */ jsx("strong", { children: data.object.displayName }),
|
|
27
|
+
/* @__PURE__ */ jsx("span", { children: properties.length })
|
|
28
|
+
] }),
|
|
29
|
+
/* @__PURE__ */ jsx("code", { children: data.object.name }),
|
|
30
|
+
/* @__PURE__ */ jsx("div", {
|
|
31
|
+
className: "ps-schema-preview",
|
|
32
|
+
children: properties.slice(0, 3).map((property) => /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("span", { children: [property.name === data.object.primaryKey && /* @__PURE__ */ jsx(KeyRound, {
|
|
33
|
+
size: 11,
|
|
34
|
+
"aria-label": "Primary key"
|
|
35
|
+
}), property.displayName] }), /* @__PURE__ */ jsx("small", {
|
|
36
|
+
title: typeDisplayName(property.type),
|
|
37
|
+
children: typeDisplayName(property.type)
|
|
38
|
+
})] }, property.name))
|
|
39
|
+
}),
|
|
40
|
+
properties.length > 3 && /* @__PURE__ */ jsxs("footer", { children: [
|
|
41
|
+
"+",
|
|
42
|
+
properties.length - 3,
|
|
43
|
+
" properties"
|
|
44
|
+
] }),
|
|
45
|
+
data.outgoing.map((id, index) => /* @__PURE__ */ jsx(Handle, {
|
|
46
|
+
id,
|
|
47
|
+
type: "source",
|
|
48
|
+
position: Position.Right,
|
|
49
|
+
isConnectable: false,
|
|
50
|
+
style: { top: 62 + (index + 1) / (data.outgoing.length + 1) * 100 }
|
|
51
|
+
}, id))
|
|
52
|
+
]
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/** Fit after the host panel's opening animation/resize, not just its initial short height. */
|
|
56
|
+
function FitSchemaViewport() {
|
|
57
|
+
const { fitView } = useReactFlow();
|
|
58
|
+
const ready = useNodesInitialized();
|
|
59
|
+
const width = useStore((state) => state.width);
|
|
60
|
+
const height = useStore((state) => state.height);
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
if (!ready || !width || !height) return;
|
|
63
|
+
const frame = requestAnimationFrame(() => {
|
|
64
|
+
fitView({
|
|
65
|
+
padding: .06,
|
|
66
|
+
maxZoom: 1
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
return () => cancelAnimationFrame(frame);
|
|
70
|
+
}, [
|
|
71
|
+
ready,
|
|
72
|
+
width,
|
|
73
|
+
height,
|
|
74
|
+
fitView
|
|
75
|
+
]);
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
const nodeTypes = { object: ObjectCard };
|
|
79
|
+
function SchemaView({ ir, theme }) {
|
|
80
|
+
const initial = useMemo(() => {
|
|
81
|
+
const layout = layoutSchema(ir);
|
|
82
|
+
const names = new Set(ir.objectTypes.map((object) => object.name));
|
|
83
|
+
const links = ir.linkTypes.filter((link) => names.has(link.source.objectType) && names.has(link.target.objectType)).map(schemaRelationship);
|
|
84
|
+
return {
|
|
85
|
+
nodes: layout.nodes.map(({ objectType, x, y }) => ({
|
|
86
|
+
id: objectType.name,
|
|
87
|
+
type: "object",
|
|
88
|
+
position: {
|
|
89
|
+
x,
|
|
90
|
+
y
|
|
91
|
+
},
|
|
92
|
+
ariaLabel: `${objectType.displayName} object type`,
|
|
93
|
+
data: {
|
|
94
|
+
object: objectType,
|
|
95
|
+
outgoing: links.filter((link) => link.source === objectType.name).map((link) => link.id),
|
|
96
|
+
incoming: links.filter((link) => link.target === objectType.name).map((link) => link.id)
|
|
97
|
+
}
|
|
98
|
+
})),
|
|
99
|
+
edges: links.map((link) => ({
|
|
100
|
+
id: link.id,
|
|
101
|
+
source: link.source,
|
|
102
|
+
target: link.target,
|
|
103
|
+
sourceHandle: link.id,
|
|
104
|
+
targetHandle: link.id,
|
|
105
|
+
type: "smoothstep",
|
|
106
|
+
label: link.label,
|
|
107
|
+
ariaLabel: `${link.source} → ${link.target}: ${link.label}`,
|
|
108
|
+
markerEnd: { type: MarkerType.ArrowClosed }
|
|
109
|
+
}))
|
|
110
|
+
};
|
|
111
|
+
}, [ir]);
|
|
112
|
+
return /* @__PURE__ */ jsx(SchemaCanvas, {
|
|
113
|
+
ir,
|
|
114
|
+
theme,
|
|
115
|
+
initial
|
|
116
|
+
}, JSON.stringify(ir));
|
|
117
|
+
}
|
|
118
|
+
function SchemaCanvas({ ir, theme, initial }) {
|
|
119
|
+
const [nodes, setNodes, onNodesChange] = useNodesState(initial.nodes);
|
|
120
|
+
const [selected, select] = useState();
|
|
121
|
+
const object = ir.objectTypes.find((type) => type.name === selected);
|
|
122
|
+
if (!ir.objectTypes.length) return /* @__PURE__ */ jsx("div", {
|
|
123
|
+
className: "ps-schema-empty",
|
|
124
|
+
children: "This ontology has no object types."
|
|
125
|
+
});
|
|
126
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
127
|
+
className: "ps-schema",
|
|
128
|
+
"aria-label": "Ontology schema",
|
|
129
|
+
children: [/* @__PURE__ */ jsxs(ReactFlow, {
|
|
130
|
+
proOptions: { hideAttribution: true },
|
|
131
|
+
nodes,
|
|
132
|
+
edges: initial.edges,
|
|
133
|
+
nodeTypes,
|
|
134
|
+
onNodesChange,
|
|
135
|
+
onSelectionChange: ({ nodes: selectedNodes }) => select(selectedNodes[0]?.id),
|
|
136
|
+
nodesConnectable: false,
|
|
137
|
+
edgesReconnectable: false,
|
|
138
|
+
edgesFocusable: false,
|
|
139
|
+
deleteKeyCode: null,
|
|
140
|
+
fitView: true,
|
|
141
|
+
fitViewOptions: {
|
|
142
|
+
padding: .06,
|
|
143
|
+
maxZoom: 1
|
|
144
|
+
},
|
|
145
|
+
minZoom: .25,
|
|
146
|
+
maxZoom: 2,
|
|
147
|
+
colorMode: theme,
|
|
148
|
+
defaultEdgeOptions: {
|
|
149
|
+
style: { strokeWidth: 1.5 },
|
|
150
|
+
labelStyle: { fontSize: 10 },
|
|
151
|
+
labelBgPadding: [6, 4],
|
|
152
|
+
labelBgBorderRadius: 4
|
|
153
|
+
},
|
|
154
|
+
children: [
|
|
155
|
+
/* @__PURE__ */ jsx(FitSchemaViewport, {}),
|
|
156
|
+
/* @__PURE__ */ jsx(Background, {
|
|
157
|
+
gap: 20,
|
|
158
|
+
size: 1
|
|
159
|
+
}),
|
|
160
|
+
/* @__PURE__ */ jsx(Controls, { showInteractive: false })
|
|
161
|
+
]
|
|
162
|
+
}), object && /* @__PURE__ */ jsxs("aside", {
|
|
163
|
+
className: "ps-schema-details",
|
|
164
|
+
"aria-label": `${object.displayName} schema details`,
|
|
165
|
+
children: [/* @__PURE__ */ jsxs("header", { children: [
|
|
166
|
+
/* @__PURE__ */ jsx("button", {
|
|
167
|
+
type: "button",
|
|
168
|
+
"aria-label": "Close schema details",
|
|
169
|
+
onClick: () => {
|
|
170
|
+
select(void 0);
|
|
171
|
+
setNodes((current) => current.map((node) => ({
|
|
172
|
+
...node,
|
|
173
|
+
selected: false
|
|
174
|
+
})));
|
|
175
|
+
},
|
|
176
|
+
children: /* @__PURE__ */ jsx(X, { size: 14 })
|
|
177
|
+
}),
|
|
178
|
+
/* @__PURE__ */ jsx(ObjectTypeIcon, {
|
|
179
|
+
className: "ps-schema-object-icon",
|
|
180
|
+
objectType: object
|
|
181
|
+
}),
|
|
182
|
+
/* @__PURE__ */ jsx("strong", { children: object.displayName })
|
|
183
|
+
] }), /* @__PURE__ */ jsxs("div", {
|
|
184
|
+
className: "ps-schema-detail-body",
|
|
185
|
+
children: [
|
|
186
|
+
/* @__PURE__ */ jsx("code", { children: object.name }),
|
|
187
|
+
/* @__PURE__ */ jsxs("table", {
|
|
188
|
+
"aria-label": "Object properties",
|
|
189
|
+
children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [/* @__PURE__ */ jsx("th", { children: "Property" }), /* @__PURE__ */ jsx("th", { children: "Type" })] }) }), /* @__PURE__ */ jsx("tbody", { children: object.properties.map((property) => /* @__PURE__ */ jsxs("tr", { children: [/* @__PURE__ */ jsxs("td", { children: [/* @__PURE__ */ jsxs("span", { children: [property.name === object.primaryKey && /* @__PURE__ */ jsx(KeyRound, {
|
|
190
|
+
size: 12,
|
|
191
|
+
"aria-label": "Primary key"
|
|
192
|
+
}), property.displayName] }), /* @__PURE__ */ jsx("code", { children: property.name })] }), /* @__PURE__ */ jsx("td", { children: typeDisplayName(property.type) })] }, property.name)) })]
|
|
193
|
+
}),
|
|
194
|
+
ir.linkTypes.some((link) => link.source.objectType === object.name || link.target.objectType === object.name) && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("h4", { children: "Relationships" }), ir.linkTypes.filter((link) => link.source.objectType === object.name || link.target.objectType === object.name).map((link) => /* @__PURE__ */ jsxs("div", {
|
|
195
|
+
className: "ps-schema-relationship",
|
|
196
|
+
children: [/* @__PURE__ */ jsx("strong", { children: schemaLinkLabel(ir, link.source.objectType === object.name ? link.target : link.source, link.source.objectType === object.name ? "one" : link.cardinality) }), /* @__PURE__ */ jsxs("span", { children: [
|
|
197
|
+
link.source.objectType,
|
|
198
|
+
".",
|
|
199
|
+
link.foreignKey,
|
|
200
|
+
" →",
|
|
201
|
+
" ",
|
|
202
|
+
link.target.objectType
|
|
203
|
+
] })]
|
|
204
|
+
}, link.id))] })
|
|
205
|
+
]
|
|
206
|
+
})]
|
|
207
|
+
})]
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
//#endregion
|
|
211
|
+
export { SchemaView };
|
|
212
|
+
|
|
213
|
+
//# sourceMappingURL=SchemaView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaView.js","names":[],"sources":["../src/SchemaView.tsx"],"sourcesContent":["import {\n Background,\n Controls,\n Handle,\n MarkerType,\n Position,\n ReactFlow,\n useNodesInitialized,\n useNodesState,\n useReactFlow,\n useStore,\n} from \"@xyflow/react\";\nimport { KeyRound, X } from \"lucide-react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { ObjectTypeIcon } from \"./OntologyIcons.js\";\nimport { layoutSchema, schemaLinkLabel, schemaRelationship } from \"./schemaLayout.js\";\nimport { typeDisplayName } from \"./typeDisplayName.js\";\nimport type { OntologyIR, ObjectTypeDef } from \"@party-stack/ontology\";\nimport type { Node, NodeProps, Edge } from \"@xyflow/react\";\n\ntype ObjectNode = Node<{ object: ObjectTypeDef; outgoing: string[]; incoming: string[] }, \"object\">;\nfunction ObjectCard({ data }: NodeProps<ObjectNode>) {\n const properties = [...data.object.properties].sort(\n (a, b) => Number(b.name === data.object.primaryKey) - Number(a.name === data.object.primaryKey)\n );\n return (\n <article className=\"ps-schema-card\">\n {data.incoming.map((id, index) => (\n <Handle\n key={id}\n id={id}\n type=\"target\"\n position={Position.Left}\n isConnectable={false}\n style={{ top: 62 + ((index + 1) / (data.incoming.length + 1)) * 100 }}\n />\n ))}\n <header>\n <ObjectTypeIcon className=\"ps-schema-object-icon\" objectType={data.object} />\n <strong>{data.object.displayName}</strong>\n <span>{properties.length}</span>\n </header>\n <code>{data.object.name}</code>\n <div className=\"ps-schema-preview\">\n {properties.slice(0, 3).map((property) => (\n <div key={property.name}>\n <span>\n {property.name === data.object.primaryKey && (\n <KeyRound size={11} aria-label=\"Primary key\" />\n )}\n {property.displayName}\n </span>\n <small title={typeDisplayName(property.type)}>{typeDisplayName(property.type)}</small>\n </div>\n ))}\n </div>\n {properties.length > 3 && <footer>+{properties.length - 3} properties</footer>}\n {data.outgoing.map((id, index) => (\n <Handle\n key={id}\n id={id}\n type=\"source\"\n position={Position.Right}\n isConnectable={false}\n style={{ top: 62 + ((index + 1) / (data.outgoing.length + 1)) * 100 }}\n />\n ))}\n </article>\n );\n}\n/** Fit after the host panel's opening animation/resize, not just its initial short height. */\nfunction FitSchemaViewport() {\n const { fitView } = useReactFlow();\n const ready = useNodesInitialized();\n const width = useStore((state) => state.width);\n const height = useStore((state) => state.height);\n useEffect(() => {\n if (!ready || !width || !height) return;\n const frame = requestAnimationFrame(() => {\n void fitView({ padding: 0.06, maxZoom: 1 });\n });\n return () => cancelAnimationFrame(frame);\n }, [ready, width, height, fitView]);\n return null;\n}\nconst nodeTypes = { object: ObjectCard };\nexport function SchemaView({ ir, theme }: { ir: OntologyIR; theme: \"dark\" | \"light\" }) {\n const initial = useMemo(() => {\n const layout = layoutSchema(ir);\n const names = new Set(ir.objectTypes.map((object) => object.name));\n const links = ir.linkTypes\n .filter((link) => names.has(link.source.objectType) && names.has(link.target.objectType))\n .map(schemaRelationship);\n return {\n nodes: layout.nodes.map(({ objectType, x, y }): ObjectNode => ({\n id: objectType.name,\n type: \"object\",\n position: { x, y },\n ariaLabel: `${objectType.displayName} object type`,\n data: {\n object: objectType,\n outgoing: links.filter((link) => link.source === objectType.name).map((link) => link.id),\n incoming: links.filter((link) => link.target === objectType.name).map((link) => link.id),\n },\n })),\n edges: links.map((link): Edge => ({\n id: link.id,\n source: link.source,\n target: link.target,\n sourceHandle: link.id,\n targetHandle: link.id,\n type: \"smoothstep\",\n label: link.label,\n ariaLabel: `${link.source} → ${link.target}: ${link.label}`,\n markerEnd: { type: MarkerType.ArrowClosed },\n })),\n };\n }, [ir]);\n return <SchemaCanvas key={JSON.stringify(ir)} ir={ir} theme={theme} initial={initial} />;\n}\nfunction SchemaCanvas({\n ir,\n theme,\n initial,\n}: {\n ir: OntologyIR;\n theme: \"dark\" | \"light\";\n initial: { nodes: ObjectNode[]; edges: Edge[] };\n}) {\n const [nodes, setNodes, onNodesChange] = useNodesState<ObjectNode>(initial.nodes);\n const [selected, select] = useState<string>();\n const object = ir.objectTypes.find((type) => type.name === selected);\n if (!ir.objectTypes.length)\n return <div className=\"ps-schema-empty\">This ontology has no object types.</div>;\n return (\n <div className=\"ps-schema\" aria-label=\"Ontology schema\">\n <ReactFlow<ObjectNode, Edge>\n proOptions={{ hideAttribution: true }}\n nodes={nodes}\n edges={initial.edges}\n nodeTypes={nodeTypes}\n onNodesChange={onNodesChange}\n onSelectionChange={({ nodes: selectedNodes }) => select(selectedNodes[0]?.id)}\n nodesConnectable={false}\n edgesReconnectable={false}\n edgesFocusable={false}\n deleteKeyCode={null}\n fitView\n fitViewOptions={{ padding: 0.06, maxZoom: 1 }}\n minZoom={0.25}\n maxZoom={2}\n colorMode={theme}\n defaultEdgeOptions={{\n style: { strokeWidth: 1.5 },\n labelStyle: { fontSize: 10 },\n labelBgPadding: [6, 4],\n labelBgBorderRadius: 4,\n }}\n >\n <FitSchemaViewport />\n <Background gap={20} size={1} />\n <Controls showInteractive={false} />\n </ReactFlow>\n {object && (\n <aside className=\"ps-schema-details\" aria-label={`${object.displayName} schema details`}>\n <header>\n <button\n type=\"button\"\n aria-label=\"Close schema details\"\n onClick={() => {\n select(undefined);\n setNodes((current) => current.map((node) => ({ ...node, selected: false })));\n }}\n >\n <X size={14} />\n </button>\n <ObjectTypeIcon className=\"ps-schema-object-icon\" objectType={object} />\n <strong>{object.displayName}</strong>\n </header>\n <div className=\"ps-schema-detail-body\">\n <code>{object.name}</code>\n <table aria-label=\"Object properties\">\n <thead>\n <tr>\n <th>Property</th>\n <th>Type</th>\n </tr>\n </thead>\n <tbody>\n {object.properties.map((property) => (\n <tr key={property.name}>\n <td>\n <span>\n {property.name === object.primaryKey && (\n <KeyRound size={12} aria-label=\"Primary key\" />\n )}\n {property.displayName}\n </span>\n <code>{property.name}</code>\n </td>\n <td>{typeDisplayName(property.type)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n {ir.linkTypes.some(\n (link) =>\n link.source.objectType === object.name ||\n link.target.objectType === object.name\n ) && (\n <>\n <h4>Relationships</h4>\n {ir.linkTypes\n .filter(\n (link) =>\n link.source.objectType === object.name ||\n link.target.objectType === object.name\n )\n .map((link) => (\n <div className=\"ps-schema-relationship\" key={link.id}>\n <strong>\n {schemaLinkLabel(\n ir,\n link.source.objectType === object.name\n ? link.target\n : link.source,\n link.source.objectType === object.name\n ? \"one\"\n : link.cardinality\n )}\n </strong>\n <span>\n {link.source.objectType}.{link.foreignKey} →{\" \"}\n {link.target.objectType}\n </span>\n </div>\n ))}\n </>\n )}\n </div>\n </aside>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
package/lib/Storage.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Status } from "./diagnostics.js";
|
|
2
|
+
import { LiveOntology } from "@party-stack/ontology";
|
|
3
|
+
//#region src/Storage.d.ts
|
|
4
|
+
type StorageView = "total" | "available" | "objects" | "attachments";
|
|
5
|
+
type StorageStatus = Pick<Status, "cache" | "capacity">;
|
|
6
|
+
export declare function Storage({ ontology }: {
|
|
7
|
+
ontology: LiveOntology;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
9
|
+
type ObjectTypes = LiveOntology["ir"]["objectTypes"];
|
|
10
|
+
export declare function StorageDetails({ status, objectTypes, view }: {
|
|
11
|
+
status: StorageStatus;
|
|
12
|
+
objectTypes?: ObjectTypes;
|
|
13
|
+
view?: StorageView;
|
|
14
|
+
}): import("react").JSX.Element;
|
|
15
|
+
//#endregion
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=Storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Storage.d.ts","names":[],"sources":["../src/Storage.tsx"],"mappings":";;;KAYK;KACA,gBAAgB,KAAK;wBAcV,UAAU;EAAc,UAAU;oBAAc,IAAA;KAuE3D,cAAc;wBAEH,iBACZ,QACA,aACA;EAEA,QAAQ;EACR,cAAc;EACd,OAAO;oBACV,IAAA"}
|
package/lib/Storage.js
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { diagnosticTargets, useReplicaStatus } from "./diagnostics.js";
|
|
2
|
+
import { ChevronDown } from "lucide-react";
|
|
3
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
import { useState } from "react";
|
|
5
|
+
//#region src/Storage.tsx
|
|
6
|
+
const bytes = (value) => {
|
|
7
|
+
if (value === void 0) return "Unavailable";
|
|
8
|
+
if (value < 1024) return `${value} B`;
|
|
9
|
+
const unit = Math.min(3, Math.floor(Math.log(value) / Math.log(1024)));
|
|
10
|
+
return `${(value / 1024 ** unit).toLocaleString(void 0, { maximumFractionDigits: 1 })} ${[
|
|
11
|
+
"B",
|
|
12
|
+
"KiB",
|
|
13
|
+
"MiB",
|
|
14
|
+
"GiB"
|
|
15
|
+
][unit]}`;
|
|
16
|
+
};
|
|
17
|
+
const views = (status) => [
|
|
18
|
+
{
|
|
19
|
+
value: "total",
|
|
20
|
+
label: "Total usage"
|
|
21
|
+
},
|
|
22
|
+
...status?.capacity?.storage?.availableBytes !== void 0 ? [{
|
|
23
|
+
value: "available",
|
|
24
|
+
label: "Available storage"
|
|
25
|
+
}] : [],
|
|
26
|
+
...status?.cache?.objects.maxBytes !== void 0 ? [{
|
|
27
|
+
value: "objects",
|
|
28
|
+
label: "Object budget"
|
|
29
|
+
}] : [],
|
|
30
|
+
...status?.cache?.attachments?.maxBytes !== void 0 ? [{
|
|
31
|
+
value: "attachments",
|
|
32
|
+
label: "Attachment budget"
|
|
33
|
+
}] : []
|
|
34
|
+
];
|
|
35
|
+
function Storage({ ontology }) {
|
|
36
|
+
const targets = diagnosticTargets(ontology.diagnostics);
|
|
37
|
+
const [index, setIndex] = useState(() => ontology.diagnostics?.parent ? 1 : 0);
|
|
38
|
+
const target = targets[index] ?? targets[0];
|
|
39
|
+
const snapshot = useReplicaStatus(target?.value);
|
|
40
|
+
const [view, setView] = useState("total");
|
|
41
|
+
const choices = views(snapshot.status);
|
|
42
|
+
const selected = choices.some((choice) => choice.value === view) ? view : "total";
|
|
43
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
44
|
+
className: "ps-diagnostics-screen ps-storage",
|
|
45
|
+
"aria-label": "Storage inspector",
|
|
46
|
+
children: [/* @__PURE__ */ jsxs("header", {
|
|
47
|
+
className: "ps-diagnostics-toolbar ps-trace-toolbar",
|
|
48
|
+
children: [
|
|
49
|
+
/* @__PURE__ */ jsxs("div", {
|
|
50
|
+
className: "ps-trace-source",
|
|
51
|
+
children: [/* @__PURE__ */ jsx("span", { children: "Source" }), targets.length > 1 ? /* @__PURE__ */ jsxs("span", {
|
|
52
|
+
className: "ps-trace-source-select",
|
|
53
|
+
children: [/* @__PURE__ */ jsx("select", {
|
|
54
|
+
"aria-label": "Storage source",
|
|
55
|
+
value: index,
|
|
56
|
+
onChange: (event) => setIndex(Number(event.target.value)),
|
|
57
|
+
children: targets.map((item, key) => /* @__PURE__ */ jsx("option", {
|
|
58
|
+
value: key,
|
|
59
|
+
children: item.label
|
|
60
|
+
}, key))
|
|
61
|
+
}), /* @__PURE__ */ jsx(ChevronDown, {
|
|
62
|
+
size: 12,
|
|
63
|
+
"aria-hidden": true
|
|
64
|
+
})]
|
|
65
|
+
}) : /* @__PURE__ */ jsx("strong", { children: target?.label ?? "This tab" })]
|
|
66
|
+
}),
|
|
67
|
+
/* @__PURE__ */ jsx("span", {
|
|
68
|
+
className: "ps-trace-toolbar-separator",
|
|
69
|
+
"aria-hidden": true
|
|
70
|
+
}),
|
|
71
|
+
/* @__PURE__ */ jsxs("div", {
|
|
72
|
+
className: "ps-trace-source",
|
|
73
|
+
children: [/* @__PURE__ */ jsx("span", { children: "View" }), /* @__PURE__ */ jsxs("span", {
|
|
74
|
+
className: "ps-trace-source-select",
|
|
75
|
+
children: [/* @__PURE__ */ jsx("select", {
|
|
76
|
+
"aria-label": "Storage view",
|
|
77
|
+
value: selected,
|
|
78
|
+
onChange: (event) => setView(event.target.value),
|
|
79
|
+
children: choices.map((choice) => /* @__PURE__ */ jsx("option", {
|
|
80
|
+
value: choice.value,
|
|
81
|
+
children: choice.label
|
|
82
|
+
}, choice.value))
|
|
83
|
+
}), /* @__PURE__ */ jsx(ChevronDown, {
|
|
84
|
+
size: 12,
|
|
85
|
+
"aria-hidden": true
|
|
86
|
+
})]
|
|
87
|
+
})]
|
|
88
|
+
})
|
|
89
|
+
]
|
|
90
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
91
|
+
className: "ps-storage-content",
|
|
92
|
+
children: [snapshot.error && /* @__PURE__ */ jsx("p", {
|
|
93
|
+
role: "alert",
|
|
94
|
+
children: snapshot.error
|
|
95
|
+
}), snapshot.status ? /* @__PURE__ */ jsx(StorageDetails, {
|
|
96
|
+
status: snapshot.status,
|
|
97
|
+
objectTypes: ontology.ir.objectTypes,
|
|
98
|
+
view: selected
|
|
99
|
+
}) : /* @__PURE__ */ jsx("p", {
|
|
100
|
+
className: "ps-replication-empty",
|
|
101
|
+
children: snapshot.error ? "Storage information unavailable." : "Waiting for storage information…"
|
|
102
|
+
})]
|
|
103
|
+
})]
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
function StorageDetails({ status, objectTypes = [], view = "total" }) {
|
|
107
|
+
const [hovered, setHovered] = useState();
|
|
108
|
+
const [focused, setFocused] = useState();
|
|
109
|
+
const highlighted = hovered ?? focused;
|
|
110
|
+
const objects = status.cache?.objects;
|
|
111
|
+
const attachments = status.cache?.attachments;
|
|
112
|
+
const parts = [...view === "attachments" ? [] : objects?.byObjectType?.length ? objects.byObjectType.map((entry) => {
|
|
113
|
+
const type = objectTypes.find((type) => type.name === entry.objectType);
|
|
114
|
+
return {
|
|
115
|
+
label: type?.pluralDisplayName ?? entry.objectType,
|
|
116
|
+
bytes: entry.bytes,
|
|
117
|
+
color: type?.color ?? "var(--ps-muted)"
|
|
118
|
+
};
|
|
119
|
+
}) : [{
|
|
120
|
+
label: "Objects",
|
|
121
|
+
bytes: objects?.bytes ?? 0,
|
|
122
|
+
color: "var(--ps-muted)"
|
|
123
|
+
}], ...view === "objects" ? [] : [{
|
|
124
|
+
label: "Attachments",
|
|
125
|
+
bytes: attachments?.bytes ?? 0,
|
|
126
|
+
color: "var(--ps-accent)"
|
|
127
|
+
}]].filter((entry) => entry.bytes > 0);
|
|
128
|
+
const total = parts.reduce((sum, part) => sum + part.bytes, 0);
|
|
129
|
+
const capacity = view === "available" ? status.capacity?.storage : void 0;
|
|
130
|
+
const available = capacity?.availableBytes;
|
|
131
|
+
const budget = view === "objects" ? objects : view === "attachments" ? attachments : void 0;
|
|
132
|
+
const scale = Math.max(total, budget?.maxBytes ?? total + (available ?? 0));
|
|
133
|
+
const freeLabel = available !== void 0 ? "Available storage" : budget?.maxBytes !== void 0 ? "Remaining budget" : void 0;
|
|
134
|
+
const free = available ?? (budget?.maxBytes === void 0 ? void 0 : Math.max(0, budget.maxBytes - total));
|
|
135
|
+
const chartParts = [...parts, ...freeLabel && free !== void 0 ? [{
|
|
136
|
+
label: freeLabel,
|
|
137
|
+
bytes: free,
|
|
138
|
+
color: "var(--ps-hover)"
|
|
139
|
+
}] : []];
|
|
140
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("section", {
|
|
141
|
+
className: "ps-storage-summary",
|
|
142
|
+
"aria-label": "Replica cache usage",
|
|
143
|
+
children: [
|
|
144
|
+
/* @__PURE__ */ jsxs("div", {
|
|
145
|
+
className: "ps-storage-heading",
|
|
146
|
+
children: [/* @__PURE__ */ jsx("h2", { children: view === "objects" ? "Object cache" : view === "attachments" ? "Attachment cache" : "Replica cache" }), /* @__PURE__ */ jsxs("strong", { children: [status.cache ? bytes(total) : "Unavailable", budget?.maxBytes !== void 0 ? ` of ${bytes(budget.maxBytes)}` : available !== void 0 ? ` · ${bytes(available)} available` : ""] })]
|
|
147
|
+
}),
|
|
148
|
+
/* @__PURE__ */ jsx("figure", {
|
|
149
|
+
className: "ps-storage-chart",
|
|
150
|
+
"aria-label": "Storage by object type",
|
|
151
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
152
|
+
className: "ps-storage-bar",
|
|
153
|
+
children: [chartParts.map((part) => /* @__PURE__ */ jsx("span", {
|
|
154
|
+
title: `${part.label}: ${bytes(part.bytes)}`,
|
|
155
|
+
"data-storage-part": part.label,
|
|
156
|
+
"data-dimmed": highlighted !== void 0 && highlighted !== part.label,
|
|
157
|
+
className: part.label === freeLabel ? "ps-storage-free" : void 0,
|
|
158
|
+
style: {
|
|
159
|
+
width: `${scale ? part.bytes / scale * 100 : 0}%`,
|
|
160
|
+
background: part.color
|
|
161
|
+
},
|
|
162
|
+
children: part.label === freeLabel && part.bytes / scale > .2 ? `${bytes(part.bytes)} ${available !== void 0 ? "available" : "remaining"}` : ""
|
|
163
|
+
}, part.label)), budget?.targetBytes !== void 0 && scale > 0 && /* @__PURE__ */ jsx("i", {
|
|
164
|
+
className: "ps-storage-target",
|
|
165
|
+
style: { left: `${budget.targetBytes / scale * 100}%` },
|
|
166
|
+
title: `Reclaim toward ${bytes(budget.targetBytes)}`
|
|
167
|
+
})]
|
|
168
|
+
})
|
|
169
|
+
}),
|
|
170
|
+
/* @__PURE__ */ jsx("div", {
|
|
171
|
+
className: "ps-storage-legend",
|
|
172
|
+
children: chartParts.map((part) => /* @__PURE__ */ jsxs("button", {
|
|
173
|
+
type: "button",
|
|
174
|
+
onPointerEnter: () => setHovered(part.label),
|
|
175
|
+
onPointerLeave: () => setHovered(void 0),
|
|
176
|
+
onFocus: () => setFocused(part.label),
|
|
177
|
+
onBlur: () => setFocused(void 0),
|
|
178
|
+
children: [
|
|
179
|
+
/* @__PURE__ */ jsx("i", {
|
|
180
|
+
style: { background: part.color },
|
|
181
|
+
"aria-hidden": true
|
|
182
|
+
}),
|
|
183
|
+
part.label,
|
|
184
|
+
/* @__PURE__ */ jsx("strong", { children: bytes(part.bytes) })
|
|
185
|
+
]
|
|
186
|
+
}, part.label))
|
|
187
|
+
}),
|
|
188
|
+
budget?.targetBytes !== void 0 && /* @__PURE__ */ jsxs("p", {
|
|
189
|
+
className: "ps-storage-budget-note",
|
|
190
|
+
children: [
|
|
191
|
+
"Reclaim toward ",
|
|
192
|
+
bytes(budget.targetBytes),
|
|
193
|
+
total > (budget.maxBytes ?? Infinity) ? " · Above budget" : ""
|
|
194
|
+
]
|
|
195
|
+
})
|
|
196
|
+
]
|
|
197
|
+
}), /* @__PURE__ */ jsxs("p", {
|
|
198
|
+
className: "ps-storage-note ps-storage-footnote",
|
|
199
|
+
children: ["Logical payload sizes. Database indexes, filesystem overhead and transfer buffers are excluded.", available !== void 0 ? capacity?.scope === "origin" ? " Available storage is the browser origin’s shared free quota, not device free space." : " Available storage is shared with other users of this filesystem or database." : ""]
|
|
200
|
+
})] });
|
|
201
|
+
}
|
|
202
|
+
//#endregion
|
|
203
|
+
export { Storage, StorageDetails };
|
|
204
|
+
|
|
205
|
+
//# sourceMappingURL=Storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Storage.js","names":[],"sources":["../src/Storage.tsx"],"sourcesContent":["import { ChevronDown } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { diagnosticTargets, useReplicaStatus } from \"./diagnostics.js\";\nimport type { Status } from \"./diagnostics.js\";\nimport type { LiveOntology } from \"@party-stack/ontology\";\n\nconst bytes = (value?: number) => {\n if (value === undefined) return \"Unavailable\";\n if (value < 1024) return `${value} B`;\n const unit = Math.min(3, Math.floor(Math.log(value) / Math.log(1024)));\n return `${(value / 1024 ** unit).toLocaleString(undefined, { maximumFractionDigits: 1 })} ${[\"B\", \"KiB\", \"MiB\", \"GiB\"][unit]}`;\n};\ntype StorageView = \"total\" | \"available\" | \"objects\" | \"attachments\";\ntype StorageStatus = Pick<Status, \"cache\" | \"capacity\">;\nconst views = (status?: StorageStatus): readonly { value: StorageView; label: string }[] => [\n { value: \"total\", label: \"Total usage\" },\n ...(status?.capacity?.storage?.availableBytes !== undefined\n ? [{ value: \"available\" as const, label: \"Available storage\" }]\n : []),\n ...(status?.cache?.objects.maxBytes !== undefined\n ? [{ value: \"objects\" as const, label: \"Object budget\" }]\n : []),\n ...(status?.cache?.attachments?.maxBytes !== undefined\n ? [{ value: \"attachments\" as const, label: \"Attachment budget\" }]\n : []),\n];\n\nexport function Storage({ ontology }: { ontology: LiveOntology }) {\n const targets = diagnosticTargets(ontology.diagnostics);\n const [index, setIndex] = useState(() => (ontology.diagnostics?.parent ? 1 : 0));\n const target = targets[index] ?? targets[0];\n const snapshot = useReplicaStatus(target?.value);\n const [view, setView] = useState<StorageView>(\"total\");\n const choices = views(snapshot.status);\n const selected = choices.some((choice) => choice.value === view) ? view : \"total\";\n return (\n <div className=\"ps-diagnostics-screen ps-storage\" aria-label=\"Storage inspector\">\n <header className=\"ps-diagnostics-toolbar ps-trace-toolbar\">\n <div className=\"ps-trace-source\">\n <span>Source</span>\n {targets.length > 1 ? (\n <span className=\"ps-trace-source-select\">\n <select\n aria-label=\"Storage source\"\n value={index}\n onChange={(event) => setIndex(Number(event.target.value))}\n >\n {targets.map((item, key) => (\n <option key={key} value={key}>\n {item.label}\n </option>\n ))}\n </select>\n <ChevronDown size={12} aria-hidden />\n </span>\n ) : (\n <strong>{target?.label ?? \"This tab\"}</strong>\n )}\n </div>\n <span className=\"ps-trace-toolbar-separator\" aria-hidden />\n <div className=\"ps-trace-source\">\n <span>View</span>\n <span className=\"ps-trace-source-select\">\n <select\n aria-label=\"Storage view\"\n value={selected}\n onChange={(event) => setView(event.target.value as StorageView)}\n >\n {choices.map((choice) => (\n <option key={choice.value} value={choice.value}>\n {choice.label}\n </option>\n ))}\n </select>\n <ChevronDown size={12} aria-hidden />\n </span>\n </div>\n </header>\n <div className=\"ps-storage-content\">\n {snapshot.error && <p role=\"alert\">{snapshot.error}</p>}\n {snapshot.status ? (\n <StorageDetails\n status={snapshot.status}\n objectTypes={ontology.ir.objectTypes}\n view={selected}\n />\n ) : (\n <p className=\"ps-replication-empty\">\n {snapshot.error\n ? \"Storage information unavailable.\"\n : \"Waiting for storage information…\"}\n </p>\n )}\n </div>\n </div>\n );\n}\n\ntype ObjectTypes = LiveOntology[\"ir\"][\"objectTypes\"];\n\nexport function StorageDetails({\n status,\n objectTypes = [],\n view = \"total\",\n}: {\n status: StorageStatus;\n objectTypes?: ObjectTypes;\n view?: StorageView;\n}) {\n const [hovered, setHovered] = useState<string>();\n const [focused, setFocused] = useState<string>();\n const highlighted = hovered ?? focused;\n const objects = status.cache?.objects;\n const attachments = status.cache?.attachments;\n const parts = [\n ...(view === \"attachments\"\n ? []\n : objects?.byObjectType?.length\n ? objects.byObjectType.map((entry) => {\n const type = objectTypes.find((type) => type.name === entry.objectType);\n return {\n label: type?.pluralDisplayName ?? entry.objectType,\n bytes: entry.bytes,\n color: type?.color ?? \"var(--ps-muted)\",\n };\n })\n : [{ label: \"Objects\", bytes: objects?.bytes ?? 0, color: \"var(--ps-muted)\" }]),\n ...(view === \"objects\"\n ? []\n : [{ label: \"Attachments\", bytes: attachments?.bytes ?? 0, color: \"var(--ps-accent)\" }]),\n ].filter((entry) => entry.bytes > 0);\n const total = parts.reduce((sum, part) => sum + part.bytes, 0);\n const capacity = view === \"available\" ? status.capacity?.storage : undefined;\n const available = capacity?.availableBytes;\n const budget = view === \"objects\" ? objects : view === \"attachments\" ? attachments : undefined;\n const scale = Math.max(total, budget?.maxBytes ?? total + (available ?? 0));\n const freeLabel =\n available !== undefined\n ? \"Available storage\"\n : budget?.maxBytes !== undefined\n ? \"Remaining budget\"\n : undefined;\n const free =\n available ?? (budget?.maxBytes === undefined ? undefined : Math.max(0, budget.maxBytes - total));\n const chartParts = [\n ...parts,\n ...(freeLabel && free !== undefined\n ? [{ label: freeLabel, bytes: free, color: \"var(--ps-hover)\" }]\n : []),\n ];\n const heading =\n view === \"objects\" ? \"Object cache\" : view === \"attachments\" ? \"Attachment cache\" : \"Replica cache\";\n return (\n <>\n <section className=\"ps-storage-summary\" aria-label=\"Replica cache usage\">\n <div className=\"ps-storage-heading\">\n <h2>{heading}</h2>\n <strong>\n {status.cache ? bytes(total) : \"Unavailable\"}\n {budget?.maxBytes !== undefined\n ? ` of ${bytes(budget.maxBytes)}`\n : available !== undefined\n ? ` · ${bytes(available)} available`\n : \"\"}\n </strong>\n </div>\n <figure className=\"ps-storage-chart\" aria-label=\"Storage by object type\">\n <div className=\"ps-storage-bar\">\n {chartParts.map((part) => (\n <span\n key={part.label}\n title={`${part.label}: ${bytes(part.bytes)}`}\n data-storage-part={part.label}\n data-dimmed={highlighted !== undefined && highlighted !== part.label}\n className={part.label === freeLabel ? \"ps-storage-free\" : undefined}\n style={{\n width: `${scale ? (part.bytes / scale) * 100 : 0}%`,\n background: part.color,\n }}\n >\n {part.label === freeLabel && part.bytes / scale > 0.2\n ? `${bytes(part.bytes)} ${available !== undefined ? \"available\" : \"remaining\"}`\n : \"\"}\n </span>\n ))}\n {budget?.targetBytes !== undefined && scale > 0 && (\n <i\n className=\"ps-storage-target\"\n style={{ left: `${(budget.targetBytes / scale) * 100}%` }}\n title={`Reclaim toward ${bytes(budget.targetBytes)}`}\n />\n )}\n </div>\n </figure>\n <div className=\"ps-storage-legend\">\n {chartParts.map((part) => (\n <button\n type=\"button\"\n key={part.label}\n onPointerEnter={() => setHovered(part.label)}\n onPointerLeave={() => setHovered(undefined)}\n onFocus={() => setFocused(part.label)}\n onBlur={() => setFocused(undefined)}\n >\n <i style={{ background: part.color }} aria-hidden />\n {part.label}\n <strong>{bytes(part.bytes)}</strong>\n </button>\n ))}\n </div>\n {budget?.targetBytes !== undefined && (\n <p className=\"ps-storage-budget-note\">\n Reclaim toward {bytes(budget.targetBytes)}\n {total > (budget.maxBytes ?? Infinity) ? \" · Above budget\" : \"\"}\n </p>\n )}\n </section>\n <p className=\"ps-storage-note ps-storage-footnote\">\n Logical payload sizes. Database indexes, filesystem overhead and transfer buffers are\n excluded.\n {available !== undefined\n ? capacity?.scope === \"origin\"\n ? \" Available storage is the browser origin’s shared free quota, not device free space.\"\n : \" Available storage is shared with other users of this filesystem or database.\"\n : \"\"}\n </p>\n </>\n );\n}\n"],"mappings":"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"}
|
package/lib/Tracing.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tracing.d.ts","names":[],"sources":["../src/Tracing.tsx"],"mappings":";;wBAyBgB,UAAU;EAAc,UAAU;oBAAc,IAAA"}
|