From d7a8b5f2b776dd7cd6bd75c535fa3e4fd310d46d Mon Sep 17 00:00:00 2001 From: Dean Date: Tue, 26 Sep 2023 10:58:56 +0100 Subject: [PATCH 01/23] Updated the nav item body text to ensure it was truncated. The selected by Avatar was being pushed out of view. Hover text added --- packages/builder/src/components/common/NavItem.svelte | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/builder/src/components/common/NavItem.svelte b/packages/builder/src/components/common/NavItem.svelte index a65da55c8f..2c8a862535 100644 --- a/packages/builder/src/components/common/NavItem.svelte +++ b/packages/builder/src/components/common/NavItem.svelte @@ -102,7 +102,7 @@ {/if}
- {text} + {text} {#if selectedBy} {/if} @@ -227,9 +227,6 @@ .text { font-weight: 600; font-size: 12px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; flex: 1 1 auto; color: var(--spectrum-global-color-gray-900); order: 2; @@ -238,6 +235,11 @@ align-items: center; gap: 8px; } + .text span { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } .scrollable .text { flex: 0 0 auto; max-width: 160px; From 09280166c736ae8315ac761cc03a3cbf94c036e1 Mon Sep 17 00:00:00 2001 From: Dean Date: Tue, 26 Sep 2023 15:15:30 +0100 Subject: [PATCH 02/23] Added comment updates to reflect new naming behaviour --- packages/builder/src/helpers/duplicate.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/builder/src/helpers/duplicate.js b/packages/builder/src/helpers/duplicate.js index e84a600138..1547fcd4d1 100644 --- a/packages/builder/src/helpers/duplicate.js +++ b/packages/builder/src/helpers/duplicate.js @@ -3,16 +3,17 @@ * e.g. * name all names result * ------ ----------- -------- - * ("foo") ["foo"] "foo (1)" - * ("foo") ["foo", "foo (1)"] "foo (2)" - * ("foo (1)") ["foo", "foo (1)"] "foo (2)" - * ("foo") ["foo", "foo (2)"] "foo (1)" + * ("foo") ["foo"] "foo 1" + * ("foo") ["foo", "foo 1"] "foo 2" + * ("foo 1") ["foo", "foo 1"] "foo 2" + * ("foo") ["foo", "foo 2"] "foo 1" * * Repl */ export const duplicateName = (name, allNames) => { - const baseName = name.split(" (")[0] - const isDuplicate = new RegExp(`${baseName}\\s\\((\\d+)\\)$`) + const duplicatePattern = new RegExp(`\\s(\\d+)$`) + const baseName = name.split(duplicatePattern)[0] + const isDuplicate = new RegExp(`${baseName}\\s(\\d+)$`) // get the sequence from matched names const sequence = [] @@ -28,7 +29,6 @@ export const duplicateName = (name, allNames) => { return false }) sequence.sort((a, b) => a - b) - // get the next number in the sequence let number if (sequence.length === 0) { @@ -46,5 +46,5 @@ export const duplicateName = (name, allNames) => { } } - return `${baseName} (${number})` + return `${baseName} ${number}` } From e73ddef040847f45df09a607e3e251562c56908b Mon Sep 17 00:00:00 2001 From: Dean Date: Tue, 26 Sep 2023 15:29:40 +0100 Subject: [PATCH 03/23] Updated UI tests --- .../builder/src/helpers/tests/duplicate.test.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/builder/src/helpers/tests/duplicate.test.js b/packages/builder/src/helpers/tests/duplicate.test.js index a571054e0c..400abed0aa 100644 --- a/packages/builder/src/helpers/tests/duplicate.test.js +++ b/packages/builder/src/helpers/tests/duplicate.test.js @@ -9,34 +9,34 @@ describe("duplicate", () => { const duplicate = duplicateName(name, names) - expect(duplicate).toBe("foo (1)") + expect(duplicate).toBe("foo 1") }) it("with multiple existing", async () => { - const names = ["foo", "foo (1)", "foo (2)"] + const names = ["foo", "foo 1", "foo 2"] const name = "foo" const duplicate = duplicateName(name, names) - expect(duplicate).toBe("foo (3)") + expect(duplicate).toBe("foo 3") }) it("with mixed multiple existing", async () => { - const names = ["foo", "foo (1)", "foo (2)", "bar", "bar (1)", "bar (2)"] + const names = ["foo", "foo 1", "foo 2", "bar", "bar 1", "bar 2"] const name = "foo" const duplicate = duplicateName(name, names) - expect(duplicate).toBe("foo (3)") + expect(duplicate).toBe("foo 3") }) it("with incomplete sequence", async () => { - const names = ["foo", "foo (2)", "foo (3)"] + const names = ["foo", "foo 2", "foo 3"] const name = "foo" const duplicate = duplicateName(name, names) - expect(duplicate).toBe("foo (1)") + expect(duplicate).toBe("foo 1") }) }) }) From 4bda97d70ff4ac4d5da8ec98d2e6c5ae1850061f Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Wed, 11 Oct 2023 11:07:46 +0100 Subject: [PATCH 04/23] Create a failing test for BUDI-7552 --- .../server/src/api/routes/tests/table.spec.ts | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/packages/server/src/api/routes/tests/table.spec.ts b/packages/server/src/api/routes/tests/table.spec.ts index f56c6e4e44..874b3535cd 100644 --- a/packages/server/src/api/routes/tests/table.spec.ts +++ b/packages/server/src/api/routes/tests/table.spec.ts @@ -1,4 +1,3 @@ -import { generator } from "@budibase/backend-core/tests" import { events, context } from "@budibase/backend-core" import { FieldType, Table, ViewCalculation } from "@budibase/types" import { checkBuilderEndpoint } from "./utilities/TestFunctions" @@ -182,6 +181,49 @@ describe("/tables", () => { 1 ) }) + + it("should update Auto ID field after bulk import", async () => { + const table = await config.createTable({ + name: "TestTable", + type: "table", + schema: { + autoId: { + name: "id", + type: FieldType.NUMBER, + subtype: "autoID", + autocolumn: true, + constraints: { + type: "number", + presence: false, + }, + }, + }, + }) + + let response = await request + .post(`/api/${table._id}/rows`) + .send({}) + .set(config.defaultHeaders()) + .expect(200) + + expect(response.body.autoId).toEqual(1) + + await request + .post(`/api/tables/${table._id}/import`) + .send({ + rows: [{ autoId: 2 }], + }) + .set(config.defaultHeaders()) + .expect(200) + + response = await request + .post(`/api/${table._id}/rows`) + .send({}) + .set(config.defaultHeaders()) + .expect(200) + + expect(response.body.autoId).toEqual(3) + }) }) describe("fetch", () => { From 7f2ab8b1ae56c83517c4d42d62b21620fa00628d Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Wed, 11 Oct 2023 12:29:43 +0100 Subject: [PATCH 05/23] Make sure table gets saved after bulkImport if it has changed. This fixes auto ID columns having the wrong lastID. --- .../server/src/api/controllers/table/external.ts | 1 + .../server/src/api/controllers/table/index.ts | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/server/src/api/controllers/table/external.ts b/packages/server/src/api/controllers/table/external.ts index 327904666d..ad6a56ee27 100644 --- a/packages/server/src/api/controllers/table/external.ts +++ b/packages/server/src/api/controllers/table/external.ts @@ -376,6 +376,7 @@ export async function destroy(ctx: UserCtx) { export async function bulkImport(ctx: UserCtx) { const table = await sdk.tables.getTable(ctx.params.tableId) + const { rows }: { rows: unknown } = ctx.request.body const schema: unknown = table.schema diff --git a/packages/server/src/api/controllers/table/index.ts b/packages/server/src/api/controllers/table/index.ts index e7c6ae57b0..aa3f7cc702 100644 --- a/packages/server/src/api/controllers/table/index.ts +++ b/packages/server/src/api/controllers/table/index.ts @@ -6,7 +6,7 @@ import { validate as validateSchema, } from "../../../utilities/schema" import { isExternalTable, isSQL } from "../../../integrations/utils" -import { events } from "@budibase/backend-core" +import { context, events } from "@budibase/backend-core" import { FetchTablesResponse, SaveTableRequest, @@ -18,7 +18,7 @@ import { import sdk from "../../../sdk" import { jsonFromCsvString } from "../../../utilities/csv" import { builderSocket } from "../../../websockets" -import { cloneDeep } from "lodash" +import { cloneDeep, isEqual } from "lodash" function pickApi({ tableId, table }: { tableId?: string; table?: Table }) { if (table && !tableId) { @@ -99,7 +99,16 @@ export async function destroy(ctx: UserCtx) { export async function bulkImport(ctx: UserCtx) { const tableId = ctx.params.tableId - await pickApi({ tableId }).bulkImport(ctx) + let db = context.getAppDB() + let tableBefore = await sdk.tables.getTable(tableId) + let tableAfter = await pickApi({ tableId }).bulkImport(ctx) + + if (!isEqual(tableBefore, tableAfter)) { + await db.put(tableAfter) + ctx.eventEmitter && + ctx.eventEmitter.emitTable(`table:save`, ctx.appId, tableAfter) + } + // right now we don't trigger anything for bulk import because it // can only be done in the builder, but in the future we may need to // think about events for bulk items From 0d9f257cc2ac209e7f52c9ffddaaffc1fcfe92a1 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Wed, 11 Oct 2023 12:51:57 +0100 Subject: [PATCH 06/23] Remove whitespace-only change. --- packages/server/src/api/controllers/table/external.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/server/src/api/controllers/table/external.ts b/packages/server/src/api/controllers/table/external.ts index ad6a56ee27..327904666d 100644 --- a/packages/server/src/api/controllers/table/external.ts +++ b/packages/server/src/api/controllers/table/external.ts @@ -376,7 +376,6 @@ export async function destroy(ctx: UserCtx) { export async function bulkImport(ctx: UserCtx) { const table = await sdk.tables.getTable(ctx.params.tableId) - const { rows }: { rows: unknown } = ctx.request.body const schema: unknown = table.schema From a0e9abb95bff69074c729060b8c7b5000df1a6a5 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Wed, 11 Oct 2023 16:45:02 +0100 Subject: [PATCH 07/23] Responding to PR feedback. --- .../src/api/controllers/table/external.ts | 4 ++- .../server/src/api/controllers/table/index.ts | 11 ++++--- .../src/api/controllers/table/internal.ts | 4 ++- .../server/src/api/routes/tests/table.spec.ts | 29 +++++-------------- .../server/src/tests/utilities/api/row.ts | 15 ++++++++++ packages/types/src/api/web/app/rows.ts | 9 ++++++ 6 files changed, 43 insertions(+), 29 deletions(-) diff --git a/packages/server/src/api/controllers/table/external.ts b/packages/server/src/api/controllers/table/external.ts index 327904666d..a332247a26 100644 --- a/packages/server/src/api/controllers/table/external.ts +++ b/packages/server/src/api/controllers/table/external.ts @@ -18,6 +18,8 @@ import { AutoReason, Datasource, FieldSchema, + ImportRowsRequest, + ImportRowsResponse, Operation, QueryJson, RelationshipType, @@ -374,7 +376,7 @@ export async function destroy(ctx: UserCtx) { return tableToDelete } -export async function bulkImport(ctx: UserCtx) { +export async function bulkImport(ctx: UserCtx) { const table = await sdk.tables.getTable(ctx.params.tableId) const { rows }: { rows: unknown } = ctx.request.body const schema: unknown = table.schema diff --git a/packages/server/src/api/controllers/table/index.ts b/packages/server/src/api/controllers/table/index.ts index aa3f7cc702..69e1988def 100644 --- a/packages/server/src/api/controllers/table/index.ts +++ b/packages/server/src/api/controllers/table/index.ts @@ -6,9 +6,11 @@ import { validate as validateSchema, } from "../../../utilities/schema" import { isExternalTable, isSQL } from "../../../integrations/utils" -import { context, events } from "@budibase/backend-core" +import { events } from "@budibase/backend-core" import { FetchTablesResponse, + ImportRowsRequest, + ImportRowsResponse, SaveTableRequest, SaveTableResponse, Table, @@ -97,16 +99,13 @@ export async function destroy(ctx: UserCtx) { builderSocket?.emitTableDeletion(ctx, deletedTable) } -export async function bulkImport(ctx: UserCtx) { +export async function bulkImport(ctx: UserCtx) { const tableId = ctx.params.tableId - let db = context.getAppDB() let tableBefore = await sdk.tables.getTable(tableId) let tableAfter = await pickApi({ tableId }).bulkImport(ctx) if (!isEqual(tableBefore, tableAfter)) { - await db.put(tableAfter) - ctx.eventEmitter && - ctx.eventEmitter.emitTable(`table:save`, ctx.appId, tableAfter) + await sdk.tables.saveTable(tableAfter) } // right now we don't trigger anything for bulk import because it diff --git a/packages/server/src/api/controllers/table/internal.ts b/packages/server/src/api/controllers/table/internal.ts index e468848c57..7765e630db 100644 --- a/packages/server/src/api/controllers/table/internal.ts +++ b/packages/server/src/api/controllers/table/internal.ts @@ -10,6 +10,8 @@ import { } from "../../../utilities/rowProcessor" import { runStaticFormulaChecks } from "./bulkFormula" import { + ImportRowsRequest, + ImportRowsResponse, RenameColumn, SaveTableRequest, SaveTableResponse, @@ -206,7 +208,7 @@ export async function destroy(ctx: any) { return tableToDelete } -export async function bulkImport(ctx: any) { +export async function bulkImport(ctx: UserCtx) { const table = await sdk.tables.getTable(ctx.params.tableId) const { rows, identifierFields } = ctx.request.body await handleDataImport(ctx.user, table, rows, identifierFields) diff --git a/packages/server/src/api/routes/tests/table.spec.ts b/packages/server/src/api/routes/tests/table.spec.ts index 874b3535cd..12472eaa21 100644 --- a/packages/server/src/api/routes/tests/table.spec.ts +++ b/packages/server/src/api/routes/tests/table.spec.ts @@ -200,29 +200,16 @@ describe("/tables", () => { }, }) - let response = await request - .post(`/api/${table._id}/rows`) - .send({}) - .set(config.defaultHeaders()) - .expect(200) + let row = await config.api.row.save(table._id!, {}) + expect(row.autoId).toEqual(1) - expect(response.body.autoId).toEqual(1) + await config.api.row.bulkImport(table._id!, { + rows: [{ autoId: 2 }], + identifierFields: [], + }) - await request - .post(`/api/tables/${table._id}/import`) - .send({ - rows: [{ autoId: 2 }], - }) - .set(config.defaultHeaders()) - .expect(200) - - response = await request - .post(`/api/${table._id}/rows`) - .send({}) - .set(config.defaultHeaders()) - .expect(200) - - expect(response.body.autoId).toEqual(3) + row = await config.api.row.save(table._id!, {}) + expect(row.autoId).toEqual(3) }) }) diff --git a/packages/server/src/tests/utilities/api/row.ts b/packages/server/src/tests/utilities/api/row.ts index adeb96a593..ce95bf2835 100644 --- a/packages/server/src/tests/utilities/api/row.ts +++ b/packages/server/src/tests/utilities/api/row.ts @@ -4,6 +4,8 @@ import { Row, ValidateResponse, ExportRowsRequest, + ImportRowsRequest, + ImportRowsResponse, } from "@budibase/types" import TestConfiguration from "../TestConfiguration" import { TestAPI } from "./base" @@ -123,6 +125,19 @@ export class RowAPI extends TestAPI { return request } + bulkImport = async ( + tableId: string, + body: ImportRowsRequest, + { expectStatus } = { expectStatus: 200 } + ): Promise => { + let request = this.request + .post(`/api/tables/${tableId}/import`) + .send(body) + .set(this.config.defaultHeaders()) + .expect(expectStatus) + return (await request).body + } + search = async ( sourceId: string, { expectStatus } = { expectStatus: 200 } diff --git a/packages/types/src/api/web/app/rows.ts b/packages/types/src/api/web/app/rows.ts index 62ea90a6a4..d695075ac0 100644 --- a/packages/types/src/api/web/app/rows.ts +++ b/packages/types/src/api/web/app/rows.ts @@ -37,3 +37,12 @@ export interface ExportRowsRequest { } export type ExportRowsResponse = ReadStream + +export type ImportRowsRequest = { + rows: Row[] + identifierFields: string[] +} + +export type ImportRowsResponse = { + message: string +} From c76e11035021b6fed7cb37457e052c4d7ee20e08 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Wed, 11 Oct 2023 16:58:24 +0100 Subject: [PATCH 08/23] Add BulkImportResponse as a type after merging Adri's type changes. --- packages/server/src/api/controllers/table/external.ts | 3 ++- packages/server/src/api/controllers/table/index.ts | 3 ++- packages/server/src/api/controllers/table/internal.ts | 3 ++- packages/server/src/api/routes/tests/table.spec.ts | 3 ++- packages/server/src/tests/utilities/api/row.ts | 8 ++++---- packages/types/src/api/web/app/table.ts | 4 ++++ 6 files changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/server/src/api/controllers/table/external.ts b/packages/server/src/api/controllers/table/external.ts index 75318a3462..49dbc855f7 100644 --- a/packages/server/src/api/controllers/table/external.ts +++ b/packages/server/src/api/controllers/table/external.ts @@ -16,6 +16,7 @@ import { context, events } from "@budibase/backend-core" import { isRows, isSchema, parse } from "../../../utilities/schema" import { BulkImportRequest, + BulkImportResponse, Datasource, FieldSchema, ManyToManyRelationshipFieldMetadata, @@ -386,7 +387,7 @@ export async function destroy(ctx: UserCtx) { return tableToDelete } -export async function bulkImport(ctx: UserCtx) { +export async function bulkImport(ctx: UserCtx) { const table = await sdk.tables.getTable(ctx.params.tableId) const { rows } = ctx.request.body const schema = table.schema diff --git a/packages/server/src/api/controllers/table/index.ts b/packages/server/src/api/controllers/table/index.ts index 4e63686bcb..8d81e6d168 100644 --- a/packages/server/src/api/controllers/table/index.ts +++ b/packages/server/src/api/controllers/table/index.ts @@ -9,6 +9,7 @@ import { isExternalTable, isSQL } from "../../../integrations/utils" import { events } from "@budibase/backend-core" import { BulkImportRequest, + BulkImportResponse, FetchTablesResponse, SaveTableRequest, SaveTableResponse, @@ -98,7 +99,7 @@ export async function destroy(ctx: UserCtx) { builderSocket?.emitTableDeletion(ctx, deletedTable) } -export async function bulkImport(ctx: UserCtx) { +export async function bulkImport(ctx: UserCtx) { const tableId = ctx.params.tableId let tableBefore = await sdk.tables.getTable(tableId) let tableAfter = await pickApi({ tableId }).bulkImport(ctx) diff --git a/packages/server/src/api/controllers/table/internal.ts b/packages/server/src/api/controllers/table/internal.ts index 11be19a8a7..3d957b8771 100644 --- a/packages/server/src/api/controllers/table/internal.ts +++ b/packages/server/src/api/controllers/table/internal.ts @@ -11,6 +11,7 @@ import { import { runStaticFormulaChecks } from "./bulkFormula" import { BulkImportRequest, + BulkImportResponse, RenameColumn, SaveTableRequest, SaveTableResponse, @@ -207,7 +208,7 @@ export async function destroy(ctx: any) { return tableToDelete } -export async function bulkImport(ctx: UserCtx) { +export async function bulkImport(ctx: UserCtx) { const table = await sdk.tables.getTable(ctx.params.tableId) const { rows, identifierFields } = ctx.request.body await handleDataImport(ctx.user, table, rows, identifierFields) diff --git a/packages/server/src/api/routes/tests/table.spec.ts b/packages/server/src/api/routes/tests/table.spec.ts index f8f78561dd..ded54729b9 100644 --- a/packages/server/src/api/routes/tests/table.spec.ts +++ b/packages/server/src/api/routes/tests/table.spec.ts @@ -5,6 +5,7 @@ import { RelationshipType, Table, ViewCalculation, + AutoFieldSubTypes, } from "@budibase/types" import { checkBuilderEndpoint } from "./utilities/TestFunctions" import * as setup from "./utilities" @@ -196,7 +197,7 @@ describe("/tables", () => { autoId: { name: "id", type: FieldType.NUMBER, - subtype: "autoID", + subtype: AutoFieldSubTypes.AUTO_ID, autocolumn: true, constraints: { type: "number", diff --git a/packages/server/src/tests/utilities/api/row.ts b/packages/server/src/tests/utilities/api/row.ts index ce95bf2835..bb880bb7da 100644 --- a/packages/server/src/tests/utilities/api/row.ts +++ b/packages/server/src/tests/utilities/api/row.ts @@ -4,8 +4,8 @@ import { Row, ValidateResponse, ExportRowsRequest, - ImportRowsRequest, - ImportRowsResponse, + BulkImportRequest, + BulkImportResponse, } from "@budibase/types" import TestConfiguration from "../TestConfiguration" import { TestAPI } from "./base" @@ -127,9 +127,9 @@ export class RowAPI extends TestAPI { bulkImport = async ( tableId: string, - body: ImportRowsRequest, + body: BulkImportRequest, { expectStatus } = { expectStatus: 200 } - ): Promise => { + ): Promise => { let request = this.request .post(`/api/tables/${tableId}/import`) .send(body) diff --git a/packages/types/src/api/web/app/table.ts b/packages/types/src/api/web/app/table.ts index 8fb0297a9e..cb5faaa9ea 100644 --- a/packages/types/src/api/web/app/table.ts +++ b/packages/types/src/api/web/app/table.ts @@ -29,3 +29,7 @@ export interface BulkImportRequest { rows: Row[] identifierFields?: Array } + +export interface BulkImportResponse { + message: string +} From b310d7c5a7f09abbf79d8dd3ce0ce73e94ca7738 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Wed, 11 Oct 2023 17:12:28 +0100 Subject: [PATCH 09/23] Linting. --- packages/server/src/api/controllers/table/external.ts | 4 +++- packages/server/src/api/controllers/table/index.ts | 4 +++- packages/server/src/api/controllers/table/internal.ts | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/server/src/api/controllers/table/external.ts b/packages/server/src/api/controllers/table/external.ts index 49dbc855f7..967176c2e4 100644 --- a/packages/server/src/api/controllers/table/external.ts +++ b/packages/server/src/api/controllers/table/external.ts @@ -387,7 +387,9 @@ export async function destroy(ctx: UserCtx) { return tableToDelete } -export async function bulkImport(ctx: UserCtx) { +export async function bulkImport( + ctx: UserCtx +) { const table = await sdk.tables.getTable(ctx.params.tableId) const { rows } = ctx.request.body const schema = table.schema diff --git a/packages/server/src/api/controllers/table/index.ts b/packages/server/src/api/controllers/table/index.ts index 8d81e6d168..44f673f284 100644 --- a/packages/server/src/api/controllers/table/index.ts +++ b/packages/server/src/api/controllers/table/index.ts @@ -99,7 +99,9 @@ export async function destroy(ctx: UserCtx) { builderSocket?.emitTableDeletion(ctx, deletedTable) } -export async function bulkImport(ctx: UserCtx) { +export async function bulkImport( + ctx: UserCtx +) { const tableId = ctx.params.tableId let tableBefore = await sdk.tables.getTable(tableId) let tableAfter = await pickApi({ tableId }).bulkImport(ctx) diff --git a/packages/server/src/api/controllers/table/internal.ts b/packages/server/src/api/controllers/table/internal.ts index 3d957b8771..eeb4a9eb5f 100644 --- a/packages/server/src/api/controllers/table/internal.ts +++ b/packages/server/src/api/controllers/table/internal.ts @@ -208,7 +208,9 @@ export async function destroy(ctx: any) { return tableToDelete } -export async function bulkImport(ctx: UserCtx) { +export async function bulkImport( + ctx: UserCtx +) { const table = await sdk.tables.getTable(ctx.params.tableId) const { rows, identifierFields } = ctx.request.body await handleDataImport(ctx.user, table, rows, identifierFields) From 6219299bb938eadd2788ab4a3c93e6b49ec69a4b Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Wed, 11 Oct 2023 16:24:11 +0000 Subject: [PATCH 10/23] Bump version to 2.11.23 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index e64bf3e185..9b72277368 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.11.22", + "version": "2.11.23", "npmClient": "yarn", "packages": [ "packages/*" From bda67b1aca9f66ba3fd5ec5c39ba4321ecfcbe2f Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Wed, 11 Oct 2023 16:32:36 +0000 Subject: [PATCH 11/23] Bump version to 2.11.24 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index 9b72277368..c257c2d9e5 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.11.23", + "version": "2.11.24", "npmClient": "yarn", "packages": [ "packages/*" From d1b7ccd86f5c2b2743652111c290a2cb73fe2afc Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Wed, 11 Oct 2023 17:49:25 +0100 Subject: [PATCH 12/23] Updating docs and removing old documentation pathway. --- package.json | 1 - packages/server/package.json | 1 - packages/server/scripts/docs/README.md | 31 -- packages/server/scripts/docs/generate.js | 74 ----- packages/server/scripts/docs/toSwagger.js | 320 --------------------- packages/server/specs/openapi.json | 9 +- packages/server/specs/openapi.yaml | 3 + packages/server/src/definitions/openapi.ts | 9 +- 8 files changed, 15 insertions(+), 433 deletions(-) delete mode 100644 packages/server/scripts/docs/README.md delete mode 100644 packages/server/scripts/docs/generate.js delete mode 100644 packages/server/scripts/docs/toSwagger.js diff --git a/package.json b/package.json index e5b6554fca..c38ef76e17 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,6 @@ "build:docker:dependencies": "docker build -f hosting/dependencies/Dockerfile -t budibase/dependencies:latest ./hosting", "publish:docker:couch": "docker buildx build --platform linux/arm64,linux/amd64 -f hosting/couchdb/Dockerfile -t budibase/couchdb:latest -t budibase/couchdb:v3.2.1 --push ./hosting/couchdb", "publish:docker:dependencies": "docker buildx build --platform linux/arm64,linux/amd64 -f hosting/dependencies/Dockerfile -t budibase/dependencies:latest -t budibase/dependencies:v3.2.1 --push ./hosting", - "build:docs": "lerna run --stream build:docs", "release:helm": "node scripts/releaseHelmChart", "env:multi:enable": "lerna run --stream env:multi:enable", "env:multi:disable": "lerna run --stream env:multi:disable", diff --git a/packages/server/package.json b/packages/server/package.json index 795886d7cc..bb9a80f721 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -20,7 +20,6 @@ "test:watch": "jest --watch", "predocker": "copyfiles -f ../client/dist/budibase-client.js ../client/manifest.json client && yarn build && cp ../../yarn.lock ./dist/", "build:docker": "yarn predocker && docker build . -t app-service --label version=$BUDIBASE_RELEASE_VERSION", - "build:docs": "node ./scripts/docs/generate.js open", "run:docker": "node dist/index.js", "run:docker:cluster": "pm2-runtime start pm2.config.js", "dev:stack:up": "node scripts/dev/manage.js up", diff --git a/packages/server/scripts/docs/README.md b/packages/server/scripts/docs/README.md deleted file mode 100644 index f1075754d3..0000000000 --- a/packages/server/scripts/docs/README.md +++ /dev/null @@ -1,31 +0,0 @@ -### Documentation - -This directory contains the scripts required to generate the APIDoc based documentation. -You can find the docs about comment structure at the [APIDocs page](https://apidocjs.com/). - -In general most API endpoints will look like: -```js - /** - * @api {post} /api/:param/url Give it a name - * @apiName Give it a name - * @apiGroup group - * @apiPermission permission - * @apiDescription Describe what the endpoint does, any special cases the user - * should be aware of. - * - * @apiParam {string} param describe a URL parameter. - * - * @apiParam (Body) input describe a field on the body. - * - * @apiSuccess {object} output describe the output. - */ -``` - -There are a few key points to note when writing API docs: -1. Don't use `@apiBody` - this isn't currently supported by our swagger converter. -2. Make sure to always have an `@api` definition at the start, which must always have the -HTTP verb, the endpoint URL and the name. -3. There are three ways you can specify parameters used as inputs for your endpoint, -`@apiParam` for a URL param, `@apiParam (Body)` for a field on the request body and `@apiParam (Query)` -for query string parameters. -4. The `@apiGroup` should be the same for all API Doc comments in a route file. \ No newline at end of file diff --git a/packages/server/scripts/docs/generate.js b/packages/server/scripts/docs/generate.js deleted file mode 100644 index 0d6d42fd32..0000000000 --- a/packages/server/scripts/docs/generate.js +++ /dev/null @@ -1,74 +0,0 @@ -const fs = require("fs") -const { join } = require("path") -const { createDoc } = require("apidoc") -const packageJson = require("../../package.json") -const toSwagger = require("./toSwagger") -const open = require("open") - -const config = { - name: "Budibase API", - version: packageJson.version, - description: "Documenting the Budibase backend API", - title: "Budibase app service API", -} - -const shouldOpen = process.argv[2] -const disallowed = [] - -function filter(parsedRouteFiles) { - const tagToSearch = "url" - for (let routeFile of parsedRouteFiles) { - for (let route of routeFile) { - let routeInfo = route["local"] - if (disallowed.includes(routeInfo[tagToSearch])) { - const idx = routeFile.indexOf(route) - routeFile.splice(idx, 1) - } - } - } -} - -async function generate() { - // start by writing a config file - const configPath = join(__dirname, "config.json") - fs.writeFileSync(configPath, JSON.stringify(config)) - const mainPath = join(__dirname, "..", "..") - const srcPath = join(mainPath, "src", "api", "routes") - const assetsPath = join(mainPath, "builder", "assets", "docs") - if (!fs.existsSync(assetsPath)) { - fs.mkdirSync(assetsPath, { recursive: true }) - } - const options = { - src: [srcPath], - dest: assetsPath, - filters: { - main: { - postFilter: filter, - }, - }, - config: configPath, - } - const doc = createDoc(options) - if (typeof doc !== "boolean") { - const swagger = toSwagger(JSON.parse(doc.data), JSON.parse(doc.project)) - fs.writeFileSync(join(assetsPath, "swagger.json"), JSON.stringify(swagger)) - fs.writeFileSync(join(assetsPath, "apidoc.json"), doc.data) - fs.writeFileSync(join(assetsPath, "project.json"), doc.project) - console.log( - `Docs generated successfully, find in ${assetsPath}, swagger.json, apidoc.json and project.json` - ) - } else { - throw "Unable to generate docs." - } - // delete the temporary config file - fs.unlinkSync(configPath) - setTimeout(async () => { - if (shouldOpen === "open") { - await open(join(assetsPath, "index.html"), { wait: false }) - } - }, 2000) -} - -generate().catch(err => { - console.error(err) -}) diff --git a/packages/server/scripts/docs/toSwagger.js b/packages/server/scripts/docs/toSwagger.js deleted file mode 100644 index 1532e25fa6..0000000000 --- a/packages/server/scripts/docs/toSwagger.js +++ /dev/null @@ -1,320 +0,0 @@ -let _ = require("lodash") -let { pathToRegexp } = require("path-to-regexp") - -/******************************************************** - * Based on: https://github.com/fsbahman/apidoc-swagger * - ********************************************************/ - -let swagger = { - swagger: "2.0", - info: {}, - paths: {}, - definitions: {}, -} - -function toSwagger(apidocJson, projectJson) { - swagger.info = addInfo(projectJson) - swagger.paths = extractPaths(apidocJson) - return swagger -} - -let tagsRegex = /(<([^>]+)>)/gi -// Removes

tags from text -function removeTags(text) { - return text ? text.replace(tagsRegex, "") : text -} - -function addInfo(projectJson) { - let info = {} - info["title"] = projectJson.title || projectJson.name - info["version"] = projectJson.version - info["description"] = projectJson.description - return info -} - -/** - * Extracts paths provided in json format - * post, patch, put request parameters are extracted in body - * get and delete are extracted to path parameters - * @param apidocJson - * @returns {{}} - */ -function extractPaths(apidocJson) { - let apiPaths = groupByUrl(apidocJson) - let paths = {} - for (let i = 0; i < apiPaths.length; i++) { - let verbs = apiPaths[i].verbs - let url = verbs[0].url - let pattern = pathToRegexp(url, null) - let matches = pattern.exec(url) - - // Surrounds URL parameters with curly brackets -> :email with {email} - let pathKeys = [] - for (let j = 1; j < matches.length; j++) { - let key = matches[j].slice(1) - url = url.replace(matches[j], "{" + key + "}") - pathKeys.push(key) - } - - for (let j = 0; j < verbs.length; j++) { - let verb = verbs[j] - let type = verb.type - - let obj = (paths[url] = paths[url] || {}) - - if (type === "post" || type === "patch" || type === "put") { - _.extend( - obj, - createPostPushPutOutput(verb, swagger.definitions, pathKeys) - ) - } else { - _.extend(obj, createGetDeleteOutput(verb, swagger.definitions)) - } - } - } - return paths -} - -function createPostPushPutOutput(verbs, definitions, pathKeys) { - let pathItemObject = {} - let verbDefinitionResult = createVerbDefinitions(verbs, definitions) - - let params = [] - let pathParams = createPathParameters(verbs, pathKeys) - pathParams = _.filter(pathParams, function (param) { - let hasKey = pathKeys.indexOf(param.name) !== -1 - return !(param.in === "path" && !hasKey) - }) - - params = params.concat(pathParams) - let required = - verbs.parameter && - verbs.parameter.fields && - verbs.parameter.fields.Parameter && - verbs.parameter.fields.Parameter.length > 0 - - params.push({ - in: "body", - name: "body", - description: removeTags(verbs.description), - required: required, - schema: { - $ref: "#/definitions/" + verbDefinitionResult.topLevelParametersRef, - }, - }) - - pathItemObject[verbs.type] = { - tags: [verbs.group], - summary: removeTags(verbs.description), - consumes: ["application/json"], - produces: ["application/json"], - parameters: params, - } - - if (verbDefinitionResult.topLevelSuccessRef) { - pathItemObject[verbs.type].responses = { - 200: { - description: "successful operation", - schema: { - type: verbDefinitionResult.topLevelSuccessRefType, - items: { - $ref: "#/definitions/" + verbDefinitionResult.topLevelSuccessRef, - }, - }, - }, - } - } - - return pathItemObject -} - -function createVerbDefinitions(verbs, definitions) { - let result = { - topLevelParametersRef: null, - topLevelSuccessRef: null, - topLevelSuccessRefType: null, - } - let defaultObjectName = verbs.name - - let fieldArrayResult = {} - if (verbs && verbs.parameter && verbs.parameter.fields) { - fieldArrayResult = createFieldArrayDefinitions( - verbs.parameter.fields.Parameter, - definitions, - verbs.name, - defaultObjectName - ) - result.topLevelParametersRef = fieldArrayResult.topLevelRef - } - - if (verbs && verbs.success && verbs.success.fields) { - fieldArrayResult = createFieldArrayDefinitions( - verbs.success.fields["Success 200"], - definitions, - verbs.name, - defaultObjectName - ) - result.topLevelSuccessRef = fieldArrayResult.topLevelRef - result.topLevelSuccessRefType = fieldArrayResult.topLevelRefType - } - - return result -} - -function createFieldArrayDefinitions( - fieldArray, - definitions, - topLevelRef, - defaultObjectName -) { - let result = { - topLevelRef: topLevelRef, - topLevelRefType: null, - } - - if (!fieldArray) { - return result - } - - for (let i = 0; i < fieldArray.length; i++) { - let parameter = fieldArray[i] - - let nestedName = createNestedName(parameter.field) - let objectName = nestedName.objectName - if (!objectName) { - objectName = defaultObjectName - } - let type = parameter.type - if (i === 0) { - result.topLevelRefType = type - if (parameter.type === "Object") { - objectName = nestedName.propertyName - nestedName.propertyName = null - } else if (parameter.type === "Array") { - objectName = nestedName.propertyName - nestedName.propertyName = null - result.topLevelRefType = "array" - } - result.topLevelRef = objectName - } - - definitions[objectName] = definitions[objectName] || { - properties: {}, - required: [], - } - - if (nestedName.propertyName) { - let prop = { - type: (parameter.type || "").toLowerCase(), - description: removeTags(parameter.description), - } - if (parameter.type === "Object") { - prop.$ref = "#/definitions/" + parameter.field - } - - let typeIndex = type.indexOf("[]") - if (typeIndex !== -1 && typeIndex === type.length - 2) { - prop.type = "array" - prop.items = { - type: type.slice(0, type.length - 2), - } - } - - definitions[objectName]["properties"][nestedName.propertyName] = prop - if (!parameter.optional) { - let arr = definitions[objectName]["required"] - if (arr.indexOf(nestedName.propertyName) === -1) { - arr.push(nestedName.propertyName) - } - } - } - } - - return result -} - -function createNestedName(field) { - let propertyName = field - let objectName - let propertyNames = field.split(".") - if (propertyNames && propertyNames.length > 1) { - propertyName = propertyNames[propertyNames.length - 1] - propertyNames.pop() - objectName = propertyNames.join(".") - } - - return { - propertyName: propertyName, - objectName: objectName, - } -} - -/** - * Generate get, delete method output - * @param verbs - * @param definitions - * @returns {{}} - */ -function createGetDeleteOutput(verbs, definitions) { - let pathItemObject = {} - verbs.type = verbs.type === "del" ? "delete" : verbs.type - - let verbDefinitionResult = createVerbDefinitions(verbs, definitions) - pathItemObject[verbs.type] = { - tags: [verbs.group], - summary: removeTags(verbs.description), - consumes: ["application/json"], - produces: ["application/json"], - parameters: createPathParameters(verbs), - } - if (verbDefinitionResult.topLevelSuccessRef) { - pathItemObject[verbs.type].responses = { - 200: { - description: "successful operation", - schema: { - type: verbDefinitionResult.topLevelSuccessRefType, - items: { - $ref: "#/definitions/" + verbDefinitionResult.topLevelSuccessRef, - }, - }, - }, - } - } - return pathItemObject -} - -/** - * Iterate through all method parameters and create array of parameter objects which are stored as path parameters - * @param verbs - * @returns {Array} - */ -function createPathParameters(verbs) { - let pathItemObject = [] - if (verbs.parameter && verbs.parameter.fields.Parameter) { - for (let i = 0; i < verbs.parameter.fields.Parameter.length; i++) { - let param = verbs.parameter.fields.Parameter[i] - let field = param.field - let type = param.type - pathItemObject.push({ - name: field, - in: type === "file" ? "formData" : "path", - required: !param.optional, - type: param.type.toLowerCase(), - description: removeTags(param.description), - }) - } - } - return pathItemObject -} - -function groupByUrl(apidocJson) { - return _.chain(apidocJson) - .groupBy("url") - .toPairs() - .map(function (element) { - return _.zipObject(["url", "verbs"], element) - }) - .value() -} - -module.exports = toSwagger diff --git a/packages/server/specs/openapi.json b/packages/server/specs/openapi.json index 8baba62a62..a6900adea7 100644 --- a/packages/server/specs/openapi.json +++ b/packages/server/specs/openapi.json @@ -859,7 +859,8 @@ "json", "internal", "barcodeqr", - "bigint" + "bigint", + "bb_reference" ], "description": "Defines the type of the column, most explain themselves, a link column is a relationship." }, @@ -1064,7 +1065,8 @@ "json", "internal", "barcodeqr", - "bigint" + "bigint", + "bb_reference" ], "description": "Defines the type of the column, most explain themselves, a link column is a relationship." }, @@ -1280,7 +1282,8 @@ "json", "internal", "barcodeqr", - "bigint" + "bigint", + "bb_reference" ], "description": "Defines the type of the column, most explain themselves, a link column is a relationship." }, diff --git a/packages/server/specs/openapi.yaml b/packages/server/specs/openapi.yaml index 0673794fb0..ad02a3cd9c 100644 --- a/packages/server/specs/openapi.yaml +++ b/packages/server/specs/openapi.yaml @@ -782,6 +782,7 @@ components: - internal - barcodeqr - bigint + - bb_reference description: Defines the type of the column, most explain themselves, a link column is a relationship. constraints: @@ -946,6 +947,7 @@ components: - internal - barcodeqr - bigint + - bb_reference description: Defines the type of the column, most explain themselves, a link column is a relationship. constraints: @@ -1117,6 +1119,7 @@ components: - internal - barcodeqr - bigint + - bb_reference description: Defines the type of the column, most explain themselves, a link column is a relationship. constraints: diff --git a/packages/server/src/definitions/openapi.ts b/packages/server/src/definitions/openapi.ts index a813f0f135..34014ba626 100644 --- a/packages/server/src/definitions/openapi.ts +++ b/packages/server/src/definitions/openapi.ts @@ -279,7 +279,8 @@ export interface components { | "json" | "internal" | "barcodeqr" - | "bigint"; + | "bigint" + | "bb_reference"; /** @description A constraint can be applied to the column which will be validated against when a row is saved. */ constraints?: { /** @enum {string} */ @@ -386,7 +387,8 @@ export interface components { | "json" | "internal" | "barcodeqr" - | "bigint"; + | "bigint" + | "bb_reference"; /** @description A constraint can be applied to the column which will be validated against when a row is saved. */ constraints?: { /** @enum {string} */ @@ -495,7 +497,8 @@ export interface components { | "json" | "internal" | "barcodeqr" - | "bigint"; + | "bigint" + | "bb_reference"; /** @description A constraint can be applied to the column which will be validated against when a row is saved. */ constraints?: { /** @enum {string} */ From 15c308efca287147090693ccece8a1094440cca7 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Wed, 11 Oct 2023 17:06:01 +0000 Subject: [PATCH 13/23] Bump version to 2.11.25 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index c257c2d9e5..c35b873b75 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.11.24", + "version": "2.11.25", "npmClient": "yarn", "packages": [ "packages/*" From 5908a791f207f06178906bf60e427c47fb8773eb Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 11 Oct 2023 19:10:58 +0200 Subject: [PATCH 14/23] Return email and names on bb reference api output --- packages/server/src/api/routes/tests/row.spec.ts | 3 +++ .../src/utilities/rowProcessor/bbReferenceProcessor.ts | 3 +++ .../rowProcessor/tests/bbReferenceProcessor.spec.ts | 6 ++++++ 3 files changed, 12 insertions(+) diff --git a/packages/server/src/api/routes/tests/row.spec.ts b/packages/server/src/api/routes/tests/row.spec.ts index 4b1bc65793..0a80253210 100644 --- a/packages/server/src/api/routes/tests/row.spec.ts +++ b/packages/server/src/api/routes/tests/row.spec.ts @@ -1580,6 +1580,9 @@ describe.each([ (row: Row) => ({ _id: row._id, primaryDisplay: row.email, + email: row.email, + firstName: row.firstName, + lastName: row.lastName, }), ], ])("links - %s", (__, relSchema, dataGenerator, resultMapper) => { diff --git a/packages/server/src/utilities/rowProcessor/bbReferenceProcessor.ts b/packages/server/src/utilities/rowProcessor/bbReferenceProcessor.ts index c126530b8d..c7b8998bad 100644 --- a/packages/server/src/utilities/rowProcessor/bbReferenceProcessor.ts +++ b/packages/server/src/utilities/rowProcessor/bbReferenceProcessor.ts @@ -82,6 +82,9 @@ export async function processOutputBBReferences( return users.map(u => ({ _id: u._id, primaryDisplay: u.email, + email: u.email, + firstName: u.firstName, + lastName: u.lastName, })) default: diff --git a/packages/server/src/utilities/rowProcessor/tests/bbReferenceProcessor.spec.ts b/packages/server/src/utilities/rowProcessor/tests/bbReferenceProcessor.spec.ts index 10d339f6b4..b6174861d4 100644 --- a/packages/server/src/utilities/rowProcessor/tests/bbReferenceProcessor.spec.ts +++ b/packages/server/src/utilities/rowProcessor/tests/bbReferenceProcessor.spec.ts @@ -180,6 +180,9 @@ describe("bbReferenceProcessor", () => { { _id: user._id, primaryDisplay: user.email, + email: user.email, + firstName: user.firstName, + lastName: user.lastName, }, ]) expect(cacheGetUsersSpy).toBeCalledTimes(1) @@ -204,6 +207,9 @@ describe("bbReferenceProcessor", () => { [user1, user2].map(u => ({ _id: u._id, primaryDisplay: u.email, + email: u.email, + firstName: u.firstName, + lastName: u.lastName, })) ) ) From 1ce94484fdf92d66dde07d7063baa0e81322fbf1 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Wed, 11 Oct 2023 17:27:27 +0000 Subject: [PATCH 15/23] Bump version to 2.11.26 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index c35b873b75..5708bb5f44 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.11.25", + "version": "2.11.26", "npmClient": "yarn", "packages": [ "packages/*" From 7090819752dc4623b09d695179a222abbaac0953 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Wed, 11 Oct 2023 18:43:25 +0100 Subject: [PATCH 16/23] Updating version of VM2 to ^3.9.19 - due to possible RCE issue with Promises (we do not allow async code, but there still could be a risk). --- packages/server/package.json | 2 +- packages/string-templates/package.json | 2 +- yarn.lock | 10 +++++++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/server/package.json b/packages/server/package.json index bb9a80f721..f66e9346e1 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -111,7 +111,7 @@ "to-json-schema": "0.2.5", "uuid": "3.3.2", "validate.js": "0.13.1", - "vm2": "3.9.17", + "vm2": "^3.9.19", "worker-farm": "1.7.0", "xml2js": "0.5.0", "yargs": "13.2.4" diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json index 6780840ed3..d9f56442a0 100644 --- a/packages/string-templates/package.json +++ b/packages/string-templates/package.json @@ -29,7 +29,7 @@ "dayjs": "^1.10.8", "handlebars": "^4.7.6", "lodash": "^4.17.20", - "vm2": "^3.9.15" + "vm2": "^3.9.19" }, "devDependencies": { "@rollup/plugin-commonjs": "^17.1.0", diff --git a/yarn.lock b/yarn.lock index d8e1d41d56..a528ffa0bc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21750,7 +21750,15 @@ vlq@^0.2.2: resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== -vm2@3.9.17, vm2@^3.9.15, vm2@^3.9.8: +vm2@^3.9.19: + version "3.9.19" + resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.19.tgz#be1e1d7a106122c6c492b4d51c2e8b93d3ed6a4a" + integrity sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg== + dependencies: + acorn "^8.7.0" + acorn-walk "^8.2.0" + +vm2@^3.9.8: version "3.9.17" resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.17.tgz#251b165ff8a0e034942b5181057305e39570aeab" integrity sha512-AqwtCnZ/ERcX+AVj9vUsphY56YANXxRuqMb7GsDtAr0m0PcQX3u0Aj3KWiXM0YAHy7i6JEeHrwOnwXbGYgRpAw== From f958832e86b057b9a8a29e77b176aca0062a082a Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Wed, 11 Oct 2023 18:48:04 +0100 Subject: [PATCH 17/23] Removing dupe vm2 --- yarn.lock | 8 -------- 1 file changed, 8 deletions(-) diff --git a/yarn.lock b/yarn.lock index a528ffa0bc..81c2815663 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21758,14 +21758,6 @@ vm2@^3.9.19: acorn "^8.7.0" acorn-walk "^8.2.0" -vm2@^3.9.8: - version "3.9.17" - resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.17.tgz#251b165ff8a0e034942b5181057305e39570aeab" - integrity sha512-AqwtCnZ/ERcX+AVj9vUsphY56YANXxRuqMb7GsDtAr0m0PcQX3u0Aj3KWiXM0YAHy7i6JEeHrwOnwXbGYgRpAw== - dependencies: - acorn "^8.7.0" - acorn-walk "^8.2.0" - vuvuzela@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/vuvuzela/-/vuvuzela-1.0.3.tgz#3be145e58271c73ca55279dd851f12a682114b0b" From f4e75f4a2be2f0f61faccc1763331a63f175b20b Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Wed, 11 Oct 2023 18:05:23 +0000 Subject: [PATCH 18/23] Bump version to 2.11.27 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index 5708bb5f44..64d169472b 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.11.26", + "version": "2.11.27", "npmClient": "yarn", "packages": [ "packages/*" From d6f8662e952c9001c1712a07c484af820df49e4f Mon Sep 17 00:00:00 2001 From: Conor Webb <126772285+ConorWebb96@users.noreply.github.com> Date: Thu, 12 Oct 2023 08:29:40 +0100 Subject: [PATCH 19/23] Adding onchange actions to code scanner. (#12029) * Adding onchange actions to code scanner. * Removed unused code, set updateOnChange to false. --------- Co-authored-by: Michael Drury --- packages/client/manifest.json | 11 +++++++++++ .../src/components/app/forms/CodeScanner.svelte | 1 + 2 files changed, 12 insertions(+) diff --git a/packages/client/manifest.json b/packages/client/manifest.json index d987344956..47b935b420 100644 --- a/packages/client/manifest.json +++ b/packages/client/manifest.json @@ -3419,6 +3419,17 @@ "value": "custom" } }, + { + "type": "event", + "label": "On change", + "key": "onChange", + "context": [ + { + "label": "Field Value", + "key": "value" + } + ] + }, { "type": "validation/string", "label": "Validation", diff --git a/packages/client/src/components/app/forms/CodeScanner.svelte b/packages/client/src/components/app/forms/CodeScanner.svelte index 9895413446..04d6919157 100644 --- a/packages/client/src/components/app/forms/CodeScanner.svelte +++ b/packages/client/src/components/app/forms/CodeScanner.svelte @@ -128,6 +128,7 @@
{ dispatch("change", value) }} From ad0529cf64679f40373b1b498796a6fd9d6f4c1c Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Thu, 12 Oct 2023 07:30:01 +0000 Subject: [PATCH 20/23] Bump version to 2.11.28 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index 64d169472b..e6fd167f16 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.11.27", + "version": "2.11.28", "npmClient": "yarn", "packages": [ "packages/*" From 025e660674e9b8b65f90b31fe23c52d0826d59e5 Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Thu, 12 Oct 2023 07:39:03 +0000 Subject: [PATCH 21/23] Bump version to 2.11.29 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index e6fd167f16..c4315ee698 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.11.28", + "version": "2.11.29", "npmClient": "yarn", "packages": [ "packages/*" From eea31893cfba592550f573dcb44847fb101b6fc3 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Thu, 12 Oct 2023 10:03:47 +0100 Subject: [PATCH 22/23] Trying to fix max-space size action as part of the single image release (required to create the space needed for both image builds. --- .github/workflows/release-singleimage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-singleimage.yml b/.github/workflows/release-singleimage.yml index bd01ed786a..78b5cdd577 100644 --- a/.github/workflows/release-singleimage.yml +++ b/.github/workflows/release-singleimage.yml @@ -18,7 +18,7 @@ jobs: - name: Maximize build space uses: easimon/maximize-build-space@master with: - root-reserve-mb: 35000 + root-reserve-mb: 30000 swap-size-mb: 1024 remove-android: 'true' remove-dotnet: 'true' From f83df42bfc2781dd498e9e25a3e845e770d28a6c Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Thu, 12 Oct 2023 09:13:59 +0000 Subject: [PATCH 23/23] Bump version to 2.11.30 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index c4315ee698..95e10c444e 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.11.29", + "version": "2.11.30", "npmClient": "yarn", "packages": [ "packages/*"