diff --git a/packages/backend-core/src/index.ts b/packages/backend-core/src/index.ts
index dbdce51c50..d4e6e9a1ec 100644
--- a/packages/backend-core/src/index.ts
+++ b/packages/backend-core/src/index.ts
@@ -1,6 +1,5 @@
export * as configs from "./configs"
export * as events from "./events"
-export * as migrations from "./migrations"
export * as users from "./users"
export * as userUtils from "./users/utils"
export * as roles from "./security/roles"
diff --git a/packages/backend-core/src/migrations/definitions.ts b/packages/backend-core/src/migrations/definitions.ts
deleted file mode 100644
index 0dd57fe639..0000000000
--- a/packages/backend-core/src/migrations/definitions.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import {
- MigrationType,
- MigrationName,
- MigrationDefinition,
-} from "@budibase/types"
-
-export const DEFINITIONS: MigrationDefinition[] = [
- {
- type: MigrationType.GLOBAL,
- name: MigrationName.USER_EMAIL_VIEW_CASING,
- },
- {
- type: MigrationType.GLOBAL,
- name: MigrationName.SYNC_QUOTAS,
- },
- {
- type: MigrationType.APP,
- name: MigrationName.APP_URLS,
- },
- {
- type: MigrationType.APP,
- name: MigrationName.EVENT_APP_BACKFILL,
- },
- {
- type: MigrationType.APP,
- name: MigrationName.TABLE_SETTINGS_LINKS_TO_ACTIONS,
- },
- {
- type: MigrationType.GLOBAL,
- name: MigrationName.EVENT_GLOBAL_BACKFILL,
- },
- {
- type: MigrationType.INSTALLATION,
- name: MigrationName.EVENT_INSTALLATION_BACKFILL,
- },
- {
- type: MigrationType.GLOBAL,
- name: MigrationName.GLOBAL_INFO_SYNC_USERS,
- },
-]
diff --git a/packages/backend-core/src/migrations/index.ts b/packages/backend-core/src/migrations/index.ts
deleted file mode 100644
index bce0cfc75c..0000000000
--- a/packages/backend-core/src/migrations/index.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from "./migrations"
-export * from "./definitions"
diff --git a/packages/backend-core/src/migrations/migrations.ts b/packages/backend-core/src/migrations/migrations.ts
deleted file mode 100644
index c8320b5724..0000000000
--- a/packages/backend-core/src/migrations/migrations.ts
+++ /dev/null
@@ -1,186 +0,0 @@
-import { DEFAULT_TENANT_ID } from "../constants"
-import {
- DocumentType,
- StaticDatabases,
- getAllApps,
- getGlobalDBName,
- getDB,
-} from "../db"
-import environment from "../environment"
-import * as platform from "../platform"
-import * as context from "../context"
-import { DEFINITIONS } from "."
-import {
- Migration,
- MigrationOptions,
- MigrationType,
- MigrationNoOpOptions,
- App,
-} from "@budibase/types"
-
-export const getMigrationsDoc = async (db: any) => {
- // get the migrations doc
- try {
- return await db.get(DocumentType.MIGRATIONS)
- } catch (err: any) {
- if (err.status && err.status === 404) {
- return { _id: DocumentType.MIGRATIONS }
- } else {
- throw err
- }
- }
-}
-
-export const backPopulateMigrations = async (opts: MigrationNoOpOptions) => {
- // filter migrations to the type and populate a no-op migration
- const migrations: Migration[] = DEFINITIONS.filter(
- def => def.type === opts.type
- ).map(d => ({ ...d, fn: async () => {} }))
- await runMigrations(migrations, { noOp: opts })
-}
-
-export const runMigration = async (
- migration: Migration,
- options: MigrationOptions = {}
-) => {
- const migrationType = migration.type
- const migrationName = migration.name
- const silent = migration.silent
-
- const log = (message: string) => {
- if (!silent) {
- console.log(message)
- }
- }
-
- // get the db to store the migration in
- let dbNames: string[]
- if (migrationType === MigrationType.GLOBAL) {
- dbNames = [getGlobalDBName()]
- } else if (migrationType === MigrationType.APP) {
- if (options.noOp) {
- if (!options.noOp.appId) {
- throw new Error("appId is required for noOp app migration")
- }
- dbNames = [options.noOp.appId]
- } else {
- const apps = (await getAllApps(migration.appOpts)) as App[]
- dbNames = apps.map(app => app.appId)
- }
- } else if (migrationType === MigrationType.INSTALLATION) {
- dbNames = [StaticDatabases.PLATFORM_INFO.name]
- } else {
- throw new Error(`Unrecognised migration type [${migrationType}]`)
- }
-
- const length = dbNames.length
- let count = 0
-
- // run the migration against each db
- for (const dbName of dbNames) {
- count++
- const lengthStatement = length > 1 ? `[${count}/${length}]` : ""
-
- const db = getDB(dbName)
-
- try {
- const doc = await getMigrationsDoc(db)
-
- // the migration has already been run
- if (doc[migrationName]) {
- // check for force
- if (
- options.force &&
- options.force[migrationType] &&
- options.force[migrationType].includes(migrationName)
- ) {
- log(`[Migration: ${migrationName}] [DB: ${dbName}] Forcing`)
- } else {
- // no force, exit
- return
- }
- }
-
- // check if the migration is not a no-op
- if (!options.noOp) {
- log(
- `[Migration: ${migrationName}] [DB: ${dbName}] Running ${lengthStatement}`
- )
-
- if (migration.preventRetry) {
- // eagerly set the completion date
- // so that we never run this migration twice even upon failure
- doc[migrationName] = Date.now()
- const response = await db.put(doc)
- doc._rev = response.rev
- }
-
- // run the migration
- if (migrationType === MigrationType.APP) {
- await context.doInAppContext(db.name, async () => {
- await migration.fn(db)
- })
- } else {
- await migration.fn(db)
- }
-
- log(`[Migration: ${migrationName}] [DB: ${dbName}] Complete`)
- }
-
- // mark as complete
- doc[migrationName] = Date.now()
- await db.put(doc)
- } catch (err) {
- console.error(
- `[Migration: ${migrationName}] [DB: ${dbName}] Error: `,
- err
- )
- throw err
- }
- }
-}
-
-export const runMigrations = async (
- migrations: Migration[],
- options: MigrationOptions = {}
-) => {
- let tenantIds
-
- if (environment.MULTI_TENANCY) {
- if (options.noOp) {
- tenantIds = [options.noOp.tenantId]
- } else if (!options.tenantIds || !options.tenantIds.length) {
- // run for all tenants
- tenantIds = await platform.tenants.getTenantIds()
- } else {
- tenantIds = options.tenantIds
- }
- } else {
- // single tenancy
- tenantIds = [DEFAULT_TENANT_ID]
- }
-
- if (tenantIds.length > 1) {
- console.log(`Checking migrations for ${tenantIds.length} tenants`)
- } else {
- console.log("Checking migrations")
- }
-
- let count = 0
- // for all tenants
- for (const tenantId of tenantIds) {
- count++
- if (tenantIds.length > 1) {
- console.log(`Progress [${count}/${tenantIds.length}]`)
- }
- // for all migrations
- for (const migration of migrations) {
- // run the migration
- await context.doInTenant(
- tenantId,
- async () => await runMigration(migration, options)
- )
- }
- }
- console.log("Migrations complete")
-}
diff --git a/packages/backend-core/src/migrations/tests/__snapshots__/migrations.spec.ts.snap b/packages/backend-core/src/migrations/tests/__snapshots__/migrations.spec.ts.snap
deleted file mode 100644
index 377900b5d5..0000000000
--- a/packages/backend-core/src/migrations/tests/__snapshots__/migrations.spec.ts.snap
+++ /dev/null
@@ -1,11 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`migrations should match snapshot 1`] = `
-{
- "_id": "migrations",
- "_rev": "1-2f64479842a0513aa8b97f356b0b9127",
- "createdAt": "2020-01-01T00:00:00.000Z",
- "test": 1577836800000,
- "updatedAt": "2020-01-01T00:00:00.000Z",
-}
-`;
diff --git a/packages/backend-core/src/migrations/tests/migrations.spec.ts b/packages/backend-core/src/migrations/tests/migrations.spec.ts
deleted file mode 100644
index af2eb33cf5..0000000000
--- a/packages/backend-core/src/migrations/tests/migrations.spec.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-import { testEnv, DBTestConfiguration } from "../../../tests/extra"
-import * as migrations from "../index"
-import * as context from "../../context"
-import { MigrationType } from "@budibase/types"
-
-testEnv.multiTenant()
-
-describe("migrations", () => {
- const config = new DBTestConfiguration()
-
- const migrationFunction = jest.fn()
-
- const MIGRATIONS = [
- {
- type: MigrationType.GLOBAL,
- name: "test" as any,
- fn: migrationFunction,
- },
- ]
-
- beforeEach(() => {
- config.newTenant()
- })
-
- afterEach(async () => {
- jest.clearAllMocks()
- })
-
- const migrate = () => {
- return migrations.runMigrations(MIGRATIONS, {
- tenantIds: [config.tenantId],
- })
- }
-
- it("should run a new migration", async () => {
- await config.doInTenant(async () => {
- await migrate()
- expect(migrationFunction).toHaveBeenCalled()
- const db = context.getGlobalDB()
- const doc = await migrations.getMigrationsDoc(db)
- expect(doc.test).toBeDefined()
- })
- })
-
- it("should match snapshot", async () => {
- await config.doInTenant(async () => {
- await migrate()
- const doc = await migrations.getMigrationsDoc(context.getGlobalDB())
- expect(doc).toMatchSnapshot()
- })
- })
-
- it("should skip a previously run migration", async () => {
- await config.doInTenant(async () => {
- const db = context.getGlobalDB()
- await migrate()
- const previousDoc = await migrations.getMigrationsDoc(db)
- await migrate()
- const currentDoc = await migrations.getMigrationsDoc(db)
- expect(migrationFunction).toHaveBeenCalledTimes(1)
- expect(currentDoc.test).toBe(previousDoc.test)
- })
- })
-})
diff --git a/packages/bbui/src/Icon/Icon.svelte b/packages/bbui/src/Icon/Icon.svelte
index c22bb3f918..7438fab5fd 100644
--- a/packages/bbui/src/Icon/Icon.svelte
+++ b/packages/bbui/src/Icon/Icon.svelte
@@ -1,23 +1,23 @@
-
("sdk")
- const component = getContext("component")
+ const { styleable, Provider, ActionTypes, API } = getContext("sdk")
+ const component = getContext("component")
let interval: ReturnType
let queryExtensions: Record = {}
diff --git a/packages/client/src/components/app/blocks/form/FormBlock.svelte b/packages/client/src/components/app/blocks/form/FormBlock.svelte
index 656aa5933b..3f44aee1d7 100644
--- a/packages/client/src/components/app/blocks/form/FormBlock.svelte
+++ b/packages/client/src/components/app/blocks/form/FormBlock.svelte
@@ -1,37 +1,43 @@
-
+