diff --git a/.gitignore b/.gitignore index dcb1d822f0..24c031d958 100644 --- a/.gitignore +++ b/.gitignore @@ -38,7 +38,7 @@ bower_components build/Release # Dependency directories -node_modules/ +/node_modules/ jspm_packages/ # TypeScript v1 declaration files diff --git a/packages/builder/.gitignore b/packages/builder/.gitignore index 328f7f0f3c..6e90239f92 100644 --- a/packages/builder/.gitignore +++ b/packages/builder/.gitignore @@ -1,5 +1,5 @@ .DS_Store -node_modules +/node_modules/ node_modules_win package-lock.json yarn.lock diff --git a/packages/builder/package.json b/packages/builder/package.json index 9f4003cb8c..8d9c07c204 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -5,10 +5,11 @@ "private": true, "scripts": { "build": "rollup -c", - "start": "rollup -c -w", + "start": "routify -c rollup", "test": "jest", "test:watch": "jest --watchAll", - "dev:builder": "rollup -c -w" + "dev:builder": "routify -c rollup", + "rollup": "rollup -c -w" }, "jest": { "globals": { @@ -19,7 +20,9 @@ "testURL": "http://jest-breaks-if-this-does-not-exist", "moduleNameMapper": { "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "/internals/mocks/fileMock.js", - "\\.(css|less|sass|scss)$": "identity-obj-proxy" + "\\.(css|less|sass|scss)$": "identity-obj-proxy", + "components(.*)$": "/src/components$1", + "builderStore(.*)$": "/src/builderStore$1" }, "moduleFileExtensions": [ "js" @@ -54,6 +57,8 @@ "@babel/plugin-transform-runtime": "^7.5.5", "@babel/preset-env": "^7.5.5", "@babel/runtime": "^7.5.5", + "@rollup/plugin-alias": "^3.0.1", + "@sveltech/routify": "1.5.0-beta.16", "babel-jest": "^24.8.0", "browser-sync": "^2.26.7", "http-proxy-middleware": "^0.19.1", @@ -75,4 +80,4 @@ "svelte": "^3.0.0" }, "gitHead": "115189f72a850bfb52b65ec61d932531bf327072" -} +} \ No newline at end of file diff --git a/packages/builder/rollup.config.js b/packages/builder/rollup.config.js index 9986e39fd5..4a4081e53a 100644 --- a/packages/builder/rollup.config.js +++ b/packages/builder/rollup.config.js @@ -1,3 +1,4 @@ +import alias from "@rollup/plugin-alias" import svelte from "rollup-plugin-svelte" import resolve from "rollup-plugin-node-resolve" import commonjs from "rollup-plugin-commonjs" @@ -11,6 +12,8 @@ import browsersync from "rollup-plugin-browsersync" import proxy from "http-proxy-middleware" import replace from "rollup-plugin-replace" +import path from "path" + const target = "http://localhost:4001" const _builderProxy = proxy("/_builder", { target: "http://localhost:3000", @@ -142,6 +145,11 @@ const coreExternal = [ "@nx-js/compiler-util", ] +const customResolver = resolve({ + extensions: [".mjs", ".js", ".jsx", ".json", ".sass", ".scss", ".svelte"] +}) +const projectRootDir = path.resolve(__dirname) + export default { input: "src/main.js", output: { @@ -151,6 +159,13 @@ export default { file: `${outputpath}/bundle.js`, }, plugins: [ + alias({ + entries: [ + { find: "components", replacement: path.resolve(projectRootDir, 'src/components') }, + { find: "builderStore", replacement: path.resolve(projectRootDir, 'src/builderStore') } + ], + customResolver + }), copy({ targets: [ { src: "src/index.html", dest: outputpath }, @@ -216,10 +231,10 @@ export default { // browser on changes when not in production !production && livereload(outputpath), !production && - browsersync({ - server: outputpath, - middleware: [apiProxy, _builderProxy], - }), + browsersync({ + server: outputpath, + middleware: [apiProxy, _builderProxy], + }), // If we're building for production (npm run build // instead of npm run dev), minify @@ -229,3 +244,20 @@ export default { clearScreen: false, }, } + +function serve() { + let started = false + + return { + writeBundle() { + if (!started) { + started = true + + require("child_process").spawn("npm", ["run", "start"], { + stdio: ["ignore", "inherit", "inherit"], + shell: true, + }) + } + }, + } +} diff --git a/packages/builder/src/App.svelte b/packages/builder/src/App.svelte index 381a40c2a5..424c7b9a1e 100644 --- a/packages/builder/src/App.svelte +++ b/packages/builder/src/App.svelte @@ -2,13 +2,13 @@ import NoPackage from "./NoPackage.svelte" import PackageRoot from "./PackageRoot.svelte" import Settings from "./Settings.svelte" - import { store, initialise } from "./builderStore" + import { store, initialise } from "builderStore" import { onMount } from "svelte" - import IconButton from "./common/IconButton.svelte" - import Spinner from "./common/Spinner.svelte" + import IconButton from "components/common/IconButton.svelte" + import Spinner from "components/common/Spinner.svelte" import AppNotification, { showAppNotification, - } from "./common/AppNotification.svelte" + } from "components/common/AppNotification.svelte" let init = initialise() diff --git a/packages/builder/src/BackendRoot.svelte b/packages/builder/src/BackendRoot.svelte index d37e774a96..50dd713196 100644 --- a/packages/builder/src/BackendRoot.svelte +++ b/packages/builder/src/BackendRoot.svelte @@ -1,13 +1,13 @@
@@ -37,13 +37,13 @@ .content { flex: 1 1 auto; - margin: 80px 60px; + margin: 40px 40px; } .nav { overflow: auto; flex: 0 1 auto; - width: 300px; + width: 275px; height: 100%; } diff --git a/packages/builder/src/NoPackage.svelte b/packages/builder/src/NoPackage.svelte index f3cfe6a857..c15df26036 100644 --- a/packages/builder/src/NoPackage.svelte +++ b/packages/builder/src/NoPackage.svelte @@ -1,6 +1,6 @@ diff --git a/packages/builder/src/PackageRoot.svelte b/packages/builder/src/PackageRoot.svelte index f7a134ed9a..71660ec2e8 100644 --- a/packages/builder/src/PackageRoot.svelte +++ b/packages/builder/src/PackageRoot.svelte @@ -1,10 +1,10 @@ diff --git a/packages/builder/src/budibase.css b/packages/builder/src/budibase.css index b64bb77e1a..fce34b256e 100644 --- a/packages/builder/src/budibase.css +++ b/packages/builder/src/budibase.css @@ -62,9 +62,9 @@ margin: 5px 20px 5px 0px; border-radius: 0 5px 5px 0; display: flex; - align-items: center; + align-items: baseline; font-weight: 500; - font-size: 0.8em; + font-size: 12px; } .budibase__nav-item.selected { diff --git a/packages/builder/src/builderStore/createPackage.js b/packages/builder/src/builderStore/createPackage.js index c67585af68..d4f4a9e54b 100644 --- a/packages/builder/src/builderStore/createPackage.js +++ b/packages/builder/src/builderStore/createPackage.js @@ -1,4 +1,4 @@ -import { createNewHierarchy } from "../common/core" +import { createNewHierarchy } from "components/common/core" export const createPackage = (packageInfo, store) => { packageInfo.createNewPackage("") diff --git a/packages/builder/src/builderStore/generate_css.js b/packages/builder/src/builderStore/generate_css.js index 19148ce9b0..0f776a5255 100644 --- a/packages/builder/src/builderStore/generate_css.js +++ b/packages/builder/src/builderStore/generate_css.js @@ -1,5 +1,5 @@ import { filter, map, reduce, toPairs } from "lodash/fp" -import { pipe } from "../common/core" +import { pipe } from "components/common/core" const self = n => n const join_with = delimiter => a => a.join(delimiter) diff --git a/packages/builder/src/builderStore/loadComponentLibraries.js b/packages/builder/src/builderStore/loadComponentLibraries.js index 5a142f2798..8534bcf177 100644 --- a/packages/builder/src/builderStore/loadComponentLibraries.js +++ b/packages/builder/src/builderStore/loadComponentLibraries.js @@ -1,5 +1,5 @@ import { flatten, values, uniq, map } from "lodash/fp" -import { pipe } from "../common/core" +import { pipe } from "components/common/core" export const loadLibs = async (appName, appPackage) => { const allLibraries = {} diff --git a/packages/builder/src/builderStore/store/backend.js b/packages/builder/src/builderStore/store/backend.js index 65f012e34c..b4a10fec13 100644 --- a/packages/builder/src/builderStore/store/backend.js +++ b/packages/builder/src/builderStore/store/backend.js @@ -10,7 +10,7 @@ import { isIndex, canDeleteIndex, canDeleteRecord, -} from "../../common/core" +} from "components/common/core" export const getBackendUiStore = () => { const INITIAL_BACKEND_UI_STATE = { @@ -100,9 +100,9 @@ export const saveBackend = async state => { const instances_currentFirst = state.selectedDatabase ? [ - state.appInstances.find(i => i.id === state.selectedDatabase.id), - ...state.appInstances.filter(i => i.id !== state.selectedDatabase.id), - ] + state.appInstances.find(i => i.id === state.selectedDatabase.id), + ...state.appInstances.filter(i => i.id !== state.selectedDatabase.id), + ] : state.appInstances for (let instance of instances_currentFirst) { @@ -198,7 +198,10 @@ export const saveCurrentNode = store => () => { const defaultIndex = templateApi(state.hierarchy).getNewIndexTemplate( cloned.parent() ) - defaultIndex.name = `all_${cloned.name}s` + defaultIndex.name = hierarchyFunctions.isTopLevelIndex(cloned) + ? `all_${cloned.name}s` + : `${cloned.parent().name}_${cloned.name}s` + defaultIndex.allowedRecordNodeIds = [cloned.nodeId] } diff --git a/packages/builder/src/builderStore/store/index.js b/packages/builder/src/builderStore/store/index.js index 41230bcaf4..76cdc5a7c3 100644 --- a/packages/builder/src/builderStore/store/index.js +++ b/packages/builder/src/builderStore/store/index.js @@ -1,18 +1,18 @@ import { filter, cloneDeep, last, concat, isEmpty, values } from "lodash/fp" -import { pipe, getNode, constructHierarchy } from "../../common/core" +import { pipe, getNode, constructHierarchy } from "components/common/core" import * as backendStoreActions from "./backend" import { writable } from "svelte/store" -import { defaultPagesObject } from "../../userInterface/pagesParsing/defaultPagesObject" +import { defaultPagesObject } from "components/userInterface/pagesParsing/defaultPagesObject" import api from "../api" -import { getExactComponent } from "../../userInterface/pagesParsing/searchComponents" -import { rename } from "../../userInterface/pagesParsing/renameScreen" +import { getExactComponent } from "components/userInterface/pagesParsing/searchComponents" +import { rename } from "components/userInterface/pagesParsing/renameScreen" import { getNewScreen, createProps, makePropsSafe, getBuiltin, -} from "../../userInterface/pagesParsing/createProps" -import { expandComponentDefinition } from "../../userInterface/pagesParsing/types" +} from "components/userInterface/pagesParsing/createProps" +import { expandComponentDefinition } from "components/userInterface/pagesParsing/types" import { loadLibs, libUrlsForPreview } from "../loadComponentLibraries" import { buildCodeForScreens } from "../buildCodeForScreens" import { generate_screen_css } from "../generate_css" diff --git a/packages/builder/src/accessLevels/AccessLevelView.svelte b/packages/builder/src/components/accessLevels/AccessLevelView.svelte similarity index 93% rename from packages/builder/src/accessLevels/AccessLevelView.svelte rename to packages/builder/src/components/accessLevels/AccessLevelView.svelte index e5423db018..9936fba566 100644 --- a/packages/builder/src/accessLevels/AccessLevelView.svelte +++ b/packages/builder/src/components/accessLevels/AccessLevelView.svelte @@ -5,7 +5,7 @@ import ButtonGroup from "../common/ButtonGroup.svelte" import Button from "../common/Button.svelte" import ActionButton from "../common/ActionButton.svelte" - import { validateAccessLevels } from "../common/core" + import { validateAccessLevels, nodeNameFromNodeKey } from "../common/core" import ErrorsBox from "../common/ErrorsBox.svelte" export let level @@ -38,7 +38,9 @@ ) const getPermissionName = perm => - perm.nodeKey ? `${perm.type} - ${perm.nodeKey}` : perm.type + perm.nodeKey + ? `${perm.type} - ${nodeNameFromNodeKey(hierarchy, perm.nodeKey)}` + : perm.type const save = () => { const newLevels = isNew diff --git a/packages/builder/src/accessLevels/AccessLevelsRoot.svelte b/packages/builder/src/components/accessLevels/AccessLevelsRoot.svelte similarity index 85% rename from packages/builder/src/accessLevels/AccessLevelsRoot.svelte rename to packages/builder/src/components/accessLevels/AccessLevelsRoot.svelte index 8d57d83f2b..f53afae5f6 100644 --- a/packages/builder/src/accessLevels/AccessLevelsRoot.svelte +++ b/packages/builder/src/components/accessLevels/AccessLevelsRoot.svelte @@ -1,12 +1,15 @@ + +
+ +
diff --git a/packages/builder/src/database/ModelDataTable/modals/CreateEditRecord.svelte b/packages/builder/src/components/database/ModelDataTable/modals/CreateEditRecord.svelte similarity index 88% rename from packages/builder/src/database/ModelDataTable/modals/CreateEditRecord.svelte rename to packages/builder/src/components/database/ModelDataTable/modals/CreateEditRecord.svelte index 25837db018..99c7e78116 100644 --- a/packages/builder/src/database/ModelDataTable/modals/CreateEditRecord.svelte +++ b/packages/builder/src/components/database/ModelDataTable/modals/CreateEditRecord.svelte @@ -1,18 +1,18 @@
@@ -42,7 +41,7 @@
{/if} - +
diff --git a/packages/builder/src/pages/_[application]/backend/_layout.svelte b/packages/builder/src/pages/_[application]/backend/_layout.svelte new file mode 100644 index 0000000000..58452ee636 --- /dev/null +++ b/packages/builder/src/pages/_[application]/backend/_layout.svelte @@ -0,0 +1,48 @@ + + +
+ +
+ + +
+ +
+ + diff --git a/packages/builder/src/pages/_[application]/backend/actions/index.svelte b/packages/builder/src/pages/_[application]/backend/actions/index.svelte new file mode 100644 index 0000000000..b527bb251a --- /dev/null +++ b/packages/builder/src/pages/_[application]/backend/actions/index.svelte @@ -0,0 +1,134 @@ + + +
+
+ + + Create New Action + + + Create New Trigger + + +
+ +
+ + + +
+ +
+ + diff --git a/packages/builder/src/pages/_[application]/backend/database/index.svelte b/packages/builder/src/pages/_[application]/backend/database/index.svelte new file mode 100644 index 0000000000..2724e8045a --- /dev/null +++ b/packages/builder/src/pages/_[application]/backend/database/index.svelte @@ -0,0 +1,96 @@ + + + + {#if recordOpen} + + {/if} + {#if modelOpen} + + {/if} + {#if viewOpen} + + {/if} + {#if databaseOpen} + + {/if} + {#if deleteRecordOpen} + + {/if} + {#if userOpen} + + {/if} + + +
+
+
+
{breadcrumbs}
+ {#if $backendUiStore.selectedDatabase.id} + { + selectedRecord = null + backendUiStore.actions.modals.show('RECORD') + }}> + Create new record + + {/if} +
+ {#if $backendUiStore.selectedDatabase.id} + + {:else}Please select a database{/if} +
+
+ + diff --git a/packages/builder/src/pages/_[application]/backend/index.svelte b/packages/builder/src/pages/_[application]/backend/index.svelte new file mode 100644 index 0000000000..09345bc127 --- /dev/null +++ b/packages/builder/src/pages/_[application]/backend/index.svelte @@ -0,0 +1,6 @@ + + + diff --git a/packages/builder/src/pages/_[application]/frontend/_layout.svelte b/packages/builder/src/pages/_[application]/frontend/_layout.svelte new file mode 100644 index 0000000000..0385342cef --- /dev/null +++ b/packages/builder/src/pages/_[application]/frontend/_layout.svelte @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/builder/src/pages/_[application]/frontend/index.svelte b/packages/builder/src/pages/_[application]/frontend/index.svelte new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/builder/src/pages/_[application]/index.svelte b/packages/builder/src/pages/_[application]/index.svelte new file mode 100644 index 0000000000..25636f83f1 --- /dev/null +++ b/packages/builder/src/pages/_[application]/index.svelte @@ -0,0 +1,6 @@ + + + diff --git a/packages/builder/src/pages/_[application]/settings/_layout.svelte b/packages/builder/src/pages/_[application]/settings/_layout.svelte new file mode 100644 index 0000000000..43a188a476 --- /dev/null +++ b/packages/builder/src/pages/_[application]/settings/_layout.svelte @@ -0,0 +1,2 @@ + + diff --git a/packages/builder/src/pages/_[application]/settings/index.svelte b/packages/builder/src/pages/_[application]/settings/index.svelte new file mode 100644 index 0000000000..163d304af4 --- /dev/null +++ b/packages/builder/src/pages/_[application]/settings/index.svelte @@ -0,0 +1 @@ +Settings diff --git a/packages/builder/src/pages/index.svelte b/packages/builder/src/pages/index.svelte new file mode 100644 index 0000000000..004280071b --- /dev/null +++ b/packages/builder/src/pages/index.svelte @@ -0,0 +1,68 @@ + + +
+ + {#await promise} +
+ +
+ {:then result} + + {:catch err} +

{err}

+ {/await} + + +
+ + diff --git a/packages/builder/tests/componentDependencies.spec.js b/packages/builder/tests/componentDependencies.spec.js index 267f395b2a..45cd891699 100644 --- a/packages/builder/tests/componentDependencies.spec.js +++ b/packages/builder/tests/componentDependencies.spec.js @@ -1,4 +1,4 @@ -import { componentDependencies } from "../src/userInterface/pagesParsing/findDependencies" +import { componentDependencies } from "../src/components/userInterface/pagesParsing/findDependencies" import { componentsAndScreens } from "./testData" import { some, find } from "lodash/fp" diff --git a/packages/builder/tests/createProps.spec.js b/packages/builder/tests/createProps.spec.js index 7acfa38b48..7ef13e5062 100644 --- a/packages/builder/tests/createProps.spec.js +++ b/packages/builder/tests/createProps.spec.js @@ -1,4 +1,4 @@ -import { createProps } from "../src/userInterface/pagesParsing/createProps" +import { createProps } from "../src/components/userInterface/pagesParsing/createProps" import { keys, some } from "lodash/fp" import { BB_STATE_BINDINGPATH } from "@budibase/client/src/state/parseBinding" import { stripStandardProps } from "./testData" diff --git a/packages/builder/tests/expandPropDef.spec.js b/packages/builder/tests/expandPropDef.spec.js index 08c3eb3327..a46aa368e1 100644 --- a/packages/builder/tests/expandPropDef.spec.js +++ b/packages/builder/tests/expandPropDef.spec.js @@ -1,4 +1,4 @@ -import { expandComponentDefinition } from "../src/userInterface/pagesParsing/types" +import { expandComponentDefinition } from "../src/components/userInterface/pagesParsing/types" const componentDef = () => ({ name: "comp", diff --git a/packages/builder/tests/getNewScreen.spec.js b/packages/builder/tests/getNewScreen.spec.js index 04f58c2c0c..6614753eab 100644 --- a/packages/builder/tests/getNewScreen.spec.js +++ b/packages/builder/tests/getNewScreen.spec.js @@ -1,4 +1,4 @@ -import { getNewScreen } from "../src/userInterface/pagesParsing/createProps" +import { getNewScreen } from "../src/components/userInterface/pagesParsing/createProps" import { componentsAndScreens, stripStandardProps } from "./testData" describe("geNewScreen", () => { diff --git a/packages/builder/tests/renameScreen.spec.js b/packages/builder/tests/renameScreen.spec.js index 8f5aea2109..9091c029ce 100644 --- a/packages/builder/tests/renameScreen.spec.js +++ b/packages/builder/tests/renameScreen.spec.js @@ -1,5 +1,5 @@ -import { getExactComponent } from "../src/userInterface/pagesParsing/searchComponents" -import { rename } from "../src/userInterface/pagesParsing/renameScreen" +import { getExactComponent } from "../src/components/userInterface/pagesParsing/searchComponents" +import { rename } from "../src/components/userInterface/pagesParsing/renameScreen" import { componentsAndScreens } from "./testData" describe("rename component", () => { diff --git a/packages/builder/tests/searchComponentsProps.spec.js b/packages/builder/tests/searchComponentsProps.spec.js index e81d1c2533..65f05b064e 100644 --- a/packages/builder/tests/searchComponentsProps.spec.js +++ b/packages/builder/tests/searchComponentsProps.spec.js @@ -2,7 +2,7 @@ import { searchAllComponents, getExactComponent, getAncestorProps, -} from "../src/userInterface/pagesParsing/searchComponents" +} from "../src/components/userInterface/pagesParsing/searchComponents" import { componentsAndScreens } from "./testData" describe("searchAllComponents", () => { diff --git a/packages/builder/tests/validatePages.spec.js b/packages/builder/tests/validatePages.spec.js index deb86d84ad..695ee51259 100644 --- a/packages/builder/tests/validatePages.spec.js +++ b/packages/builder/tests/validatePages.spec.js @@ -1,7 +1,7 @@ import { validatePages, validatePage, -} from "../src/userInterface/pagesParsing/validatePages" +} from "../src/components/userInterface/pagesParsing/validatePages" const validPages = () => ({ main: { diff --git a/packages/cli/.gitignore b/packages/cli/.gitignore index 76507387b6..d0c97ab594 100644 --- a/packages/cli/.gitignore +++ b/packages/cli/.gitignore @@ -1 +1,2 @@ -sandbox/ \ No newline at end of file +sandbox/ +node_modules/ \ No newline at end of file diff --git a/packages/core/src/templateApi/createNodes.js b/packages/core/src/templateApi/createNodes.js index 804445b4e9..a9a45617a2 100644 --- a/packages/core/src/templateApi/createNodes.js +++ b/packages/core/src/templateApi/createNodes.js @@ -48,6 +48,11 @@ const nodeKeyMaker = node => () => [defaultCase, n => joinKey(node.parent().nodeKey(), n.name)] )(node) +const nodeNameMaker = node => () => + isRoot(node) + ? "/" + : joinKey(node.parent().nodeName(), node.name) + const validate = parent => node => { if ( isIndex(node) && @@ -71,6 +76,7 @@ const validate = parent => node => { const construct = parent => node => { node.nodeKey = nodeKeyMaker(node) + node.nodeName = nodeNameMaker(node) node.pathRegx = pathRegxMaker(node) node.parent = constant(parent) node.isRoot = () => diff --git a/packages/core/src/templateApi/hierarchy.js b/packages/core/src/templateApi/hierarchy.js index 6136a7c38b..3843da79df 100644 --- a/packages/core/src/templateApi/hierarchy.js +++ b/packages/core/src/templateApi/hierarchy.js @@ -244,6 +244,11 @@ export const fieldReversesReferenceToIndex = indexNode => field => intersection(field.typeOptions.reverseIndexNodeKeys)([indexNode.nodeKey()]) .length > 0 +export const nodeNameFromNodeKey = (hierarchy, nodeKey) => { + const node = getNode(hierarchy, nodeKey) + return node ? node.nodeName() : "" +} + export default { getLastPartInKey, getNodesInPath, @@ -279,4 +284,7 @@ export default { fieldReversesReferenceToNode, fieldReversesReferenceToIndex, getFlattenedHierarchy, + isTopLevelIndex, + isTopLevelRecord, + nodeNameFromNodeKey, } diff --git a/packages/core/src/transactions/execute.js b/packages/core/src/transactions/execute.js index 54bf019463..9b90a66041 100644 --- a/packages/core/src/transactions/execute.js +++ b/packages/core/src/transactions/execute.js @@ -44,18 +44,22 @@ import { } from "../templateApi/hierarchy" import { getRecordInfo } from "../recordApi/recordInfo" import { getIndexDir } from "../indexApi/getIndexDir" +import { _deleteIndex } from "../indexApi/delete" import { initialiseIndex } from "../indexing/initialiseIndex" export const executeTransactions = app => async transactions => { const recordsByShard = mappedRecordsByIndexShard(app.hierarchy, transactions) for (const shard of keys(recordsByShard)) { - if (recordsByShard[shard].isRebuild) + if (recordsByShard[shard].isRebuild) { + if (await app.datastore.exists(shard)) + await app.datastore.deleteFile(shard) await initialiseIndex( app.datastore, getParentKey(recordsByShard[shard].indexDir), recordsByShard[shard].indexNode ) + } await applyToShard( app.hierarchy, app.datastore, @@ -76,7 +80,11 @@ const mappedRecordsByIndexShard = (hierarchy, transactions) => { const indexBuild = getBuildIndexTransactionsByShard(hierarchy, transactions) - const toRemove = [...deletes, ...updates.toRemove, ...indexBuild.toRemove] + const toRemove = [ + ...deletes, + ...updates.toRemove, + ...indexBuild.toRemove, + ] const toWrite = [...created, ...updates.toWrite, ...indexBuild.toWrite] diff --git a/packages/core/test/templateApi.constructHeirarchy.spec.js b/packages/core/test/templateApi.constructHeirarchy.spec.js index 1435f5dbec..1bd238e224 100644 --- a/packages/core/test/templateApi.constructHeirarchy.spec.js +++ b/packages/core/test/templateApi.constructHeirarchy.spec.js @@ -13,6 +13,7 @@ describe("hierarchy node creation", () => { expect(root.parent).toBeDefined() expect(root.isRoot()).toBeTruthy() expect(root.indexes).toEqual([]) + expect(root.nodeName()).toBe("/") }) it("> getNewRecordTemplate > should be initialise with correct members", async () => { @@ -33,6 +34,7 @@ describe("hierarchy node creation", () => { expect(record.collectionNodeKey()).toBe("/records") expect(record.collectionPathRegx()).toBe("/records") expect(record.nodeKey()).toBe(`/records/${record.nodeId}-{id}`) + expect(record.nodeName()).toBe(`/${record.name}`) expect(record.pathRegx()).toBe(`/records/${record.nodeId}-[a-zA-Z0-9_\-]+`) }) @@ -60,6 +62,16 @@ describe("hierarchy node creation", () => { expect(parentRecord.children[0]).toBe(record) }) + it("> getNewrecordTemplate > child should get correct nodeName ", async () => { + const { templateApi } = await getMemoryTemplateApi() + const root = templateApi.getNewRootLevel() + const parentRecord = templateApi.getNewRecordTemplate(root) + parentRecord.name = "parent" + const record = templateApi.getNewRecordTemplate(parentRecord) + record.name = "child" + expect(record.nodeName()).toBe(`/${parentRecord.name}/${record.name}`) + }) + it("> getNewrecordTemplate > should add itself to parents's default index allowedNodeIds", async () => { const { templateApi } = await getMemoryTemplateApi() const root = templateApi.getNewRootLevel() diff --git a/packages/core/test/templateApi.upgradeData.spec.js b/packages/core/test/templateApi.upgradeData.spec.js index 945c5e0f43..8118180121 100644 --- a/packages/core/test/templateApi.upgradeData.spec.js +++ b/packages/core/test/templateApi.upgradeData.spec.js @@ -240,6 +240,40 @@ describe("upgradeData", () => { }) +it("should rebuild affected index when field is removed", async () => { + const { oldSetup, newSetup, records } = await configure() + newSetup.contact.fields = newSetup.contact.fields.filter(f => f.name !== "status") + + let itemsInIndex = await _listItems(oldSetup.app, "/contact_index") + expect(itemsInIndex.length).toBe(2) + expect(itemsInIndex[0].status).toBeDefined() + expect(itemsInIndex[0].status).toBe(records.contact1.status) + + await upgradeData(oldSetup.app)(newSetup.root) + + itemsInIndex = await _listItems(newSetup.app, "/contact_index") + expect(itemsInIndex.length).toBe(2) + expect(itemsInIndex[0].status).toBeUndefined() +}) + +it("should rebuild affected index when field is added", async () => { + const { oldSetup, newSetup, records } = await configure() + + const aliveField = newSetup.templateApi.getNewField("string") + aliveField.name = "isalive" + newSetup.templateApi.addField(newSetup.contact, aliveField) + + let itemsInIndex = await _listItems(oldSetup.app, "/contact_index") + expect(itemsInIndex.length).toBe(2) + expect(itemsInIndex[0].isalive).toBeUndefined() + + await upgradeData(oldSetup.app)(newSetup.root) + + itemsInIndex = await _listItems(newSetup.app, "/contact_index") + expect(itemsInIndex.length).toBe(2) + expect(itemsInIndex[0].isalive).toBe(null) +}) + const configure = async () => { const oldSetup = await setup() @@ -256,8 +290,10 @@ const configure = async () => { const createSomeRecords = async recordApi => { const contact1 = recordApi.getNew("/contacts", "contact") contact1.name = "bobby" + contact1.status = "New" const contact2 = recordApi.getNew("/contacts", "contact") contact2.name = "poppy" + contact2.status = "Complete" await recordApi.save(contact1) await recordApi.save(contact2) diff --git a/packages/core/yarn.lock b/packages/core/yarn.lock index 043b36cbd7..c5155fb43e 100644 --- a/packages/core/yarn.lock +++ b/packages/core/yarn.lock @@ -1663,11 +1663,16 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.8.1, commander@~2.20.0: +commander@^2.8.1: version "2.20.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ== +commander@~2.20.3: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + component-emitter@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" @@ -2431,9 +2436,9 @@ growly@^1.3.0: integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= handlebars@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" - integrity sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw== + version "4.7.3" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.3.tgz#8ece2797826886cf8082d1726ff21d2a022550ee" + integrity sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg== dependencies: neo-async "^2.6.0" optimist "^0.6.1" @@ -5352,11 +5357,11 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= uglify-js@^3.1.4: - version "3.6.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" - integrity sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg== + version "3.7.7" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.7.7.tgz#21e52c7dccda80a53bf7cde69628a7e511aec9c9" + integrity sha512-FeSU+hi7ULYy6mn8PKio/tXsdSXN35lm4KgV2asx00kzrLU9Pi3oAslcJT70Jdj7PHX29gGUPOT6+lXGBbemhA== dependencies: - commander "~2.20.0" + commander "~2.20.3" source-map "~0.6.1" unicode-canonical-property-names-ecmascript@^1.0.4: diff --git a/packages/datastores/.gitignore b/packages/datastores/.gitignore new file mode 100644 index 0000000000..096746c148 --- /dev/null +++ b/packages/datastores/.gitignore @@ -0,0 +1 @@ +/node_modules/ \ No newline at end of file diff --git a/packages/materialdesign-components/src/Templates/indexDatatable.js b/packages/materialdesign-components/src/Templates/indexDatatable.js index 8c0ba95b47..f242e7d8d6 100644 --- a/packages/materialdesign-components/src/Templates/indexDatatable.js +++ b/packages/materialdesign-components/src/Templates/indexDatatable.js @@ -1,6 +1,6 @@ export default ({ indexes, helpers }) => indexes.map(i => ({ - name: `Table based on index: ${i.name} `, + name: `Table based on view: ${i.name} `, props: tableProps( i, helpers.indexSchema(i).filter(c => !excludedColumns.includes(c.name)) diff --git a/packages/materialdesign-components/src/Templates/recordForm.js b/packages/materialdesign-components/src/Templates/recordForm.js index 70354a5e4d..38ab602a8e 100644 --- a/packages/materialdesign-components/src/Templates/recordForm.js +++ b/packages/materialdesign-components/src/Templates/recordForm.js @@ -1,6 +1,6 @@ export default ({ records }) => records.map(r => ({ - name: `Form for Record: ${r.nodeKey()}`, + name: `Form for Record: ${r.nodeName()}`, props: outerContainer(r), })) diff --git a/packages/server/.gitignore b/packages/server/.gitignore index 4e5f6256f0..cf08d58354 100644 --- a/packages/server/.gitignore +++ b/packages/server/.gitignore @@ -1,3 +1,4 @@ +node_modules/ myapps/ config.js /builder/* diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock index 5475d85d62..7e65f2f2d4 100644 --- a/packages/server/yarn.lock +++ b/packages/server/yarn.lock @@ -451,9 +451,9 @@ acorn-walk@^6.0.1: integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA== acorn@^5.5.3: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== + version "5.7.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== acorn@^6.0.1: version "6.3.0"