1
0
Fork 0
mirror of synced 2024-07-01 20:41:03 +12:00

Merge pull request #209 from Budibase/bugfix/change-record-and-index

Changes a most instances of Record to Model. Less work done on Index to View conversion.
This commit is contained in:
Kevin Åberg Kultalahti 2020-04-15 09:00:20 +02:00 committed by GitHub
commit 63b1e233bf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
46 changed files with 13530 additions and 13101 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -59,7 +59,7 @@ window["##BUDIBASE_APPDEFINITION##"] = {
getShardName: "", getShardName: "",
getSortKey: "record.id", getSortKey: "record.id",
aggregateGroups: [], aggregateGroups: [],
allowedRecordNodeIds: [2], allowedModelNodeIds: [2],
nodeId: 5, nodeId: 5,
}, },
], ],
@ -79,7 +79,7 @@ window["##BUDIBASE_APPDEFINITION##"] = {
getShardName: "", getShardName: "",
getSortKey: "record.id", getSortKey: "record.id",
aggregateGroups: [], aggregateGroups: [],
allowedRecordNodeIds: [1], allowedModelNodeIds: [1],
nodeId: 4, nodeId: 4,
}, },
{ {
@ -91,7 +91,7 @@ window["##BUDIBASE_APPDEFINITION##"] = {
getShardName: "", getShardName: "",
getSortKey: "record.id", getSortKey: "record.id",
aggregateGroups: [], aggregateGroups: [],
allowedRecordNodeIds: [2], allowedModelNodeIds: [2],
nodeId: 6, nodeId: 6,
}, },
], ],

View file

