diff --git a/lerna.json b/lerna.json
index e26819bf33..196113a33a 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
{
- "version": "2.1.32-alpha.11",
+ "version": "2.1.39",
"npmClient": "yarn",
"packages": [
"packages/*"
diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json
index fdc41293eb..6b350ca7a6 100644
--- a/packages/backend-core/package.json
+++ b/packages/backend-core/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/backend-core",
- "version": "2.1.32-alpha.11",
+ "version": "2.1.39",
"description": "Budibase backend core libraries used in server and worker",
"main": "dist/src/index.js",
"types": "dist/src/index.d.ts",
@@ -20,7 +20,7 @@
"test:watch": "jest --watchAll"
},
"dependencies": {
- "@budibase/types": "2.1.32-alpha.11",
+ "@budibase/types": "^2.1.39",
"@shopify/jest-koa-mocks": "5.0.1",
"@techpass/passport-openidconnect": "0.3.2",
"aws-sdk": "2.1030.0",
diff --git a/packages/bbui/package.json b/packages/bbui/package.json
index 2e2a9f7f36..5d3aea92f8 100644
--- a/packages/bbui/package.json
+++ b/packages/bbui/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/bbui",
"description": "A UI solution used in the different Budibase projects.",
- "version": "2.1.32-alpha.11",
+ "version": "2.1.39",
"license": "MPL-2.0",
"svelte": "src/index.js",
"module": "dist/bbui.es.js",
@@ -38,7 +38,7 @@
],
"dependencies": {
"@adobe/spectrum-css-workflow-icons": "^1.2.1",
- "@budibase/string-templates": "2.1.32-alpha.11",
+ "@budibase/string-templates": "^2.1.39",
"@spectrum-css/actionbutton": "^1.0.1",
"@spectrum-css/actiongroup": "^1.0.1",
"@spectrum-css/avatar": "^3.0.2",
diff --git a/packages/bbui/src/Form/Core/DatePicker.svelte b/packages/bbui/src/Form/Core/DatePicker.svelte
index 379f41b284..a35fee1446 100644
--- a/packages/bbui/src/Form/Core/DatePicker.svelte
+++ b/packages/bbui/src/Form/Core/DatePicker.svelte
@@ -197,6 +197,7 @@
{/if}
{
s._id !== screen._id
)
})
- if (otherHomeScreens.length) {
+ if (otherHomeScreens.length && updatedScreen.routing.homeScreen) {
const patch = screen => {
screen.routing.homeScreen = false
}
diff --git a/packages/builder/src/components/backend/DatasourceNavigator/TableIntegrationMenu/CreateExternalTableModal.svelte b/packages/builder/src/components/backend/DatasourceNavigator/TableIntegrationMenu/CreateExternalTableModal.svelte
index f6cd6af758..45269a365c 100644
--- a/packages/builder/src/components/backend/DatasourceNavigator/TableIntegrationMenu/CreateExternalTableModal.svelte
+++ b/packages/builder/src/components/backend/DatasourceNavigator/TableIntegrationMenu/CreateExternalTableModal.svelte
@@ -7,9 +7,9 @@
let name = ""
let submitted = false
- $: valid = name && name.length > 0 && !datasource?.entities[name]
+ $: valid = name && name.length > 0 && !datasource?.entities?.[name]
$: error =
- !submitted && name && datasource?.entities[name]
+ !submitted && name && datasource?.entities?.[name]
? "Table name already in use."
: null
diff --git a/packages/cli/package.json b/packages/cli/package.json
index 8544963b47..644a77c34d 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/cli",
- "version": "2.1.32-alpha.11",
+ "version": "2.1.39",
"description": "Budibase CLI, for developers, self hosting and migrations.",
"main": "src/index.js",
"bin": {
@@ -26,9 +26,9 @@
"outputPath": "build"
},
"dependencies": {
- "@budibase/backend-core": "2.1.32-alpha.11",
- "@budibase/string-templates": "2.1.32-alpha.11",
- "@budibase/types": "2.1.32-alpha.11",
+ "@budibase/backend-core": "^2.1.39",
+ "@budibase/string-templates": "^2.1.39",
+ "@budibase/types": "^2.1.39",
"axios": "0.21.2",
"chalk": "4.1.0",
"cli-progress": "3.11.2",
diff --git a/packages/client/package.json b/packages/client/package.json
index d99a4545b3..2f31afd3eb 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/client",
- "version": "2.1.32-alpha.11",
+ "version": "2.1.39",
"license": "MPL-2.0",
"module": "dist/budibase-client.js",
"main": "dist/budibase-client.js",
@@ -19,9 +19,9 @@
"dev:builder": "rollup -cw"
},
"dependencies": {
- "@budibase/bbui": "2.1.32-alpha.11",
- "@budibase/frontend-core": "2.1.32-alpha.11",
- "@budibase/string-templates": "2.1.32-alpha.11",
+ "@budibase/bbui": "^2.1.39",
+ "@budibase/frontend-core": "^2.1.39",
+ "@budibase/string-templates": "^2.1.39",
"@spectrum-css/button": "^3.0.3",
"@spectrum-css/card": "^3.0.3",
"@spectrum-css/divider": "^1.0.3",
diff --git a/packages/frontend-core/package.json b/packages/frontend-core/package.json
index 8fe3888252..240716848f 100644
--- a/packages/frontend-core/package.json
+++ b/packages/frontend-core/package.json
@@ -1,12 +1,12 @@
{
"name": "@budibase/frontend-core",
- "version": "2.1.32-alpha.11",
+ "version": "2.1.39",
"description": "Budibase frontend core libraries used in builder and client",
"author": "Budibase",
"license": "MPL-2.0",
"svelte": "src/index.js",
"dependencies": {
- "@budibase/bbui": "2.1.32-alpha.11",
+ "@budibase/bbui": "^2.1.39",
"lodash": "^4.17.21",
"svelte": "^3.46.2"
}
diff --git a/packages/sdk/package.json b/packages/sdk/package.json
index bb49c76919..c7708fcc51 100644
--- a/packages/sdk/package.json
+++ b/packages/sdk/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/sdk",
- "version": "2.1.32-alpha.11",
+ "version": "2.1.39",
"description": "Budibase Public API SDK",
"author": "Budibase",
"license": "MPL-2.0",
diff --git a/packages/server/package.json b/packages/server/package.json
index ba4f186c05..85799f329c 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/server",
"email": "hi@budibase.com",
- "version": "2.1.32-alpha.11",
+ "version": "2.1.39",
"description": "Budibase Web Server",
"main": "src/index.ts",
"repository": {
@@ -43,11 +43,11 @@
"license": "GPL-3.0",
"dependencies": {
"@apidevtools/swagger-parser": "10.0.3",
- "@budibase/backend-core": "2.1.32-alpha.11",
- "@budibase/client": "2.1.32-alpha.11",
- "@budibase/pro": "2.1.32-alpha.11",
- "@budibase/string-templates": "2.1.32-alpha.11",
- "@budibase/types": "2.1.32-alpha.11",
+ "@budibase/backend-core": "^2.1.39",
+ "@budibase/client": "^2.1.39",
+ "@budibase/pro": "2.1.39",
+ "@budibase/string-templates": "^2.1.39",
+ "@budibase/types": "^2.1.39",
"@bull-board/api": "3.7.0",
"@bull-board/koa": "3.9.4",
"@elastic/elasticsearch": "7.10.0",
diff --git a/packages/server/src/api/controllers/table/external.ts b/packages/server/src/api/controllers/table/external.ts
index 5257c4e39e..8bb8886479 100644
--- a/packages/server/src/api/controllers/table/external.ts
+++ b/packages/server/src/api/controllers/table/external.ts
@@ -220,6 +220,9 @@ export async function save(ctx: BBContext) {
const db = context.getAppDB()
const datasource = await db.get(datasourceId)
+ if (!datasource.entities) {
+ datasource.entities = {}
+ }
const oldTables = cloneDeep(datasource.entities)
const tables: Record = datasource.entities
diff --git a/packages/server/src/integrations/mysql.ts b/packages/server/src/integrations/mysql.ts
index 69dbb40480..acf8f4904a 100644
--- a/packages/server/src/integrations/mysql.ts
+++ b/packages/server/src/integrations/mysql.ts
@@ -106,7 +106,11 @@ function bindingTypeCoerce(bindings: any[]) {
}
// if not a number, see if it is a date - important to do in this order as any
// integer will be considered a valid date
- else if (/^\d/.test(binding) && dayjs(binding).isValid()) {
+ else if (
+ /^\d/.test(binding) &&
+ dayjs(binding).isValid() &&
+ !binding.includes(",")
+ ) {
bindings[i] = dayjs(binding).toDate()
}
}
diff --git a/packages/server/src/integrations/tests/mysql.spec.ts b/packages/server/src/integrations/tests/mysql.spec.ts
index a70eb73857..c4a26beb60 100644
--- a/packages/server/src/integrations/tests/mysql.spec.ts
+++ b/packages/server/src/integrations/tests/mysql.spec.ts
@@ -73,4 +73,61 @@ describe("MySQL Integration", () => {
expect(response).toEqual([{ deleted: true }])
})
})
+
+ describe("binding type coerce", () => {
+ it("ignores non-string types ", async () => {
+ const sql = "select * from users;"
+ const date = new Date()
+ await config.integration.read({
+ sql,
+ bindings: [11, date, ["a", "b", "c"], { id: 1 }],
+ })
+ expect(config.integration.client.query).toHaveBeenCalledWith(sql, [
+ 11,
+ date,
+ ["a", "b", "c"],
+ { id: 1 },
+ ])
+ })
+
+ it("parses strings matching a number regex", async () => {
+ const sql = "select * from users;"
+ await config.integration.read({
+ sql,
+ bindings: ["101", "3.14"],
+ })
+ expect(config.integration.client.query).toHaveBeenCalledWith(
+ sql,
+ [101, 3.14]
+ )
+ })
+
+ it("parses strings matching a valid date format", async () => {
+ const sql = "select * from users;"
+ await config.integration.read({
+ sql,
+ bindings: [
+ "2001-10-30",
+ "2010-09-01T13:30:59.123Z",
+ "2021-02-05 12:01 PM",
+ ],
+ })
+ expect(config.integration.client.query).toHaveBeenCalledWith(sql, [
+ new Date("2001-10-30T00:00:00.000Z"),
+ new Date("2010-09-01T13:30:59.123Z"),
+ new Date("2021-02-05T12:01:00.000Z"),
+ ])
+ })
+
+ it("does not parse string matching a valid array of numbers as date", async () => {
+ const sql = "select * from users;"
+ await config.integration.read({
+ sql,
+ bindings: ["1,2,2017"],
+ })
+ expect(config.integration.client.query).toHaveBeenCalledWith(sql, [
+ "1,2,2017",
+ ])
+ })
+ })
})
diff --git a/packages/server/src/threads/query.ts b/packages/server/src/threads/query.ts
index 8ee8bcb463..3d6428dd56 100644
--- a/packages/server/src/threads/query.ts
+++ b/packages/server/src/threads/query.ts
@@ -53,7 +53,6 @@ class QueryRunner {
async execute(): Promise {
let { datasource, fields, queryVerb, transformer } = this
-
let datasourceClone = cloneDeep(datasource)
let fieldsClone = cloneDeep(fields)
@@ -176,6 +175,7 @@ class QueryRunner {
parameters,
transformer: query.transformer,
queryId,
+ ctx: this.ctx,
},
{ noRecursiveQuery: true }
).execute()
diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json
index 7742b61ae3..ea10351553 100644
--- a/packages/string-templates/package.json
+++ b/packages/string-templates/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/string-templates",
- "version": "2.1.32-alpha.11",
+ "version": "2.1.39",
"description": "Handlebars wrapper for Budibase templating.",
"main": "src/index.cjs",
"module": "dist/bundle.mjs",
diff --git a/packages/types/package.json b/packages/types/package.json
index d69ee43a37..f502413aa7 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/types",
- "version": "2.1.32-alpha.11",
+ "version": "2.1.39",
"description": "Budibase types",
"main": "dist/index.js",
"types": "dist/index.d.ts",
diff --git a/packages/types/src/sdk/licensing/plan.ts b/packages/types/src/sdk/licensing/plan.ts
index b370397534..f46432b109 100644
--- a/packages/types/src/sdk/licensing/plan.ts
+++ b/packages/types/src/sdk/licensing/plan.ts
@@ -23,4 +23,5 @@ export interface Price {
duration: PriceDuration
priceId: string
dayPasses: number
+ isPerUser: boolean
}
diff --git a/packages/worker/package.json b/packages/worker/package.json
index 8149abfbdf..4b2c0f2722 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/worker",
"email": "hi@budibase.com",
- "version": "2.1.32-alpha.11",
+ "version": "2.1.39",
"description": "Budibase background service",
"main": "src/index.ts",
"repository": {
@@ -36,10 +36,10 @@
"author": "Budibase",
"license": "GPL-3.0",
"dependencies": {
- "@budibase/backend-core": "2.1.32-alpha.11",
- "@budibase/pro": "2.1.32-alpha.11",
- "@budibase/string-templates": "2.1.32-alpha.11",
- "@budibase/types": "2.1.32-alpha.11",
+ "@budibase/backend-core": "^2.1.39",
+ "@budibase/pro": "2.1.39",
+ "@budibase/string-templates": "^2.1.39",
+ "@budibase/types": "^2.1.39",
"@koa/router": "8.0.8",
"@sentry/node": "6.17.7",
"@techpass/passport-openidconnect": "0.3.2",