Merge branch 'master' of github.com:budibase/budibase into execute-script-v2

This commit is contained in:
Sam Rose 2025-01-15 12:24:40 +00:00
commit 94f4b8c43e
No known key found for this signature in database
10 changed files with 168 additions and 103 deletions

View File

@ -1,6 +1,6 @@
{
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
"version": "3.2.41",
"version": "3.2.44",
"npmClient": "yarn",
"concurrency": 20,
"command": {

View File

@ -21,7 +21,7 @@
"scripts": {
"prebuild": "rimraf dist/",
"prepack": "cp package.json dist",
"build": "node ./scripts/build.js && tsc -p tsconfig.build.json --emitDeclarationOnly --paths null",
"build": "node ./scripts/build.js && tsc -p tsconfig.build.json --emitDeclarationOnly --paths null && tsc -p tsconfig.test.json --paths null",
"build:dev": "yarn prebuild && tsc --build --watch --preserveWatchOutput",
"build:oss": "node ./scripts/build.js",
"check:types": "tsc -p tsconfig.json --noEmit --paths null",

View File

@ -0,0 +1,9 @@
{
"extends": "../../tsconfig.build.json",
"compilerOptions": {
"outDir": "dist",
"sourceMap": true
},
"include": ["tests/**/*.js", "tests/**/*.ts"],
"exclude": ["node_modules", "dist"]
}

View File

@ -1,27 +0,0 @@
import { writable } from "svelte/store"
import { API } from "@/api"
export function createPermissionStore() {
const { subscribe } = writable([])
return {
subscribe,
save: async ({ level, role, resource }) => {
return await API.updatePermissionForResource(resource, role, level)
},
remove: async ({ level, role, resource }) => {
return await API.removePermissionFromResource(resource, role, level)
},
forResource: async resourceId => {
return (await API.getPermissionForResource(resourceId)).permissions
},
forResourceDetailed: async resourceId => {
return await API.getPermissionForResource(resourceId)
},
getDependantsInfo: async resourceId => {
return await API.getDependants(resourceId)
},
}
}
export const permissions = createPermissionStore()

View File

@ -0,0 +1,50 @@
import { BudiStore } from "../BudiStore"
import { API } from "@/api"
import {
PermissionLevel,
GetResourcePermsResponse,
GetDependantResourcesResponse,
ResourcePermissionInfo,
} from "@budibase/types"
interface Permission {
level: PermissionLevel
role: string
resource: string
}
export class PermissionStore extends BudiStore<Permission[]> {
constructor() {
super([])
}
save = async (permission: Permission) => {
const { level, role, resource } = permission
return await API.updatePermissionForResource(resource, role, level)
}
remove = async (permission: Permission) => {
const { level, role, resource } = permission
return await API.removePermissionFromResource(resource, role, level)
}
forResource = async (
resourceId: string
): Promise<Record<string, ResourcePermissionInfo>> => {
return (await API.getPermissionForResource(resourceId)).permissions
}
forResourceDetailed = async (
resourceId: string
): Promise<GetResourcePermsResponse> => {
return await API.getPermissionForResource(resourceId)
}
getDependantsInfo = async (
resourceId: string
): Promise<GetDependantResourcesResponse> => {
return await API.getDependants(resourceId)
}
}
export const permissions = new PermissionStore()

View File

@ -1,67 +0,0 @@
import { writable, derived } from "svelte/store"
import { tables } from "./tables"
import { API } from "@/api"
export function createViewsStore() {
const store = writable({
selectedViewName: null,
})
const derivedStore = derived([store, tables], ([$store, $tables]) => {
let list = []
$tables.list?.forEach(table => {
const views = Object.values(table?.views || {}).filter(view => {
return view.version !== 2
})
list = list.concat(views)
})
return {
...$store,
list,
selected: list.find(view => view.name === $store.selectedViewName),
}
})
const select = name => {
store.update(state => ({
...state,
selectedViewName: name,
}))
}
const deleteView = async view => {
await API.deleteView(view.name)
// Update tables
tables.update(state => {
const table = state.list.find(table => table._id === view.tableId)
delete table.views[view.name]
return { ...state }
})
}
const save = async view => {
const savedView = await API.saveView(view)
select(view.name)
// Update tables
tables.update(state => {
const table = state.list.find(table => table._id === view.tableId)
if (table) {
if (view.originalName) {
delete table.views[view.originalName]
}
table.views[view.name] = savedView
}
return { ...state }
})
}
return {
subscribe: derivedStore.subscribe,
select,
delete: deleteView,
save,
}
}
export const views = createViewsStore()

View File

@ -0,0 +1,94 @@
import { DerivedBudiStore } from "../BudiStore"
import { tables } from "./tables"
import { API } from "@/api"
import { View } from "@budibase/types"
import { helpers } from "@budibase/shared-core"
import { derived, Writable } from "svelte/store"
interface BuilderViewStore {
selectedViewName: string | null
}
interface DerivedViewStore extends BuilderViewStore {
list: View[]
selected?: View
}
export class ViewsStore extends DerivedBudiStore<
BuilderViewStore,
DerivedViewStore
> {
constructor() {
const makeDerivedStore = (store: Writable<BuilderViewStore>) => {
return derived([store, tables], ([$store, $tables]): DerivedViewStore => {
let list: View[] = []
$tables.list?.forEach(table => {
const views = Object.values(table?.views || {}).filter(
(view): view is View => !helpers.views.isV2(view)
)
list = list.concat(views)
})
return {
selectedViewName: $store.selectedViewName,
list,
selected: list.find(view => view.name === $store.selectedViewName),
}
})
}
super(
{
selectedViewName: null,
},
makeDerivedStore
)
this.select = this.select.bind(this)
}
select = (name: string) => {
this.store.update(state => ({
...state,
selectedViewName: name,
}))
}
delete = async (view: View) => {
if (!view.name) {
throw new Error("View name is required")
}
await API.deleteView(view.name)
// Update tables
tables.update(state => {
const table = state.list.find(table => table._id === view.tableId)
if (table?.views && view.name) {
delete table.views[view.name]
}
return { ...state }
})
}
save = async (view: View & { originalName?: string }) => {
if (!view.name) {
throw new Error("View name is required")
}
const savedView = await API.saveView(view)
this.select(view.name)
// Update tables
tables.update(state => {
const table = state.list.find(table => table._id === view.tableId)
if (table?.views && view.name) {
if (view.originalName) {
delete table.views[view.originalName]
}
table.views[view.name] = savedView
}
return { ...state }
})
}
}
export const views = new ViewsStore()

@ -1 +1 @@
Subproject commit 193476cdfade6d3c613e6972f16ee0c527e01ff6
Subproject commit 43a5785ccb4f83ce929b29f05ea0a62199fcdf23

View File

@ -46,7 +46,10 @@ const svelteCompilePlugin = {
let { argv } = require("yargs")
async function runBuild(entry, outfile) {
const isDev = process.env.NODE_ENV !== "production"
const isDev = !process.env.CI
console.log(`Building in mode dev mode: ${isDev}`)
const tsconfig = argv["p"] || `tsconfig.build.json`
const { data: tsconfigPathPluginContent } = loadTsConfig(
@ -58,7 +61,7 @@ async function runBuild(entry, outfile) {
entryPoints: [entry],
bundle: true,
minify: !isDev,
sourcemap: isDev,
sourcemap: tsconfigPathPluginContent.compilerOptions.sourceMap,
tsconfig,
plugins: [
svelteCompilePlugin,
@ -125,10 +128,12 @@ async function runBuild(entry, outfile) {
await Promise.all([hbsFiles, mainBuild, oldClientVersions])
if (isDev) {
fs.writeFileSync(
`dist/${path.basename(outfile)}.meta.json`,
JSON.stringify((await mainBuild).metafile)
)
}
console.log(
"\x1b[32m%s\x1b[0m",

View File

@ -11,6 +11,7 @@
"declaration": true,
"isolatedModules": true,
"baseUrl": ".",
"sourceMap": true,
"paths": {
"@budibase/types": ["./packages/types/src"],
"@budibase/backend-core": ["./packages/backend-core/src"],