From c2fbdf505ede3f5f0cac579f8d28703116cf2006 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Fri, 3 Jan 2025 10:42:44 +0000 Subject: [PATCH 1/4] Convert portal feature store to TS --- packages/builder/src/stores/BudiStore.ts | 13 +++-- .../builder/src/stores/portal/features.js | 54 ------------------- .../builder/src/stores/portal/features.ts | 35 ++++++++++++ packages/types/src/documents/global/config.ts | 3 ++ 4 files changed, 48 insertions(+), 57 deletions(-) delete mode 100644 packages/builder/src/stores/portal/features.js create mode 100644 packages/builder/src/stores/portal/features.ts diff --git a/packages/builder/src/stores/BudiStore.ts b/packages/builder/src/stores/BudiStore.ts index d5bbc99328..d537847a4d 100644 --- a/packages/builder/src/stores/BudiStore.ts +++ b/packages/builder/src/stores/BudiStore.ts @@ -20,7 +20,7 @@ interface BudiStoreOpts { export class BudiStore { store: Writable - subscribe: Writable["subscribe"] + subscribe: Readable["subscribe"] update: Writable["update"] set: Writable["set"] @@ -53,17 +53,24 @@ export class BudiStore { } } -export class DerivedBudiStore extends BudiStore { +// This deliberately does not extend a BudiStore as doing so imposes a requirement that +// DerivedT must extend T, which is not desirable, due to the type of the subscribe property. +export class DerivedBudiStore { + store: BudiStore derivedStore: Readable subscribe: Readable["subscribe"] + update: Writable["update"] + set: Writable["set"] constructor( init: T, makeDerivedStore: (store: Writable) => Readable, opts?: BudiStoreOpts ) { - super(init, opts) + this.store = new BudiStore(init, opts) this.derivedStore = makeDerivedStore(this.store) this.subscribe = this.derivedStore.subscribe + this.update = this.store.update + this.set = this.store.set } } diff --git a/packages/builder/src/stores/portal/features.js b/packages/builder/src/stores/portal/features.js deleted file mode 100644 index 747052aa6c..0000000000 --- a/packages/builder/src/stores/portal/features.js +++ /dev/null @@ -1,54 +0,0 @@ -import { writable } from "svelte/store" -import { API } from "@/api" -import { licensing } from "./licensing" -import { ConfigType } from "@budibase/types" - -export const createFeatureStore = () => { - const internalStore = writable({ - scim: { - isFeatureFlagEnabled: false, - isConfigFlagEnabled: false, - }, - }) - - const store = writable({ - isScimEnabled: false, - }) - - internalStore.subscribe(s => { - store.update(state => ({ - ...state, - isScimEnabled: s.scim.isFeatureFlagEnabled && s.scim.isConfigFlagEnabled, - })) - }) - - licensing.subscribe(v => { - internalStore.update(state => ({ - ...state, - scim: { - ...state.scim, - isFeatureFlagEnabled: v.scimEnabled, - }, - })) - }) - - const actions = { - init: async () => { - const scimConfig = await API.getConfig(ConfigType.SCIM) - internalStore.update(state => ({ - ...state, - scim: { - ...state.scim, - isConfigFlagEnabled: scimConfig?.config?.enabled, - }, - })) - }, - } - - return { - subscribe: store.subscribe, - ...actions, - } -} - -export const features = createFeatureStore() diff --git a/packages/builder/src/stores/portal/features.ts b/packages/builder/src/stores/portal/features.ts new file mode 100644 index 0000000000..049c7485a6 --- /dev/null +++ b/packages/builder/src/stores/portal/features.ts @@ -0,0 +1,35 @@ +import { derived, Writable } from "svelte/store" +import { API } from "@/api" +import { licensing } from "./licensing" +import { ConfigType, isConfig, isSCIMConfig } from "@budibase/types" +import { DerivedBudiStore } from "../BudiStore" + +interface FeatureState { + scimConfigEnabled: Boolean +} + +interface DerivedFeatureState { + isScimEnabled: Boolean +} + +class FeatureStore extends DerivedBudiStore { + constructor() { + const makeDerivedStore = (store: Writable) => { + return derived([store, licensing], ([$state, $licensing]) => ({ + isScimEnabled: $state.scimConfigEnabled && $licensing.scimEnabled, + })) + } + super({ scimConfigEnabled: false }, makeDerivedStore) + } + + async init() { + const config = await API.getConfig(ConfigType.SCIM) + this.update(state => ({ + ...state, + scimConfigEnabled: + isConfig(config) && isSCIMConfig(config) && config.config.enabled, + })) + } +} + +export const features = new FeatureStore() diff --git a/packages/types/src/documents/global/config.ts b/packages/types/src/documents/global/config.ts index 33f7e10584..d51ca9d54d 100644 --- a/packages/types/src/documents/global/config.ts +++ b/packages/types/src/documents/global/config.ts @@ -127,6 +127,9 @@ export interface AIInnerConfig { export interface AIConfig extends Config {} +export const isConfig = (config: Object): config is Config => + "type" in config && "config" in config + export const isSettingsConfig = (config: Config): config is SettingsConfig => config.type === ConfigType.SETTINGS From cf4122e20448bd0be77959f8f05f42c6a342cae8 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Fri, 3 Jan 2025 10:45:29 +0000 Subject: [PATCH 2/4] Revert small change to BudiStore --- packages/builder/src/stores/BudiStore.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/builder/src/stores/BudiStore.ts b/packages/builder/src/stores/BudiStore.ts index d537847a4d..c638bbf5bc 100644 --- a/packages/builder/src/stores/BudiStore.ts +++ b/packages/builder/src/stores/BudiStore.ts @@ -20,7 +20,7 @@ interface BudiStoreOpts { export class BudiStore { store: Writable - subscribe: Readable["subscribe"] + subscribe: Writable["subscribe"] update: Writable["update"] set: Writable["set"] From 34b9cf38cf733b89256e31c6a0bd78dc3cc5ec16 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Mon, 6 Jan 2025 14:50:57 +0000 Subject: [PATCH 3/4] Add the openAPI package globally to avoid issues with it not being found. --- .github/workflows/readme-openapi.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/readme-openapi.yml b/.github/workflows/readme-openapi.yml index b52787934f..9f42f6141b 100644 --- a/.github/workflows/readme-openapi.yml +++ b/.github/workflows/readme-openapi.yml @@ -19,5 +19,8 @@ jobs: cache: yarn - run: yarn --frozen-lockfile + - name: Install OpenAPI pkg + run: yarn global add openapi + - name: update specs run: cd packages/server && yarn specs && openapi specs/openapi.yaml --key=${{ secrets.README_API_KEY }} --id=6728a74f5918b50036c61841 From 294f696d63cc66250742c7d3dd7f4b619698f566 Mon Sep 17 00:00:00 2001 From: melohagan <101575380+melohagan@users.noreply.github.com> Date: Mon, 6 Jan 2025 15:31:39 +0000 Subject: [PATCH 4/4] Offer option to open Budibase via CLI (#15312) --- packages/cli/package.json | 3 ++- packages/cli/src/hosting/start.ts | 5 +++++ yarn.lock | 24 ++++++++++++------------ 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index 927824a522..662434957e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -16,6 +16,7 @@ }, "dependencies": { "@budibase/backend-core": "*", + "@budibase/pouchdb-replication-stream": "1.2.11", "@budibase/string-templates": "*", "@budibase/types": "*", "chalk": "4.1.0", @@ -28,9 +29,9 @@ "inquirer": "8.0.0", "lookpath": "1.1.0", "node-fetch": "2.6.7", + "open": "8.4.2", "posthog-node": "4.0.1", "pouchdb": "7.3.0", - "@budibase/pouchdb-replication-stream": "1.2.11", "randomstring": "1.1.5", "tar": "6.2.1", "yaml": "^2.1.1" diff --git a/packages/cli/src/hosting/start.ts b/packages/cli/src/hosting/start.ts index 75e3df451f..5b08268c94 100644 --- a/packages/cli/src/hosting/start.ts +++ b/packages/cli/src/hosting/start.ts @@ -3,6 +3,8 @@ import { info, success } from "../utils" import * as makeFiles from "./makeFiles" import compose from "docker-compose" import fs from "fs" +import { confirmation } from "../questions" +const open = require("open") export async function start() { await checkDockerConfigured() @@ -22,6 +24,9 @@ export async function start() { // need to log as it makes it more clear await compose.upAll({ cwd: "./", log: true }) }) + if (await confirmation(`Do you wish to open http://localhost:${port} ?`)) { + await open(`http://localhost:${port}`) + } console.log( success( `Services started, please go to http://localhost:${port} for next steps.` diff --git a/yarn.lock b/yarn.lock index c6181f7866..c54385478e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2131,9 +2131,9 @@ through2 "^2.0.0" "@budibase/pro@npm:@budibase/pro@latest": - version "3.2.28" - resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-3.2.28.tgz#59b5b37225715bb8fbf5b1c5c989140b10b58710" - integrity sha512-eDPeZpYFRZYQhCulcQAUwFoPk68c8+K9mIsB6QD3oMHmHTDA1P2ZcXvLNqDTIqHB94DqnWinqDf4hTuGYApgPA== + version "3.2.32" + resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-3.2.32.tgz#f6abcd5a5524e7f33d958acb6e610e29995427bb" + integrity sha512-bF0pd17IjYugjll2yKYmb0RM+tfKZcCmRBc4XG2NZ4f/I47QaOovm9RqSw6tfqCFuzRewxR3SWmtmSseUc/e0w== dependencies: "@anthropic-ai/sdk" "^0.27.3" "@budibase/backend-core" "*" @@ -15600,15 +15600,7 @@ only@~0.0.2: resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" integrity sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ== -open@^7.3.1: - version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -open@^8.0.0, open@^8.4.0, open@~8.4.0: +open@8.4.2, open@^8.0.0, open@^8.4.0, open@~8.4.0: version "8.4.2" resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== @@ -15617,6 +15609,14 @@ open@^8.0.0, open@^8.4.0, open@~8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" +open@^7.3.1: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + openai@4.59.0: version "4.59.0" resolved "https://registry.yarnpkg.com/openai/-/openai-4.59.0.tgz#3961d11a9afb5920e1bd475948a87969e244fc08"