From c351539e36d3c0920c790cb48de344214345a0b1 Mon Sep 17 00:00:00 2001 From: nichenqin Date: Sat, 19 Oct 2024 21:11:12 +0800 Subject: [PATCH 1/2] fix: fix handle on table deleted --- .../blocks/aggregate/aggregate.svelte | 12 +- .../aggregate/config/aggregate-config.svelte | 36 +-- .../components/blocks/base/base-detail.svelte | 9 +- .../components/blocks/base/empty-base.svelte | 2 +- .../blocks/dashboard/create-dialog.svelte | 4 +- .../blocks/dashboard/dashboard-widget.svelte | 10 +- .../delete-table/delete-table-dialog.svelte | 2 +- .../components/blocks/widget/widget.svelte | 247 +++++++++--------- packages/dashboard/src/dashboard.do.ts | 4 + .../src/services/dashboard.event-service.ts | 21 -- .../src/value-objects/dashboard-widgets.vo.ts | 25 ++ ...ashboard-on-table-deleted.event-handler.ts | 31 +++ packages/event-handlers/src/handlers/index.ts | 3 +- .../src/dashboard/dashboard.mutate-visitor.ts | 21 +- .../src/dashboard/dashboard.repository.ts | 14 +- .../persistence/src/table/table.repository.ts | 2 + packages/table/src/events/index.ts | 3 + .../table/src/events/table-deleted.event.ts | 22 ++ .../table/src/methods/delete-table.method.ts | 6 + .../services/methods/delete-table.method.ts | 1 + packages/table/src/table.do.ts | 3 + turbo.json | 2 +- 22 files changed, 290 insertions(+), 190 deletions(-) delete mode 100644 packages/dashboard/src/services/dashboard.event-service.ts create mode 100644 packages/event-handlers/src/handlers/dashboard-on-table-deleted.event-handler.ts create mode 100644 packages/table/src/events/table-deleted.event.ts create mode 100644 packages/table/src/methods/delete-table.method.ts diff --git a/apps/frontend/src/lib/components/blocks/aggregate/aggregate.svelte b/apps/frontend/src/lib/components/blocks/aggregate/aggregate.svelte index a74a9502f..94017b97f 100644 --- a/apps/frontend/src/lib/components/blocks/aggregate/aggregate.svelte +++ b/apps/frontend/src/lib/components/blocks/aggregate/aggregate.svelte @@ -9,6 +9,8 @@ import * as Tooltip from "$lib/components/ui/tooltip" const table = getTable() + + export let tableId: string | undefined export let viewId: string | undefined export let shareId: string | undefined export let ignoreView: boolean = false @@ -16,10 +18,10 @@ export let widget: IWidgetDTO export let aggregate: IAggregate - $: isValid = isValidWidget(widget) + $: isValid = isValidWidget(widget) && !!tableId const getAggregate = createQuery({ - queryKey: ["aggregate", $table.id.value, widget.id], + queryKey: ["aggregate", widget.id], queryFn: () => { const agg = aggregate.type === "count" @@ -28,7 +30,7 @@ if (shareId) { return trpc.shareData.aggregate.query({ shareId, - tableId: $table.id.value, + tableId, viewId, aggregate: agg, condition: aggregate.condition, @@ -36,7 +38,7 @@ }) } return trpc.record.aggregate.query({ - tableId: $table.id.value, + tableId, viewId, aggregate: agg, condition: aggregate.condition, @@ -45,7 +47,7 @@ }, }) - let value = derived([getAggregate, table], ([$data, $table]) => { + let value = derived([getAggregate], ([$data]) => { if (aggregate.type === "count") { return ($data.data as any)?.[ID_TYPE] } diff --git a/apps/frontend/src/lib/components/blocks/aggregate/config/aggregate-config.svelte b/apps/frontend/src/lib/components/blocks/aggregate/config/aggregate-config.svelte index 9673f9b36..49ce46356 100644 --- a/apps/frontend/src/lib/components/blocks/aggregate/config/aggregate-config.svelte +++ b/apps/frontend/src/lib/components/blocks/aggregate/config/aggregate-config.svelte @@ -37,17 +37,19 @@ const value = writable | undefined>( toMaybeConditionGroup(aggregate.condition), ) - $: validValue = $value ? parseValidAggregateCondition($table.schema, $value) : undefined - $: visibleFields = $table.getOrderedVisibleFields() + $: validValue = $value && $table ? parseValidAggregateCondition($table.schema, $value) : undefined + $: visibleFields = $table?.getOrderedVisibleFields() const client = useQueryClient() const updateWidgetMutation = createMutation({ mutationFn: trpc.table.view.widget.update.mutate, async onSuccess(data, variables, context) { - await invalidate(`table:${$table.id.value}`) - await tick() - await client.invalidateQueries({ queryKey: ["aggregate", $table.id.value, widget.id] }) + if ($table) { + await invalidate(`table:${$table.id.value}`) + await tick() + await client.invalidateQueries({ queryKey: ["aggregate", $table.id.value, widget.id] }) + } onSuccess() }, onError(error, variables, context) { @@ -58,9 +60,11 @@ const updateDashboardWidget = createMutation({ mutationFn: trpc.dashboard.widget.update.mutate, async onSuccess(data, variables, context) { - await invalidate(`dashboard:${$dashboard.id.value}`) - await tick() - await client.invalidateQueries({ queryKey: ["aggregate", $table.id.value, widget.id] }) + if ($table) { + await invalidate(`dashboard:${$dashboard.id.value}`) + await tick() + await client.invalidateQueries({ queryKey: ["aggregate", $table.id.value, widget.id] }) + } onSuccess() }, }) @@ -90,7 +94,7 @@ }, }) } else { - if (!viewId) { + if (!viewId || !$table) { return } $updateWidgetMutation.mutate({ @@ -164,12 +168,14 @@
Filters
- visibleFields.some((f) => f.id.value === field.id) && getIsFilterableFieldType(field.type)} - class="rounded-md border" - > + {#if $table} + visibleFields.some((f) => f.id.value === field.id) && getIsFilterableFieldType(field.type)} + class="rounded-md border" + > + {/if}
diff --git a/apps/frontend/src/lib/components/blocks/base/base-detail.svelte b/apps/frontend/src/lib/components/blocks/base/base-detail.svelte index 21833438e..c08197bf7 100644 --- a/apps/frontend/src/lib/components/blocks/base/base-detail.svelte +++ b/apps/frontend/src/lib/components/blocks/base/base-detail.svelte @@ -94,7 +94,7 @@ {:else}
-
+

{base.name} have no tables

@@ -108,7 +108,8 @@ }} > - Create New Table + Import Table + {/if}
diff --git a/apps/frontend/src/lib/components/blocks/base/empty-base.svelte b/apps/frontend/src/lib/components/blocks/base/empty-base.svelte index e82da58be..013f3e008 100644 --- a/apps/frontend/src/lib/components/blocks/base/empty-base.svelte +++ b/apps/frontend/src/lib/components/blocks/base/empty-base.svelte @@ -4,7 +4,7 @@
-
+

There is no base in the space.

diff --git a/apps/frontend/src/lib/components/blocks/dashboard/create-dialog.svelte b/apps/frontend/src/lib/components/blocks/dashboard/create-dialog.svelte index d50b3c47e..3d624e099 100644 --- a/apps/frontend/src/lib/components/blocks/dashboard/create-dialog.svelte +++ b/apps/frontend/src/lib/components/blocks/dashboard/create-dialog.svelte @@ -62,7 +62,7 @@ }) -
+ Name @@ -74,6 +74,6 @@ Submit {#if browser} - + {/if} diff --git a/apps/frontend/src/lib/components/blocks/dashboard/dashboard-widget.svelte b/apps/frontend/src/lib/components/blocks/dashboard/dashboard-widget.svelte index f1ac10fc2..341422b3b 100644 --- a/apps/frontend/src/lib/components/blocks/dashboard/dashboard-widget.svelte +++ b/apps/frontend/src/lib/components/blocks/dashboard/dashboard-widget.svelte @@ -7,14 +7,16 @@ import { setTable } from "$lib/store/table.store" import { writable } from "svelte/store" - export let tableId: string + export let tableId: string | undefined export let widget: IWidgetDTO export let movePointerDown: ((e: Event) => void) | undefined = undefined export let resizePointerDown: ((e: Event) => void) | undefined = undefined const store = new GetDashboardWidgetTableStore() onMount(() => { - store.fetch({ variables: { tableId } }) + if (tableId) { + store.fetch({ variables: { tableId } }) + } }) $: table = $store.data?.table @@ -25,6 +27,4 @@ } -{#if table} - -{/if} + diff --git a/apps/frontend/src/lib/components/blocks/delete-table/delete-table-dialog.svelte b/apps/frontend/src/lib/components/blocks/delete-table/delete-table-dialog.svelte index d69374a2e..334164211 100644 --- a/apps/frontend/src/lib/components/blocks/delete-table/delete-table-dialog.svelte +++ b/apps/frontend/src/lib/components/blocks/delete-table/delete-table-dialog.svelte @@ -26,8 +26,8 @@ const deleteTableMutation = createMutation({ mutationFn: trpc.table.delete.mutate, async onSuccess(data, variables, context) { - await invalidateAll() await goto("/") + await invalidateAll() }, onError(error, variables, context) { toast.error(error.message) diff --git a/apps/frontend/src/lib/components/blocks/widget/widget.svelte b/apps/frontend/src/lib/components/blocks/widget/widget.svelte index a3d44acce..623e01e81 100644 --- a/apps/frontend/src/lib/components/blocks/widget/widget.svelte +++ b/apps/frontend/src/lib/components/blocks/widget/widget.svelte @@ -63,141 +63,140 @@ }) -{#if $table} -
-
-
- {#if movePointerDown} - - {/if} - {widget.name} -
- {#if !shareId} -
- - - - - - (editing = true)}> - - {#if editing} - { - editing = false - }} - class="w-1/2" - autofocus - on:focus={(e) => e.target.select()} - bind:value={widget.name} - /> - {:else} - {widget.name} - {/if} - - +
+
+
+ {#if movePointerDown} + + {/if} + {widget.name} +
+ {#if !shareId} +
+ + + + + + (editing = true)}> + + {#if editing} + { + editing = false + }} + class="w-1/2" + autofocus + on:focus={(e) => e.target.select()} + bind:value={widget.name} + /> + {:else} + {widget.name} + {/if} + + -
-
+
+
+ {#if widget.item.type === "aggregate"} + + {/if} +
+
+
{#if widget.item.type === "aggregate"} - { + editing = false + }} /> {/if}
-
-
- {#if widget.item.type === "aggregate"} - { - editing = false - }} - /> - {/if} -
-
- - +
+ + - - - - - - { - open = true - editing = true - }} - > - - Edit Name - - (confirmDelete = true)}> - - Delete - - - -
- {/if} -
- {#if widget.item.type === "aggregate"} - + + + + + + { + open = true + editing = true + }} + > + + Edit Name + + (confirmDelete = true)}> + + Delete + + + +
{/if} +
+ {#if widget.item.type === "aggregate"} + + {/if} - {#if resizePointerDown} - - {/if} -
+ /> + + {/if} +
- - - - Delete Widget {widget.name}? - - This action cannot be undone. This will permanently delete this widget. and remove your data from our servers. - - - - Cancel - - - - - - -{/if} + + + + Delete Widget {widget.name}? + + This action cannot be undone. This will permanently delete this widget. and remove your data from our servers. + + + + Cancel + + + + + + diff --git a/packages/dashboard/src/dashboard.do.ts b/packages/dashboard/src/dashboard.do.ts index 3c7814247..3d9747f7f 100644 --- a/packages/dashboard/src/dashboard.do.ts +++ b/packages/dashboard/src/dashboard.do.ts @@ -76,6 +76,10 @@ export class Dashboard extends AggregateRoot { return this.widgets.$onFieldDeleted(tableId, fieldId) } + $onTableDeleted(tableId: string): Option { + return this.widgets.$onTableDeleted(tableId) + } + public toJSON(): IDashboardDTO { return { id: this.id.value, diff --git a/packages/dashboard/src/services/dashboard.event-service.ts b/packages/dashboard/src/services/dashboard.event-service.ts deleted file mode 100644 index 8ff77c5d9..000000000 --- a/packages/dashboard/src/services/dashboard.event-service.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { createLogger } from "@undb/logger" -import type { FieldDeletedEvent } from "@undb/table" -import type { Dashboard } from "../dashboard.do" -import { injectDashboardRepository, type IDashboardRepository } from "../dashboard.repository" - -export interface IDashboardEventService { - onFieldDeleted(dashboard: Dashboard, event: FieldDeletedEvent): Promise -} - -export class DashboardEventService implements IDashboardEventService { - private readonly logger = createLogger(DashboardEventService.name) - - constructor( - @injectDashboardRepository() - private readonly dashboardRepository: IDashboardRepository, - ) {} - - async onFieldDeleted(dashboard: Dashboard, event: FieldDeletedEvent): Promise { - this.logger.debug(event) - } -} diff --git a/packages/dashboard/src/value-objects/dashboard-widgets.vo.ts b/packages/dashboard/src/value-objects/dashboard-widgets.vo.ts index 47ebdd31c..3f1c7f75c 100644 --- a/packages/dashboard/src/value-objects/dashboard-widgets.vo.ts +++ b/packages/dashboard/src/value-objects/dashboard-widgets.vo.ts @@ -48,6 +48,21 @@ export class DashboardWidget extends ValueObject { ) } + deleteTable(tableId: string): Option { + if (this.tableId !== tableId) { + return None + } + + return Some( + new DashboardWidget({ + table: { + id: undefined, + }, + widget: this.props.widget, + }), + ) + } + /** * Creates a DashboardWidget instance * @param table Table object @@ -137,6 +152,16 @@ export class DashboardWidgets extends ValueObject { return Some(new WithDashboardWidgets(dashbaordWidgets)) } + $onTableDeleted(tableId: string): Option { + const widgets = this.value.map((w) => { + const widget = new DashboardWidget(w) + const updated = widget.deleteTable(tableId) + return updated.isSome() ? updated.unwrap().toJSON() : w + }) + const dashbaordWidgets = new DashboardWidgets(widgets) + return Some(new WithDashboardWidgets(dashbaordWidgets)) + } + get tableIds(): string[] { return this.value.map((w) => w.table.id).filter((tableId) => !!tableId) as string[] } diff --git a/packages/event-handlers/src/handlers/dashboard-on-table-deleted.event-handler.ts b/packages/event-handlers/src/handlers/dashboard-on-table-deleted.event-handler.ts new file mode 100644 index 000000000..164c75a30 --- /dev/null +++ b/packages/event-handlers/src/handlers/dashboard-on-table-deleted.event-handler.ts @@ -0,0 +1,31 @@ +import { eventHandler } from "@undb/cqrs" +import { DashboardTableIdSpecification, injectDashboardRepository, type IDashboardRepository } from "@undb/dashboard" +import { singleton } from "@undb/di" +import type { IEventHandler } from "@undb/domain" +import { createLogger } from "@undb/logger" +import { TableDeletedEvent } from "@undb/table" + +@eventHandler(TableDeletedEvent) +@singleton() +export class DashboardOnTableDeletedEventHandle implements IEventHandler { + private readonly logger = createLogger(DashboardOnTableDeletedEventHandle.name) + + constructor(@injectDashboardRepository() private readonly dashboardRepository: IDashboardRepository) {} + + async handle(event: TableDeletedEvent): Promise { + this.logger.debug(event) + + const tableId = event.payload.table.id + + const spec = new DashboardTableIdSpecification(tableId) + const dashboards = await this.dashboardRepository.find(spec) + console.log(dashboards) + + for (const dashboard of dashboards) { + const spec = dashboard.$onTableDeleted(tableId) + if (spec.isSome()) { + await this.dashboardRepository.updateOneById(dashboard, spec.unwrap()) + } + } + } +} diff --git a/packages/event-handlers/src/handlers/index.ts b/packages/event-handlers/src/handlers/index.ts index 005dfd3e2..c820990bb 100644 --- a/packages/event-handlers/src/handlers/index.ts +++ b/packages/event-handlers/src/handlers/index.ts @@ -1,3 +1,4 @@ import { DashboardOnFieldDeletedEventHandle } from "./dashboard-on-field-deleted.event-handler" +import { DashboardOnTableDeletedEventHandle } from "./dashboard-on-table-deleted.event-handler" -export const eventHandlers = [DashboardOnFieldDeletedEventHandle] +export const eventHandlers = [DashboardOnFieldDeletedEventHandle, DashboardOnTableDeletedEventHandle] diff --git a/packages/persistence/src/dashboard/dashboard.mutate-visitor.ts b/packages/persistence/src/dashboard/dashboard.mutate-visitor.ts index c50be3a70..a2c63187a 100644 --- a/packages/persistence/src/dashboard/dashboard.mutate-visitor.ts +++ b/packages/persistence/src/dashboard/dashboard.mutate-visitor.ts @@ -30,14 +30,23 @@ export class DashboardMutateVisitor extends AbstractQBMutationVisitor implements } withDashboardWidgets(v: WithDashboardWidgets): void { this.setData("widgets", v.widgets.value.length ? json(v.widgets.value) : null) - const tableIds = v.widgets.tableIds const dashboardId = this.dashboard.id.value - const sql = this.qb - .insertInto("undb_dashboard_table_id_mapping") - .values(tableIds.map((tableId) => ({ dashboard_id: dashboardId, table_id: tableId }))) - .onConflict((ob) => ob.doNothing()) + + const deleteSql = this.qb + .deleteFrom("undb_dashboard_table_id_mapping") + .where("dashboard_id", "=", dashboardId) .compile() - this.addSql(sql) + this.addSql(deleteSql) + + const tableIds = v.widgets.tableIds + if (tableIds.length > 0) { + const sql = this.qb + .insertInto("undb_dashboard_table_id_mapping") + .values(tableIds.map((tableId) => ({ dashboard_id: dashboardId, table_id: tableId }))) + .onConflict((ob) => ob.doNothing()) + .compile() + this.addSql(sql) + } } withDashboardBaseId(v: DashboardBaseIdSpecification): void { throw new Error("Method not implemented.") diff --git a/packages/persistence/src/dashboard/dashboard.repository.ts b/packages/persistence/src/dashboard/dashboard.repository.ts index f0a3323c1..1367d2a0a 100644 --- a/packages/persistence/src/dashboard/dashboard.repository.ts +++ b/packages/persistence/src/dashboard/dashboard.repository.ts @@ -91,10 +91,12 @@ export class DashboardRepository implements IDashboardRepository { }) .execute() const tableIds = dashboard.tableIds - await qb - .insertInto("undb_dashboard_table_id_mapping") - .values(tableIds.map((id) => ({ dashboard_id: dashboard.id.value, table_id: id }))) - .execute() + if (tableIds.length > 0) { + await qb + .insertInto("undb_dashboard_table_id_mapping") + .values(tableIds.map((id) => ({ dashboard_id: dashboard.id.value, table_id: id }))) + .execute() + } await this.outboxService.save(dashboard) } @@ -116,6 +118,10 @@ export class DashboardRepository implements IDashboardRepository { .set({ ...visitor.data, updated_by: userId, updated_at: new Date().toISOString() }) .where((eb) => eb.eb("id", "=", dashboard.id.value)) .execute() + + for (const sql of visitor.sql) { + await qb.executeQuery(sql) + } await this.outboxService.save(dashboard) } diff --git a/packages/persistence/src/table/table.repository.ts b/packages/persistence/src/table/table.repository.ts index 6d8a47518..4bdced7fc 100644 --- a/packages/persistence/src/table/table.repository.ts +++ b/packages/persistence/src/table/table.repository.ts @@ -200,5 +200,7 @@ export class TableRepository implements ITableRepository { .execute() await this.underlyingTableService.delete(table) + console.log("save", table.domainEvents) + await this.outboxService.save(table) } } diff --git a/packages/table/src/events/index.ts b/packages/table/src/events/index.ts index 0acbae778..a65638f0f 100644 --- a/packages/table/src/events/index.ts +++ b/packages/table/src/events/index.ts @@ -9,6 +9,7 @@ import type { SetViewFilterEvent } from "./set-view-filter.event" import type { SetViewOptionEvent } from "./set-view-option.event" import type { SetViewSortEvent } from "./set-view-sort.event" import type { TableCreatedEvent } from "./table-created.event" +import type { TableDeletedEvent } from "./table-deleted.event" import type { ViewCreatedEvent } from "./view-created.event" import type { ViewDeletedEvent } from "./view-deleted.event" import type { ViewUpdatedEvent } from "./view-updated.event" @@ -25,6 +26,7 @@ export * from "./set-view-filter.event" export * from "./set-view-option.event" export * from "./set-view-sort.event" export * from "./table-created.event" +export * from "./table-deleted.event" export * from "./view-created.event" export * from "./view-deleted.event" export * from "./view-updated.event" @@ -44,3 +46,4 @@ export type ITableEvents = | ViewCreatedEvent | ViewUpdatedEvent | ViewDeletedEvent + | TableDeletedEvent diff --git a/packages/table/src/events/table-deleted.event.ts b/packages/table/src/events/table-deleted.event.ts new file mode 100644 index 000000000..d8fcc5962 --- /dev/null +++ b/packages/table/src/events/table-deleted.event.ts @@ -0,0 +1,22 @@ +import { BaseEvent } from "@undb/domain" +import { z } from "@undb/zod" +import { tableDTO } from "../dto" + +const EVT_TABLE_DELETED = "table.deleted" as const + +export const tableDeletedEventPayload = z.object({ + table: tableDTO, +}) + +export type ITableDeletedEventPayload = z.infer + +export class TableDeletedEvent extends BaseEvent { + name = EVT_TABLE_DELETED + + constructor( + public readonly payload: ITableDeletedEventPayload, + spaceId: string, + ) { + super(payload, undefined, spaceId) + } +} diff --git a/packages/table/src/methods/delete-table.method.ts b/packages/table/src/methods/delete-table.method.ts new file mode 100644 index 000000000..cb0de1899 --- /dev/null +++ b/packages/table/src/methods/delete-table.method.ts @@ -0,0 +1,6 @@ +import { TableDeletedEvent } from "../events/table-deleted.event" +import type { TableDo } from "../table.do" + +export function deleteTable(this: TableDo): void { + this.addDomainEvent(new TableDeletedEvent({ table: this.toJSON() }, this.spaceId)) +} diff --git a/packages/table/src/services/methods/delete-table.method.ts b/packages/table/src/services/methods/delete-table.method.ts index 456bbed3f..81053b3ff 100644 --- a/packages/table/src/services/methods/delete-table.method.ts +++ b/packages/table/src/services/methods/delete-table.method.ts @@ -40,6 +40,7 @@ export async function deleteTableMethod(this: TableService, dto: IDeleteTableDTO await this.repository.bulkUpdate(updates) } + table.$deleteTable() await this.repository.deleteOneById(table) return table diff --git a/packages/table/src/table.do.ts b/packages/table/src/table.do.ts index 06996110e..cac3d291f 100644 --- a/packages/table/src/table.do.ts +++ b/packages/table/src/table.do.ts @@ -7,6 +7,7 @@ import { createFormMethod } from "./methods/create-form.method" import { createViewMethod } from "./methods/create-view.method" import { deleteFieldMethod } from "./methods/delete-field.method" import { deleteFormMethod } from "./methods/delete-form.method" +import { deleteTable } from "./methods/delete-table.method" import { deleteViewMethod } from "./methods/delete-view.method" import { duplicateFieldMethod } from "./methods/duplicate-field.method" import { duplicateFormMethod } from "./methods/duplicate-form.method" @@ -81,6 +82,8 @@ export class TableDo extends AggregateRoot { $deleteView = deleteViewMethod $setTableForm = setTableForm + $deleteTable = deleteTable + #createReferenceField = createReferenceField reorderFields(fieldsOrder: string[]) { diff --git a/turbo.json b/turbo.json index 1860d2ab9..8121cb3ea 100644 --- a/turbo.json +++ b/turbo.json @@ -1,7 +1,7 @@ { "$schema": "https://turbo.build/schema.json", "globalDependencies": ["**/.env.*local", ".env"], - "ui": "tui", + "ui": "stream", "globalEnv": ["LOG_LEVEL", "AXIOM_TOKEN", "AXIOM_DATASET", "UNDB_*", "GITHUB_*", "GOOGLE_*"], "tasks": { "build": { From 3468672f2f82b6bbc2152f6c967ee2a0a7bddadb Mon Sep 17 00:00:00 2001 From: GitHub actions Date: Sat, 19 Oct 2024 13:12:01 +0000 Subject: [PATCH 2/2] Prepare release v1.0.0-104 --- CHANGELOG.md | 11 +++++++++++ package.json | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b1b464a4..377e05f95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## v1.0.0-104 + + +### 🩹 Fixes + +- Fix handle on table deleted ([c351539](https://github.com/undb-io/undb/commit/c351539)) + +### ❤️ Contributors + +- Nichenqin ([@nichenqin](http://github.com/nichenqin)) + ## v1.0.0-103 diff --git a/package.json b/package.json index 6f0c0f013..ddf3f55a0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "undb", - "version": "1.0.0-103", + "version": "1.0.0-104", "private": true, "scripts": { "build": "NODE_ENV=production bun --bun turbo build",