From 0dbd1ed6ee1af3e431f1c58f5f670bd9b8259c58 Mon Sep 17 00:00:00 2001 From: Ariel Weinberger Date: Sat, 14 Oct 2023 17:00:13 -0700 Subject: [PATCH] feat: filters for metrics and charts in dashboard (#250) * feat: filters for metrics and charts in dashboard * feat(console): add filter number indicator * chore: remove redundant npm package --- .../components/prompts/FunctionsEditor.tsx | 183 ------------------ .../components/prompts/FunctionsFormModal.tsx | 4 +- .../components/requests/RequestFilters.tsx | 57 ++---- .../pages/projects/overview/DashboardPage.tsx | 49 +++-- .../overview/charts/ExecutionTimeChart.tsx | 3 + .../overview/charts/SuccessErrorRateChart.tsx | 3 + .../overview/useProjectOverviewMetrics.tsx | 3 + .../src/app/pages/requests/RequestsPage.tsx | 6 +- .../inputs/get-project-metrics.input.ts | 7 + .../inputs/get-prompt-metrics.input.ts | 4 + apps/server/src/app/metrics/metrics.utils.ts | 5 +- .../app/metrics/project-metrics.resolver.ts | 22 ++- .../app/metrics/project-metrics.service.ts | 77 +++++--- .../src/app/reporting/reporting.service.ts | 4 +- .../src/app/reporting/utils/dql-utils.ts | 2 +- package-lock.json | 46 ----- package.json | 3 - 17 files changed, 149 insertions(+), 329 deletions(-) delete mode 100755 apps/console/src/app/components/prompts/FunctionsEditor.tsx diff --git a/apps/console/src/app/components/prompts/FunctionsEditor.tsx b/apps/console/src/app/components/prompts/FunctionsEditor.tsx deleted file mode 100755 index fbe2cc3a..00000000 --- a/apps/console/src/app/components/prompts/FunctionsEditor.tsx +++ /dev/null @@ -1,183 +0,0 @@ -import { Col, Form, Row } from "antd"; -import { FormConfig, OnSubmit } from "@tutim/types"; -import { TutimWizard, TutimProvider } from "@tutim/headless"; -import { defaultFields } from "@tutim/fields"; -import { usePromptVersionEditorContext } from "../../lib/providers/PromptVersionEditorContext"; -import { trackEvent } from "../../lib/utils/analytics"; -import "./form.css"; - -interface Props { - onClose: () => void; -} - -const config: FormConfig = { - layout: { - arrayConfigs: { - functions: { - groupConfigs: { - groups: [ - { - key: "meta", - fields: ["name", "description"], - layout: { fieldsPerRow: 2 }, - }, - ], - }, - }, - "functions.$.parameters": { - groupConfigs: { - groups: [ - { - key: "name", - fields: ["key", "type"], - layout: { fieldsPerRow: 2 }, - }, - ], - }, - }, - }, - }, - fields: [ - { - key: "functions", - label: "Functions", - type: "array", - children: { - fields: [ - { - key: "name", - label: "Function Name", - type: "text", - isRequired: true, - }, - { - key: "description", - label: "Function Description", - type: "text", - isRequired: true, - }, - { - key: "parameters", - label: "Parameters", - type: "array", - children: { - fields: [ - { - key: "key", - label: "Key", - type: "text", - isRequired: true, - }, - { - key: "type", - label: "Type", - type: "select", - isRequired: true, - defaultValue: "string", - options: [ - { label: "String", value: "string" }, - { label: "Number", value: "number" }, - { label: "Boolean", value: "boolean" }, - { label: "Object", value: "object" }, - { label: "Array", value: "array" }, - ], - }, - { - key: "description", - label: "Description", - type: "text", - }, - ], - }, - }, - ], - }, - }, - ], -}; - -export const FunctionsForm = ({ data, onSubmit }): JSX.Element => { - return ( - - - - ); -}; - -export const FunctionsEditor = ({ onClose }: Props) => { - const { form } = usePromptVersionEditorContext(); - const settings = Form.useWatch("settings", { form, preserve: true }); - const functions = form.getFieldValue(["settings", "functions"]) || []; - - const data = functions.map(parseFromSchemaToFormData); - const onSubmit: OnSubmit = ({ data }) => { - const parsedFunctions = data.functions.map(parseFromFormDataToSchema); - form.setFieldsValue({ - settings: { - functions: parsedFunctions.length ? parsedFunctions : undefined, - }, - }); - onClose(); - trackEvent("prompt_functions_edited"); - }; - - return ( - - - - - - ); -}; - -interface FunctionForm { - name: string; - description: string; - parameters: { - key: string; - type: string; - description: string; - required: boolean; - }[]; -} - -interface FunctionSchema { - name: string; - description: string; - parameters: { - properties: Record< - string, - { - type: string; - description: string; - required: boolean; - } - >; - }; -} - -const mapArrWithKeyToObjByKey = (arr: T[]) => { - return arr.reduce((acc, { key, ...rest }) => { - acc[key] = rest; - return acc; - }, {}); -}; - -const parseFromFormDataToSchema = (data: FunctionForm): FunctionSchema => { - const propertiesObject = mapArrWithKeyToObjByKey(data.parameters); - const parameters = { - type: "object", - properties: propertiesObject, - }; - return { ...data, parameters }; -}; - -const parseFromSchemaToFormData = (data: FunctionSchema): FunctionForm => { - const parametersArray = Object.entries(data.parameters.properties).map( - ([key, value]) => ({ key, ...value }) - ); - return { ...data, parameters: parametersArray }; -}; diff --git a/apps/console/src/app/components/prompts/FunctionsFormModal.tsx b/apps/console/src/app/components/prompts/FunctionsFormModal.tsx index 5c48880f..b77785d8 100644 --- a/apps/console/src/app/components/prompts/FunctionsFormModal.tsx +++ b/apps/console/src/app/components/prompts/FunctionsFormModal.tsx @@ -1,5 +1,5 @@ import { Modal } from "antd"; -import { FunctionsEditor } from "./FunctionsEditor"; +// import { FunctionsEditor } from "./FunctionsEditor"; interface Props { open: boolean; @@ -15,7 +15,7 @@ export const FunctionsFormModal = ({ open, onClose }: Props) => { footer={false} width={"700px"} > - + {/* */} ); }; diff --git a/apps/console/src/app/components/requests/RequestFilters.tsx b/apps/console/src/app/components/requests/RequestFilters.tsx index 5a61faa5..b5998fa4 100644 --- a/apps/console/src/app/components/requests/RequestFilters.tsx +++ b/apps/console/src/app/components/requests/RequestFilters.tsx @@ -1,6 +1,4 @@ -import { RequestReportItem } from "../../pages/requests/types"; -import { Card, Space } from "antd"; -import styled from "@emotion/styled"; +import { Space } from "antd"; import { AddFilterItem, FilterItem } from "./filters/FilterItem"; import { useFiltersAndSortParams } from "../../lib/hooks/useFiltersAndSortParams"; import { @@ -8,42 +6,27 @@ import { STRING_FILTER_OPERATORS, } from "../../lib/constants/filters"; -const Box = styled.div` - padding: 10px 0; -`; - -interface Props { - requests: RequestReportItem[]; -} - -export const RequestFilters = (props: Props) => { +export const RequestFilters = () => { const { filters, removeFilter, addFilter } = useFiltersAndSortParams(); return ( - - - - - - {filters.map((filter) => ( - op.value === filter.operator - )?.label - } - value={filter.value} - onRemoveFilter={() => removeFilter(filter)} - /> - ))} - - - - + + + + {filters.map((filter) => ( + op.value === filter.operator + )?.label + } + value={filter.value} + onRemoveFilter={() => removeFilter(filter)} + /> + ))} + + ); }; diff --git a/apps/console/src/app/pages/projects/overview/DashboardPage.tsx b/apps/console/src/app/pages/projects/overview/DashboardPage.tsx index be7cbf40..6e98cad0 100644 --- a/apps/console/src/app/pages/projects/overview/DashboardPage.tsx +++ b/apps/console/src/app/pages/projects/overview/DashboardPage.tsx @@ -1,4 +1,5 @@ -import { Card, Col, Row, Typography } from "antd"; +import { Button, Card, Col, Popover, Row, Space, Typography } from "antd"; +import Icon from "@ant-design/icons/lib/components/Icon"; import { SuccessErrorRateChart } from "./charts/SuccessErrorRateChart"; import { ProjectMetricControlsProvider } from "./charts/ProjectMetricContext"; import { TimeframeSelector } from "../../../components/metrics/TimeframeSelector"; @@ -6,17 +7,43 @@ import { TimeframeSelectorProvider } from "../../../lib/providers/TimeframeSelec import { StatisticsSection } from "./StatisticsSection"; import { ExecutionTimeChart } from "./charts/ExecutionTimeChart"; import { usePageTitle } from "../../../lib/hooks/usePageTitle"; +import { RequestFilters } from "../../../components/requests/RequestFilters"; +import { FunnelIcon } from "@heroicons/react/24/outline"; +import { useFiltersAndSortParams } from "../../../lib/hooks/useFiltersAndSortParams"; export const DashboardPage = () => { usePageTitle("Dashboard"); + const { filters } = useFiltersAndSortParams(); + return ( - + Dashboard - - + + + } + > + + + + @@ -47,20 +74,6 @@ export const DashboardPage = () => { - {/* - - -
- - Total Cost (Per Provider) - -
- -
-
-
- -
*/}
); }; diff --git a/apps/console/src/app/pages/projects/overview/charts/ExecutionTimeChart.tsx b/apps/console/src/app/pages/projects/overview/charts/ExecutionTimeChart.tsx index 804ead5f..4093a5c7 100644 --- a/apps/console/src/app/pages/projects/overview/charts/ExecutionTimeChart.tsx +++ b/apps/console/src/app/pages/projects/overview/charts/ExecutionTimeChart.tsx @@ -20,6 +20,7 @@ import { } from "../../../../../@generated/graphql/graphql"; import { Spin } from "antd"; import { LoadingOutlined } from "@ant-design/icons"; +import { useFiltersAndSortParams } from "../../../../lib/hooks/useFiltersAndSortParams"; const histogramToChartData = (requests: HistogramMetric[]) => { return requests.map((entry) => ({ @@ -32,6 +33,7 @@ export const ExecutionTimeChart = () => { const { project } = useCurrentProject(); const { startDate, endDate } = useTimeframeSelector(); const controls = useProjectMetricControls(); + const { filters } = useFiltersAndSortParams(); const durationHistogram = useProjectMetricHistogram( { @@ -40,6 +42,7 @@ export const ExecutionTimeChart = () => { bucketSize: controls.bucketSize, startDate: startDate, endDate: endDate, + filters, }, { enabled: !!project && !!startDate && !!endDate, diff --git a/apps/console/src/app/pages/projects/overview/charts/SuccessErrorRateChart.tsx b/apps/console/src/app/pages/projects/overview/charts/SuccessErrorRateChart.tsx index 33a6f013..71c07814 100644 --- a/apps/console/src/app/pages/projects/overview/charts/SuccessErrorRateChart.tsx +++ b/apps/console/src/app/pages/projects/overview/charts/SuccessErrorRateChart.tsx @@ -20,6 +20,7 @@ import { useProjectMetricControls } from "./ProjectMetricContext"; import { TooltipWithTimestamp } from "./TooltipWithTimestamp"; import { Spin } from "antd"; import { LoadingOutlined } from "@ant-design/icons"; +import { useFiltersAndSortParams } from "../../../../lib/hooks/useFiltersAndSortParams"; const histogramToChartData = ( totalRequests: HistogramMetric[], @@ -39,6 +40,7 @@ const histogramToChartData = ( export const SuccessErrorRateChart = () => { const { startDate, endDate } = useTimeframeSelector(); const controls = useProjectMetricControls(); + const { filters } = useFiltersAndSortParams(); const { project } = useCurrentProject(); const totalRequestsHistogram = useProjectMetricHistogram( @@ -48,6 +50,7 @@ export const SuccessErrorRateChart = () => { bucketSize: controls.bucketSize, startDate: startDate, endDate: endDate, + filters, }, { enabled: !!project && !!startDate && !!endDate, diff --git a/apps/console/src/app/pages/projects/overview/useProjectOverviewMetrics.tsx b/apps/console/src/app/pages/projects/overview/useProjectOverviewMetrics.tsx index 243165df..39afa68e 100644 --- a/apps/console/src/app/pages/projects/overview/useProjectOverviewMetrics.tsx +++ b/apps/console/src/app/pages/projects/overview/useProjectOverviewMetrics.tsx @@ -1,11 +1,13 @@ import { ProjectMetricType } from "../../../../@generated/graphql/graphql"; import { useProjectMetric } from "../../../graphql/hooks/queries"; import { useCurrentProject } from "../../../lib/hooks/useCurrentProject"; +import { useFiltersAndSortParams } from "../../../lib/hooks/useFiltersAndSortParams"; import { useTimeframeSelector } from "../../../lib/providers/TimeframeSelectorContext"; export const useProjectOverviewMetrics = () => { const { project } = useCurrentProject(); const { startDate, endDate } = useTimeframeSelector(); + const { filters } = useFiltersAndSortParams(); const useMetric = (metric: ProjectMetricType) => useProjectMetric( @@ -14,6 +16,7 @@ export const useProjectOverviewMetrics = () => { metric, startDate, endDate, + filters, }, { enabled: !!project && !!startDate && !!endDate, diff --git a/apps/console/src/app/pages/requests/RequestsPage.tsx b/apps/console/src/app/pages/requests/RequestsPage.tsx index 0f19987b..dca35db6 100644 --- a/apps/console/src/app/pages/requests/RequestsPage.tsx +++ b/apps/console/src/app/pages/requests/RequestsPage.tsx @@ -1,4 +1,4 @@ -import { Drawer, Space, Table, Tag, Typography } from "antd"; +import { Drawer, Space, Table, Tag, Typography, Card } from "antd"; import type { ColumnsType } from "antd/es/table"; import { useGetRequestReports } from "../../graphql/hooks/queries"; import { useMemo, useState } from "react"; @@ -136,7 +136,9 @@ export const RequestsPage = () => {
Requests - + + + Date, { nullable: false }) endDate: Date; + + @Field(() => [FilterInput], { nullable: true }) + filters?: FilterInput[]; } export enum ProjectMetricHistogramBucketSize { @@ -55,4 +59,7 @@ export class GetProjectMetricHistogramInput { @Field(() => ProjectMetricHistogramBucketSize, { nullable: true }) bucketSize?: ProjectMetricHistogramBucketSize; // The size of each histogram bucket, e.g., "1d", "1w", "1h" + + @Field(() => [FilterInput], { nullable: true }) + filters?: FilterInput[]; } diff --git a/apps/server/src/app/metrics/inputs/get-prompt-metrics.input.ts b/apps/server/src/app/metrics/inputs/get-prompt-metrics.input.ts index f51eed88..7f51f50d 100644 --- a/apps/server/src/app/metrics/inputs/get-prompt-metrics.input.ts +++ b/apps/server/src/app/metrics/inputs/get-prompt-metrics.input.ts @@ -1,4 +1,5 @@ import { Field, InputType, registerEnumType } from "@nestjs/graphql"; +import { FilterInput } from "../../common/filters/filter.input"; export enum PromptExecutionMetricField { totalCost = "totalCost", @@ -55,4 +56,7 @@ export class GetPromptMetricsInput { @Field(() => String, { nullable: true }) fillEmpty?: string = null; + + @Field(() => [FilterInput], { nullable: true }) + filters: FilterInput[]; } diff --git a/apps/server/src/app/metrics/metrics.utils.ts b/apps/server/src/app/metrics/metrics.utils.ts index 0966960c..df6896f4 100644 --- a/apps/server/src/app/metrics/metrics.utils.ts +++ b/apps/server/src/app/metrics/metrics.utils.ts @@ -12,16 +12,15 @@ export function getPercentageChange( } export function buildBaseProjectMetricQuery( + body: bodybuilder.Bodybuilder, projectId: string, startDate: string, endDate: string ): bodybuilder.Bodybuilder { - const body = bodybuilder() + return body .filter("term", "ownership.projectId", projectId) .filter("range", "timestamp", { gte: startDate, lte: endDate }) .size(0); - - return body; } type IntervalDates = { diff --git a/apps/server/src/app/metrics/project-metrics.resolver.ts b/apps/server/src/app/metrics/project-metrics.resolver.ts index 5eac9452..5a8f388e 100644 --- a/apps/server/src/app/metrics/project-metrics.resolver.ts +++ b/apps/server/src/app/metrics/project-metrics.resolver.ts @@ -31,7 +31,7 @@ export class ProjectMetricsResolver { this.logger.assign({ data }); this.logger.info("Getting project metric"); - const { projectId, metric, startDate, endDate } = data; + const { projectId, metric, startDate, endDate, filters } = data; const project = await this.prismaService.project.findUnique({ where: { @@ -46,31 +46,36 @@ export class ProjectMetricsResolver { return this.projectMetricsService.getRequests( projectId, startDate, - endDate + endDate, + filters ); case ProjectMetricType.cost: return this.projectMetricsService.getCost( projectId, startDate, - endDate + endDate, + filters ); case ProjectMetricType.duration: return this.projectMetricsService.getAvgDuration( projectId, startDate, - endDate + endDate, + filters ); case ProjectMetricType.successfulRequests: return this.projectMetricsService.getSuccessfulRequests( projectId, startDate, - endDate + endDate, + filters ); case ProjectMetricType.erroneousRequests: return this.projectMetricsService.getErroneousRequests( projectId, startDate, - endDate + endDate, + filters ); } } @@ -83,7 +88,7 @@ export class ProjectMetricsResolver { this.logger.assign({ data }); this.logger.info("Getting project metric histogram"); - const { projectId, metric, startDate, endDate, bucketSize } = data; + const { projectId, metric, startDate, endDate, bucketSize, filters } = data; const project = await this.prismaService.project.findUnique({ where: { @@ -97,7 +102,8 @@ export class ProjectMetricsResolver { metric, startDate, endDate, - bucketSize + bucketSize, + filters ); } } diff --git a/apps/server/src/app/metrics/project-metrics.service.ts b/apps/server/src/app/metrics/project-metrics.service.ts index 9b7c21ec..6d748828 100644 --- a/apps/server/src/app/metrics/project-metrics.service.ts +++ b/apps/server/src/app/metrics/project-metrics.service.ts @@ -7,7 +7,8 @@ import { getStartAndEndDates, } from "./metrics.utils"; import { OpenSearchIndex } from "../opensearch/types"; -import bodybuilder from "bodybuilder"; +import { FilterInput } from "../common/filters/filter.input"; +import { mapFiltersToDql } from "../reporting/utils/dql-utils"; @Injectable() export class ProjectMetricsService { @@ -16,15 +17,20 @@ export class ProjectMetricsService { async getRequests( projectId: string, startDate: Date, - endDate: Date + endDate: Date, + filters: FilterInput[] ): Promise { const { current, previous } = getStartAndEndDates(startDate, endDate); const buildAndExecuteQuery = async (startDate: string, endDate: string) => { + let body = mapFiltersToDql({ filters, restrictions: {} }); + body = buildBaseProjectMetricQuery(body, projectId, startDate, endDate); + const result = await this.openSearchService.client.search({ index: OpenSearchIndex.Requests, - body: buildBaseProjectMetricQuery(projectId, startDate, endDate), + body: body.build(), }); + return result.body.hits.total.value || 0; }; @@ -42,18 +48,23 @@ export class ProjectMetricsService { async getCost( projectId: string, startDate: Date, - endDate: Date + endDate: Date, + filters: FilterInput[] ): Promise { const { current, previous } = getStartAndEndDates(startDate, endDate); const buildAndExecuteQuery = async (startDate: string, endDate: string) => { - const body = buildBaseProjectMetricQuery(projectId, startDate, endDate) - .aggregation("sum", "calculated.totalCost", "total_cost") - .build(); + let body = mapFiltersToDql({ filters, restrictions: {} }); + body = buildBaseProjectMetricQuery( + body, + projectId, + startDate, + endDate + ).aggregation("sum", "calculated.totalCost", "total_cost"); const query = { index: OpenSearchIndex.Requests, - body, + body: body.build(), }; const result = await this.openSearchService.client.search(query); @@ -75,17 +86,22 @@ export class ProjectMetricsService { async getAvgDuration( projectId: string, startDate: Date, - endDate: Date + endDate: Date, + filters: FilterInput[] ): Promise { const { current, previous } = getStartAndEndDates(startDate, endDate); const buildAndExecuteQuery = async (startDate: string, endDate: string) => { - const body = buildBaseProjectMetricQuery(projectId, startDate, endDate) - .aggregation("avg", "calculated.duration", "avg_duration") - .build(); + let body = mapFiltersToDql({ filters, restrictions: {} }); + body = buildBaseProjectMetricQuery( + body, + projectId, + startDate, + endDate + ).aggregation("avg", "calculated.duration", "avg_duration"); const result = await this.openSearchService.client.search({ index: OpenSearchIndex.Requests, - body, + body: body.build(), }); return result.body.aggregations.avg_duration.value || 0; @@ -105,18 +121,23 @@ export class ProjectMetricsService { async getSuccessfulRequests( projectId: string, startDate: Date, - endDate: Date + endDate: Date, + filters: FilterInput[] ): Promise { const { current, previous } = getStartAndEndDates(startDate, endDate); const buildAndExecuteQuery = async (startDate: string, endDate: string) => { - const body = buildBaseProjectMetricQuery(projectId, startDate, endDate) - .filter("term", "response.status", 200) - .build(); + let body = mapFiltersToDql({ filters, restrictions: {} }); + body = buildBaseProjectMetricQuery( + body, + projectId, + startDate, + endDate + ).filter("term", "response.status", 200); const result = await this.openSearchService.client.search({ index: OpenSearchIndex.Requests, - body, + body: body.build(), }); return result.body.hits.total.value || 0; @@ -136,18 +157,23 @@ export class ProjectMetricsService { async getErroneousRequests( projectId: string, startDate: Date, - endDate: Date + endDate: Date, + filters: FilterInput[] ): Promise { const { current, previous } = getStartAndEndDates(startDate, endDate); const buildAndExecuteQuery = async (startDate: string, endDate: string) => { - const body = buildBaseProjectMetricQuery(projectId, startDate, endDate) - .notFilter("term", "response.status", 200) - .build(); + let body = mapFiltersToDql({ filters, restrictions: {} }); + body = buildBaseProjectMetricQuery( + body, + projectId, + startDate, + endDate + ).notFilter("term", "response.status", 200); const result = await this.openSearchService.client.search({ index: OpenSearchIndex.Requests, - body, + body: body.build(), }); return result.body.hits.total.value || 0; @@ -169,9 +195,10 @@ export class ProjectMetricsService { metricType: ProjectMetricType, startDate: Date, endDate: Date, - bucketSize: string + bucketSize: string, + filters: FilterInput[] ): Promise { - let body = bodybuilder(); + let body = mapFiltersToDql({ filters, restrictions: {} }); body = body .addFilter("term", "ownership.projectId", projectId) diff --git a/apps/server/src/app/reporting/reporting.service.ts b/apps/server/src/app/reporting/reporting.service.ts index f829de30..191cdc13 100644 --- a/apps/server/src/app/reporting/reporting.service.ts +++ b/apps/server/src/app/reporting/reporting.service.ts @@ -89,7 +89,7 @@ export class ReportingService { const size = pageSize > MAX_PAGE_SIZE ? MAX_PAGE_SIZE : pageSize; const from = (page - 1) * size; - const dql = mapFiltersToDql({ + const body = mapFiltersToDql({ restrictions: { "ownership.projectId": projectId, "ownership.organizationId": organizationId, @@ -98,6 +98,8 @@ export class ReportingService { filters, }); + const dql = body.build(); + return this.openSearchService.client.search<{ hits: { hits: Array<{ _source: RequestReport }>; diff --git a/apps/server/src/app/reporting/utils/dql-utils.ts b/apps/server/src/app/reporting/utils/dql-utils.ts index 29f5aefb..855000f5 100644 --- a/apps/server/src/app/reporting/utils/dql-utils.ts +++ b/apps/server/src/app/reporting/utils/dql-utils.ts @@ -114,5 +114,5 @@ export const mapFiltersToDql = ({ } }); - return body.build(); + return body; }; diff --git a/package-lock.json b/package-lock.json index 576b37ee..2e408662 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,9 +48,6 @@ "@splinetool/runtime": "^0.9.436", "@swc/helpers": "0.5.1", "@tanstack/react-query": "^4.29.3", - "@tutim/fields": "^0.1.4", - "@tutim/headless": "^0.1.4", - "@tutim/types": "^0.1.4", "@uiw/codemirror-extensions-classname": "^4.21.3", "@uiw/codemirror-theme-material": "^4.19.16", "@uiw/react-codemirror": "^4.19.16", @@ -13123,32 +13120,6 @@ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" }, - "node_modules/@tutim/fields": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@tutim/fields/-/fields-0.1.4.tgz", - "integrity": "sha512-nrp3KabIyXg3Z1ALow9SLxx7gE/THGFWQaDFdl1kMm75HasVAomg2UClxui94NUjM5L+HNE6aztsg1ucJI1Deg==", - "peerDependencies": { - "@tutim/headless": "*", - "@tutim/types": "*", - "react": "^16.8.0 || 17.x || 18.x", - "react-dom": "^16.8.0 || 17.x || 18.x" - } - }, - "node_modules/@tutim/headless": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@tutim/headless/-/headless-0.1.4.tgz", - "integrity": "sha512-skIeXnFLY+Y7CMI6FZMYOpw3wOph8/31SOdmnu8a/7AuAORI0aa1lzeOAdL0F27gKZ5nhMQF+fP8D7eJWlz+7g==", - "peerDependencies": { - "@tutim/types": "*", - "react": "^16.8.0 || 17.x || 18.x", - "react-dom": "^16.8.0 || 17.x || 18.x" - } - }, - "node_modules/@tutim/types": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@tutim/types/-/types-0.1.4.tgz", - "integrity": "sha512-Xk3bxHbfDDVmXEUJYn6G8+h5KgtUK5Fm09DfTnXFbvjQJAMvMVQnX4BIJXA+d73To70IiYb4ngfPOVHlqjgJwA==" - }, "node_modules/@types/accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", @@ -49948,23 +49919,6 @@ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" }, - "@tutim/fields": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@tutim/fields/-/fields-0.1.4.tgz", - "integrity": "sha512-nrp3KabIyXg3Z1ALow9SLxx7gE/THGFWQaDFdl1kMm75HasVAomg2UClxui94NUjM5L+HNE6aztsg1ucJI1Deg==", - "requires": {} - }, - "@tutim/headless": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@tutim/headless/-/headless-0.1.4.tgz", - "integrity": "sha512-skIeXnFLY+Y7CMI6FZMYOpw3wOph8/31SOdmnu8a/7AuAORI0aa1lzeOAdL0F27gKZ5nhMQF+fP8D7eJWlz+7g==", - "requires": {} - }, - "@tutim/types": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@tutim/types/-/types-0.1.4.tgz", - "integrity": "sha512-Xk3bxHbfDDVmXEUJYn6G8+h5KgtUK5Fm09DfTnXFbvjQJAMvMVQnX4BIJXA+d73To70IiYb4ngfPOVHlqjgJwA==" - }, "@types/accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", diff --git a/package.json b/package.json index 1e52130e..4b81001b 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,6 @@ "@splinetool/runtime": "^0.9.436", "@swc/helpers": "0.5.1", "@tanstack/react-query": "^4.29.3", - "@tutim/fields": "^0.1.4", - "@tutim/headless": "^0.1.4", - "@tutim/types": "^0.1.4", "@uiw/codemirror-extensions-classname": "^4.21.3", "@uiw/codemirror-theme-material": "^4.19.16", "@uiw/react-codemirror": "^4.19.16",