diff --git a/examples/nextjs-api-sales/package.json b/examples/nextjs-api-sales/package.json index 1050c6b75e..d50e7d4eb5 100644 --- a/examples/nextjs-api-sales/package.json +++ b/examples/nextjs-api-sales/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "bulma": "^0.9.3", - "next": "14.2.15", + "next": "14.2.21", "node-fetch": "^3.2.10", "sass": "^1.52.3", "react": "17.0.2", diff --git a/examples/nextjs-api-sales/yarn.lock b/examples/nextjs-api-sales/yarn.lock index b595a148bf..a10fccb2e9 100644 --- a/examples/nextjs-api-sales/yarn.lock +++ b/examples/nextjs-api-sales/yarn.lock @@ -46,10 +46,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@next/env@14.2.15": - version "14.2.15" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.15.tgz#06d984e37e670d93ddd6790af1844aeb935f332f" - integrity sha512-S1qaj25Wru2dUpcIZMjxeMVSwkt8BK4dmWHHiBuRstcIyOsMapqT4A4jSB6onvqeygkSSmOkyny9VVx8JIGamQ== +"@next/env@14.2.21": + version "14.2.21" + resolved "https://registry.yarnpkg.com/@next/env/-/env-14.2.21.tgz#09ff0813d29c596397e141205d4f5fd5c236bdd0" + integrity sha512-lXcwcJd5oR01tggjWJ6SrNNYFGuOOMB9c251wUNkjCpkoXOPkDeF/15c3mnVlBqrW4JJXb2kVxDFhC4GduJt2A== "@next/eslint-plugin-next@12.1.0": version "12.1.0" @@ -58,50 +58,50 @@ dependencies: glob "7.1.7" -"@next/swc-darwin-arm64@14.2.15": - version "14.2.15" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.15.tgz#6386d585f39a1c490c60b72b1f76612ba4434347" - integrity sha512-Rvh7KU9hOUBnZ9TJ28n2Oa7dD9cvDBKua9IKx7cfQQ0GoYUwg9ig31O2oMwH3wm+pE3IkAQ67ZobPfEgurPZIA== +"@next/swc-darwin-arm64@14.2.21": + version "14.2.21" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.21.tgz#32a31992aace1440981df9cf7cb3af7845d94fec" + integrity sha512-HwEjcKsXtvszXz5q5Z7wCtrHeTTDSTgAbocz45PHMUjU3fBYInfvhR+ZhavDRUYLonm53aHZbB09QtJVJj8T7g== -"@next/swc-darwin-x64@14.2.15": - version "14.2.15" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.15.tgz#b7baeedc6a28f7545ad2bc55adbab25f7b45cb89" - integrity sha512-5TGyjFcf8ampZP3e+FyCax5zFVHi+Oe7sZyaKOngsqyaNEpOgkKB3sqmymkZfowy3ufGA/tUgDPPxpQx931lHg== +"@next/swc-darwin-x64@14.2.21": + version "14.2.21" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.21.tgz#5ab4b3f6685b6b52f810d0f5cf6e471480ddffdb" + integrity sha512-TSAA2ROgNzm4FhKbTbyJOBrsREOMVdDIltZ6aZiKvCi/v0UwFmwigBGeqXDA97TFMpR3LNNpw52CbVelkoQBxA== -"@next/swc-linux-arm64-gnu@14.2.15": - version "14.2.15" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.15.tgz#fa13c59d3222f70fb4cb3544ac750db2c6e34d02" - integrity sha512-3Bwv4oc08ONiQ3FiOLKT72Q+ndEMyLNsc/D3qnLMbtUYTQAmkx9E/JRu0DBpHxNddBmNT5hxz1mYBphJ3mfrrw== +"@next/swc-linux-arm64-gnu@14.2.21": + version "14.2.21" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.21.tgz#8a0e1fa887aef19ca218af2af515d0a5ee67ba3f" + integrity sha512-0Dqjn0pEUz3JG+AImpnMMW/m8hRtl1GQCNbO66V1yp6RswSTiKmnHf3pTX6xMdJYSemf3O4Q9ykiL0jymu0TuA== -"@next/swc-linux-arm64-musl@14.2.15": - version "14.2.15" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.15.tgz#30e45b71831d9a6d6d18d7ac7d611a8d646a17f9" - integrity sha512-k5xf/tg1FBv/M4CMd8S+JL3uV9BnnRmoe7F+GWC3DxkTCD9aewFRH1s5rJ1zkzDa+Do4zyN8qD0N8c84Hu96FQ== +"@next/swc-linux-arm64-musl@14.2.21": + version "14.2.21" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.21.tgz#ddad844406b42fa8965fe11250abc85c1fe0fd05" + integrity sha512-Ggfw5qnMXldscVntwnjfaQs5GbBbjioV4B4loP+bjqNEb42fzZlAaK+ldL0jm2CTJga9LynBMhekNfV8W4+HBw== -"@next/swc-linux-x64-gnu@14.2.15": - version "14.2.15" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.15.tgz#5065db17fc86f935ad117483f21f812dc1b39254" - integrity sha512-kE6q38hbrRbKEkkVn62reLXhThLRh6/TvgSP56GkFNhU22TbIrQDEMrO7j0IcQHcew2wfykq8lZyHFabz0oBrA== +"@next/swc-linux-x64-gnu@14.2.21": + version "14.2.21" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.21.tgz#db55fd666f9ba27718f65caa54b622a912cdd16b" + integrity sha512-uokj0lubN1WoSa5KKdThVPRffGyiWlm/vCc/cMkWOQHw69Qt0X1o3b2PyLLx8ANqlefILZh1EdfLRz9gVpG6tg== -"@next/swc-linux-x64-musl@14.2.15": - version "14.2.15" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.15.tgz#3c4a4568d8be7373a820f7576cf33388b5dab47e" - integrity sha512-PZ5YE9ouy/IdO7QVJeIcyLn/Rc4ml9M2G4y3kCM9MNf1YKvFY4heg3pVa/jQbMro+tP6yc4G2o9LjAz1zxD7tQ== +"@next/swc-linux-x64-musl@14.2.21": + version "14.2.21" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.21.tgz#dddb850353624efcd58c4c4e30ad8a1aab379642" + integrity sha512-iAEBPzWNbciah4+0yI4s7Pce6BIoxTQ0AGCkxn/UBuzJFkYyJt71MadYQkjPqCQCJAFQ26sYh7MOKdU+VQFgPg== -"@next/swc-win32-arm64-msvc@14.2.15": - version "14.2.15" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.15.tgz#fb812cc4ca0042868e32a6a021da91943bb08b98" - integrity sha512-2raR16703kBvYEQD9HNLyb0/394yfqzmIeyp2nDzcPV4yPjqNUG3ohX6jX00WryXz6s1FXpVhsCo3i+g4RUX+g== +"@next/swc-win32-arm64-msvc@14.2.21": + version "14.2.21" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.21.tgz#290012ee57b196d3d2d04853e6bf0179cae9fbaf" + integrity sha512-plykgB3vL2hB4Z32W3ktsfqyuyGAPxqwiyrAi2Mr8LlEUhNn9VgkiAl5hODSBpzIfWweX3er1f5uNpGDygfQVQ== -"@next/swc-win32-ia32-msvc@14.2.15": - version "14.2.15" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.15.tgz#ec26e6169354f8ced240c1427be7fd485c5df898" - integrity sha512-fyTE8cklgkyR1p03kJa5zXEaZ9El+kDNM5A+66+8evQS5e/6v0Gk28LqA0Jet8gKSOyP+OTm/tJHzMlGdQerdQ== +"@next/swc-win32-ia32-msvc@14.2.21": + version "14.2.21" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.21.tgz#c959135a78cab18cca588d11d1e33bcf199590d4" + integrity sha512-w5bacz4Vxqrh06BjWgua3Yf7EMDb8iMcVhNrNx8KnJXt8t+Uu0Zg4JHLDL/T7DkTCEEfKXO/Er1fcfWxn2xfPA== -"@next/swc-win32-x64-msvc@14.2.15": - version "14.2.15" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.15.tgz#18d68697002b282006771f8d92d79ade9efd35c4" - integrity sha512-SzqGbsLsP9OwKNUG9nekShTwhj6JSB9ZLMWQ8g1gG6hdE5gQLncbnbymrwy2yVmH9nikSLYRYxYMFu78Ggp7/g== +"@next/swc-win32-x64-msvc@14.2.21": + version "14.2.21" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.21.tgz#21ff892286555b90538a7d1b505ea21a005d6ead" + integrity sha512-sT6+llIkzpsexGYZq8cjjthRyRGe5cJVhqh12FmlbxHqna6zsDDK8UNaV7g41T6atFHCJUPeLb3uyAwrBwy0NA== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -1253,12 +1253,12 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -next@14.2.15: - version "14.2.15" - resolved "https://registry.yarnpkg.com/next/-/next-14.2.15.tgz#348e5603e22649775d19c785c09a89c9acb5189a" - integrity sha512-h9ctmOokpoDphRvMGnwOJAedT6zKhwqyZML9mDtspgf4Rh3Pn7UTYKqePNoDvhsWBAO5GoPNYshnAUGIazVGmw== +next@14.2.21: + version "14.2.21" + resolved "https://registry.yarnpkg.com/next/-/next-14.2.21.tgz#f6da9e2abba1a0e4ca7a5273825daf06632554ba" + integrity sha512-rZmLwucLHr3/zfDMYbJXbw0ZeoBpirxkXuvsJbk7UPorvPYZhP7vq7aHbKnU7dQNCYIimRrbB2pp3xmf+wsYUg== dependencies: - "@next/env" "14.2.15" + "@next/env" "14.2.21" "@swc/helpers" "0.5.5" busboy "1.6.0" caniuse-lite "^1.0.30001579" @@ -1266,15 +1266,15 @@ next@14.2.15: postcss "8.4.31" styled-jsx "5.1.1" optionalDependencies: - "@next/swc-darwin-arm64" "14.2.15" - "@next/swc-darwin-x64" "14.2.15" - "@next/swc-linux-arm64-gnu" "14.2.15" - "@next/swc-linux-arm64-musl" "14.2.15" - "@next/swc-linux-x64-gnu" "14.2.15" - "@next/swc-linux-x64-musl" "14.2.15" - "@next/swc-win32-arm64-msvc" "14.2.15" - "@next/swc-win32-ia32-msvc" "14.2.15" - "@next/swc-win32-x64-msvc" "14.2.15" + "@next/swc-darwin-arm64" "14.2.21" + "@next/swc-darwin-x64" "14.2.21" + "@next/swc-linux-arm64-gnu" "14.2.21" + "@next/swc-linux-arm64-musl" "14.2.21" + "@next/swc-linux-x64-gnu" "14.2.21" + "@next/swc-linux-x64-musl" "14.2.21" + "@next/swc-win32-arm64-msvc" "14.2.21" + "@next/swc-win32-ia32-msvc" "14.2.21" + "@next/swc-win32-x64-msvc" "14.2.21" node-domexception@^1.0.0: version "1.0.0" diff --git a/lerna.json b/lerna.json index 5e0bc09825..dde9cf03a0 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "version": "3.2.29", + "version": "3.2.32", "npmClient": "yarn", "concurrency": 20, "command": { diff --git a/packages/backend-core/src/context/mainContext.ts b/packages/backend-core/src/context/mainContext.ts index 64ba240fa5..e5f20882d3 100644 --- a/packages/backend-core/src/context/mainContext.ts +++ b/packages/backend-core/src/context/mainContext.ts @@ -385,17 +385,17 @@ export function getCurrentContext(): ContextMap | undefined { } } -export function getFeatureFlags>( +export function getFeatureFlags( key: string -): T | undefined { +): Record | undefined { const context = getCurrentContext() if (!context) { return undefined } - return context.featureFlagCache?.[key] as T + return context.featureFlagCache?.[key] } -export function setFeatureFlags(key: string, value: Record) { +export function setFeatureFlags(key: string, value: Record) { const context = getCurrentContext() if (!context) { return diff --git a/packages/backend-core/src/context/types.ts b/packages/backend-core/src/context/types.ts index 5549a47ff7..23598b951e 100644 --- a/packages/backend-core/src/context/types.ts +++ b/packages/backend-core/src/context/types.ts @@ -20,7 +20,7 @@ export type ContextMap = { clients: Record } featureFlagCache?: { - [key: string]: Record + [key: string]: Record } viewToTableCache?: Record } diff --git a/packages/backend-core/src/features/features.ts b/packages/backend-core/src/features/features.ts index 650254fcb2..772bcf5860 100644 --- a/packages/backend-core/src/features/features.ts +++ b/packages/backend-core/src/features/features.ts @@ -2,9 +2,10 @@ import env from "../environment" import * as crypto from "crypto" import * as context from "../context" import { PostHog, PostHogOptions } from "posthog-node" -import { FeatureFlag } from "@budibase/types" import tracer from "dd-trace" import { Duration } from "../utils" +import { cloneDeep } from "lodash" +import { FeatureFlagDefaults } from "@budibase/types" let posthog: PostHog | undefined export function init(opts?: PostHogOptions) { @@ -30,74 +31,6 @@ export function shutdown() { posthog?.shutdown() } -export abstract class Flag { - static boolean(defaultValue: boolean): Flag { - return new BooleanFlag(defaultValue) - } - - static string(defaultValue: string): Flag { - return new StringFlag(defaultValue) - } - - static number(defaultValue: number): Flag { - return new NumberFlag(defaultValue) - } - - protected constructor(public defaultValue: T) {} - - abstract parse(value: any): T -} - -type UnwrapFlag = F extends Flag ? U : never - -export type FlagValues = { - [K in keyof T]: UnwrapFlag -} - -type KeysOfType = { - [K in keyof T]: T[K] extends Flag ? K : never -}[keyof T] - -class BooleanFlag extends Flag { - parse(value: any) { - if (typeof value === "string") { - return ["true", "t", "1"].includes(value.toLowerCase()) - } - - if (typeof value === "boolean") { - return value - } - - throw new Error(`could not parse value "${value}" as boolean`) - } -} - -class StringFlag extends Flag { - parse(value: any) { - if (typeof value === "string") { - return value - } - throw new Error(`could not parse value "${value}" as string`) - } -} - -class NumberFlag extends Flag { - parse(value: any) { - if (typeof value === "number") { - return value - } - - if (typeof value === "string") { - const parsed = parseFloat(value) - if (!isNaN(parsed)) { - return parsed - } - } - - throw new Error(`could not parse value "${value}" as number`) - } -} - export interface EnvFlagEntry { tenantId: string key: string @@ -120,7 +53,7 @@ export function parseEnvFlags(flags: string): EnvFlagEntry[] { return result } -export class FlagSet, T extends { [key: string]: V }> { +export class FlagSet { // This is used to safely cache flags sets in the current request context. // Because multiple sets could theoretically exist, we don't want the cache of // one to leak into another. @@ -130,34 +63,25 @@ export class FlagSet, T extends { [key: string]: V }> { this.setId = crypto.randomUUID() } - defaults(): FlagValues { - return Object.keys(this.flagSchema).reduce((acc, key) => { - const typedKey = key as keyof T - acc[typedKey] = this.flagSchema[key].defaultValue - return acc - }, {} as FlagValues) + defaults(): T { + return cloneDeep(this.flagSchema) } isFlagName(name: string | number | symbol): name is keyof T { return this.flagSchema[name as keyof T] !== undefined } - async get(key: K): Promise[K]> { + async isEnabled(key: K): Promise { const flags = await this.fetch() return flags[key] } - async isEnabled>(key: K): Promise { - const flags = await this.fetch() - return flags[key] - } - - async fetch(): Promise> { + async fetch(): Promise { return await tracer.trace("features.fetch", async span => { - const cachedFlags = context.getFeatureFlags>(this.setId) + const cachedFlags = context.getFeatureFlags(this.setId) if (cachedFlags) { span?.addTags({ fromCache: true }) - return cachedFlags + return cachedFlags as T } const tags: Record = {} @@ -189,7 +113,7 @@ export class FlagSet, T extends { [key: string]: V }> { // @ts-expect-error - TS does not like you writing into a generic type, // but we know that it's okay in this case because it's just an object. - flagValues[key as keyof FlagValues] = value + flagValues[key as keyof T] = value tags[`flags.${key}.source`] = "environment" } @@ -217,11 +141,11 @@ export class FlagSet, T extends { [key: string]: V }> { tags[`readFromPostHog`] = true const personProperties: Record = { tenantId } - const posthogFlags = await posthog.getAllFlagsAndPayloads(userId, { + const posthogFlags = await posthog.getAllFlags(userId, { personProperties, }) - for (const [name, value] of Object.entries(posthogFlags.featureFlags)) { + for (const [name, value] of Object.entries(posthogFlags)) { if (!this.isFlagName(name)) { // We don't want an unexpected PostHog flag to break the app, so we // just log it and continue. @@ -229,19 +153,20 @@ export class FlagSet, T extends { [key: string]: V }> { continue } + if (typeof value !== "boolean") { + console.warn(`Invalid value for posthog flag "${name}": ${value}`) + continue + } + if (flagValues[name] === true || specificallySetFalse.has(name)) { // If the flag is already set to through environment variables, we // don't want to override it back to false here. continue } - const payload = posthogFlags.featureFlagPayloads?.[name] - const flag = this.flagSchema[name] try { - // @ts-expect-error - TS does not like you writing into a generic - // type, but we know that it's okay in this case because it's just - // an object. - flagValues[name] = flag.parse(payload || value) + // @ts-expect-error - TS does not like you writing into a generic type. + flagValues[name] = value tags[`flags.${name}.source`] = "posthog" } catch (err) { // We don't want an invalid PostHog flag to break the app, so we just @@ -262,18 +187,12 @@ export class FlagSet, T extends { [key: string]: V }> { } } -// This is the primary source of truth for feature flags. If you want to add a -// new flag, add it here and use the `fetch` and `get` functions to access it. -// All of the machinery in this file is to make sure that flags have their -// default values set correctly and their types flow through the system. -const flagsConfig: Record> = { - [FeatureFlag.DEFAULT_VALUES]: Flag.boolean(true), - [FeatureFlag.AUTOMATION_BRANCHING]: Flag.boolean(true), - [FeatureFlag.AI_CUSTOM_CONFIGS]: Flag.boolean(true), - [FeatureFlag.BUDIBASE_AI]: Flag.boolean(true), - [FeatureFlag.USE_ZOD_VALIDATOR]: Flag.boolean(env.isDev()), -} -export const flags = new FlagSet(flagsConfig) +export const flags = new FlagSet(FeatureFlagDefaults) -type UnwrapPromise = T extends Promise ? U : T -export type FeatureFlags = UnwrapPromise> +export async function isEnabled(flag: keyof typeof FeatureFlagDefaults) { + return await flags.isEnabled(flag) +} + +export async function all() { + return await flags.fetch() +} diff --git a/packages/backend-core/src/features/tests/features.spec.ts b/packages/backend-core/src/features/tests/features.spec.ts index ced874f4af..f918347eea 100644 --- a/packages/backend-core/src/features/tests/features.spec.ts +++ b/packages/backend-core/src/features/tests/features.spec.ts @@ -1,5 +1,5 @@ import { IdentityContext, IdentityType } from "@budibase/types" -import { Flag, FlagSet, FlagValues, init, shutdown } from "../" +import { FlagSet, init, shutdown } from "../" import * as context from "../../context" import environment, { withEnv } from "../../environment" import nodeFetch from "node-fetch" @@ -7,10 +7,8 @@ import nock from "nock" import * as crypto from "crypto" const schema = { - TEST_BOOLEAN: Flag.boolean(false), - TEST_STRING: Flag.string("default value"), - TEST_NUMBER: Flag.number(0), - TEST_BOOLEAN_DEFAULT_TRUE: Flag.boolean(true), + TEST_BOOLEAN: false, + TEST_BOOLEAN_DEFAULT_TRUE: true, } const flags = new FlagSet(schema) @@ -19,7 +17,7 @@ interface TestCase { identity?: Partial environmentFlags?: string posthogFlags?: PostHogFlags - expected?: Partial> + expected?: Partial errorMessage?: string | RegExp } @@ -83,22 +81,6 @@ describe("feature flags", () => { }, expected: { TEST_BOOLEAN: true }, }, - { - it: "should be able to read string flags from PostHog", - posthogFlags: { - featureFlags: { TEST_STRING: true }, - featureFlagPayloads: { TEST_STRING: "test" }, - }, - expected: { TEST_STRING: "test" }, - }, - { - it: "should be able to read numeric flags from PostHog", - posthogFlags: { - featureFlags: { TEST_NUMBER: true }, - featureFlagPayloads: { TEST_NUMBER: "123" }, - }, - expected: { TEST_NUMBER: 123 }, - }, { it: "should not be able to override a negative environment flag from PostHog", environmentFlags: "default:!TEST_BOOLEAN", @@ -177,7 +159,7 @@ describe("feature flags", () => { expect(values).toMatchObject(expected) for (const [key, expectedValue] of Object.entries(expected)) { - const value = await flags.get(key as keyof typeof schema) + const value = await flags.isEnabled(key as keyof typeof schema) expect(value).toBe(expectedValue) } } else { diff --git a/packages/backend-core/src/features/tests/utils.ts b/packages/backend-core/src/features/tests/utils.ts index cc633c083d..b9281b7f19 100644 --- a/packages/backend-core/src/features/tests/utils.ts +++ b/packages/backend-core/src/features/tests/utils.ts @@ -1,5 +1,6 @@ -import { FeatureFlags, parseEnvFlags } from ".." +import { FeatureFlags } from "@budibase/types" import { setEnv } from "../../environment" +import { parseEnvFlags } from "../features" function getCurrentFlags(): Record> { const result: Record> = {} diff --git a/packages/bbui/src/Form/Core/DatePicker/NumberInput.svelte b/packages/bbui/src/Form/Core/DatePicker/NumberInput.svelte index 6c06ce4e79..84b55c403f 100644 --- a/packages/bbui/src/Form/Core/DatePicker/NumberInput.svelte +++ b/packages/bbui/src/Form/Core/DatePicker/NumberInput.svelte @@ -51,6 +51,7 @@ } input.hide-arrows { -moz-appearance: textfield; + appearance: textfield; } input[type="time"]::-webkit-calendar-picker-indicator { display: none; diff --git a/packages/bbui/src/Form/Core/Slider.svelte b/packages/bbui/src/Form/Core/Slider.svelte index 1a601d0185..0fcadd8bad 100644 --- a/packages/bbui/src/Form/Core/Slider.svelte +++ b/packages/bbui/src/Form/Core/Slider.svelte @@ -39,6 +39,7 @@ padding: 0; margin: 0; -webkit-appearance: none; + appearance: none; background: transparent; } input::-webkit-slider-thumb { diff --git a/packages/bbui/src/ProgressCircle/ProgressCircle.svelte b/packages/bbui/src/ProgressCircle/ProgressCircle.svelte index 37a1e07d73..112fa739c7 100644 --- a/packages/bbui/src/ProgressCircle/ProgressCircle.svelte +++ b/packages/bbui/src/ProgressCircle/ProgressCircle.svelte @@ -37,7 +37,7 @@ } } - export let overBackground + export let overBackground = false diff --git a/packages/bbui/src/Tabs/Tabs.svelte b/packages/bbui/src/Tabs/Tabs.svelte index c94b396398..3955145ad1 100644 --- a/packages/bbui/src/Tabs/Tabs.svelte +++ b/packages/bbui/src/Tabs/Tabs.svelte @@ -124,8 +124,6 @@ .spectrum-Tabs-selectionIndicator.emphasized { background-color: var(--spectrum-global-color-blue-400); } - .spectrum-Tabs--horizontal .spectrum-Tabs-selectionIndicator { - } .noHorizPadding { padding: 0; } diff --git a/packages/bbui/src/Tooltip/AbsTooltip.svelte b/packages/bbui/src/Tooltip/AbsTooltip.svelte index 4d2399aaf8..b85f4e1c03 100644 --- a/packages/bbui/src/Tooltip/AbsTooltip.svelte +++ b/packages/bbui/src/Tooltip/AbsTooltip.svelte @@ -134,6 +134,7 @@ .spectrum-Tooltip-label { display: -webkit-box; -webkit-line-clamp: 3; + line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; font-size: 12px; diff --git a/packages/builder/package.json b/packages/builder/package.json index f2a829d5a9..71d1c32008 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -94,6 +94,7 @@ "@sveltejs/vite-plugin-svelte": "1.4.0", "@testing-library/jest-dom": "6.4.2", "@testing-library/svelte": "^4.1.0", + "@types/shortid": "^2.2.0", "babel-jest": "^29.6.2", "identity-obj-proxy": "^3.0.0", "jest": "29.7.0", diff --git a/packages/builder/src/App.svelte b/packages/builder/src/App.svelte index f31f45bb84..866a28a4e6 100644 --- a/packages/builder/src/App.svelte +++ b/packages/builder/src/App.svelte @@ -3,7 +3,7 @@ import { routes } from "../.routify/routes" import { NotificationDisplay, BannerDisplay } from "@budibase/bbui" import { parse, stringify } from "qs" - import LicensingOverlays from "components/portal/licensing/LicensingOverlays.svelte" + import LicensingOverlays from "@/components/portal/licensing/LicensingOverlays.svelte" const queryHandler = { parse, stringify } diff --git a/packages/builder/src/analytics/index.js b/packages/builder/src/analytics/index.js index c9887aebc3..aa83f3c7ab 100644 --- a/packages/builder/src/analytics/index.js +++ b/packages/builder/src/analytics/index.js @@ -1,4 +1,4 @@ -import { API } from "api" +import { API } from "@/api" import PosthogClient from "./PosthogClient" import { Events, EventSource } from "./constants" diff --git a/packages/builder/src/api.ts b/packages/builder/src/api.ts index 907354499f..e9e8b39e28 100644 --- a/packages/builder/src/api.ts +++ b/packages/builder/src/api.ts @@ -3,7 +3,7 @@ import { CookieUtils, Constants, } from "@budibase/frontend-core" -import { appStore } from "stores/builder" +import { appStore } from "@/stores/builder" import { get } from "svelte/store" import { auth, navigation } from "./stores/portal" diff --git a/packages/builder/src/components/ContextMenu.svelte b/packages/builder/src/components/ContextMenu.svelte index 37aacf06ed..3ff2a2b084 100644 --- a/packages/builder/src/components/ContextMenu.svelte +++ b/packages/builder/src/components/ContextMenu.svelte @@ -1,5 +1,5 @@ diff --git a/packages/builder/src/components/automation/AutomationBuilder/DraggableCanvas.svelte b/packages/builder/src/components/automation/AutomationBuilder/DraggableCanvas.svelte index b1a4f37f46..0b68d8e4b3 100644 --- a/packages/builder/src/components/automation/AutomationBuilder/DraggableCanvas.svelte +++ b/packages/builder/src/components/automation/AutomationBuilder/DraggableCanvas.svelte @@ -9,7 +9,7 @@ } from "svelte" import Logo from "assets/bb-emblem.svg?raw" import { Utils, memo } from "@budibase/frontend-core" - import { selectedAutomation, automationStore } from "stores/builder" + import { selectedAutomation, automationStore } from "@/stores/builder" // CSS classes that, on mouse down, will trigger the view drag behaviour export let draggableClasses = [] diff --git a/packages/builder/src/components/automation/AutomationBuilder/FlowChart/ActionModal.svelte b/packages/builder/src/components/automation/AutomationBuilder/FlowChart/ActionModal.svelte index 88201aa225..706c196fff 100644 --- a/packages/builder/src/components/automation/AutomationBuilder/FlowChart/ActionModal.svelte +++ b/packages/builder/src/components/automation/AutomationBuilder/FlowChart/ActionModal.svelte @@ -10,10 +10,10 @@ Tag, } from "@budibase/bbui" import { AutomationActionStepId } from "@budibase/types" - import { automationStore, selectedAutomation } from "stores/builder" - import { admin, licensing } from "stores/portal" + import { automationStore, selectedAutomation } from "@/stores/builder" + import { admin, licensing } from "@/stores/portal" import { externalActions } from "./ExternalActions" - import { TriggerStepID, ActionStepID } from "constants/backend/automations" + import { TriggerStepID, ActionStepID } from "@/constants/backend/automations" export let block export let modal diff --git a/packages/builder/src/components/automation/AutomationBuilder/FlowChart/AutomationBlockTagline.svelte b/packages/builder/src/components/automation/AutomationBuilder/FlowChart/AutomationBlockTagline.svelte index 8732623dcf..0a8ce505b8 100644 --- a/packages/builder/src/components/automation/AutomationBuilder/FlowChart/AutomationBlockTagline.svelte +++ b/packages/builder/src/components/automation/AutomationBuilder/FlowChart/AutomationBlockTagline.svelte @@ -1,7 +1,7 @@ diff --git a/packages/builder/src/components/automation/AutomationPanel/AutomationNavItem.svelte b/packages/builder/src/components/automation/AutomationPanel/AutomationNavItem.svelte index fa89ab9393..c44ba8a93a 100644 --- a/packages/builder/src/components/automation/AutomationPanel/AutomationNavItem.svelte +++ b/packages/builder/src/components/automation/AutomationPanel/AutomationNavItem.svelte @@ -4,12 +4,12 @@ userSelectedResourceMap, automationStore, contextMenuStore, - } from "stores/builder" + } from "@/stores/builder" import { notifications, Icon } from "@budibase/bbui" import { sdk } from "@budibase/shared-core" - import ConfirmDialog from "components/common/ConfirmDialog.svelte" - import UpdateAutomationModal from "components/automation/AutomationPanel/UpdateAutomationModal.svelte" - import NavItem from "components/common/NavItem.svelte" + import ConfirmDialog from "@/components/common/ConfirmDialog.svelte" + import UpdateAutomationModal from "@/components/automation/AutomationPanel/UpdateAutomationModal.svelte" + import NavItem from "@/components/common/NavItem.svelte" export let automation export let icon diff --git a/packages/builder/src/components/automation/AutomationPanel/AutomationPanel.svelte b/packages/builder/src/components/automation/AutomationPanel/AutomationPanel.svelte index a26efdf243..f84130f5e7 100644 --- a/packages/builder/src/components/automation/AutomationPanel/AutomationPanel.svelte +++ b/packages/builder/src/components/automation/AutomationPanel/AutomationPanel.svelte @@ -1,11 +1,11 @@ import BindingPanel from "./BindingPanel.svelte" - import { snippets } from "stores/builder" + import { snippets } from "@/stores/builder" export let bindings = [] export let value = "" diff --git a/packages/builder/src/components/common/bindings/SnippetDrawer.svelte b/packages/builder/src/components/common/bindings/SnippetDrawer.svelte index d8e56b059a..90ca6ffd9f 100644 --- a/packages/builder/src/components/common/bindings/SnippetDrawer.svelte +++ b/packages/builder/src/components/common/bindings/SnippetDrawer.svelte @@ -8,11 +8,11 @@ TooltipType, notifications, } from "@budibase/bbui" - import BindingPanel from "components/common/bindings/BindingPanel.svelte" + import BindingPanel from "@/components/common/bindings/BindingPanel.svelte" import { decodeJSBinding, encodeJSBinding } from "@budibase/string-templates" - import { snippets } from "stores/builder" - import { getSequentialName } from "helpers/duplicate" - import ConfirmDialog from "components/common/ConfirmDialog.svelte" + import { snippets } from "@/stores/builder" + import { getSequentialName } from "@/helpers/duplicate" + import ConfirmDialog from "@/components/common/ConfirmDialog.svelte" import { ValidSnippetNameRegex } from "@budibase/shared-core" export let snippet diff --git a/packages/builder/src/components/common/bindings/SnippetSidePanel.svelte b/packages/builder/src/components/common/bindings/SnippetSidePanel.svelte index 2cc27b91cd..95f40005c0 100644 --- a/packages/builder/src/components/common/bindings/SnippetSidePanel.svelte +++ b/packages/builder/src/components/common/bindings/SnippetSidePanel.svelte @@ -9,11 +9,11 @@ Body, Button, } from "@budibase/bbui" - import CodeEditor from "components/common/CodeEditor/CodeEditor.svelte" - import { EditorModes } from "components/common/CodeEditor" + import CodeEditor from "@/components/common/CodeEditor/CodeEditor.svelte" + import { EditorModes } from "@/components/common/CodeEditor" import SnippetDrawer from "./SnippetDrawer.svelte" - import { licensing } from "stores/portal" - import UpgradeButton from "pages/builder/portal/_components/UpgradeButton.svelte" + import { licensing } from "@/stores/portal" + import UpgradeButton from "@/pages/builder/portal/_components/UpgradeButton.svelte" export let addSnippet export let snippets diff --git a/packages/builder/src/components/common/bindings/utils.js b/packages/builder/src/components/common/bindings/utils.js index 77e4a1dfb1..9fc147a420 100644 --- a/packages/builder/src/components/common/bindings/utils.js +++ b/packages/builder/src/components/common/bindings/utils.js @@ -1,5 +1,5 @@ import { decodeJSBinding } from "@budibase/string-templates" -import { hbInsert, jsInsert } from "components/common/CodeEditor" +import { hbInsert, jsInsert } from "@/components/common/CodeEditor" export const BindingType = { READABLE: "readableBinding", diff --git a/packages/builder/src/components/common/renderers/CapitaliseRenderer.svelte b/packages/builder/src/components/common/renderers/CapitaliseRenderer.svelte index b5155fc044..bc019a3c71 100644 --- a/packages/builder/src/components/common/renderers/CapitaliseRenderer.svelte +++ b/packages/builder/src/components/common/renderers/CapitaliseRenderer.svelte @@ -1,5 +1,5 @@ diff --git a/packages/builder/src/components/common/users/PasswordRepeatInput.svelte b/packages/builder/src/components/common/users/PasswordRepeatInput.svelte index bd7f5b50c7..46597a57c8 100644 --- a/packages/builder/src/components/common/users/PasswordRepeatInput.svelte +++ b/packages/builder/src/components/common/users/PasswordRepeatInput.svelte @@ -1,7 +1,10 @@ diff --git a/packages/builder/src/components/deploy/AppActions.svelte b/packages/builder/src/components/deploy/AppActions.svelte index 9ba46832f4..f57563b2ab 100644 --- a/packages/builder/src/components/deploy/AppActions.svelte +++ b/packages/builder/src/components/deploy/AppActions.svelte @@ -11,13 +11,13 @@ StatusLight, AbsTooltip, } from "@budibase/bbui" - import RevertModal from "components/deploy/RevertModal.svelte" - import VersionModal from "components/deploy/VersionModal.svelte" + import RevertModal from "@/components/deploy/RevertModal.svelte" + import VersionModal from "@/components/deploy/VersionModal.svelte" import { processStringSync } from "@budibase/string-templates" - import ConfirmDialog from "components/common/ConfirmDialog.svelte" - import analytics, { Events, EventSource } from "analytics" - import { API } from "api" - import { appsStore } from "stores/portal" + import ConfirmDialog from "@/components/common/ConfirmDialog.svelte" + import analytics, { Events, EventSource } from "@/analytics" + import { API } from "@/api" + import { appsStore } from "@/stores/portal" import { previewStore, builderStore, @@ -26,9 +26,9 @@ deploymentStore, sortedScreens, appPublished, - } from "stores/builder" - import TourWrap from "components/portal/onboarding/TourWrap.svelte" - import { TOUR_STEP_KEYS } from "components/portal/onboarding/tours.js" + } from "@/stores/builder" + import TourWrap from "@/components/portal/onboarding/TourWrap.svelte" + import { TOUR_STEP_KEYS } from "@/components/portal/onboarding/tours.js" import { goto } from "@roxi/routify" export let application diff --git a/packages/builder/src/components/deploy/CreateWebhookDeploymentModal.svelte b/packages/builder/src/components/deploy/CreateWebhookDeploymentModal.svelte index 899d1659e8..927d69f43c 100644 --- a/packages/builder/src/components/deploy/CreateWebhookDeploymentModal.svelte +++ b/packages/builder/src/components/deploy/CreateWebhookDeploymentModal.svelte @@ -1,9 +1,9 @@ diff --git a/packages/builder/src/components/design/settings/controls/ColumnEditor/CellDrawer.svelte b/packages/builder/src/components/design/settings/controls/ColumnEditor/CellDrawer.svelte index d2e0ddc1b0..13db369893 100644 --- a/packages/builder/src/components/design/settings/controls/ColumnEditor/CellDrawer.svelte +++ b/packages/builder/src/components/design/settings/controls/ColumnEditor/CellDrawer.svelte @@ -7,8 +7,8 @@ Layout, Label, } from "@budibase/bbui" - import { themeStore, previewStore } from "stores/builder" - import DrawerBindableInput from "components/common/bindings/DrawerBindableInput.svelte" + import { themeStore, previewStore } from "@/stores/builder" + import DrawerBindableInput from "@/components/common/bindings/DrawerBindableInput.svelte" export let column diff --git a/packages/builder/src/components/design/settings/controls/ColumnEditor/ColumnEditor.svelte b/packages/builder/src/components/design/settings/controls/ColumnEditor/ColumnEditor.svelte index 4a11211662..5e27b591f8 100644 --- a/packages/builder/src/components/design/settings/controls/ColumnEditor/ColumnEditor.svelte +++ b/packages/builder/src/components/design/settings/controls/ColumnEditor/ColumnEditor.svelte @@ -4,8 +4,11 @@ import { createEventDispatcher } from "svelte" import ColumnDrawer from "./ColumnDrawer.svelte" import { cloneDeep } from "lodash/fp" - import { getDatasourceForProvider, getSchemaForDatasource } from "dataBinding" - import { selectedScreen, tables } from "stores/builder" + import { + getDatasourceForProvider, + getSchemaForDatasource, + } from "@/dataBinding" + import { selectedScreen, tables } from "@/stores/builder" export let componentInstance export let value = [] diff --git a/packages/builder/src/components/design/settings/controls/DataProviderSelect.svelte b/packages/builder/src/components/design/settings/controls/DataProviderSelect.svelte index 2e74cac0f4..310a22e73e 100644 --- a/packages/builder/src/components/design/settings/controls/DataProviderSelect.svelte +++ b/packages/builder/src/components/design/settings/controls/DataProviderSelect.svelte @@ -1,8 +1,8 @@ diff --git a/packages/builder/src/components/start/AppContextMenuModals.svelte b/packages/builder/src/components/start/AppContextMenuModals.svelte index f4921c4312..186e0d8601 100644 --- a/packages/builder/src/components/start/AppContextMenuModals.svelte +++ b/packages/builder/src/components/start/AppContextMenuModals.svelte @@ -1,9 +1,9 @@ diff --git a/packages/builder/src/pages/builder/app/[application]/automation/_layout.svelte b/packages/builder/src/pages/builder/app/[application]/automation/_layout.svelte index a3887d951f..f0f7f9be20 100644 --- a/packages/builder/src/pages/builder/app/[application]/automation/_layout.svelte +++ b/packages/builder/src/pages/builder/app/[application]/automation/_layout.svelte @@ -1,17 +1,17 @@ diff --git a/packages/builder/src/pages/builder/app/[application]/data/table/[tableId]/[viewId]/_layout.svelte b/packages/builder/src/pages/builder/app/[application]/data/table/[tableId]/[viewId]/_layout.svelte index 9c1baa723e..4a12047c37 100644 --- a/packages/builder/src/pages/builder/app/[application]/data/table/[tableId]/[viewId]/_layout.svelte +++ b/packages/builder/src/pages/builder/app/[application]/data/table/[tableId]/[viewId]/_layout.svelte @@ -1,6 +1,6 @@
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte index 1e8868f03c..55a4dc4de4 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPreview.svelte @@ -12,11 +12,11 @@ hoverStore, componentTreeNodesStore, snippets, - } from "stores/builder" - import ConfirmDialog from "components/common/ConfirmDialog.svelte" + } from "@/stores/builder" + import ConfirmDialog from "@/components/common/ConfirmDialog.svelte" import { Layout, Heading, Body, Icon, notifications } from "@budibase/bbui" import ErrorSVG from "@budibase/frontend-core/assets/error.svg?raw" - import { findComponent, findComponentPath } from "helpers/components" + import { findComponent, findComponentPath } from "@/helpers/components" import { isActive, goto } from "@roxi/routify" import { ClientAppSkeleton } from "@budibase/frontend-core" import { getThemeClassNames, ThemeClassPrefix } from "@budibase/shared-core" diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ComponentList/ComponentKeyHandler.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ComponentList/ComponentKeyHandler.svelte index 6b27d79c15..ca8a08368a 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ComponentList/ComponentKeyHandler.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ComponentList/ComponentKeyHandler.svelte @@ -5,11 +5,11 @@ componentStore, selectedComponent, componentTreeNodesStore, - } from "stores/builder" - import { findComponent, getChildIdsForComponent } from "helpers/components" + } from "@/stores/builder" + import { findComponent, getChildIdsForComponent } from "@/helpers/components" import { goto, isActive } from "@roxi/routify" import { notifications } from "@budibase/bbui" - import ConfirmDialog from "components/common/ConfirmDialog.svelte" + import ConfirmDialog from "@/components/common/ConfirmDialog.svelte" let confirmDeleteDialog let confirmEjectDialog diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ComponentList/ComponentTree.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ComponentList/ComponentTree.svelte index 997fac6f10..a6f404d61b 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ComponentList/ComponentTree.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ComponentList/ComponentTree.svelte @@ -1,5 +1,5 @@ diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/LeftPanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/LeftPanel.svelte index ab078a3a5b..fa3ad5f6be 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/LeftPanel.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/LeftPanel.svelte @@ -1,7 +1,7 @@ diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ScreenList/RoleIndicator.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ScreenList/RoleIndicator.svelte index 09e29d806a..807c0208a2 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ScreenList/RoleIndicator.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/ScreenList/RoleIndicator.svelte @@ -1,7 +1,7 @@ diff --git a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/CreateScreenModal.svelte b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/CreateScreenModal.svelte index 47d7c765d6..edc502bbb4 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/CreateScreenModal.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/_components/NewScreen/CreateScreenModal.svelte @@ -1,5 +1,5 @@ diff --git a/packages/builder/src/pages/builder/app/[application]/settings/automations/_components/HistoryDetailsPanel.svelte b/packages/builder/src/pages/builder/app/[application]/settings/automations/_components/HistoryDetailsPanel.svelte index 6dc95b0a13..cfe912699f 100644 --- a/packages/builder/src/pages/builder/app/[application]/settings/automations/_components/HistoryDetailsPanel.svelte +++ b/packages/builder/src/pages/builder/app/[application]/settings/automations/_components/HistoryDetailsPanel.svelte @@ -8,10 +8,10 @@ Icon, } from "@budibase/bbui" import StatusRenderer from "./StatusRenderer.svelte" - import DateTimeRenderer from "components/common/renderers/DateTimeRenderer.svelte" - import TestDisplay from "components/automation/AutomationBuilder/TestDisplay.svelte" + import DateTimeRenderer from "@/components/common/renderers/DateTimeRenderer.svelte" + import TestDisplay from "@/components/automation/AutomationBuilder/TestDisplay.svelte" import { goto } from "@roxi/routify" - import { automationStore } from "stores/builder" + import { automationStore } from "@/stores/builder" export let history export let appId diff --git a/packages/builder/src/pages/builder/app/[application]/settings/automations/index.svelte b/packages/builder/src/pages/builder/app/[application]/settings/automations/index.svelte index dd332c92a9..71faa5762f 100644 --- a/packages/builder/src/pages/builder/app/[application]/settings/automations/index.svelte +++ b/packages/builder/src/pages/builder/app/[application]/settings/automations/index.svelte @@ -11,14 +11,14 @@ Toggle, notifications, } from "@budibase/bbui" - import DateTimeRenderer from "components/common/renderers/DateTimeRenderer.svelte" + import DateTimeRenderer from "@/components/common/renderers/DateTimeRenderer.svelte" import StatusRenderer from "./_components/StatusRenderer.svelte" import HistoryDetailsPanel from "./_components/HistoryDetailsPanel.svelte" - import { automationStore, appStore } from "stores/builder" - import { createPaginationStore } from "helpers/pagination" + import { automationStore, appStore } from "@/stores/builder" + import { createPaginationStore } from "@/helpers/pagination" import { getContext, onDestroy, onMount } from "svelte" import dayjs from "dayjs" - import { auth, licensing, admin, appsStore } from "stores/portal" + import { auth, licensing, admin, appsStore } from "@/stores/portal" import { Constants } from "@budibase/frontend-core" import Portal from "svelte-portal" diff --git a/packages/builder/src/pages/builder/app/[application]/settings/backups/_components/ActionsRenderer.svelte b/packages/builder/src/pages/builder/app/[application]/settings/backups/_components/ActionsRenderer.svelte index 3e88fb5541..93d6f0ae81 100644 --- a/packages/builder/src/pages/builder/app/[application]/settings/backups/_components/ActionsRenderer.svelte +++ b/packages/builder/src/pages/builder/app/[application]/settings/backups/_components/ActionsRenderer.svelte @@ -9,11 +9,11 @@ AbsTooltip, TooltipPosition, } from "@budibase/bbui" - import ConfirmDialog from "components/common/ConfirmDialog.svelte" + import ConfirmDialog from "@/components/common/ConfirmDialog.svelte" import CreateRestoreModal from "./CreateRestoreModal.svelte" import { createEventDispatcher } from "svelte" - import { isOnlyUser } from "stores/builder" - import { BackupType } from "constants/backend/backups" + import { isOnlyUser } from "@/stores/builder" + import { BackupType } from "@/constants/backend/backups" export let row diff --git a/packages/builder/src/pages/builder/app/[application]/settings/backups/_components/CreateRestoreModal.svelte b/packages/builder/src/pages/builder/app/[application]/settings/backups/_components/CreateRestoreModal.svelte index 62ef3e239d..09528be113 100644 --- a/packages/builder/src/pages/builder/app/[application]/settings/backups/_components/CreateRestoreModal.svelte +++ b/packages/builder/src/pages/builder/app/[application]/settings/backups/_components/CreateRestoreModal.svelte @@ -1,6 +1,6 @@ diff --git a/packages/builder/src/pages/builder/app/[application]/settings/version.svelte b/packages/builder/src/pages/builder/app/[application]/settings/version.svelte index bd592fa308..6a780555a9 100644 --- a/packages/builder/src/pages/builder/app/[application]/settings/version.svelte +++ b/packages/builder/src/pages/builder/app/[application]/settings/version.svelte @@ -1,7 +1,7 @@ {#if $auth.user} diff --git a/packages/builder/src/pages/builder/app/updating/[application].svelte b/packages/builder/src/pages/builder/app/updating/[application].svelte index 1f92861edf..34468e3c71 100644 --- a/packages/builder/src/pages/builder/app/updating/[application].svelte +++ b/packages/builder/src/pages/builder/app/updating/[application].svelte @@ -2,7 +2,7 @@ import { Updating } from "@budibase/frontend-core" import { redirect, params } from "@roxi/routify" - import { API } from "api" + import { API } from "@/api" async function isMigrationDone() { const response = await API.getMigrationStatus() diff --git a/packages/builder/src/pages/builder/apps/_layout.svelte b/packages/builder/src/pages/builder/apps/_layout.svelte index 17f70bf815..0b81999dfa 100644 --- a/packages/builder/src/pages/builder/apps/_layout.svelte +++ b/packages/builder/src/pages/builder/apps/_layout.svelte @@ -1,5 +1,5 @@ {#if $auth.user} diff --git a/packages/builder/src/pages/builder/apps/index.svelte b/packages/builder/src/pages/builder/apps/index.svelte index 632478748d..8bf96d0240 100644 --- a/packages/builder/src/pages/builder/apps/index.svelte +++ b/packages/builder/src/pages/builder/apps/index.svelte @@ -19,12 +19,12 @@ groups, licensing, enrichedApps, - } from "stores/portal" + } from "@/stores/portal" import { goto } from "@roxi/routify" - import { AppStatus } from "constants" - import { gradient } from "actions" - import ProfileModal from "components/settings/ProfileModal.svelte" - import ChangePasswordModal from "components/settings/ChangePasswordModal.svelte" + import { AppStatus } from "@/constants" + import { gradient } from "@/actions" + import ProfileModal from "@/components/settings/ProfileModal.svelte" + import ChangePasswordModal from "@/components/settings/ChangePasswordModal.svelte" import { processStringSync } from "@budibase/string-templates" import Spaceman from "assets/bb-space-man.svg" import Logo from "assets/bb-emblem.svg" diff --git a/packages/builder/src/pages/builder/auth/_components/GoogleButton.svelte b/packages/builder/src/pages/builder/auth/_components/GoogleButton.svelte index 812f744087..c27f08a8c3 100644 --- a/packages/builder/src/pages/builder/auth/_components/GoogleButton.svelte +++ b/packages/builder/src/pages/builder/auth/_components/GoogleButton.svelte @@ -1,7 +1,7 @@ diff --git a/packages/builder/src/pages/builder/portal/_components/MobileMenu.svelte b/packages/builder/src/pages/builder/portal/_components/MobileMenu.svelte index 9b4938e0d5..256199f3d7 100644 --- a/packages/builder/src/pages/builder/portal/_components/MobileMenu.svelte +++ b/packages/builder/src/pages/builder/portal/_components/MobileMenu.svelte @@ -1,12 +1,12 @@ diff --git a/packages/builder/src/pages/builder/portal/_components/UserDropdown.svelte b/packages/builder/src/pages/builder/portal/_components/UserDropdown.svelte index 9faae70aa9..d2a7be8237 100644 --- a/packages/builder/src/pages/builder/portal/_components/UserDropdown.svelte +++ b/packages/builder/src/pages/builder/portal/_components/UserDropdown.svelte @@ -1,11 +1,11 @@ diff --git a/packages/builder/src/pages/builder/portal/plugins/_components/AddPluginModal.svelte b/packages/builder/src/pages/builder/portal/plugins/_components/AddPluginModal.svelte index fe3b9056e9..ead80f1ded 100644 --- a/packages/builder/src/pages/builder/portal/plugins/_components/AddPluginModal.svelte +++ b/packages/builder/src/pages/builder/portal/plugins/_components/AddPluginModal.svelte @@ -8,9 +8,9 @@ Body, notifications, } from "@budibase/bbui" - import KeyValueBuilder from "components/integration/KeyValueBuilder.svelte" - import { plugins } from "stores/portal" - import { PluginSource } from "constants" + import KeyValueBuilder from "@/components/integration/KeyValueBuilder.svelte" + import { plugins } from "@/stores/portal" + import { PluginSource } from "@/constants" function opt(name, optional) { if (optional) { diff --git a/packages/builder/src/pages/builder/portal/plugins/_components/DeletePluginModal.svelte b/packages/builder/src/pages/builder/portal/plugins/_components/DeletePluginModal.svelte index 1782b44f2b..b41776dcfe 100644 --- a/packages/builder/src/pages/builder/portal/plugins/_components/DeletePluginModal.svelte +++ b/packages/builder/src/pages/builder/portal/plugins/_components/DeletePluginModal.svelte @@ -1,6 +1,6 @@ diff --git a/packages/builder/src/pages/builder/portal/settings/environment/index.svelte b/packages/builder/src/pages/builder/portal/settings/environment/index.svelte index 0d4c7e1479..13892c61d3 100644 --- a/packages/builder/src/pages/builder/portal/settings/environment/index.svelte +++ b/packages/builder/src/pages/builder/portal/settings/environment/index.svelte @@ -7,9 +7,9 @@ InlineAlert, notifications, } from "@budibase/bbui" - import { environment, licensing } from "stores/portal" + import { environment, licensing } from "@/stores/portal" import { onMount } from "svelte" - import CreateEditVariableModal from "components/portal/environment/CreateEditVariableModal.svelte" + import CreateEditVariableModal from "@/components/portal/environment/CreateEditVariableModal.svelte" import EditVariableColumn from "./_components/EditVariableColumn.svelte" import LockedFeature from "../../_components/LockedFeature.svelte" diff --git a/packages/builder/src/pages/builder/portal/settings/index.svelte b/packages/builder/src/pages/builder/portal/settings/index.svelte index 26688e3861..016b28aebc 100644 --- a/packages/builder/src/pages/builder/portal/settings/index.svelte +++ b/packages/builder/src/pages/builder/portal/settings/index.svelte @@ -1,6 +1,6 @@ -
+
{ if (prop) { builderStore.actions.updateProp(prop, e.detail) @@ -24,4 +25,7 @@ div { padding: 0 4px; } + div.disabled { + pointer-events: none; + } diff --git a/packages/client/src/components/preview/SettingsPicker.svelte b/packages/client/src/components/preview/SettingsPicker.svelte index 3900d065e8..6b354f8d65 100644 --- a/packages/client/src/components/preview/SettingsPicker.svelte +++ b/packages/client/src/components/preview/SettingsPicker.svelte @@ -6,6 +6,7 @@ export let options export let label export let component + export let disabled = false $: currentValue = component?.[prop] @@ -16,6 +17,7 @@ autoWidth placeholder={label} {options} + {disabled} value={currentValue} on:change={e => { if (prop) { diff --git a/packages/client/src/sdk.js b/packages/client/src/sdk.js index bd51924bf4..40d066f2ee 100644 --- a/packages/client/src/sdk.js +++ b/packages/client/src/sdk.js @@ -41,6 +41,7 @@ import { memo, derivedMemo, } from "@budibase/frontend-core" +import { createValidatorFromConstraints } from "components/app/forms/validation" export default { API, @@ -81,6 +82,7 @@ export default { generateGoldenSample: RowUtils.generateGoldenSample, memo, derivedMemo, + createValidatorFromConstraints, // Components Provider, diff --git a/packages/client/svelte.config.mjs b/packages/client/svelte.config.mjs new file mode 100644 index 0000000000..af7d74ea4b --- /dev/null +++ b/packages/client/svelte.config.mjs @@ -0,0 +1,7 @@ +import { vitePreprocess } from "@sveltejs/vite-plugin-svelte" + +const config = { + preprocess: vitePreprocess(), +} + +export default config diff --git a/packages/frontend-core/package.json b/packages/frontend-core/package.json index 8377b13ea2..b1f311183a 100644 --- a/packages/frontend-core/package.json +++ b/packages/frontend-core/package.json @@ -5,6 +5,9 @@ "author": "Budibase", "license": "MPL-2.0", "svelte": "./src/index.ts", + "scripts": { + "check:types": "yarn svelte-check" + }, "dependencies": { "@budibase/bbui": "*", "@budibase/shared-core": "*", @@ -13,5 +16,8 @@ "lodash": "4.17.21", "shortid": "2.2.15", "socket.io-client": "^4.7.5" + }, + "devDependencies": { + "svelte-check": "^4.1.0" } } diff --git a/packages/frontend-core/src/components/grid/cells/AICell.svelte b/packages/frontend-core/src/components/grid/cells/AICell.svelte index 38e81cefd3..b56e67b752 100644 --- a/packages/frontend-core/src/components/grid/cells/AICell.svelte +++ b/packages/frontend-core/src/components/grid/cells/AICell.svelte @@ -73,6 +73,7 @@ .value { display: -webkit-box; -webkit-line-clamp: var(--content-lines); + line-clamp: var(--content-lines); -webkit-box-orient: vertical; overflow: hidden; line-height: 20px; diff --git a/packages/frontend-core/src/components/grid/cells/BBReferenceCell.svelte b/packages/frontend-core/src/components/grid/cells/BBReferenceCell.svelte index 5d98ba903b..fe6d8945ba 100644 --- a/packages/frontend-core/src/components/grid/cells/BBReferenceCell.svelte +++ b/packages/frontend-core/src/components/grid/cells/BBReferenceCell.svelte @@ -26,7 +26,7 @@ : RelationshipType.MANY_TO_MANY, } - async function searchFunction(searchParams) { + async function searchFunction(_tableId, searchParams) { if ( subtype !== BBReferenceFieldSubType.USER && subtype !== BBReferenceFieldSubType.USERS diff --git a/packages/frontend-core/src/components/grid/cells/LongFormCell.svelte b/packages/frontend-core/src/components/grid/cells/LongFormCell.svelte index 7829e5da7d..80da91e091 100644 --- a/packages/frontend-core/src/components/grid/cells/LongFormCell.svelte +++ b/packages/frontend-core/src/components/grid/cells/LongFormCell.svelte @@ -93,6 +93,7 @@ .value { display: -webkit-box; -webkit-line-clamp: var(--content-lines); + line-clamp: var(--content-lines); -webkit-box-orient: vertical; overflow: hidden; line-height: 20px; diff --git a/packages/frontend-core/src/components/grid/cells/TextCell.svelte b/packages/frontend-core/src/components/grid/cells/TextCell.svelte index 9275bca3c6..b9a63eb401 100644 --- a/packages/frontend-core/src/components/grid/cells/TextCell.svelte +++ b/packages/frontend-core/src/components/grid/cells/TextCell.svelte @@ -74,12 +74,14 @@ .value { display: -webkit-box; -webkit-line-clamp: var(--content-lines); + line-clamp: var(--content-lines); -webkit-box-orient: vertical; overflow: hidden; line-height: 20px; } .number .value { -webkit-line-clamp: 1; + line-clamp: 1; } input { flex: 1 1 auto; @@ -110,5 +112,6 @@ } input[type="number"] { -moz-appearance: textfield; + appearance: textfield; } diff --git a/packages/frontend-core/src/components/grid/layout/Grid.svelte b/packages/frontend-core/src/components/grid/layout/Grid.svelte index fcaf9724c3..bd630e9908 100644 --- a/packages/frontend-core/src/components/grid/layout/Grid.svelte +++ b/packages/frontend-core/src/components/grid/layout/Grid.svelte @@ -1,4 +1,4 @@ -