@ -9,7 +9,7 @@ import {
templateApi, templateApi,
isIndex, isIndex,
canDeleteIndex, canDeleteIndex,
canDeleteRecord, canDeleteModel,
} from "components/common/core" } from "components/common/core"
export const getBackendUiStore = () => { export const getBackendUiStore = () => {
@ -107,7 +107,7 @@ export const saveBackend = async state => {
} }
} }
export const newRecord = (store, useRoot) => () => { export const newModel = (store, useRoot) => () => {
store.update(state => { store.update(state => {
state.currentNodeIsNew = true state.currentNodeIsNew = true
const shadowHierarchy = createShadowHierarchy(state.hierarchy) const shadowHierarchy = createShadowHierarchy(state.hierarchy)
@ -115,7 +115,7 @@ export const newRecord = (store, useRoot) => () => {
? shadowHierarchy ? shadowHierarchy
: getNode(shadowHierarchy, state.currentNode.nodeId) : getNode(shadowHierarchy, state.currentNode.nodeId)
state.errors = [] state.errors = []
state.currentNode = templateApi(shadowHierarchy).getNewRecordTemplate( state.currentNode = templateApi(shadowHierarchy).getNewModelTemplate(
parent, parent,
"", "",
true true
@ -196,7 +196,7 @@ export const saveCurrentNode = store => () => {
? `all_${cloned.name}s` ? `all_${cloned.name}s`
: `${cloned.parent().name}_${cloned.name}s` : `${cloned.parent().name}_${cloned.name}s`
defaultIndex.allowedRecordNodeIds = [cloned.nodeId] defaultIndex.allowedModelNodeIds = [cloned.nodeId]
} }
state.currentNodeIsNew = false state.currentNodeIsNew = false
@ -214,10 +214,10 @@ export const deleteCurrentNode = store => () => {
? state.hierarchy.children.find(node => node !== state.currentNode) ? state.hierarchy.children.find(node => node !== state.currentNode)
: nodeToDelete.parent() : nodeToDelete.parent()
const isRecord = hierarchyFunctions.isRecord(nodeToDelete) const isModel = hierarchyFunctions.isModel(nodeToDelete)
const check = isRecord const check = isModel
? canDeleteRecord(nodeToDelete) ? canDeleteModel(nodeToDelete)
: canDeleteIndex(nodeToDelete) : canDeleteIndex(nodeToDelete)
if (!check.canDelete) { if (!check.canDelete) {
@ -225,7 +225,7 @@ export const deleteCurrentNode = store => () => {
return state return state
} }
const recordOrIndexKey = isRecord ? "children" : "indexes" const recordOrIndexKey = isModel ? "children" : "indexes"
// remove the selected record or index // remove the selected record or index
const newCollection = remove( const newCollection = remove(

View file

@ -20,8 +20,6 @@ import { generate_screen_css } from "../generate_css"
import { insertCodeMetadata } from "../insertCodeMetadata" import { insertCodeMetadata } from "../insertCodeMetadata"
import { uuid } from "../uuid" import { uuid } from "../uuid"
let appname = ""
export const getStore = () => { export const getStore = () => {
const initial = { const initial = {
apps: [], apps: [],
@ -52,8 +50,8 @@ export const getStore = () => {
store.setPackage = setPackage(store, initial) store.setPackage = setPackage(store, initial)
store.newChildRecord = backendStoreActions.newRecord(store, false) store.newChildModel = backendStoreActions.newModel(store, false)
store.newRootRecord = backendStoreActions.newRecord(store, true) store.newRootModel = backendStoreActions.newModel(store, true)
store.selectExistingNode = backendStoreActions.selectExistingNode(store) store.selectExistingNode = backendStoreActions.selectExistingNode(store)
store.newChildIndex = backendStoreActions.newIndex(store, false) store.newChildIndex = backendStoreActions.newIndex(store, false)
store.newRootIndex = backendStoreActions.newIndex(store, true) store.newRootIndex = backendStoreActions.newIndex(store, true)

View file

@ -10,7 +10,7 @@ import { generateSchema } from "../../../../core/src/indexing/indexSchemaCreator
import { generate } from "shortid" import { generate } from "shortid"
export { canDeleteIndex } from "../../../../core/src/templateApi/canDeleteIndex" export { canDeleteIndex } from "../../../../core/src/templateApi/canDeleteIndex"
export { canDeleteRecord } from "../../../../core/src/templateApi/canDeleteRecord" export { canDeleteModel } from "../../../../core/src/templateApi/canDeleteModel"
export { userWithFullAccess } from "../../../../core/src/index" export { userWithFullAccess } from "../../../../core/src/index"
export { joinKey } from "../../../../core/src/common" export { joinKey } from "../../../../core/src/common"
export { getExactNodeForKey } from "../../../../core/src/templateApi/hierarchy" export { getExactNodeForKey } from "../../../../core/src/templateApi/hierarchy"
@ -65,20 +65,20 @@ export const getPotentialReverseReferenceIndexes = (hierarchy, refIndex) => {
return res return res
} }
export const getPotentialReferenceIndexes = (hierarchy, record) => export const getPotentialReferenceIndexes = (hierarchy, model) =>
pipe(hierarchy, [ pipe(hierarchy, [
hierarchyFunctions.getFlattenedHierarchy, hierarchyFunctions.getFlattenedHierarchy,
filter(hierarchyFunctions.isAncestorIndex), filter(hierarchyFunctions.isAncestorIndex),
filter( filter(
i => i =>
hierarchyFunctions.isAncestor(record)(i.parent()) || hierarchyFunctions.isAncestor(model)(i.parent()) ||
i.parent().nodeId === record.parent().nodeId || i.parent().nodeId === model.parent().nodeId ||
hierarchyFunctions.isRoot(i.parent()) hierarchyFunctions.isRoot(i.parent())
), ),
]) ])
export const isIndex = hierarchyFunctions.isIndex export const isIndex = hierarchyFunctions.isIndex
export const isRecord = hierarchyFunctions.isRecord export const isModel = hierarchyFunctions.isModel
export const nodeNameFromNodeKey = hierarchyFunctions.nodeNameFromNodeKey export const nodeNameFromNodeKey = hierarchyFunctions.nodeNameFromNodeKey
export const getDefaultTypeOptions = type => export const getDefaultTypeOptions = type =>
@ -109,7 +109,7 @@ export const getIndexNodes = hierarchy =>
export const getRecordNodes = hierarchy => export const getRecordNodes = hierarchy =>
pipe(hierarchy, [ pipe(hierarchy, [
hierarchyFunctions.getFlattenedHierarchy, hierarchyFunctions.getFlattenedHierarchy,
filter(hierarchyFunctions.isRecord), filter(hierarchyFunctions.isModel),
]) ])
export const getIndexSchema = hierarchy => index => export const getIndexSchema = hierarchy => index =>

View file

@ -1,151 +0,0 @@
<script>
import Textbox from "components/common/Textbox.svelte"
import CodeArea from "components/common/CodeArea.svelte"
import Button from "components/common/Button.svelte"
import Dropdown from "components/common/Dropdown.svelte"
import { store } from "builderStore"
import { filter, some, map, compose } from "lodash/fp"
import {
hierarchy as hierarchyFunctions,
common,
} from "../../../../core/src/"
import ErrorsBox from "components/common/ErrorsBox.svelte"
import ActionButton from "components/common/ActionButton.svelte"
const SNIPPET_EDITORS = {
MAP: "Map",
FILTER: "Filter",
SHARD: "Shard Name",
}
let index
let indexableRecords = []
let currentSnippetEditor = SNIPPET_EDITORS.MAP
const indexableRecordsFromIndex = compose(
map(node => ({
node,
isallowed:
index.allowedRecordNodeIds &&
index.allowedRecordNodeIds.some(id => node.nodeId === id),
})),
filter(hierarchyFunctions.isRecord),
filter(hierarchyFunctions.isDecendant($store.currentNode.parent())),
hierarchyFunctions.getFlattenedHierarchy
)
store.subscribe($store => {
index = $store.currentNode
indexableRecords = indexableRecordsFromIndex($store.hierarchy)
})
const toggleAllowedRecord = record => {
if (record.isallowed) {
index.allowedRecordNodeIds = index.allowedRecordNodeIds.filter(
id => id !== record.node.nodeId
)
} else {
index.allowedRecordNodeIds.push(record.node.nodeId)
}
}
</script>
<heading>
<i class="ri-eye-line button--toggled" />
<h3 class="budibase__title--3">Create / Edit View</h3>
</heading>
<form on:submit|preventDefault class="uk-form-stacked root">
<h4 class="budibase__label--big">Settings</h4>
{#if $store.errors && $store.errors.length > 0}
<ErrorsBox errors={$store.errors} />
{/if}
<div class="uk-grid-small" uk-grid>
<div class="uk-width-1-2@s">
<Textbox bind:text={index.name} label="Name" />
</div>
<div class="uk-width-1-2@s">
<Dropdown
label="View Type"
bind:selected={index.indexType}
options={['ancestor', 'reference']} />
</div>
</div>
<div class="allowed-records">
<div class="budibase__label--big">
Which models would you like to add to this view?
</div>
{#each indexableRecords as rec}
<input
class="uk-checkbox"
type="checkbox"
checked={rec.isallowed}
on:change={() => toggleAllowedRecord(rec)} />
<span class="checkbox-model-label">{rec.node.name}</span>
{/each}
</div>
<h4 class="budibase__label--big">Snippets</h4>
{#each Object.values(SNIPPET_EDITORS) as snippetType}
<span
class="snippet-selector__heading hoverable"
class:highlighted={currentSnippetEditor === snippetType}
on:click={() => (currentSnippetEditor = snippetType)}>
{snippetType}
</span>
{/each}
{#if currentSnippetEditor === SNIPPET_EDITORS.MAP}
<CodeArea bind:text={index.map} label="Map" />
{:else if currentSnippetEditor === SNIPPET_EDITORS.FILTER}
<CodeArea bind:text={index.filter} label="Filter" />
{:else if currentSnippetEditor === SNIPPET_EDITORS.SHARD}
<CodeArea bind:text={index.getShardName} label="Shard Name" />
{/if}
<ActionButton color="secondary" on:click={store.saveCurrentNode}>
Save
</ActionButton>
{#if !$store.currentNodeIsNew}
<ActionButton alert on:click={store.deleteCurrentNode}>Delete</ActionButton>
{/if}
</form>
<style>
.root {
height: 100%;
padding: 15px;
}
.allowed-records {
margin: 20px 0px;
}
.allowed-records > span {
margin-right: 30px;
}
.snippet-selector__heading {
margin-right: 20px;
opacity: 0.7;
}
.highlighted {
opacity: 1;
}
.checkbox-model-label {
text-transform: capitalize;
}
h3 {
margin: 0 0 0 10px;
}
heading {
padding: 20px 20px 0 20px;
display: flex;
align-items: center;
}
</style>

View file

@ -1,7 +1,231 @@
<script> <script>
import ModelView from "../../ModelView.svelte" import { tick } from "svelte"
import Textbox from "components/common/Textbox.svelte"
import Button from "components/common/Button.svelte"
import Select from "components/common/Select.svelte"
import ActionButton from "components/common/ActionButton.svelte"
import getIcon from "components/common/icon"
import FieldView from "../../FieldView.svelte"
import {
get,
compose,
map,
join,
filter,
some,
find,
keys,
isDate,
} from "lodash/fp"
import { store, backendUiStore } from "builderStore"
import { common, hierarchy } from "../../../../../../core/src/"
import { getNode } from "components/common/core"
import { templateApi, pipe, validate } from "components/common/core"
import ErrorsBox from "components/common/ErrorsBox.svelte"
let model
let editingField = false
let fieldToEdit
let isNewField = false
let newField
let editField
let deleteField
let onFinishedFieldEdit
let editIndex
$: parent = model && model.parent()
$: isChildModel = parent && parent.name !== "root"
$: modelExistsInHierarchy =
$store.currentNode && getNode($store.hierarchy, $store.currentNode.nodeId)
store.subscribe($store => {
model = $store.currentNode
const flattened = hierarchy.getFlattenedHierarchy($store.hierarchy)
newField = () => {
isNewField = true
fieldToEdit = templateApi($store.hierarchy).getNewField("string")
editingField = true
}
onFinishedFieldEdit = field => {
if (field) {
store.saveField(field)
}
editingField = false
}
editField = field => {
isNewField = false
fieldToEdit = field
editingField = true
}
deleteField = field => {
store.deleteField(field)
}
editIndex = index => {
store.selectExistingNode(index.nodeId)
}
})
let getTypeOptionsValueText = value => {
if (
value === Number.MAX_SAFE_INTEGER ||
value === Number.MIN_SAFE_INTEGER ||
new Date(value).getTime() === new Date(8640000000000000).getTime() ||
new Date(value).getTime() === new Date(-8640000000000000).getTime()
)
return "(any)"
if (value === null) return "(not set)"
return value
}
const nameChanged = ev => {
const pluralName = n => `${n}s`
if (model.collectionName === "") {
model.collectionName = pluralName(ev.target.value)
}
}
</script> </script>
<section> <heading>
<ModelView /> {#if !editingField}
</section> <i class="ri-list-settings-line button--toggled" />
<h3 class="budibase__title--3">Create / Edit Model</h3>
{:else}
<i class="ri-file-list-line button--toggled" />
<h3 class="budibase__title--3">Create / Edit Field</h3>
{/if}
</heading>
{#if !editingField}
<div class="padding">
<h4 class="budibase__label--big">Settings</h4>
{#if $store.errors && $store.errors.length > 0}
<ErrorsBox errors={$store.errors} />
{/if}
<form on:submit|preventDefault class="uk-form-stacked">
<Textbox label="Name" bind:text={model.name} on:change={nameChanged} />
{#if isChildModel}
<div>
<label class="uk-form-label">Parent</label>
<div class="uk-form-controls parent-name">{parent.name}</div>
</div>
{/if}
</form>
<div class="table-controls">
<span class="budibase__label--big">Fields</span>
<h4 class="hoverable new-field" on:click={newField}>Add new field</h4>
</div>
<table class="uk-table fields-table budibase__table">
<thead>
<tr>
<th>Edit</th>
<th>Name</th>
<th>Type</th>
<th>Values</th>
<th />
</tr>
</thead>
<tbody>
{#each model ? model.fields : [] as field}
<tr>
<td>
<i class="ri-more-line" on:click={() => editField(field)} />
</td>
<td>
<div>{field.name}</div>
</td>
<td>{field.type}</td>
<td>{field.typeOptions.values || ''}</td>
<td>
<i
class="ri-delete-bin-6-line hoverable"
on:click={() => deleteField(field)} />
</td>
</tr>
{/each}
</tbody>
</table>
<div class="uk-margin">
<ActionButton color="secondary" on:click={store.saveCurrentNode}>
Save
</ActionButton>
{#if modelExistsInHierarchy}
<ActionButton color="primary" on:click={store.newChildModel}>
Create Child Model on {model.name}
</ActionButton>
<ActionButton
color="primary"
on:click={async () => {
backendUiStore.actions.modals.show('VIEW')
await tick()
store.newChildIndex()
}}>
Create Child View on {model.name}
</ActionButton>
<ActionButton alert on:click={store.deleteCurrentNode}>
Delete
</ActionButton>
{/if}
</div>
</div>
{:else}
<FieldView
field={fieldToEdit}
onFinished={onFinishedFieldEdit}
allFields={model.fields}
store={$store} />
{/if}
<style>
.padding {
padding: 20px;
}
.new-field {
font-size: 16px;
font-weight: bold;
color: var(--button-text);
}
.fields-table {
margin: 1rem 1rem 0rem 0rem;
border-collapse: collapse;
}
tbody > tr:hover {
background-color: var(--primary10);
}
.table-controls {
display: flex;
justify-content: space-between;
align-items: center;
}
.ri-more-line:hover {
cursor: pointer;
}
heading {
padding: 20px 20px 0 20px;
display: flex;
align-items: center;
}
h3 {
margin: 0 0 0 10px;
}
.parent-name {
font-weight: bold;
}
</style>

View file

@ -1,7 +1,151 @@
<script> <script>
import IndexView from "../../IndexView.svelte" import Textbox from "components/common/Textbox.svelte"
import CodeArea from "components/common/CodeArea.svelte"
import Button from "components/common/Button.svelte"
import Dropdown from "components/common/Dropdown.svelte"
import { store } from "builderStore"
import { filter, some, map, compose } from "lodash/fp"
import {
hierarchy as hierarchyFunctions,
common,
} from "../../../../../../core/src/"
import ErrorsBox from "components/common/ErrorsBox.svelte"
import ActionButton from "components/common/ActionButton.svelte"
const SNIPPET_EDITORS = {
MAP: "Map",
FILTER: "Filter",
SHARD: "Shard Name",
}
let view
let indexableModels = []
let currentSnippetEditor = SNIPPET_EDITORS.MAP
const indexableModelsFromIndex = compose(
map(node => ({
node,
isallowed:
view.allowedModelNodeIds &&
view.allowedModelNodeIds.some(id => node.nodeId === id),
})),
filter(hierarchyFunctions.isModel),
filter(hierarchyFunctions.isDecendant($store.currentNode.parent())),
hierarchyFunctions.getFlattenedHierarchy
)
store.subscribe($store => {
view = $store.currentNode
indexableModels = indexableModelsFromIndex($store.hierarchy)
})
const toggleAllowedModel = model => {
if (model.isallowed) {
view.allowedModelNodeIds = view.allowedModelNodeIds.filter(
id => id !== model.node.nodeId
)
} else {
view.allowedModelNodeIds.push(model.node.nodeId)
}
}
</script> </script>
<section> <heading>
<IndexView /> <i class="ri-eye-line button--toggled" />
</section> <h3 class="budibase__title--3">Create / Edit View</h3>
</heading>
<form on:submit|preventDefault class="uk-form-stacked root">
<h4 class="budibase__label--big">Settings</h4>
{#if $store.errors && $store.errors.length > 0}
<ErrorsBox errors={$store.errors} />
{/if}
<div class="uk-grid-small" uk-grid>
<div class="uk-width-1-2@s">
<Textbox bind:text={view.name} label="Name" />
</div>
<div class="uk-width-1-2@s">
<Dropdown
label="View Type"
bind:selected={view.indexType}
options={['ancestor', 'reference']} />
</div>
</div>
<div class="allowed-records">
<div class="budibase__label--big">
Which models would you like to add to this view?
</div>
{#each indexableModels as model}
<input
class="uk-checkbox"
type="checkbox"
checked={model.isallowed}
on:change={() => toggleAllowedModel(model)} />
<span class="checkbox-model-label">{model.node.name}</span>
{/each}
</div>
<h4 class="budibase__label--big">Snippets</h4>
{#each Object.values(SNIPPET_EDITORS) as snippetType}
<span
class="snippet-selector__heading hoverable"
class:highlighted={currentSnippetEditor === snippetType}
on:click={() => (currentSnippetEditor = snippetType)}>
{snippetType}
</span>
{/each}
{#if currentSnippetEditor === SNIPPET_EDITORS.MAP}
<CodeArea bind:text={view.map} label="Map" />
{:else if currentSnippetEditor === SNIPPET_EDITORS.FILTER}
<CodeArea bind:text={view.filter} label="Filter" />
{:else if currentSnippetEditor === SNIPPET_EDITORS.SHARD}
<CodeArea bind:text={view.getShardName} label="Shard Name" />
{/if}
<ActionButton color="secondary" on:click={store.saveCurrentNode}>
Save
</ActionButton>
{#if !$store.currentNodeIsNew}
<ActionButton alert on:click={store.deleteCurrentNode}>Delete</ActionButton>
{/if}
</form>
<style>
.root {
height: 100%;
padding: 15px;
}
.allowed-records {
margin: 20px 0px;
}
.allowed-records > span {
margin-right: 30px;
}
.snippet-selector__heading {
margin-right: 20px;
opacity: 0.7;
}
.highlighted {
opacity: 1;
}
.checkbox-model-label {
text-transform: capitalize;
}
h3 {
margin: 0 0 0 10px;
}
heading {
padding: 20px 20px 0 20px;
display: flex;
align-items: center;
}
</style>

View file

@ -1,240 +0,0 @@
<script>
import { tick } from "svelte"
import Textbox from "components/common/Textbox.svelte"
import Button from "components/common/Button.svelte"
import Select from "components/common/Select.svelte"
import ActionButton from "components/common/ActionButton.svelte"
import getIcon from "components/common/icon"
import FieldView from "./FieldView.svelte"
import {
get,
compose,
map,
join,
filter,
some,
find,
keys,
isDate,
} from "lodash/fp"
import { store, backendUiStore } from "builderStore"
import { common, hierarchy } from "../../../../core/src/"
import { getNode } from "components/common/core"
import { templateApi, pipe, validate } from "components/common/core"
import ErrorsBox from "components/common/ErrorsBox.svelte"
let record
let getIndexAllowedRecords
let editingField = false
let fieldToEdit
let isNewField = false
let newField
let editField
let deleteField
let onFinishedFieldEdit
let editIndex
$: models = $store.hierarchy.children
$: parent = record && record.parent()
$: isChildModel = parent && parent.name !== "root"
$: modelExistsInHierarchy =
$store.currentNode && getNode($store.hierarchy, $store.currentNode.nodeId)
store.subscribe($store => {
record = $store.currentNode
const flattened = hierarchy.getFlattenedHierarchy($store.hierarchy)
getIndexAllowedRecords = compose(
join(", "),
map(id => flattened.find(n => n.nodeId === id).name),
filter(id => flattened.some(n => n.nodeId === id)),
get("allowedRecordNodeIds")
)
newField = () => {
isNewField = true
fieldToEdit = templateApi($store.hierarchy).getNewField("string")
editingField = true
}
onFinishedFieldEdit = field => {
if (field) {
store.saveField(field)
}
editingField = false
}
editField = field => {
isNewField = false
fieldToEdit = field
editingField = true
}
deleteField = field => {
store.deleteField(field)
}
editIndex = index => {
store.selectExistingNode(index.nodeId)
}
})
let getTypeOptionsValueText = value => {
if (
value === Number.MAX_SAFE_INTEGER ||
value === Number.MIN_SAFE_INTEGER ||
new Date(value).getTime() === new Date(8640000000000000).getTime() ||
new Date(value).getTime() === new Date(-8640000000000000).getTime()
)
return "(any)"
if (value === null) return "(not set)"
return value
}
const nameChanged = ev => {
const pluralName = n => `${n}s`
if (record.collectionName === "") {
record.collectionName = pluralName(ev.target.value)
}
}
</script>
<heading>
{#if !editingField}
<i class="ri-list-settings-line button--toggled" />
<h3 class="budibase__title--3">Create / Edit Model</h3>
{:else}
<i class="ri-file-list-line button--toggled" />
<h3 class="budibase__title--3">Create / Edit Field</h3>
{/if}
</heading>
{#if !editingField}
<div class="padding">
<h4 class="budibase__label--big">Settings</h4>
{#if $store.errors && $store.errors.length > 0}
<ErrorsBox errors={$store.errors} />
{/if}
<form on:submit|preventDefault class="uk-form-stacked">
<Textbox label="Name" bind:text={record.name} on:change={nameChanged} />
{#if isChildModel}
<div>
<label class="uk-form-label">Parent</label>
<div class="uk-form-controls parent-name">{parent.name}</div>
</div>
{/if}
</form>
<div class="table-controls">
<span class="budibase__label--big">Fields</span>
<h4 class="hoverable new-field" on:click={newField}>Add new field</h4>
</div>
<table class="uk-table fields-table budibase__table">
<thead>
<tr>
<th>Edit</th>
<th>Name</th>
<th>Type</th>
<th>Values</th>
<th />
</tr>
</thead>
<tbody>
{#each record ? record.fields : [] as field}
<tr>
<td>
<i class="ri-more-line" on:click={() => editField(field)} />
</td>
<td>
<div>{field.name}</div>
</td>
<td>{field.type}</td>
<td>{field.typeOptions.values || ''}</td>
<td>
<i
class="ri-delete-bin-6-line hoverable"
on:click={() => deleteField(field)} />
</td>
</tr>
{/each}
</tbody>
</table>
<div class="uk-margin">
<ActionButton color="secondary" on:click={store.saveCurrentNode}>
Save
</ActionButton>
{#if modelExistsInHierarchy}
<ActionButton color="primary" on:click={store.newChildRecord}>
Create Child Model on {record.name}
</ActionButton>
<ActionButton
color="primary"
on:click={async () => {
backendUiStore.actions.modals.show('VIEW')
await tick()
store.newChildIndex()
}}>
Create Child View on {record.name}
</ActionButton>
<ActionButton alert on:click={store.deleteCurrentNode}>
Delete
</ActionButton>
{/if}
</div>
</div>
{:else}
<FieldView
field={fieldToEdit}
onFinished={onFinishedFieldEdit}
allFields={record.fields}
store={$store} />
{/if}
<style>
.padding {
padding: 20px;
}
.new-field {
font-size: 16px;
font-weight: bold;
color: var(--button-text);
}
.fields-table {
margin: 1rem 1rem 0rem 0rem;
border-collapse: collapse;
}
tbody > tr:hover {
background-color: var(--primary10);
}
.table-controls {
display: flex;
justify-content: space-between;
align-items: center;
}
.ri-more-line:hover {
cursor: pointer;
}
heading {
padding: 20px 20px 0 20px;
display: flex;
align-items: center;
}
h3 {
margin: 0 0 0 10px;
}
.parent-name {
font-weight: bold;
}
</style>

View file

@ -18,7 +18,7 @@
const ICON_MAP = { const ICON_MAP = {
index: "ri-eye-line", index: "ri-eye-line",
record: "ri-list-settings-line", model: "ri-list-settings-line",
} }
store.subscribe(state => { store.subscribe(state => {
@ -45,7 +45,7 @@
<div <div
on:click={() => selectHierarchyItem(node)} on:click={() => selectHierarchyItem(node)}
class="budibase__nav-item hierarchy-item" class="budibase__nav-item hierarchy-item"
class:capitalized={type === 'record'} class:capitalized={type === 'model'}
style="padding-left: {20 + level * 20}px" style="padding-left: {20 + level * 20}px"
class:selected={navActive}> class:selected={navActive}>
<i class={ICON_MAP[type]} /> <i class={ICON_MAP[type]} />
@ -53,7 +53,7 @@
</div> </div>
{#if node.children} {#if node.children}
{#each node.children as child} {#each node.children as child}
<svelte:self node={child} level={level + 1} type="record" /> <svelte:self node={child} level={level + 1} type="model" />
{/each} {/each}
{/if} {/if}
{#if node.indexes} {#if node.indexes}

View file

@ -14,9 +14,9 @@
function newModel() { function newModel() {
if ($store.currentNode) { if ($store.currentNode) {
store.newChildRecord() store.newChildModel()
} else { } else {
store.newRootRecord() store.newRootModel()
} }
open( open(
CreateEditModelModal, CreateEditModelModal,
@ -57,8 +57,8 @@
</div> </div>
<div class="hierarchy-items-container"> <div class="hierarchy-items-container">
{#each $store.hierarchy.children as record} {#each $store.hierarchy.children as model}
<HierarchyRow node={record} type="record" /> <HierarchyRow node={model} type="model" />
{/each} {/each}
{#each $store.hierarchy.indexes as index} {#each $store.hierarchy.indexes as index}

View file

@ -3,7 +3,7 @@ import { permission } from "./permissions"
import { import {
getFlattenedHierarchy, getFlattenedHierarchy,
isIndex, isIndex,
isRecord, isModel,
} from "../templateApi/hierarchy" } from "../templateApi/hierarchy"
import { $ } from "../common" import { $ } from "../common"
@ -11,7 +11,7 @@ export const generateFullPermissions = app => {
const allNodes = getFlattenedHierarchy(app.hierarchy) const allNodes = getFlattenedHierarchy(app.hierarchy)
const accessLevel = { permissions: [] } const accessLevel = { permissions: [] }
const recordNodes = $(allNodes, [filter(isRecord)]) const recordNodes = $(allNodes, [filter(isModel)])
for (const n of recordNodes) { for (const n of recordNodes) {
permission.createRecord.add(n.nodeKey(), accessLevel) permission.createRecord.add(n.nodeKey(), accessLevel)

View file

@ -24,7 +24,7 @@ import { alwaysAuthorized } from "./permissions"
const isAllowedType = t => $(permissionTypes, [values, includes(t)]) const isAllowedType = t => $(permissionTypes, [values, includes(t)])
const isRecordOrIndexType = t => const isModelOrIndexType = t =>
some(p => p === t)([ some(p => p === t)([
permissionTypes.CREATE_RECORD, permissionTypes.CREATE_RECORD,
permissionTypes.UPDATE_RECORD, permissionTypes.UPDATE_RECORD,
@ -42,7 +42,7 @@ const permissionRules = app => [
"nodeKey", "nodeKey",
"record and index permissions must include a valid nodeKey", "record and index permissions must include a valid nodeKey",
p => p =>
!isRecordOrIndexType(p.type) || !isModelOrIndexType(p.type) ||
isSomething(getNode(app.hierarchy, p.nodeKey)) isSomething(getNode(app.hierarchy, p.nodeKey))
), ),
] ]

View file

@ -5,7 +5,7 @@ import {
getRecordNodeById, getRecordNodeById,
getNode, getNode,
isIndex, isIndex,
isRecord, isModel,
getActualKeyOfParent, getActualKeyOfParent,
getAllowedRecordNodesForIndex, getAllowedRecordNodesForIndex,
fieldReversesReferenceToIndex, fieldReversesReferenceToIndex,
@ -62,7 +62,7 @@ const buildReverseReferenceIndex = async (app, indexNode) => {
getFlattenedHierarchy, getFlattenedHierarchy,
filter( filter(
n => n =>
isRecord(n) && some(fieldReversesReferenceToIndex(indexNode))(n.fields) isModel(n) && some(fieldReversesReferenceToIndex(indexNode))(n.fields)
), ),
]) ])
@ -138,6 +138,6 @@ const buildHeirarchalIndex = async (app, indexNode) => {
} }
const recordNodeApplies = indexNode => recordNode => const recordNodeApplies = indexNode => recordNode =>
includes(recordNode.nodeId)(indexNode.allowedRecordNodeIds) includes(recordNode.nodeId)(indexNode.allowedModelNodeIds)
export default buildIndex export default buildIndex

View file

@ -23,7 +23,7 @@ import {
getRecordNodeId, getRecordNodeId,
getExactNodeForKey, getExactNodeForKey,
recordNodeIdIsAllowed, recordNodeIdIsAllowed,
isRecord, isModel,
isGlobalIndex, isGlobalIndex,
} from "../templateApi/hierarchy" } from "../templateApi/hierarchy"
import { indexTypes } from "../templateApi/indexes" import { indexTypes } from "../templateApi/indexes"
@ -57,7 +57,7 @@ export const getRelevantAncestorIndexes = (hierarchy, record) => {
return acc return acc
} }
if (!isRecord(nodeMatch) || nodeMatch.indexes.length === 0) { if (!isModel(nodeMatch) || nodeMatch.indexes.length === 0) {
return acc return acc
} }
@ -65,8 +65,8 @@ export const getRelevantAncestorIndexes = (hierarchy, record) => {
filter( filter(
i => i =>
i.indexType === indexTypes.ancestor && i.indexType === indexTypes.ancestor &&
(i.allowedRecordNodeIds.length === 0 || (i.allowedModelNodeIds.length === 0 ||
includes(nodeId)(i.allowedRecordNodeIds)) includes(nodeId)(i.allowedModelNodeIds))
), ),
]) ])

View file

@ -4,7 +4,7 @@ import { _loadFromInfo } from "./load"
import { $, joinKey } from "../common" import { $, joinKey } from "../common"
import { import {
getFlattenedHierarchy, getFlattenedHierarchy,
isRecord, isModel,
getNode, getNode,
isTopLevelRecord, isTopLevelRecord,
fieldReversesReferenceToNode, fieldReversesReferenceToNode,
@ -53,7 +53,7 @@ const initialiseAncestorIndexes = async (app, recordInfo) => {
const initialiseReverseReferenceIndexes = async (app, recordInfo) => { const initialiseReverseReferenceIndexes = async (app, recordInfo) => {
const indexNodes = $( const indexNodes = $(
fieldsThatReferenceThisRecord(app, recordInfo.recordNode), fieldsThatReferenceThisModel(app, recordInfo.recordNode),
[ [
map(f => map(f =>
$(f.typeOptions.reverseIndexNodeKeys, [ $(f.typeOptions.reverseIndexNodeKeys, [
@ -69,10 +69,10 @@ const initialiseReverseReferenceIndexes = async (app, recordInfo) => {
} }
} }
const fieldsThatReferenceThisRecord = (app, recordNode) => const fieldsThatReferenceThisModel = (app, recordNode) =>
$(app.hierarchy, [ $(app.hierarchy, [
getFlattenedHierarchy, getFlattenedHierarchy,
filter(isRecord), filter(isModel),
map(n => n.fields), map(n => n.fields),
flatten, flatten,
filter(fieldReversesReferenceToNode(recordNode)), filter(fieldReversesReferenceToNode(recordNode)),

View file

@ -4,7 +4,7 @@ import { _loadFromInfo } from "./load"
import { apiWrapper, events, $, joinKey } from "../common" import { apiWrapper, events, $, joinKey } from "../common"
import { import {
getFlattenedHierarchy, getFlattenedHierarchy,
isRecord, isModel,
getNode, getNode,
fieldReversesReferenceToNode, fieldReversesReferenceToNode,
} from "../templateApi/hierarchy" } from "../templateApi/hierarchy"

View file

@ -2,7 +2,7 @@ import {
findRoot, findRoot,
getFlattenedHierarchy, getFlattenedHierarchy,
fieldReversesReferenceToIndex, fieldReversesReferenceToIndex,
isRecord, isModel,
} from "./hierarchy" } from "./hierarchy"
import { $ } from "../common" import { $ } from "../common"
import { map, filter, reduce } from "lodash/fp" import { map, filter, reduce } from "lodash/fp"
@ -11,7 +11,7 @@ export const canDeleteIndex = indexNode => {
const flatHierarchy = $(indexNode, [findRoot, getFlattenedHierarchy]) const flatHierarchy = $(indexNode, [findRoot, getFlattenedHierarchy])
const reverseIndexes = $(flatHierarchy, [ const reverseIndexes = $(flatHierarchy, [
filter(isRecord), filter(isModel),
reduce((obj, r) => { reduce((obj, r) => {
for (let field of r.fields) { for (let field of r.fields) {
if (fieldReversesReferenceToIndex(indexNode)(field)) { if (fieldReversesReferenceToIndex(indexNode)(field)) {
@ -27,7 +27,7 @@ export const canDeleteIndex = indexNode => {
]) ])
const lookupIndexes = $(flatHierarchy, [ const lookupIndexes = $(flatHierarchy, [
filter(isRecord), filter(isModel),
reduce((obj, r) => { reduce((obj, r) => {
for (let field of r.fields) { for (let field of r.fields) {
if ( if (

View file

@ -2,17 +2,17 @@ import {
findRoot, findRoot,
getFlattenedHierarchy, getFlattenedHierarchy,
fieldReversesReferenceToIndex, fieldReversesReferenceToIndex,
isRecord, isModel,
isAncestorIndex, isAncestorIndex,
isAncestor, isAncestor,
} from "./hierarchy" } from "./hierarchy"
import { $ } from "../common" import { $ } from "../common"
import { map, filter, includes } from "lodash/fp" import { map, filter, includes } from "lodash/fp"
export const canDeleteRecord = recordNode => { export const canDeleteModel = modelNode => {
const flatHierarchy = $(recordNode, [findRoot, getFlattenedHierarchy]) const flatHierarchy = $(modelNode, [findRoot, getFlattenedHierarchy])
const ancestors = $(flatHierarchy, [filter(isAncestor(recordNode))]) const ancestors = $(flatHierarchy, [filter(isAncestor(modelNode))])
const belongsToAncestor = i => ancestors.includes(i.parent()) const belongsToAncestor = i => ancestors.includes(i.parent())
@ -22,11 +22,11 @@ export const canDeleteRecord = recordNode => {
i => i =>
isAncestorIndex(i) && isAncestorIndex(i) &&
belongsToAncestor(i) && belongsToAncestor(i) &&
includes(node.nodeId)(i.allowedRecordNodeIds) includes(node.nodeId)(i.allowedModelNodeIds)
), ),
map( map(
i => i =>
`index "${i.name}" indexes this record. Please remove the record from the index, or delete the index` `index "${i.name}" indexes this model. Please remove the model from the index, or delete the index`
), ),
]) ])
@ -39,7 +39,7 @@ export const canDeleteRecord = recordNode => {
return errorsThisNode return errorsThisNode
} }
const errors = errorsForNode(recordNode) const errors = errorsForNode(modelNode)
return { errors, canDelete: errors.length === 0 } return { errors, canDelete: errors.length === 0 }
} }

View file

@ -13,7 +13,7 @@ import {
isRoot, isRoot,
isSingleRecord, isSingleRecord,
isCollectionRecord, isCollectionRecord,
isRecord, isModel,
isaggregateGroup, isaggregateGroup,
getFlattenedHierarchy, getFlattenedHierarchy,
} from "./hierarchy" } from "./hierarchy"
@ -34,7 +34,7 @@ const pathRegxMaker = node => () =>
const nodeKeyMaker = node => () => const nodeKeyMaker = node => () =>
switchCase( switchCase(
[ [
n => isRecord(n) && !isSingleRecord(n), n => isModel(n) && !isSingleRecord(n),
n => n =>
joinKey( joinKey(
node.parent().nodeKey(), node.parent().nodeKey(),
@ -49,7 +49,7 @@ const nodeKeyMaker = node => () =>
)(node) )(node)
const nodeNameMaker = node => () => const nodeNameMaker = node => () =>
isRoot(node) isRoot(node)
? "/" ? "/"
: joinKey(node.parent().nodeName(), node.name) : joinKey(node.parent().nodeName(), node.name)
@ -58,7 +58,7 @@ const validate = parent => node => {
isIndex(node) && isIndex(node) &&
isSomething(parent) && isSomething(parent) &&
!isRoot(parent) && !isRoot(parent) &&
!isRecord(parent) !isModel(parent)
) { ) {
throw new BadRequestError(createNodeErrors.indexParentMustBeRecordOrRoot) throw new BadRequestError(createNodeErrors.indexParentMustBeRecordOrRoot)
} }
@ -103,13 +103,13 @@ const addToParent = obj => {
parent.children.push(obj) parent.children.push(obj)
} }
if (isRecord(obj)) { if (isModel(obj)) {
const defaultIndex = find( const defaultIndex = find(
parent.indexes, parent.indexes,
i => i.name === `${parent.name}_index` i => i.name === `${parent.name}_index`
) )
if (defaultIndex) { if (defaultIndex) {
defaultIndex.allowedRecordNodeIds.push(obj.nodeId) defaultIndex.allowedModelNodeIds.push(obj.nodeId)
} }
} }
} }
@ -165,7 +165,7 @@ export const getNewRootLevel = () =>
nodeId: 0, nodeId: 0,
}) })
const _getNewRecordTemplate = (parent, name, createDefaultIndex, isSingle) => { const _getNewModelTemplate = (parent, name, createDefaultIndex, isSingle) => {
const nodeId = getNodeId(parent) const nodeId = getNodeId(parent)
const node = constructNode(parent, { const node = constructNode(parent, {
name, name,
@ -175,7 +175,7 @@ const _getNewRecordTemplate = (parent, name, createDefaultIndex, isSingle) => {
validationRules: [], validationRules: [],
nodeId: nodeId, nodeId: nodeId,
indexes: [], indexes: [],
estimatedRecordCount: isRecord(parent) ? 500 : 1000000, estimatedRecordCount: isModel(parent) ? 500 : 1000000,
collectionName: (nodeId || "").toString(), collectionName: (nodeId || "").toString(),
isSingle, isSingle,
}) })
@ -183,20 +183,20 @@ const _getNewRecordTemplate = (parent, name, createDefaultIndex, isSingle) => {
if (createDefaultIndex) { if (createDefaultIndex) {
const defaultIndex = getNewIndexTemplate(parent) const defaultIndex = getNewIndexTemplate(parent)
defaultIndex.name = `${name}_index` defaultIndex.name = `${name}_index`
defaultIndex.allowedRecordNodeIds.push(node.nodeId) defaultIndex.allowedModelNodeIds.push(node.nodeId)
} }
return node return node
} }
export const getNewRecordTemplate = ( export const getNewModelTemplate = (
parent, parent,
name = "", name = "",
createDefaultIndex = true createDefaultIndex = true
) => _getNewRecordTemplate(parent, name, createDefaultIndex, false) ) => _getNewModelTemplate(parent, name, createDefaultIndex, false)
export const getNewSingleRecordTemplate = parent => export const getNewSingleRecordTemplate = parent =>
_getNewRecordTemplate(parent, "", false, true) _getNewModelTemplate(parent, "", false, true)
export const getNewIndexTemplate = (parent, type = "ancestor") => export const getNewIndexTemplate = (parent, type = "ancestor") =>
constructNode(parent, { constructNode(parent, {
@ -208,7 +208,7 @@ export const getNewIndexTemplate = (parent, type = "ancestor") =>
getShardName: "", getShardName: "",
getSortKey: "record.id", getSortKey: "record.id",
aggregateGroups: [], aggregateGroups: [],
allowedRecordNodeIds: [], allowedModelNodeIds: [],
nodeId: getNodeId(parent), nodeId: getNodeId(parent),
}) })
@ -233,7 +233,7 @@ export const getNewAggregateTemplate = set => {
export default { export default {
getNewRootLevel, getNewRootLevel,
getNewRecordTemplate, getNewModelTemplate,
getNewIndexTemplate, getNewIndexTemplate,
createNodeErrors, createNodeErrors,
constructHierarchy, constructHierarchy,

View file

@ -1,8 +1,8 @@
import {} from "../templateApi/heirarchy" import { } from "../templateApi/heirarchy"
export const canDelete = () => { export const canDelete = () => {
/* /*
it must not exist on any index.allowedRecordNodeIds it must not exist on any index.allowedModelNodeIds
it must not exist on and reference type fields it must not exist on and reference type fields
these rules should apply to any child nodes , which will also be deleted these rules should apply to any child nodes , which will also be deleted
*/ */

View file

@ -1,6 +1,6 @@
import { import {
getFlattenedHierarchy, getFlattenedHierarchy,
isRecord, isModel,
isIndex, isIndex,
isAncestor, isAncestor,
} from "./hierarchy" } from "./hierarchy"
@ -48,7 +48,7 @@ const changeItem = (type, oldNode, newNode) => ({
const findCreatedRecords = (oldHierarchyFlat, newHierarchyFlat) => { const findCreatedRecords = (oldHierarchyFlat, newHierarchyFlat) => {
const allCreated = $(newHierarchyFlat, [ const allCreated = $(newHierarchyFlat, [
filter(isRecord), filter(isModel),
filter(nodeDoesNotExistIn(oldHierarchyFlat)), filter(nodeDoesNotExistIn(oldHierarchyFlat)),
map(n => changeItem(HierarchyChangeTypes.recordCreated, null, n)), map(n => changeItem(HierarchyChangeTypes.recordCreated, null, n)),
]) ])
@ -60,7 +60,7 @@ const findCreatedRecords = (oldHierarchyFlat, newHierarchyFlat) => {
const findDeletedRecords = (oldHierarchyFlat, newHierarchyFlat) => { const findDeletedRecords = (oldHierarchyFlat, newHierarchyFlat) => {
const allDeleted = $(oldHierarchyFlat, [ const allDeleted = $(oldHierarchyFlat, [
filter(isRecord), filter(isModel),
filter(nodeDoesNotExistIn(newHierarchyFlat)), filter(nodeDoesNotExistIn(newHierarchyFlat)),
map(n => changeItem(HierarchyChangeTypes.recordDeleted, n, null)), map(n => changeItem(HierarchyChangeTypes.recordDeleted, n, null)),
]) ])
@ -72,7 +72,7 @@ const findDeletedRecords = (oldHierarchyFlat, newHierarchyFlat) => {
const findRenamedRecords = (oldHierarchyFlat, newHierarchyFlat) => const findRenamedRecords = (oldHierarchyFlat, newHierarchyFlat) =>
$(oldHierarchyFlat, [ $(oldHierarchyFlat, [
filter(isRecord), filter(isModel),
filter(nodeExistsIn(newHierarchyFlat)), filter(nodeExistsIn(newHierarchyFlat)),
filter( filter(
nodeChanged( nodeChanged(
@ -91,7 +91,7 @@ const findRenamedRecords = (oldHierarchyFlat, newHierarchyFlat) =>
const findRecordsWithFieldsChanged = (oldHierarchyFlat, newHierarchyFlat) => const findRecordsWithFieldsChanged = (oldHierarchyFlat, newHierarchyFlat) =>
$(oldHierarchyFlat, [ $(oldHierarchyFlat, [
filter(isRecord), filter(isModel),
filter(nodeExistsIn(newHierarchyFlat)), filter(nodeExistsIn(newHierarchyFlat)),
filter(hasDifferentFields(newHierarchyFlat)), filter(hasDifferentFields(newHierarchyFlat)),
map(n => map(n =>
@ -108,7 +108,7 @@ const findRecordsWithEstimatedRecordTypeChanged = (
newHierarchyFlat newHierarchyFlat
) => ) =>
$(oldHierarchyFlat, [ $(oldHierarchyFlat, [
filter(isRecord), filter(isModel),
filter(nodeExistsIn(newHierarchyFlat)), filter(nodeExistsIn(newHierarchyFlat)),
filter( filter(
nodeChanged( nodeChanged(
@ -187,7 +187,7 @@ const indexHasChanged = (_new, old) =>
_new.map !== old.map || _new.map !== old.map ||
_new.filter !== old.filter || _new.filter !== old.filter ||
_new.getShardName !== old.getShardName || _new.getShardName !== old.getShardName ||
difference(_new.allowedRecordNodeIds)(old.allowedRecordNodeIds).length > 0 difference(_new.allowedModelNodeIds)(old.allowedModelNodeIds).length > 0
const isFieldSame = f1 => f2 => f1.name === f2.name && f1.type === f2.type const isFieldSame = f1 => f2 => f1.name === f2.name && f1.type === f2.type

View file

@ -160,18 +160,18 @@ export const getRecordNodeIdFromId = recordId =>
export const getRecordNodeById = (hierarchy, recordId) => export const getRecordNodeById = (hierarchy, recordId) =>
$(hierarchy, [ $(hierarchy, [
getFlattenedHierarchy, getFlattenedHierarchy,
find(n => isRecord(n) && n.nodeId === getRecordNodeIdFromId(recordId)), find(n => isModel(n) && n.nodeId === getRecordNodeIdFromId(recordId)),
]) ])
export const recordNodeIdIsAllowed = indexNode => nodeId => export const recordNodeIdIsAllowed = indexNode => nodeId =>
indexNode.allowedRecordNodeIds.length === 0 || indexNode.allowedModelNodeIds.length === 0 ||
includes(nodeId)(indexNode.allowedRecordNodeIds) includes(nodeId)(indexNode.allowedModelNodeIds)
export const recordNodeIsAllowed = indexNode => recordNode => export const recordNodeIsAllowed = indexNode => recordNode =>
recordNodeIdIsAllowed(indexNode)(recordNode.nodeId) recordNodeIdIsAllowed(indexNode)(recordNode.nodeId)
export const getAllowedRecordNodesForIndex = (appHierarchy, indexNode) => { export const getAllowedRecordNodesForIndex = (appHierarchy, indexNode) => {
const recordNodes = $(appHierarchy, [getFlattenedHierarchy, filter(isRecord)]) const recordNodes = $(appHierarchy, [getFlattenedHierarchy, filter(isModel)])
if (isGlobalIndex(indexNode)) { if (isGlobalIndex(indexNode)) {
return $(recordNodes, [filter(recordNodeIsAllowed(indexNode))]) return $(recordNodes, [filter(recordNodeIsAllowed(indexNode))])
@ -213,9 +213,9 @@ export const getNodeFromNodeKeyHash = hierarchy => hash =>
find(n => getHashCode(n.nodeKey()) === hash), find(n => getHashCode(n.nodeKey()) === hash),
]) ])
export const isRecord = node => isSomething(node) && node.type === "record" export const isModel = node => isSomething(node) && node.type === "record"
export const isSingleRecord = node => isRecord(node) && node.isSingle export const isSingleRecord = node => isModel(node) && node.isSingle
export const isCollectionRecord = node => isRecord(node) && !node.isSingle export const isCollectionRecord = node => isModel(node) && !node.isSingle
export const isIndex = node => isSomething(node) && node.type === "index" export const isIndex = node => isSomething(node) && node.type === "index"
export const isaggregateGroup = node => export const isaggregateGroup = node =>
isSomething(node) && node.type === "aggregateGroup" isSomething(node) && node.type === "aggregateGroup"
@ -223,13 +223,13 @@ export const isShardedIndex = node =>
isIndex(node) && isNonEmptyString(node.getShardName) isIndex(node) && isNonEmptyString(node.getShardName)
export const isRoot = node => isSomething(node) && node.isRoot() export const isRoot = node => isSomething(node) && node.isRoot()
export const findRoot = node => (isRoot(node) ? node : findRoot(node.parent())) export const findRoot = node => (isRoot(node) ? node : findRoot(node.parent()))
export const isDecendantOfARecord = hasMatchingAncestor(isRecord) export const isDecendantOfARecord = hasMatchingAncestor(isModel)
export const isGlobalIndex = node => isIndex(node) && isRoot(node.parent()) export const isGlobalIndex = node => isIndex(node) && isRoot(node.parent())
export const isReferenceIndex = node => export const isReferenceIndex = node =>
isIndex(node) && node.indexType === indexTypes.reference isIndex(node) && node.indexType === indexTypes.reference
export const isAncestorIndex = node => export const isAncestorIndex = node =>
isIndex(node) && node.indexType === indexTypes.ancestor isIndex(node) && node.indexType === indexTypes.ancestor
export const isTopLevelRecord = node => isRoot(node.parent()) && isRecord(node) export const isTopLevelRecord = node => isRoot(node.parent()) && isModel(node)
export const isTopLevelIndex = node => isRoot(node.parent()) && isIndex(node) export const isTopLevelIndex = node => isRoot(node.parent()) && isIndex(node)
export const getCollectionKey = recordKey => export const getCollectionKey = recordKey =>
$(recordKey, [splitKey, parts => joinKey(parts.slice(0, parts.length - 1))]) $(recordKey, [splitKey, parts => joinKey(parts.slice(0, parts.length - 1))])
@ -271,7 +271,7 @@ export default {
recordNodeIsAllowed, recordNodeIsAllowed,
getAllowedRecordNodesForIndex, getAllowedRecordNodesForIndex,
getNodeFromNodeKeyHash, getNodeFromNodeKeyHash,
isRecord, isModel,
isCollectionRecord, isCollectionRecord,
isIndex, isIndex,
isaggregateGroup, isaggregateGroup,

View file

@ -1,6 +1,6 @@
import { import {
getNewRootLevel, getNewRootLevel,
getNewRecordTemplate, getNewModelTemplate,
getNewIndexTemplate, getNewIndexTemplate,
createNodeErrors, createNodeErrors,
constructHierarchy, constructHierarchy,
@ -38,7 +38,7 @@ const api = app => ({
getNewRootLevel, getNewRootLevel,
constructNode, constructNode,
getNewIndexTemplate, getNewIndexTemplate,
getNewRecordTemplate, getNewModelTemplate,
getNewField, getNewField,
validateField, validateField,
addField, addField,

View file

@ -1,9 +1,9 @@
import { map, isEmpty, countBy, flatten, includes, join, keys } from "lodash/fp" import { map, isEmpty, countBy, flatten, includes, join, keys } from "lodash/fp"
import {} from "lodash" import { } from "lodash"
import { applyRuleSet, makerule } from "../common/validationCommon" import { applyRuleSet, makerule } from "../common/validationCommon"
import { compileFilter, compileMap } from "../indexing/evaluate" import { compileFilter, compileMap } from "../indexing/evaluate"
import { isNonEmptyString, executesWithoutException, $ } from "../common" import { isNonEmptyString, executesWithoutException, $ } from "../common"
import { isRecord } from "./hierarchy" import { isModel } from "./hierarchy"
export const indexTypes = { reference: "reference", ancestor: "ancestor" } export const indexTypes = { reference: "reference", ancestor: "ancestor" }
@ -39,7 +39,7 @@ export const indexRuleSet = [
"indexType", "indexType",
"reference index may only exist on a record node", "reference index may only exist on a record node",
index => index =>
isRecord(index.parent()) || index.indexType !== indexTypes.reference isModel(index.parent()) || index.indexType !== indexTypes.reference
), ),
makerule( makerule(
"indexType", "indexType",

View file

@ -23,7 +23,7 @@ import {
defaultCase, defaultCase,
} from "../common" } from "../common"
import { import {
isRecord, isModel,
isRoot, isRoot,
isaggregateGroup, isaggregateGroup,
isIndex, isIndex,
@ -47,7 +47,7 @@ const commonRules = [
makerule( makerule(
"type", "type",
"node type not recognised", "node type not recognised",
anyTrue(isRecord, isRoot, isIndex, isaggregateGroup) anyTrue(isModel, isRoot, isIndex, isaggregateGroup)
), ),
] ]
@ -79,7 +79,7 @@ const aggregateGroupRules = [
const getRuleSet = node => const getRuleSet = node =>
switchCase( switchCase(
[isRecord, ruleSet(commonRules, recordRules)], [isModel, ruleSet(commonRules, recordRules)],
[isIndex, ruleSet(commonRules, indexRuleSet)], [isIndex, ruleSet(commonRules, indexRuleSet)],
@ -108,7 +108,7 @@ export const validateAll = appHierarchy => {
]) ])
const fieldErrors = $(flattened, [ const fieldErrors = $(flattened, [
filter(isRecord), filter(isModel),
map(validateAllFields), map(validateAllFields),
flatten, flatten,
]) ])
@ -140,7 +140,7 @@ const actionRules = [
), ),
] ]
const duplicateActionRule = makerule("", "action name must be unique", () => {}) const duplicateActionRule = makerule("", "action name must be unique", () => { })
const validateAction = action => applyRuleSet(actionRules)(action) const validateAction = action => applyRuleSet(actionRules)(action)

View file

@ -54,7 +54,7 @@ describe("getRelevantIndexes", () => {
expect(indexExists("/customersBySurname")).toBeTruthy() expect(indexExists("/customersBySurname")).toBeTruthy()
}) })
it("should ignore index when allowedRecordNodeIds does not contain record's node id", async () => { it("should ignore index when allowedModelNodeIds does not contain record's node id", async () => {
const { recordApi, appHierarchy } = await setupApphierarchy( const { recordApi, appHierarchy } = await setupApphierarchy(
basicAppHierarchyCreator_WithFields_AndIndexes basicAppHierarchyCreator_WithFields_AndIndexes
) )
@ -72,7 +72,7 @@ describe("getRelevantIndexes", () => {
expect(indexExists("/customersBySurname")).toBeFalsy() expect(indexExists("/customersBySurname")).toBeFalsy()
}) })
it("should include index when allowedRecordNodeIds contains record's node id", async () => { it("should include index when allowedModelNodeIds contains record's node id", async () => {
const { recordApi, appHierarchy } = await setupApphierarchy( const { recordApi, appHierarchy } = await setupApphierarchy(
basicAppHierarchyCreator_WithFields_AndIndexes basicAppHierarchyCreator_WithFields_AndIndexes
) )

View file

@ -76,7 +76,7 @@ const setup = includeFish => setupApphierarchy(createApp(includeFish))
const createApp = includeFish => templateApi => { const createApp = includeFish => templateApi => {
const root = templateApi.getNewRootLevel() const root = templateApi.getNewRootLevel()
const dogRecord = templateApi.getNewRecordTemplate(root, "dog") const dogRecord = templateApi.getNewModelTemplate(root, "dog")
const addField = recordNode => (name, type, typeOptions) => { const addField = recordNode => (name, type, typeOptions) => {
const field = templateApi.getNewField(type) const field = templateApi.getNewField(type)
@ -88,7 +88,7 @@ const createApp = includeFish => templateApi => {
const petsIndex = templateApi.getNewIndexTemplate(root) const petsIndex = templateApi.getNewIndexTemplate(root)
petsIndex.name = "allPets" petsIndex.name = "allPets"
petsIndex.allowedRecordNodeIds = [dogRecord.nodeId] petsIndex.allowedModelNodeIds = [dogRecord.nodeId]
const addDogField = addField(dogRecord) const addDogField = addField(dogRecord)
addDogField("name", "string") addDogField("name", "string")
@ -97,7 +97,7 @@ const createApp = includeFish => templateApi => {
let fishStuff = {} let fishStuff = {}
if (includeFish) { if (includeFish) {
const fishRecord = templateApi.getNewRecordTemplate(root, "fish") const fishRecord = templateApi.getNewModelTemplate(root, "fish")
const addFishField = addField(fishRecord) const addFishField = addField(fishRecord)
addFishField("name", "string") addFishField("name", "string")
addFishField("isAlive", "bool") addFishField("isAlive", "bool")
@ -105,7 +105,7 @@ const createApp = includeFish => templateApi => {
fishStuff.fishRecord = fishRecord fishStuff.fishRecord = fishRecord
const fishOnlyIndex = templateApi.getNewIndexTemplate(root) const fishOnlyIndex = templateApi.getNewIndexTemplate(root)
fishOnlyIndex.name = "fishOnly" fishOnlyIndex.name = "fishOnly"
fishOnlyIndex.allowedRecordNodeIds = [fishRecord.nodeId] fishOnlyIndex.allowedModelNodeIds = [fishRecord.nodeId]
fishStuff.fishOnlyIndex = fishOnlyIndex fishStuff.fishOnlyIndex = fishOnlyIndex
const dogFriends = templateApi.getNewIndexTemplate( const dogFriends = templateApi.getNewIndexTemplate(
@ -115,7 +115,7 @@ const createApp = includeFish => templateApi => {
dogFriends.name = "dogFriends" dogFriends.name = "dogFriends"
fishStuff.dogFriends = dogFriends fishStuff.dogFriends = dogFriends
petsIndex.allowedRecordNodeIds.push(fishRecord.nodeId) petsIndex.allowedModelNodeIds.push(fishRecord.nodeId)
const favFishField = addDogField("favouriteFish", "reference", { const favFishField = addDogField("favouriteFish", "reference", {
indexNodeKey: fishOnlyIndex.nodeKey(), indexNodeKey: fishOnlyIndex.nodeKey(),

View file

@ -133,15 +133,15 @@ const setup = ({ parentCount, childCount, grandChildCount }) =>
return field return field
} }
const parent = templateApi.getNewRecordTemplate(root, "parent") const parent = templateApi.getNewModelTemplate(root, "parent")
parent.estimatedRecordCount = parentCount || 1000 parent.estimatedRecordCount = parentCount || 1000
parent.collectionName = "parents" parent.collectionName = "parents"
addField(parent) addField(parent)
const child = templateApi.getNewRecordTemplate(parent, "child") const child = templateApi.getNewModelTemplate(parent, "child")
child.estimatedRecordCount = childCount || 1000 child.estimatedRecordCount = childCount || 1000
child.collectionName = "children" child.collectionName = "children"
addField(child) addField(child)
const grandchild = templateApi.getNewRecordTemplate(child, "grandchild") const grandchild = templateApi.getNewModelTemplate(child, "grandchild")
grandchild.estimatedRecordCount = grandChildCount || 1000 grandchild.estimatedRecordCount = grandChildCount || 1000
grandchild.collectionName = "grandchildren" grandchild.collectionName = "grandchildren"
addField(grandchild) addField(grandchild)

View file

@ -42,7 +42,7 @@ export const getMemoryStore = () => setupDatastore(memory({}))
export const getMemoryTemplateApi = store => { export const getMemoryTemplateApi = store => {
const app = { const app = {
datastore: store || getMemoryStore(), datastore: store || getMemoryStore(),
publish: () => {}, publish: () => { },
getEpochTime: async () => new Date().getTime(), getEpochTime: async () => new Date().getTime(),
user: { name: "", permissions: [permission.writeTemplates.get()] }, user: { name: "", permissions: [permission.writeTemplates.get()] },
} }
@ -78,7 +78,7 @@ export const appFromTempalteApi = async (
const fullPermissions = generateFullPermissions(app) const fullPermissions = generateFullPermissions(app)
app.user.permissions = fullPermissions app.user.permissions = fullPermissions
if (disableCleanupTransactions) setCleanupFunc(app, async () => {}) if (disableCleanupTransactions) setCleanupFunc(app, async () => { })
else setCleanupFunc(app) else setCleanupFunc(app)
return app return app
@ -138,15 +138,15 @@ export const hierarchyFactory = (...additionalFeatures) => templateApi => {
const settingsRecord = templateApi.getNewSingleRecordTemplate(root) const settingsRecord = templateApi.getNewSingleRecordTemplate(root)
settingsRecord.name = "settings" settingsRecord.name = "settings"
const customerRecord = templateApi.getNewRecordTemplate(root, "customer") const customerRecord = templateApi.getNewModelTemplate(root, "customer")
customerRecord.collectionName = "customers" customerRecord.collectionName = "customers"
findCollectionDefaultIndex(customerRecord).map = findCollectionDefaultIndex(customerRecord).map =
"return {surname:record.surname, isalive:record.isalive, partner:record.partner};" "return {surname:record.surname, isalive:record.isalive, partner:record.partner};"
const partnerRecord = templateApi.getNewRecordTemplate(root, "partner") const partnerRecord = templateApi.getNewModelTemplate(root, "partner")
partnerRecord.collectionName = "partners" partnerRecord.collectionName = "partners"
const partnerInvoiceRecord = templateApi.getNewRecordTemplate( const partnerInvoiceRecord = templateApi.getNewModelTemplate(
partnerRecord, partnerRecord,
"invoice" "invoice"
) )
@ -154,7 +154,7 @@ export const hierarchyFactory = (...additionalFeatures) => templateApi => {
findCollectionDefaultIndex(partnerInvoiceRecord).name = findCollectionDefaultIndex(partnerInvoiceRecord).name =
"partnerInvoices_index" "partnerInvoices_index"
const invoiceRecord = templateApi.getNewRecordTemplate( const invoiceRecord = templateApi.getNewModelTemplate(
customerRecord, customerRecord,
"invoice" "invoice"
) )
@ -162,7 +162,7 @@ export const hierarchyFactory = (...additionalFeatures) => templateApi => {
findCollectionDefaultIndex(invoiceRecord).map = findCollectionDefaultIndex(invoiceRecord).map =
"return {createdDate: record.createdDate, totalIncVat: record.totalIncVat};" "return {createdDate: record.createdDate, totalIncVat: record.totalIncVat};"
const chargeRecord = templateApi.getNewRecordTemplate(invoiceRecord, "charge") const chargeRecord = templateApi.getNewModelTemplate(invoiceRecord, "charge")
chargeRecord.collectionName = "charges" chargeRecord.collectionName = "charges"
const hierarchy = { const hierarchy = {
@ -203,7 +203,7 @@ export const withFields = (hierarchy, templateApi) => {
partnersReferenceIndex.name = "partnersReference" partnersReferenceIndex.name = "partnersReference"
partnersReferenceIndex.map = partnersReferenceIndex.map =
"return {name:record.businessName, phone:record.phone};" "return {name:record.businessName, phone:record.phone};"
partnersReferenceIndex.allowedRecordNodeIds = [partnerRecord.nodeId] partnersReferenceIndex.allowedModelNodeIds = [partnerRecord.nodeId]
const partnerCustomersReverseIndex = templateApi.getNewIndexTemplate( const partnerCustomersReverseIndex = templateApi.getNewIndexTemplate(
partnerRecord, partnerRecord,
@ -212,7 +212,7 @@ export const withFields = (hierarchy, templateApi) => {
partnerCustomersReverseIndex.name = "partnerCustomers" partnerCustomersReverseIndex.name = "partnerCustomers"
partnerCustomersReverseIndex.map = "return {...record};" partnerCustomersReverseIndex.map = "return {...record};"
partnerCustomersReverseIndex.filter = "record.isalive === true" partnerCustomersReverseIndex.filter = "record.isalive === true"
partnerCustomersReverseIndex.allowedRecordNodeIds = [customerRecord.nodeId] partnerCustomersReverseIndex.allowedModelNodeIds = [customerRecord.nodeId]
hierarchy.partnerCustomersReverseIndex = partnerCustomersReverseIndex hierarchy.partnerCustomersReverseIndex = partnerCustomersReverseIndex
newCustomerField("surname", "string") newCustomerField("surname", "string")
@ -236,7 +236,7 @@ export const withFields = (hierarchy, templateApi) => {
referredToCustomersReverseIndex.map = "return {...record};" referredToCustomersReverseIndex.map = "return {...record};"
referredToCustomersReverseIndex.getShardName = referredToCustomersReverseIndex.getShardName =
"return !record.surname ? 'null' : record.surname.substring(0,1);" "return !record.surname ? 'null' : record.surname.substring(0,1);"
referredToCustomersReverseIndex.allowedRecordNodeIds = [customerRecord.nodeId] referredToCustomersReverseIndex.allowedModelNodeIds = [customerRecord.nodeId]
hierarchy.referredToCustomersReverseIndex = referredToCustomersReverseIndex hierarchy.referredToCustomersReverseIndex = referredToCustomersReverseIndex
const customerReferredByField = newCustomerField( const customerReferredByField = newCustomerField(
@ -295,7 +295,7 @@ export const withFields = (hierarchy, templateApi) => {
) )
partnerChargesReverseIndex.name = "partnerCharges" partnerChargesReverseIndex.name = "partnerCharges"
partnerChargesReverseIndex.map = "return {...record};" partnerChargesReverseIndex.map = "return {...record};"
partnerChargesReverseIndex.allowedRecordNodeIds = [chargeRecord] partnerChargesReverseIndex.allowedModelNodeIds = [chargeRecord]
hierarchy.partnerChargesReverseIndex = partnerChargesReverseIndex hierarchy.partnerChargesReverseIndex = partnerChargesReverseIndex
const customersReferenceIndex = templateApi.getNewIndexTemplate( const customersReferenceIndex = templateApi.getNewIndexTemplate(
@ -304,7 +304,7 @@ export const withFields = (hierarchy, templateApi) => {
customersReferenceIndex.name = "customersReference" customersReferenceIndex.name = "customersReference"
customersReferenceIndex.map = "return {name:record.surname}" customersReferenceIndex.map = "return {name:record.surname}"
customersReferenceIndex.filter = "record.isalive === true" customersReferenceIndex.filter = "record.isalive === true"
customersReferenceIndex.allowedRecordNodeIds = [customerRecord.nodeId] customersReferenceIndex.allowedModelNodeIds = [customerRecord.nodeId]
newInvoiceField("customer", "reference", undefined, { newInvoiceField("customer", "reference", undefined, {
indexNodeKey: "/customersReference", indexNodeKey: "/customersReference",
@ -328,21 +328,21 @@ export const withIndexes = (hierarchy, templateApi) => {
"return {surname: record.surname, age:record.age};" "return {surname: record.surname, age:record.age};"
deceasedCustomersIndex.filter = "record.isalive === false" deceasedCustomersIndex.filter = "record.isalive === false"
findCollectionDefaultIndex(customerRecord).map = "return record;" findCollectionDefaultIndex(customerRecord).map = "return record;"
deceasedCustomersIndex.allowedRecordNodeIds = [customerRecord.nodeId] deceasedCustomersIndex.allowedModelNodeIds = [customerRecord.nodeId]
findCollectionDefaultIndex(invoiceRecord).allowedRecordNodeIds = [ findCollectionDefaultIndex(invoiceRecord).allowedModelNodeIds = [
invoiceRecord.nodeId, invoiceRecord.nodeId,
] ]
findCollectionDefaultIndex(customerRecord).allowedRecordNodeIds = [ findCollectionDefaultIndex(customerRecord).allowedModelNodeIds = [
customerRecord.nodeId, customerRecord.nodeId,
] ]
findCollectionDefaultIndex(partnerRecord).allowedRecordNodeIds = [ findCollectionDefaultIndex(partnerRecord).allowedModelNodeIds = [
partnerRecord.nodeId, partnerRecord.nodeId,
] ]
findIndex(partnerRecord, "partnerInvoices_index").allowedRecordNodeIds = [ findIndex(partnerRecord, "partnerInvoices_index").allowedModelNodeIds = [
partnerInvoiceRecord.nodeId, partnerInvoiceRecord.nodeId,
] ]
findCollectionDefaultIndex(chargeRecord).allowedRecordNodeIds = [ findCollectionDefaultIndex(chargeRecord).allowedModelNodeIds = [
chargeRecord.nodeId, chargeRecord.nodeId,
] ]
@ -350,14 +350,14 @@ export const withIndexes = (hierarchy, templateApi) => {
customerInvoicesIndex.name = "customer_invoices" customerInvoicesIndex.name = "customer_invoices"
customerInvoicesIndex.map = "return record;" customerInvoicesIndex.map = "return record;"
customerInvoicesIndex.filter = "record.type === 'invoice'" customerInvoicesIndex.filter = "record.type === 'invoice'"
customerInvoicesIndex.allowedRecordNodeIds = [invoiceRecord.nodeId] customerInvoicesIndex.allowedModelNodeIds = [invoiceRecord.nodeId]
const outstandingInvoicesIndex = getNewIndexTemplate(root) const outstandingInvoicesIndex = getNewIndexTemplate(root)
outstandingInvoicesIndex.name = "Outstanding Invoices" outstandingInvoicesIndex.name = "Outstanding Invoices"
outstandingInvoicesIndex.filter = outstandingInvoicesIndex.filter =
"record.type === 'invoice' && record.paidAmount < record.totalIncVat" "record.type === 'invoice' && record.paidAmount < record.totalIncVat"
outstandingInvoicesIndex.map = "return {...record};" outstandingInvoicesIndex.map = "return {...record};"
outstandingInvoicesIndex.allowedRecordNodeIds = [ outstandingInvoicesIndex.allowedModelNodeIds = [
invoiceRecord.nodeId, invoiceRecord.nodeId,
partnerInvoiceRecord.nodeId, partnerInvoiceRecord.nodeId,
] ]
@ -403,7 +403,7 @@ export const withIndexes = (hierarchy, templateApi) => {
customersBySurnameIndex.name = "customersBySurname" customersBySurnameIndex.name = "customersBySurname"
customersBySurnameIndex.map = "return {...record};" customersBySurnameIndex.map = "return {...record};"
customersBySurnameIndex.filter = "" customersBySurnameIndex.filter = ""
customersBySurnameIndex.allowedRecordNodeIds = [customerRecord.nodeId] customersBySurnameIndex.allowedModelNodeIds = [customerRecord.nodeId]
customersBySurnameIndex.getShardName = customersBySurnameIndex.getShardName =
"return !record.surname ? 'null' : record.surname.substring(0,1);" "return !record.surname ? 'null' : record.surname.substring(0,1);"
@ -426,7 +426,7 @@ export const withIndexes = (hierarchy, templateApi) => {
invoicesByOutstandingIndex.filter = "" invoicesByOutstandingIndex.filter = ""
invoicesByOutstandingIndex.getShardName = invoicesByOutstandingIndex.getShardName =
"return (record.totalIncVat > record.paidAmount ? 'outstanding' : 'paid');" "return (record.totalIncVat > record.paidAmount ? 'outstanding' : 'paid');"
invoicesByOutstandingIndex.allowedRecordNodeIds = [ invoicesByOutstandingIndex.allowedModelNodeIds = [
partnerInvoiceRecord.nodeId, partnerInvoiceRecord.nodeId,
invoiceRecord.nodeId, invoiceRecord.nodeId,
] ]

View file

@ -5,7 +5,7 @@ import {
basicAppHierarchyCreator_WithFields_AndIndexes, basicAppHierarchyCreator_WithFields_AndIndexes,
} from "./specHelpers" } from "./specHelpers"
import { canDeleteIndex } from "../src/templateApi/canDeleteIndex" import { canDeleteIndex } from "../src/templateApi/canDeleteIndex"
import { canDeleteRecord } from "../src/templateApi/canDeleteRecord" import { canDeleteModel } from "../src/templateApi/canDeleteModel"
describe("canDeleteIndex", () => { describe("canDeleteIndex", () => {
it("should return no errors if deltion is valid", async () => { it("should return no errors if deltion is valid", async () => {
@ -49,14 +49,14 @@ describe("canDeleteIndex", () => {
}) })
describe("canDeleteRecord", () => { describe("canDeleteModel", () => {
it("should return no errors when deletion is valid", async () => { it("should return no errors when deletion is valid", async () => {
const { appHierarchy } = await setupApphierarchy( const { appHierarchy } = await setupApphierarchy(
basicAppHierarchyCreator_WithFields basicAppHierarchyCreator_WithFields
) )
appHierarchy.root.indexes = appHierarchy.root.indexes.filter(i => !i.allowedRecordNodeIds.includes(appHierarchy.customerRecord.nodeId)) appHierarchy.root.indexes = appHierarchy.root.indexes.filter(i => !i.allowedModelNodeIds.includes(appHierarchy.customerRecord.nodeId))
const result = canDeleteRecord(appHierarchy.customerRecord) const result = canDeleteModel(appHierarchy.customerRecord)
expect(result.canDelete).toBe(true) expect(result.canDelete).toBe(true)
expect(result.errors).toEqual([]) expect(result.errors).toEqual([])
@ -67,7 +67,7 @@ describe("canDeleteRecord", () => {
basicAppHierarchyCreator_WithFields basicAppHierarchyCreator_WithFields
) )
const result = canDeleteRecord(appHierarchy.customerRecord) const result = canDeleteModel(appHierarchy.customerRecord)
expect(result.canDelete).toBe(false) expect(result.canDelete).toBe(false)
expect(result.errors.some(e => e.includes("customer_index"))).toBe(true) expect(result.errors.some(e => e.includes("customer_index"))).toBe(true)
@ -78,7 +78,7 @@ describe("canDeleteRecord", () => {
basicAppHierarchyCreator_WithFields_AndIndexes basicAppHierarchyCreator_WithFields_AndIndexes
) )
const result = canDeleteRecord(appHierarchy.customerRecord) const result = canDeleteModel(appHierarchy.customerRecord)
expect(result.canDelete).toBe(false) expect(result.canDelete).toBe(false)
expect(result.errors.some(e => e.includes("Outstanding Invoices"))).toBe(true) expect(result.errors.some(e => e.includes("Outstanding Invoices"))).toBe(true)

View file

@ -16,10 +16,10 @@ describe("hierarchy node creation", () => {
expect(root.nodeName()).toBe("/") expect(root.nodeName()).toBe("/")
}) })
it("> getNewRecordTemplate > should be initialise with correct members", async () => { it("> getNewModelTemplate > should be initialise with correct members", async () => {
const { templateApi } = await getMemoryTemplateApi() const { templateApi } = await getMemoryTemplateApi()
const root = templateApi.getNewRootLevel() const root = templateApi.getNewRootLevel()
const record = templateApi.getNewRecordTemplate(root) const record = templateApi.getNewModelTemplate(root)
record.name = "child" record.name = "child"
expect(record.type).toBe("record") expect(record.type).toBe("record")
expect(record.children).toEqual([]) expect(record.children).toEqual([])
@ -45,7 +45,7 @@ describe("hierarchy node creation", () => {
expect(record.isSingle).toBe(true) expect(record.isSingle).toBe(true)
}) })
it("> getNewrecordTemplate > should have static pathRegx if is singlerecord", async () => { it("> getNewModelTemplate > should have static pathRegx if is singlerecord", async () => {
const { templateApi } = await getMemoryTemplateApi() const { templateApi } = await getMemoryTemplateApi()
const root = templateApi.getNewRootLevel() const root = templateApi.getNewRootLevel()
const record = templateApi.getNewSingleRecordTemplate(root) const record = templateApi.getNewSingleRecordTemplate(root)
@ -53,59 +53,59 @@ describe("hierarchy node creation", () => {
expect(record.pathRegx()).toBe("/child") expect(record.pathRegx()).toBe("/child")
}) })
it("> getNewrecordTemplate > should add itself to parent records's children", async () => { it("> getNewModelTemplate > should add itself to parent records's children", async () => {
const { templateApi } = await getMemoryTemplateApi() const { templateApi } = await getMemoryTemplateApi()
const root = templateApi.getNewRootLevel() const root = templateApi.getNewRootLevel()
const parentRecord = templateApi.getNewRecordTemplate(root) const parentRecord = templateApi.getNewModelTemplate(root)
const record = templateApi.getNewRecordTemplate(parentRecord) const record = templateApi.getNewModelTemplate(parentRecord)
expect(parentRecord.children.length).toBe(1) expect(parentRecord.children.length).toBe(1)
expect(parentRecord.children[0]).toBe(record) expect(parentRecord.children[0]).toBe(record)
}) })
it("> getNewrecordTemplate > child should get correct nodeName ", async () => { it("> getNewModelTemplate > child should get correct nodeName ", async () => {
const { templateApi } = await getMemoryTemplateApi() const { templateApi } = await getMemoryTemplateApi()
const root = templateApi.getNewRootLevel() const root = templateApi.getNewRootLevel()
const parentRecord = templateApi.getNewRecordTemplate(root) const parentRecord = templateApi.getNewModelTemplate(root)
parentRecord.name = "parent" parentRecord.name = "parent"
const record = templateApi.getNewRecordTemplate(parentRecord) const record = templateApi.getNewModelTemplate(parentRecord)
record.name = "child" record.name = "child"
expect(record.nodeName()).toBe(`/${parentRecord.name}/${record.name}`) expect(record.nodeName()).toBe(`/${parentRecord.name}/${record.name}`)
}) })
it("> getNewrecordTemplate > should add itself to parents's default index allowedNodeIds", async () => { it("> getNewModelTemplate > should add itself to parents's default index allowedNodeIds", async () => {
const { templateApi } = await getMemoryTemplateApi() const { templateApi } = await getMemoryTemplateApi()
const root = templateApi.getNewRootLevel() const root = templateApi.getNewRootLevel()
const parentRecord = templateApi.getNewRecordTemplate(root) const parentRecord = templateApi.getNewModelTemplate(root)
const record = templateApi.getNewRecordTemplate(parentRecord) const record = templateApi.getNewModelTemplate(parentRecord)
expect(root.indexes[0].allowedRecordNodeIds).toEqual([parentRecord.nodeId]) expect(root.indexes[0].allowedModelNodeIds).toEqual([parentRecord.nodeId])
expect(parentRecord.indexes[0].allowedRecordNodeIds).toEqual([ expect(parentRecord.indexes[0].allowedModelNodeIds).toEqual([
record.nodeId, record.nodeId,
]) ])
}) })
it("> getNewrecordTemplate > should add itself to root's children", async () => { it("> getNewModelTemplate > should add itself to root's children", async () => {
const { templateApi } = await getMemoryTemplateApi() const { templateApi } = await getMemoryTemplateApi()
const root = templateApi.getNewRootLevel() const root = templateApi.getNewRootLevel()
const record = templateApi.getNewRecordTemplate(root) const record = templateApi.getNewModelTemplate(root)
expect(root.children.length).toBe(1) expect(root.children.length).toBe(1)
expect(root.children[0]).toBe(record) expect(root.children[0]).toBe(record)
}) })
it("> getNewrecordTemplate > should have dynamic pathRegx if parent is record", async () => { it("> getNewModelTemplate > should have dynamic pathRegx if parent is record", async () => {
const { templateApi } = await getMemoryTemplateApi() const { templateApi } = await getMemoryTemplateApi()
const root = templateApi.getNewRootLevel() const root = templateApi.getNewRootLevel()
const parent = templateApi.getNewRecordTemplate(root) const parent = templateApi.getNewModelTemplate(root)
parent.collectionName = "customers" parent.collectionName = "customers"
const record = templateApi.getNewRecordTemplate(parent) const record = templateApi.getNewModelTemplate(parent)
record.name = "child" record.name = "child"
expect(record.pathRegx().startsWith("/customers")).toBe(true) expect(record.pathRegx().startsWith("/customers")).toBe(true)
expect(record.pathRegx().includes("[")).toBe(true) expect(record.pathRegx().includes("[")).toBe(true)
}) })
it("> getNewrecordTemplate > should add default index", async () => { it("> getNewModelTemplate > should add default index", async () => {
const { templateApi } = await getMemoryTemplateApi() const { templateApi } = await getMemoryTemplateApi()
const root = templateApi.getNewRootLevel() const root = templateApi.getNewRootLevel()
const record = templateApi.getNewRecordTemplate(root, "rec") const record = templateApi.getNewModelTemplate(root, "rec")
expect(root.indexes.length).toBe(1) expect(root.indexes.length).toBe(1)
expect(root.indexes[0].name).toBe("rec_index") expect(root.indexes[0].name).toBe("rec_index")
}) })
@ -138,7 +138,7 @@ describe("hierarchy node creation", () => {
it("> getNewIndexTemplate > should add itself to record indexes", async () => { it("> getNewIndexTemplate > should add itself to record indexes", async () => {
const { templateApi } = await getMemoryTemplateApi() const { templateApi } = await getMemoryTemplateApi()
const root = templateApi.getNewRootLevel() const root = templateApi.getNewRootLevel()
const record = templateApi.getNewRecordTemplate(root) const record = templateApi.getNewModelTemplate(root)
const index = templateApi.getNewIndexTemplate(record) const index = templateApi.getNewIndexTemplate(record)
expect(record.indexes.length).toBe(1) expect(record.indexes.length).toBe(1)
expect(record.indexes[0]).toBe(index) expect(record.indexes[0]).toBe(index)
@ -150,7 +150,7 @@ describe("hierarchy node creation", () => {
expect(() => templateApi.getNewIndexTemplate()).toThrow( expect(() => templateApi.getNewIndexTemplate()).toThrow(
errors.allNonRootNodesMustHaveParent errors.allNonRootNodesMustHaveParent
) )
expect(() => templateApi.getNewRecordTemplate()).toThrow( expect(() => templateApi.getNewModelTemplate()).toThrow(
errors.allNonRootNodesMustHaveParent errors.allNonRootNodesMustHaveParent
) )
}) })
@ -158,8 +158,8 @@ describe("hierarchy node creation", () => {
it("> adding node > should just add one (bugfix)", async () => { it("> adding node > should just add one (bugfix)", async () => {
const { templateApi } = await getMemoryTemplateApi() const { templateApi } = await getMemoryTemplateApi()
const root = templateApi.getNewRootLevel() const root = templateApi.getNewRootLevel()
const parent = templateApi.getNewRecordTemplate(root) const parent = templateApi.getNewModelTemplate(root)
templateApi.getNewRecordTemplate(parent) templateApi.getNewModelTemplate(parent)
expect(root.children.length).toBe(1) expect(root.children.length).toBe(1)
expect(parent.children.length).toBe(1) expect(parent.children.length).toBe(1)
@ -174,7 +174,7 @@ describe("hierarchy node creation", () => {
it("> getNewAggregateGroupTemplate > should add itself to index aggregateGroups", async () => { it("> getNewAggregateGroupTemplate > should add itself to index aggregateGroups", async () => {
const { templateApi } = await getMemoryTemplateApi() const { templateApi } = await getMemoryTemplateApi()
const root = templateApi.getNewRootLevel() const root = templateApi.getNewRootLevel()
const record = templateApi.getNewRecordTemplate(root) const record = templateApi.getNewModelTemplate(root)
const index = templateApi.getNewIndexTemplate(record) const index = templateApi.getNewIndexTemplate(record)
const aggregateGroup = templateApi.getNewAggregateGroupTemplate(index) const aggregateGroup = templateApi.getNewAggregateGroupTemplate(index)
expect(index.aggregateGroups.length).toBe(1) expect(index.aggregateGroups.length).toBe(1)

View file

@ -13,7 +13,7 @@ describe("diffHierarchy", () => {
it("should detect root record created", async () => { it("should detect root record created", async () => {
const oldHierarchy = (await setup()).root; const oldHierarchy = (await setup()).root;
const newSetup = await setup() const newSetup = await setup()
const opportunity = newSetup.templateApi.getNewRecordTemplate(newSetup.root, "opportunity", false) const opportunity = newSetup.templateApi.getNewModelTemplate(newSetup.root, "opportunity", false)
const diff = diffHierarchy(oldHierarchy, newSetup.root) const diff = diffHierarchy(oldHierarchy, newSetup.root)
expect(diff).toEqual([{ expect(diff).toEqual([{
newNode: opportunity, newNode: opportunity,
@ -25,8 +25,8 @@ describe("diffHierarchy", () => {
it("should only detect root record, when newly created root record has children ", async () => { it("should only detect root record, when newly created root record has children ", async () => {
const oldHierarchy = (await setup()).root; const oldHierarchy = (await setup()).root;
const newSetup = await setup() const newSetup = await setup()
const opportunity = newSetup.templateApi.getNewRecordTemplate(newSetup.root, "opportunity", false) const opportunity = newSetup.templateApi.getNewModelTemplate(newSetup.root, "opportunity", false)
newSetup.templateApi.getNewRecordTemplate(opportunity, "invoice", true) newSetup.templateApi.getNewModelTemplate(opportunity, "invoice", true)
const diff = diffHierarchy(oldHierarchy, newSetup.root) const diff = diffHierarchy(oldHierarchy, newSetup.root)
expect(diff).toEqual([{ expect(diff).toEqual([{
newNode: opportunity, newNode: opportunity,
@ -38,7 +38,7 @@ describe("diffHierarchy", () => {
it("should detect child record created", async () => { it("should detect child record created", async () => {
const oldHierarchy = (await setup()).root; const oldHierarchy = (await setup()).root;
const newSetup = await setup() const newSetup = await setup()
const opportunity = newSetup.templateApi.getNewRecordTemplate(newSetup.contact, "opportunity", false) const opportunity = newSetup.templateApi.getNewModelTemplate(newSetup.contact, "opportunity", false)
const diff = diffHierarchy(oldHierarchy, newSetup.root) const diff = diffHierarchy(oldHierarchy, newSetup.root)
expect(diff).toEqual([{ expect(diff).toEqual([{
newNode: opportunity, newNode: opportunity,
@ -98,7 +98,7 @@ describe("diffHierarchy", () => {
it("should detect root record field removed", async () => { it("should detect root record field removed", async () => {
const oldSetup = await setup() const oldSetup = await setup()
const newSetup = await setup() const newSetup = await setup()
newSetup.contact.fields = newSetup.contact.fields.filter(f => f.name !== "name") newSetup.contact.fields = newSetup.contact.fields.filter(f => f.name !== "name")
const diff = diffHierarchy(oldSetup.root, newSetup.root) const diff = diffHierarchy(oldSetup.root, newSetup.root)
expect(diff).toEqual([{ expect(diff).toEqual([{
newNode: newSetup.contact, newNode: newSetup.contact,
@ -110,7 +110,7 @@ describe("diffHierarchy", () => {
it("should detect child record field removed", async () => { it("should detect child record field removed", async () => {
const oldSetup = await setup() const oldSetup = await setup()
const newSetup = await setup() const newSetup = await setup()
newSetup.deal.fields = newSetup.deal.fields.filter(f => f.name !== "name") newSetup.deal.fields = newSetup.deal.fields.filter(f => f.name !== "name")
const diff = diffHierarchy(oldSetup.root, newSetup.root) const diff = diffHierarchy(oldSetup.root, newSetup.root)
expect(diff).toEqual([{ expect(diff).toEqual([{
newNode: newSetup.deal, newNode: newSetup.deal,
@ -118,7 +118,7 @@ describe("diffHierarchy", () => {
type: HierarchyChangeTypes.recordFieldsChanged type: HierarchyChangeTypes.recordFieldsChanged
}]) }])
}) })
it("should detect record field added", async () => { it("should detect record field added", async () => {
const oldSetup = await setup() const oldSetup = await setup()
const newSetup = await setup() const newSetup = await setup()
@ -140,7 +140,7 @@ describe("diffHierarchy", () => {
const notesField = newSetup.templateApi.getNewField("string") const notesField = newSetup.templateApi.getNewField("string")
notesField.name = "notes" notesField.name = "notes"
newSetup.templateApi.addField(newSetup.contact, notesField) newSetup.templateApi.addField(newSetup.contact, notesField)
newSetup.contact.fields = newSetup.contact.fields.filter(f => f.name !== "name") newSetup.contact.fields = newSetup.contact.fields.filter(f => f.name !== "name")
const diff = diffHierarchy(oldSetup.root, newSetup.root) const diff = diffHierarchy(oldSetup.root, newSetup.root)
expect(diff).toEqual([{ expect(diff).toEqual([{
newNode: newSetup.contact, newNode: newSetup.contact,
@ -152,7 +152,7 @@ describe("diffHierarchy", () => {
it("should detect root record estimated record count changed", async () => { it("should detect root record estimated record count changed", async () => {
const oldSetup = await setup() const oldSetup = await setup()
const newSetup = await setup() const newSetup = await setup()
newSetup.contact.estimatedRecordCount = 987 newSetup.contact.estimatedRecordCount = 987
const diff = diffHierarchy(oldSetup.root, newSetup.root) const diff = diffHierarchy(oldSetup.root, newSetup.root)
expect(diff).toEqual([{ expect(diff).toEqual([{
newNode: newSetup.contact, newNode: newSetup.contact,
@ -164,7 +164,7 @@ describe("diffHierarchy", () => {
it("should detect root record estimated record count changed", async () => { it("should detect root record estimated record count changed", async () => {
const oldSetup = await setup() const oldSetup = await setup()
const newSetup = await setup() const newSetup = await setup()
newSetup.deal.estimatedRecordCount = 987 newSetup.deal.estimatedRecordCount = 987
const diff = diffHierarchy(oldSetup.root, newSetup.root) const diff = diffHierarchy(oldSetup.root, newSetup.root)
expect(diff).toEqual([{ expect(diff).toEqual([{
newNode: newSetup.deal, newNode: newSetup.deal,
@ -246,11 +246,11 @@ describe("diffHierarchy", () => {
})) }))
it("should detect root index allowedRecordIds changed", testIndexChanged("root", newSetup => { it("should detect root index allowedRecordIds changed", testIndexChanged("root", newSetup => {
newSetup.root.indexes[0].allowedRecordNodeIds.push(3) newSetup.root.indexes[0].allowedModelNodeIds.push(3)
})) }))
it("should detect child index allowedRecordIds changed", testIndexChanged("contact", newSetup => { it("should detect child index allowedRecordIds changed", testIndexChanged("contact", newSetup => {
newSetup.contact.indexes[0].allowedRecordNodeIds.push(3) newSetup.contact.indexes[0].allowedModelNodeIds.push(3)
})) }))
it("should detect child index map changed", testIndexChanged("contact", newSetup => { it("should detect child index map changed", testIndexChanged("contact", newSetup => {

View file

@ -3,7 +3,7 @@ import { getMemoryTemplateApi } from "./specHelpers"
import { fieldErrors } from "../src/templateApi/fields" import { fieldErrors } from "../src/templateApi/fields"
const getRecordTemplate = templateApi => const getRecordTemplate = templateApi =>
$(templateApi.getNewRootLevel(), [templateApi.getNewRecordTemplate]) $(templateApi.getNewRootLevel(), [templateApi.getNewModelTemplate])
const getValidField = templateApi => { const getValidField = templateApi => {
const field = templateApi.getNewField("string") const field = templateApi.getNewField("string")

View file

@ -3,7 +3,6 @@ import createNodes from "../src/templateApi/createNodes"
import { some } from "lodash" import { some } from "lodash"
import { getNewField, addField } from "../src/templateApi/fields" import { getNewField, addField } from "../src/templateApi/fields"
import { import {
getNewRecordValidationRule,
commonRecordValidationRules, commonRecordValidationRules,
addRecordValidationRule, addRecordValidationRule,
} from "../src/templateApi/recordValidationRules" } from "../src/templateApi/recordValidationRules"
@ -13,7 +12,7 @@ import { findCollectionDefaultIndex } from "./specHelpers"
const createValidHierarchy = () => { const createValidHierarchy = () => {
const root = createNodes.getNewRootLevel() const root = createNodes.getNewRootLevel()
const customerRecord = createNodes.getNewRecordTemplate(root, "customer") const customerRecord = createNodes.getNewModelTemplate(root, "customer")
customerRecord.collectionName = "customers" customerRecord.collectionName = "customers"
const customersDefaultIndex = findCollectionDefaultIndex(customerRecord) const customersDefaultIndex = findCollectionDefaultIndex(customerRecord)
@ -27,7 +26,7 @@ const createValidHierarchy = () => {
allCustomersOwedFunctions.aggregatedValue = "return record.owed" allCustomersOwedFunctions.aggregatedValue = "return record.owed"
allCustomersOwedFunctions.name = "all customers owed amount" allCustomersOwedFunctions.name = "all customers owed amount"
const partnerRecord = createNodes.getNewRecordTemplate(root, "partner") const partnerRecord = createNodes.getNewModelTemplate(root, "partner")
partnerRecord.collectionName = "partners" partnerRecord.collectionName = "partners"
partnerRecord.name = "partner" partnerRecord.name = "partner"
const businessName = getNewField("string") const businessName = getNewField("string")

View file

@ -3,7 +3,7 @@ import { permission } from "../src/authApi/permissions"
const saveThreeLevelHierarchy = async () => { const saveThreeLevelHierarchy = async () => {
const { templateApi, app } = await getMemoryTemplateApi() const { templateApi, app } = await getMemoryTemplateApi()
const root = templateApi.getNewRootLevel() const root = templateApi.getNewRootLevel()
const record = templateApi.getNewRecordTemplate(root) const record = templateApi.getNewModelTemplate(root)
record.name = "customer" record.name = "customer"
const surname = templateApi.getNewField("string") const surname = templateApi.getNewField("string")
surname.name = "surname" surname.name = "surname"

View file

@ -1,4 +1,4 @@
import { import {
getRecordApiFromTemplateApi, getRecordApiFromTemplateApi,
getIndexApiFromTemplateApi, getIndexApiFromTemplateApi,
} from "./specHelpers" } from "./specHelpers"
@ -24,7 +24,7 @@ describe("upgradeData", () => {
]) ])
expect(remainingKeys.length).toBe(0) expect(remainingKeys.length).toBe(0)
}) })
it("should not delete other root record types, when root record node deleted", async () => { it("should not delete other root record types, when root record node deleted", async () => {
@ -39,7 +39,7 @@ describe("upgradeData", () => {
]) ])
expect(remainingKeys.length > 0).toBe(true) expect(remainingKeys.length > 0).toBe(true)
}) })
it("should delete all child records, when child record node deleted", async () => { it("should delete all child records, when child record node deleted", async () => {
@ -67,7 +67,7 @@ describe("upgradeData", () => {
const { oldSetup, newSetup } = await configure() const { oldSetup, newSetup } = await configure()
const newIndex = newSetup.templateApi.getNewIndexTemplate(newSetup.root) const newIndex = newSetup.templateApi.getNewIndexTemplate(newSetup.root)
newIndex.name = "more_contacts" newIndex.name = "more_contacts"
newIndex.allowedRecordNodeIds = [newSetup.contact.nodeId] newIndex.allowedModelNodeIds = [newSetup.contact.nodeId]
await upgradeData(oldSetup.app)(newSetup.root) await upgradeData(oldSetup.app)(newSetup.root)
@ -112,7 +112,7 @@ describe("upgradeData", () => {
const { oldSetup, newSetup, records } = await configure() const { oldSetup, newSetup, records } = await configure()
const newIndex = newSetup.templateApi.getNewIndexTemplate(newSetup.contact) const newIndex = newSetup.templateApi.getNewIndexTemplate(newSetup.contact)
newIndex.name = "more_deals" newIndex.name = "more_deals"
newIndex.allowedRecordNodeIds = [newSetup.deal.nodeId] newIndex.allowedModelNodeIds = [newSetup.deal.nodeId]
await upgradeData(oldSetup.app)(newSetup.root) await upgradeData(oldSetup.app)(newSetup.root)
@ -159,20 +159,20 @@ describe("upgradeData", () => {
const { oldSetup, newSetup, records, recordApi } = await configure() const { oldSetup, newSetup, records, recordApi } = await configure()
const newIndex = newSetup.templateApi.getNewIndexTemplate(newSetup.lead) const newIndex = newSetup.templateApi.getNewIndexTemplate(newSetup.lead)
newIndex.name = "contact_leads" newIndex.name = "contact_leads"
newIndex.allowedRecordNodeIds = [newSetup.lead.nodeId] newIndex.allowedModelNodeIds = [newSetup.lead.nodeId]
newIndex.indexType = "reference" newIndex.indexType = "reference"
const leadField = newSetup.templateApi.getNewField("string") const leadField = newSetup.templateApi.getNewField("string")
leadField.name = "lead" leadField.name = "lead"
leadField.type = "reference" leadField.type = "reference"
leadField.typeOptions = { leadField.typeOptions = {
reverseIndexNodeKeys: [ newIndex.nodeKey() ], reverseIndexNodeKeys: [newIndex.nodeKey()],
indexNodeKey: "/lead_index", indexNodeKey: "/lead_index",
displayValue: "name" displayValue: "name"
} }
newSetup.templateApi.addField(newSetup.contact, leadField) newSetup.templateApi.addField(newSetup.contact, leadField)
await upgradeData(oldSetup.app)(newSetup.root) await upgradeData(oldSetup.app)(newSetup.root)
const indexKey = `${records.lead1.key}/contact_leads` const indexKey = `${records.lead1.key}/contact_leads`
@ -194,7 +194,7 @@ describe("upgradeData", () => {
it("should initialise a new root record", async () => { it("should initialise a new root record", async () => {
const { oldSetup, newSetup } = await configure() const { oldSetup, newSetup } = await configure()
const invoice = newSetup.templateApi.getNewRecordTemplate(newSetup.root, "invoice", true) const invoice = newSetup.templateApi.getNewModelTemplate(newSetup.root, "invoice", true)
invoice.collectionName = "invoices" invoice.collectionName = "invoices"
const nameField = newSetup.templateApi.getNewField("string") const nameField = newSetup.templateApi.getNewField("string")
@ -207,7 +207,7 @@ describe("upgradeData", () => {
expect(itemsInNewIndex.length).toBe(0) expect(itemsInNewIndex.length).toBe(0)
const newInvoice = _getNew(invoice, "/invoices") const newInvoice = _getNew(invoice, "/invoices")
await _save(newSetup.app, newInvoice) await _save(newSetup.app, newInvoice)
itemsInNewIndex = await _listItems(newSetup.app, "/invoice_index") itemsInNewIndex = await _listItems(newSetup.app, "/invoice_index")
@ -217,7 +217,7 @@ describe("upgradeData", () => {
it("should initialise a new child record", async () => { it("should initialise a new child record", async () => {
const { oldSetup, newSetup, records } = await configure() const { oldSetup, newSetup, records } = await configure()
const invoice = newSetup.templateApi.getNewRecordTemplate(newSetup.contact, "invoice", true) const invoice = newSetup.templateApi.getNewModelTemplate(newSetup.contact, "invoice", true)
invoice.collectionName = "invoices" invoice.collectionName = "invoices"
const nameField = newSetup.templateApi.getNewField("string") const nameField = newSetup.templateApi.getNewField("string")
@ -230,7 +230,7 @@ describe("upgradeData", () => {
expect(itemsInNewIndex.length).toBe(0) expect(itemsInNewIndex.length).toBe(0)
const newInvoice = _getNew(invoice, `${records.contact1.key}/invoices`) const newInvoice = _getNew(invoice, `${records.contact1.key}/invoices`)
await _save(newSetup.app, newInvoice) await _save(newSetup.app, newInvoice)
itemsInNewIndex = await _listItems(newSetup.app, `${records.contact1.key}/invoice_index`) itemsInNewIndex = await _listItems(newSetup.app, `${records.contact1.key}/invoice_index`)
@ -258,7 +258,7 @@ it("should rebuild affected index when field is removed", async () => {
it("should rebuild affected index when field is added", async () => { it("should rebuild affected index when field is added", async () => {
const { oldSetup, newSetup, records } = await configure() const { oldSetup, newSetup, records } = await configure()
const aliveField = newSetup.templateApi.getNewField("string") const aliveField = newSetup.templateApi.getNewField("string")
aliveField.name = "isalive" aliveField.name = "isalive"
newSetup.templateApi.addField(newSetup.contact, aliveField) newSetup.templateApi.addField(newSetup.contact, aliveField)
@ -276,10 +276,10 @@ it("should rebuild affected index when field is added", async () => {
const configure = async () => { const configure = async () => {
const oldSetup = await setup() const oldSetup = await setup()
const recordApi = await getRecordApiFromTemplateApi(oldSetup.templateApi) const recordApi = await getRecordApiFromTemplateApi(oldSetup.templateApi)
const indexApi = await getIndexApiFromTemplateApi(oldSetup.templateApi) const indexApi = await getIndexApiFromTemplateApi(oldSetup.templateApi)
const newSetup = await setup(oldSetup.store) const newSetup = await setup(oldSetup.store)
const records = await createSomeRecords(recordApi) const records = await createSomeRecords(recordApi)

View file

@ -5,7 +5,7 @@ import { initialiseData } from "../src/appInitialise/initialiseData"
export const setup = async store => { export const setup = async store => {
const { templateApi } = await getMemoryTemplateApi(store) const { templateApi } = await getMemoryTemplateApi(store)
const root = templateApi.getNewRootLevel() const root = templateApi.getNewRootLevel()
const contact = templateApi.getNewRecordTemplate(root, "contact", true) const contact = templateApi.getNewModelTemplate(root, "contact", true)
contact.collectionName = "contacts" contact.collectionName = "contacts"
const nameField = templateApi.getNewField("string") const nameField = templateApi.getNewField("string")
@ -16,9 +16,9 @@ export const setup = async store => {
templateApi.addField(contact, nameField) templateApi.addField(contact, nameField)
templateApi.addField(contact, statusField) templateApi.addField(contact, statusField)
const lead = templateApi.getNewRecordTemplate(root, "lead", true) const lead = templateApi.getNewModelTemplate(root, "lead", true)
lead.collectionName = "leads" lead.collectionName = "leads"
const deal = templateApi.getNewRecordTemplate(contact, "deal", true) const deal = templateApi.getNewModelTemplate(contact, "deal", true)
deal.collectionName = "deals" deal.collectionName = "deals"
templateApi.addField(deal, { ...nameField }) templateApi.addField(deal, { ...nameField })

View file

@ -20,7 +20,7 @@ export default async datastore => {
const clients = templateApi.getNewCollectionTemplate(root) const clients = templateApi.getNewCollectionTemplate(root)
clients.name = "clients" clients.name = "clients"
const client = templateApi.getNewRecordTemplate(clients) const client = templateApi.getNewModelTemplate(clients)
client.name = "client" client.name = "client"
addStringField(client, "FamilyName") addStringField(client, "FamilyName")
addStringField(client, "Address1") addStringField(client, "Address1")
@ -33,7 +33,7 @@ export default async datastore => {
const children = templateApi.getNewCollectionTemplate(client) const children = templateApi.getNewCollectionTemplate(client)
children.name = "children" children.name = "children"
const child = templateApi.getNewRecordTemplate(children) const child = templateApi.getNewModelTemplate(children)
child.name = "child" child.name = "child"
addStringField(child, "FirstName") addStringField(child, "FirstName")
addStringField(child, "Surname") addStringField(child, "Surname")
@ -43,7 +43,7 @@ export default async datastore => {
const contacts = templateApi.getNewCollectionTemplate(client) const contacts = templateApi.getNewCollectionTemplate(client)
contacts.name = "contacts" contacts.name = "contacts"
const contact = templateApi.getNewRecordTemplate(contacts) const contact = templateApi.getNewModelTemplate(contacts)
contact.name = "contact" contact.name = "contact"
addStringField(contact, "Name") addStringField(contact, "Name")
addStringField(contact, "relationship") addStringField(contact, "relationship")

View file

@ -187,7 +187,7 @@
"getShardName": "", "getShardName": "",
"getSortKey": "record.id", "getSortKey": "record.id",
"aggregateGroups": [], "aggregateGroups": [],
"allowedRecordNodeIds": [], "allowedModelNodeIds": [],
"nodeId": 15 "nodeId": 15
} }
], ],
@ -237,7 +237,7 @@
"getShardName": "", "getShardName": "",
"getSortKey": "record.id", "getSortKey": "record.id",
"aggregateGroups": [], "aggregateGroups": [],
"allowedRecordNodeIds": [], "allowedModelNodeIds": [],
"nodeId": 9 "nodeId": 9
}, },
{ {
@ -249,7 +249,7 @@
"getShardName": "", "getShardName": "",
"getSortKey": "record.id", "getSortKey": "record.id",
"aggregateGroups": [], "aggregateGroups": [],
"allowedRecordNodeIds": [], "allowedModelNodeIds": [],
"nodeId": 10 "nodeId": 10
}, },
{ {
@ -261,7 +261,7 @@
"getShardName": "", "getShardName": "",
"getSortKey": "record.id", "getSortKey": "record.id",
"aggregateGroups": [], "aggregateGroups": [],
"allowedRecordNodeIds": [], "allowedModelNodeIds": [],
"nodeId": 28 "nodeId": 28
} }
], ],
@ -367,7 +367,7 @@
"getShardName": "", "getShardName": "",
"getSortKey": "record.id", "getSortKey": "record.id",
"aggregateGroups": [], "aggregateGroups": [],
"allowedRecordNodeIds": [ "allowedModelNodeIds": [
2 2
], ],
"nodeId": 23 "nodeId": 23
@ -381,7 +381,7 @@
"getShardName": "return record.username.substring(0,2)", "getShardName": "return record.username.substring(0,2)",
"getSortKey": "record.id", "getSortKey": "record.id",
"aggregateGroups": [], "aggregateGroups": [],
"allowedRecordNodeIds": [ "allowedModelNodeIds": [
16 16
], ],
"nodeId": 24 "nodeId": 24
@ -395,7 +395,7 @@
"getShardName": "return record.name.substring(0,2)", "getShardName": "return record.name.substring(0,2)",
"getSortKey": "record.id", "getSortKey": "record.id",
"aggregateGroups": [], "aggregateGroups": [],
"allowedRecordNodeIds": [ "allowedModelNodeIds": [
8 8
], ],
"nodeId": 25 "nodeId": 25
@ -409,7 +409,7 @@
"getShardName": "", "getShardName": "",
"getSortKey": "record.id", "getSortKey": "record.id",
"aggregateGroups": [], "aggregateGroups": [],
"allowedRecordNodeIds": [ "allowedModelNodeIds": [
3 3
], ],
"nodeId": 26 "nodeId": 26
@ -468,7 +468,7 @@
"getShardName": "", "getShardName": "",
"getSortKey": "record.id", "getSortKey": "record.id",
"aggregateGroups": [], "aggregateGroups": [],
"allowedRecordNodeIds": [ "allowedModelNodeIds": [
1 1
], ],
"nodeId": 22 "nodeId": 22
@ -482,7 +482,7 @@
"getShardName": "return record.username.substring(0,2)", "getShardName": "return record.username.substring(0,2)",
"getSortKey": "record.id", "getSortKey": "record.id",
"aggregateGroups": [], "aggregateGroups": [],
"allowedRecordNodeIds": [ "allowedModelNodeIds": [
17 17
], ],
"nodeId": 27 "nodeId": 27
@ -524,4 +524,4 @@
"initialOptions": {} "initialOptions": {}
} }
] ]
} }

View file

@ -166,7 +166,7 @@
"getShardName": "", "getShardName": "",
"getSortKey": "record.id", "getSortKey": "record.id",
"aggregateGroups": [], "aggregateGroups": [],
"allowedRecordNodeIds": [ "allowedModelNodeIds": [
1 1
], ],
"nodeId": 2 "nodeId": 2
@ -180,7 +180,7 @@
"getShardName": "", "getShardName": "",
"getSortKey": "record.id", "getSortKey": "record.id",
"aggregateGroups": [], "aggregateGroups": [],
"allowedRecordNodeIds": [ "allowedModelNodeIds": [
3 3
], ],
"nodeId": 4 "nodeId": 4
@ -194,7 +194,7 @@
"getShardName": "", "getShardName": "",
"getSortKey": "record.id", "getSortKey": "record.id",
"aggregateGroups": [], "aggregateGroups": [],
"allowedRecordNodeIds": [ "allowedModelNodeIds": [
7 7
], ],
"nodeId": 8 "nodeId": 8
@ -1150,4 +1150,4 @@
"inputClass": "" "inputClass": ""
} }
} }
} }

View file

@ -131,33 +131,6 @@
lodash "^4.17.13" lodash "^4.17.13"
to-fast-properties "^2.0.0" to-fast-properties "^2.0.0"
"@budibase/client@^0.0.32":
version "0.0.32"
resolved "https://registry.yarnpkg.com/@budibase/client/-/client-0.0.32.tgz#76d9f147563a0bf939eae7f32ce75b2a527ba496"
integrity sha512-jmCCLn0CUoQbL6h623S5IqK6+GYLqX3WzUTZInSb1SCBOM3pI0eLP5HwTR6s7r42SfD0v9jTWRdyTnHiElNj8A==
dependencies:
"@nx-js/compiler-util" "^2.0.0"
bcryptjs "^2.4.3"
deep-equal "^2.0.1"
lodash "^4.17.15"
lunr "^2.3.5"
regexparam "^1.3.0"
shortid "^2.2.8"
svelte "^3.9.2"
"@budibase/core@^0.0.32":
version "0.0.32"
resolved "https://registry.yarnpkg.com/@budibase/core/-/core-0.0.32.tgz#c5d9ab869c5e9596a1ac337aaf041e795b1cc7fa"
integrity sha512-B6DHlz/C/m3jrxHbImT4bphdJlL7r2qmGrmcVBSc9mGHvwcRh1xfFGrsPCOU2IEJow+DWD63BIjyHzLPI3cerQ==
dependencies:
"@nx-js/compiler-util" "^2.0.0"
bcryptjs "^2.4.3"
date-fns "^1.29.0"
lodash "^4.17.13"
lunr "^2.3.5"
safe-buffer "^5.1.2"
shortid "^2.2.8"
"@cnakazawa/watch@^1.0.3": "@cnakazawa/watch@^1.0.3":
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef"
@ -326,11 +299,6 @@
path-to-regexp "^1.1.1" path-to-regexp "^1.1.1"
urijs "^1.19.0" urijs "^1.19.0"
"@nx-js/compiler-util@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@nx-js/compiler-util/-/compiler-util-2.0.0.tgz#c74c12165fa2f017a292bb79af007e8fce0af297"
integrity sha512-AxSQbwj9zqt8DYPZ6LwZdytqnwfiOEdcFdq4l8sdjkZmU2clTht7RDLCI8xvkp7KqgcNaOGlTeCM55TULWruyQ==
"@types/babel__core@^7.1.0": "@types/babel__core@^7.1.0":
version "7.1.2" version "7.1.2"
resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.2.tgz#608c74f55928033fce18b99b213c16be4b3d114f" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.2.tgz#608c74f55928033fce18b99b213c16be4b3d114f"
@ -678,11 +646,6 @@ bcrypt-pbkdf@^1.0.0:
dependencies: dependencies:
tweetnacl "^0.14.3" tweetnacl "^0.14.3"
bcryptjs@^2.4.3:
version "2.4.3"
resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb"
integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=
binary-extensions@^2.0.0: binary-extensions@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c"
@ -1082,11 +1045,6 @@ data-urls@^1.0.0:
whatwg-mimetype "^2.2.0" whatwg-mimetype "^2.2.0"
whatwg-url "^7.0.0" whatwg-url "^7.0.0"
date-fns@^1.29.0:
version "1.30.1"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c"
integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==
debug@^2.2.0, debug@^2.3.3: debug@^2.2.0, debug@^2.3.3:
version "2.6.9" version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@ -1125,24 +1083,6 @@ decode-uri-component@^0.2.0:
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
deep-equal@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.1.tgz#fc12bbd6850e93212f21344748682ccc5a8813cf"
integrity sha512-7Et6r6XfNW61CPPCIYfm1YPGSmh6+CliYeL4km7GWJcpX5LTAflGF8drLLR+MZX+2P3NZfAfSduutBbSWqER4g==
dependencies:
es-abstract "^1.16.3"
es-get-iterator "^1.0.1"
is-arguments "^1.0.4"
is-date-object "^1.0.1"
is-regex "^1.0.4"
isarray "^2.0.5"
object-is "^1.0.1"
object-keys "^1.1.1"
regexp.prototype.flags "^1.2.0"
side-channel "^1.0.1"
which-boxed-primitive "^1.0.1"
which-collection "^1.0.0"
deep-equal@~1.0.1: deep-equal@~1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
@ -1158,7 +1098,7 @@ deep-is@~0.1.3:
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
define-properties@^1.1.2, define-properties@^1.1.3: define-properties@^1.1.2:
version "1.1.3" version "1.1.3"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
@ -1278,23 +1218,6 @@ error-inject@^1.0.0:
resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37"
integrity sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc= integrity sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc=
es-abstract@^1.16.3, es-abstract@^1.17.0-next.1, es-abstract@^1.17.4:
version "1.17.4"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184"
integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==
dependencies:
es-to-primitive "^1.2.1"
function-bind "^1.1.1"
has "^1.0.3"
has-symbols "^1.0.1"
is-callable "^1.1.5"
is-regex "^1.0.5"
object-inspect "^1.7.0"
object-keys "^1.1.1"
object.assign "^4.1.0"
string.prototype.trimleft "^2.1.1"
string.prototype.trimright "^2.1.1"
es-abstract@^1.5.1: es-abstract@^1.5.1:
version "1.13.0" version "1.13.0"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
@ -1307,19 +1230,6 @@ es-abstract@^1.5.1:
is-regex "^1.0.4" is-regex "^1.0.4"
object-keys "^1.0.12" object-keys "^1.0.12"
es-get-iterator@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.0.tgz#bb98ad9d6d63b31aacdc8f89d5d0ee57bcb5b4c8"
integrity sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==
dependencies:
es-abstract "^1.17.4"
has-symbols "^1.0.1"
is-arguments "^1.0.4"
is-map "^2.0.1"
is-set "^2.0.1"
is-string "^1.0.5"
isarray "^2.0.5"
es-to-primitive@^1.2.0: es-to-primitive@^1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377"
@ -1329,15 +1239,6 @@ es-to-primitive@^1.2.0:
is-date-object "^1.0.1" is-date-object "^1.0.1"
is-symbol "^1.0.2" is-symbol "^1.0.2"
es-to-primitive@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
dependencies:
is-callable "^1.1.4"
is-date-object "^1.0.1"
is-symbol "^1.0.2"
escape-html@^1.0.3: escape-html@^1.0.3:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
@ -1750,11 +1651,6 @@ has-symbols@^1.0.0:
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=
has-symbols@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
has-unicode@^2.0.0: has-unicode@^2.0.0:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
@ -1939,21 +1835,11 @@ is-accessor-descriptor@^1.0.0:
dependencies: dependencies:
kind-of "^6.0.0" kind-of "^6.0.0"
is-arguments@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3"
integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==
is-arrayish@^0.2.1: is-arrayish@^0.2.1:
version "0.2.1" version "0.2.1"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
is-bigint@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.0.tgz#73da8c33208d00f130e9b5e15d23eac9215601c4"
integrity sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==
is-binary-path@~2.1.0: is-binary-path@~2.1.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
@ -1961,11 +1847,6 @@ is-binary-path@~2.1.0:
dependencies: dependencies:
binary-extensions "^2.0.0" binary-extensions "^2.0.0"
is-boolean-object@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.1.tgz#10edc0900dd127697a92f6f9807c7617d68ac48e"
integrity sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==
is-buffer@^1.1.5: is-buffer@^1.1.5:
version "1.1.6" version "1.1.6"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
@ -1976,11 +1857,6 @@ is-callable@^1.1.4:
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
is-callable@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab"
integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==
is-ci@^1.0.10: is-ci@^1.0.10:
version "1.2.1" version "1.2.1"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
@ -2091,21 +1967,11 @@ is-installed-globally@^0.1.0:
global-dirs "^0.1.0" global-dirs "^0.1.0"
is-path-inside "^1.0.0" is-path-inside "^1.0.0"
is-map@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1"
integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==
is-npm@^1.0.0: is-npm@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ=
is-number-object@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197"
integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==
is-number@^3.0.0: is-number@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
@ -2149,33 +2015,16 @@ is-regex@^1.0.4:
dependencies: dependencies:
has "^1.0.1" has "^1.0.1"
is-regex@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
dependencies:
has "^1.0.3"
is-retry-allowed@^1.0.0: is-retry-allowed@^1.0.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
is-set@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43"
integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==
is-stream@^1.0.0, is-stream@^1.1.0: is-stream@^1.0.0, is-stream@^1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
is-string@^1.0.4, is-string@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6"
integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==
is-symbol@^1.0.2: is-symbol@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38"
@ -2197,16 +2046,6 @@ is-typedarray@~1.0.0:
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
is-weakmap@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2"
integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==
is-weakset@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.1.tgz#e9a0af88dbd751589f5e50d80f4c98b780884f83"
integrity sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==
is-windows@^1.0.2: is-windows@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
@ -2227,11 +2066,6 @@ isarray@1.0.0, isarray@~1.0.0:
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
isarray@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
isexe@^2.0.0: isexe@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
@ -2918,7 +2752,7 @@ lodash.sortby@^4.7.0:
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.15: lodash@^4.17.11, lodash@^4.17.13:
version "4.17.15" version "4.17.15"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
@ -2943,11 +2777,6 @@ lru-cache@^4.0.1:
pseudomap "^1.0.2" pseudomap "^1.0.2"
yallist "^2.1.2" yallist "^2.1.2"
lunr@^2.3.5:
version "2.3.8"
resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.8.tgz#a8b89c31f30b5a044b97d2d28e2da191b6ba2072"
integrity sha512-oxMeX/Y35PNFuZoHp+jUj5OSEmLCaIH4KTFJh7a93cHBoFmpw2IoPs22VIz7vyO2YUnx2Tn9dzIwO2P/4quIRg==
make-dir@^1.0.0: make-dir@^1.0.0:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
@ -3109,11 +2938,6 @@ nan@^2.12.1:
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
nanoid@^2.1.0:
version "2.1.11"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.11.tgz#ec24b8a758d591561531b4176a01e3ab4f0f0280"
integrity sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==
nanomatch@^1.2.9: nanomatch@^1.2.9:
version "1.2.13" version "1.2.13"
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
@ -3309,17 +3133,7 @@ object-copy@^0.1.0:
define-property "^0.2.5" define-property "^0.2.5"
kind-of "^3.0.3" kind-of "^3.0.3"
object-inspect@^1.7.0: object-keys@^1.0.12:
version "1.7.0"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==
object-is@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4"
integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==
object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
@ -3331,16 +3145,6 @@ object-visit@^1.0.0:
dependencies: dependencies:
isobject "^3.0.0" isobject "^3.0.0"
object.assign@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
dependencies:
define-properties "^1.1.2"
function-bind "^1.1.1"
has-symbols "^1.0.0"
object-keys "^1.0.11"
object.getownpropertydescriptors@^2.0.3: object.getownpropertydescriptors@^2.0.3:
version "2.0.3" version "2.0.3"
resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
@ -3727,19 +3531,6 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2" extend-shallow "^3.0.2"
safe-regex "^1.1.0" safe-regex "^1.1.0"
regexp.prototype.flags@^1.2.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75"
integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==
dependencies:
define-properties "^1.1.3"
es-abstract "^1.17.0-next.1"
regexparam@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/regexparam/-/regexparam-1.3.0.tgz#2fe42c93e32a40eff6235d635e0ffa344b92965f"
integrity sha512-6IQpFBv6e5vz1QAqI+V4k8P2e/3gRrqfCJ9FI+O1FLQTO+Uz6RXZEZOPmTJ6hlGj7gkERzY5BRCv09whKP96/g==
registry-auth-token@^3.0.1: registry-auth-token@^3.0.1:
version "3.4.0" version "3.4.0"
resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e"
@ -3982,21 +3773,6 @@ shellwords@^0.1.1:
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
shortid@^2.2.8:
version "2.2.15"
resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.15.tgz#2b902eaa93a69b11120373cd42a1f1fe4437c122"
integrity sha512-5EaCy2mx2Jgc/Fdn9uuDuNIIfWBpzY4XIlhoqtXF6qsf+/+SGZ+FxDdX/ZsMZiWupIWNqAEmiNY4RC+LSmCeOw==
dependencies:
nanoid "^2.1.0"
side-channel@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947"
integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==
dependencies:
es-abstract "^1.17.0-next.1"
object-inspect "^1.7.0"
signal-exit@^3.0.0, signal-exit@^3.0.2: signal-exit@^3.0.0, signal-exit@^3.0.2:
version "3.0.2" version "3.0.2"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
@ -4186,22 +3962,6 @@ string-width@^3.0.0, string-width@^3.1.0:
is-fullwidth-code-point "^2.0.0" is-fullwidth-code-point "^2.0.0"
strip-ansi "^5.1.0" strip-ansi "^5.1.0"
string.prototype.trimleft@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74"
integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==
dependencies:
define-properties "^1.1.3"
function-bind "^1.1.1"
string.prototype.trimright@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9"
integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==
dependencies:
define-properties "^1.1.3"
function-bind "^1.1.1"
string_decoder@^1.1.1: string_decoder@^1.1.1:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
@ -4290,11 +4050,6 @@ supports-color@^6.1.0:
dependencies: dependencies:
has-flag "^3.0.0" has-flag "^3.0.0"
svelte@^3.9.2:
version "3.19.2"
resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.19.2.tgz#4b0169ee33b37399f08eb92163593a0a46c242c7"
integrity sha512-Jswg065u8R9QYcN0rdpTQSFIr0hFq7YUzcPpEY6ZpFSAWkJKZG9AJvHE1d8+NJDTfr7SzKrO6EYssYYkUmszpA==
symbol-tree@^3.2.2: symbol-tree@^3.2.2:
version "3.2.4" version "3.2.4"
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
@ -4673,27 +4428,6 @@ whatwg-url@^7.0.0:
tr46 "^1.0.1" tr46 "^1.0.1"
webidl-conversions "^4.0.2" webidl-conversions "^4.0.2"
which-boxed-primitive@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz#cbe8f838ebe91ba2471bb69e9edbda67ab5a5ec1"
integrity sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==
dependencies:
is-bigint "^1.0.0"
is-boolean-object "^1.0.0"
is-number-object "^1.0.3"
is-string "^1.0.4"
is-symbol "^1.0.2"
which-collection@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906"
integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==
dependencies:
is-map "^2.0.1"
is-set "^2.0.1"
is-weakmap "^2.0.1"
is-weakset "^2.0.1"
which-module@^2.0.0: which-module@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -59,7 +59,7 @@ window["##BUDIBASE_APPDEFINITION##"] = {
getShardName: "", getShardName: "",
getSortKey: "record.id", getSortKey: "record.id",
aggregateGroups: [], aggregateGroups: [],
allowedRecordNodeIds: [2], allowedModelNodeIds: [2],
nodeId: 5, nodeId: 5,
}, },
], ],
@ -79,7 +79,7 @@ window["##BUDIBASE_APPDEFINITION##"] = {
getShardName: "", getShardName: "",
getSortKey: "record.id", getSortKey: "record.id",
aggregateGroups: [], aggregateGroups: [],
allowedRecordNodeIds: [1], allowedModelNodeIds: [1],
nodeId: 4, nodeId: 4,
}, },
{ {
@ -91,7 +91,7 @@ window["##BUDIBASE_APPDEFINITION##"] = {
getShardName: "", getShardName: "",
getSortKey: "record.id", getSortKey: "record.id",
aggregateGroups: [], aggregateGroups: [],
allowedRecordNodeIds: [2], allowedModelNodeIds: [2],
nodeId: 6, nodeId: 6,
}, },
], ],