mirror of https://github.com/Budibase/budibase.git
205 changed files with 3961 additions and 166037 deletions
@ -1,26 +0,0 @@ |
|||||
<script> |
|
||||
import IconButton from "components/common/IconButton.svelte" |
|
||||
import { store } from "builderStore" |
|
||||
import UserInterfaceRoot from "components/userInterface/UserInterfaceRoot.svelte" |
|
||||
import { fade } from "svelte/transition" |
|
||||
</script> |
|
||||
|
|
||||
<div class="root"> |
|
||||
<div class="content uk-container"> |
|
||||
|
|
||||
<h1>Settings</h1> |
|
||||
|
|
||||
<label> |
|
||||
<input |
|
||||
type="checkbox" |
|
||||
class="uk-checkbox" |
|
||||
bind:checked={$store.useAnalytics} /> |
|
||||
Send analytics |
|
||||
</label> |
|
||||
|
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<style> |
|
||||
|
|
||||
</style> |
|
||||
@ -1,12 +0,0 @@ |
|||||
import { createNewHierarchy } from "components/common/core" |
|
||||
|
|
||||
export const createPackage = (packageInfo, store) => { |
|
||||
packageInfo.createNewPackage("") |
|
||||
const root = createNewHierarchy() |
|
||||
store.importAppDefinition({ |
|
||||
hierarchy: root, |
|
||||
actions: [], |
|
||||
triggers: [], |
|
||||
accessLevels: { version: 0, levels: [] }, |
|
||||
}) |
|
||||
} |
|
||||
@ -1,123 +0,0 @@ |
|||||
<script> |
|
||||
import { cloneDeep, map, some, filter } from "lodash/fp" |
|
||||
import Textbox from "../common/Textbox.svelte" |
|
||||
import Checkbox from "../common/Checkbox.svelte" |
|
||||
import ButtonGroup from "../common/ButtonGroup.svelte" |
|
||||
import Button from "../common/Button.svelte" |
|
||||
import ActionButton from "../common/ActionButton.svelte" |
|
||||
import { validateAccessLevels, nodeNameFromNodeKey } from "../common/core" |
|
||||
import ErrorsBox from "../common/ErrorsBox.svelte" |
|
||||
|
|
||||
export let level |
|
||||
export let allPermissions |
|
||||
export let onFinished |
|
||||
export let isNew |
|
||||
export let allLevels |
|
||||
export let hierarchy |
|
||||
export let actions |
|
||||
export let close |
|
||||
export let title |
|
||||
|
|
||||
let errors = [] |
|
||||
let clonedLevel = cloneDeep(level) |
|
||||
|
|
||||
const matchPermissions = (p1, p2) => |
|
||||
p1.type === p2.type && |
|
||||
((!p2.nodeKey && !p1.nodeKey) || p2.nodeKey === p1.nodeKey) |
|
||||
|
|
||||
const hasPermission = hasPerm => |
|
||||
clonedLevel.permissions.some(permission => |
|
||||
matchPermissions(permission, hasPerm) |
|
||||
) |
|
||||
|
|
||||
$: permissionMatrix = allPermissions.map(permission => ({ |
|
||||
permission, |
|
||||
hasPermission: hasPermission(permission), |
|
||||
})) |
|
||||
|
|
||||
$: allPermissionsSelected = permissionMatrix.every( |
|
||||
permission => permission.hasPermission |
|
||||
) |
|
||||
|
|
||||
const getPermissionName = perm => |
|
||||
perm.nodeKey |
|
||||
? `${perm.type} - ${nodeNameFromNodeKey(hierarchy, perm.nodeKey)}` |
|
||||
: perm.type |
|
||||
|
|
||||
const save = () => { |
|
||||
const newLevels = isNew |
|
||||
? [...allLevels, clonedLevel] |
|
||||
: [...allLevels.filter(l => l.name !== level.name), clonedLevel] |
|
||||
|
|
||||
errors = validateAccessLevels(hierarchy, actions, newLevels) |
|
||||
|
|
||||
if (errors.length > 0) return |
|
||||
|
|
||||
onFinished(clonedLevel) |
|
||||
close() |
|
||||
} |
|
||||
|
|
||||
const permissionChanged = perm => ev => { |
|
||||
const hasPermission = ev.target.checked |
|
||||
|
|
||||
if (hasPermission) { |
|
||||
clonedLevel.permissions.push(perm) |
|
||||
} else { |
|
||||
clonedLevel.permissions = filter(p => !matchPermissions(p, perm))( |
|
||||
clonedLevel.permissions |
|
||||
) |
|
||||
} |
|
||||
allPermissions = allPermissions |
|
||||
} |
|
||||
</script> |
|
||||
|
|
||||
<div> |
|
||||
|
|
||||
<div class="uk-modal-header"> |
|
||||
<h4 class="budibase__title--4">{title}</h4> |
|
||||
</div> |
|
||||
|
|
||||
<ErrorsBox {errors} /> |
|
||||
|
|
||||
<form on:submit|preventDefault class="uk-form-horizontal"> |
|
||||
|
|
||||
<Textbox label="Access Level Name" bind:text={clonedLevel.name} /> |
|
||||
|
|
||||
<h4 class="budibase__title--4">Permissions</h4> |
|
||||
|
|
||||
<Checkbox |
|
||||
label={'Select All'} |
|
||||
checked={allPermissionsSelected} |
|
||||
on:change={ev => { |
|
||||
permissionMatrix.forEach(permission => |
|
||||
permissionChanged(permission.permission)(ev) |
|
||||
) |
|
||||
}} /> |
|
||||
{#each permissionMatrix as permission} |
|
||||
<div class="permission-container"> |
|
||||
<Checkbox |
|
||||
label={getPermissionName(permission.permission)} |
|
||||
checked={permission.hasPermission} |
|
||||
on:change={permissionChanged(permission.permission)} /> |
|
||||
</div> |
|
||||
{/each} |
|
||||
|
|
||||
</form> |
|
||||
|
|
||||
<div class="uk-modal-footer uk-text-right"> |
|
||||
<ButtonGroup> |
|
||||
<ActionButton primary grouped on:click={save}>Save</ActionButton> |
|
||||
<ActionButton alert grouped on:click={() => onFinished()}> |
|
||||
Cancel |
|
||||
</ActionButton> |
|
||||
</ButtonGroup> |
|
||||
</div> |
|
||||
|
|
||||
</div> |
|
||||
|
|
||||
<style> |
|
||||
.permission-container { |
|
||||
margin-top: 10px; |
|
||||
margin-bottom: 10px; |
|
||||
} |
|
||||
</style> |
|
||||
@ -1,132 +1,5 @@ |
|||||
import { |
import { common } from "../../../../core/src" |
||||
hierarchy as hierarchyFunctions, |
|
||||
common, |
|
||||
getTemplateApi, |
|
||||
getAuthApi, |
|
||||
} from "../../../../core/src" |
|
||||
import { _getNew } from "../../../../core/src/recordApi/getNew" |
|
||||
import { find, filter, keyBy, flatten, map } from "lodash/fp" |
|
||||
import { generateSchema } from "../../../../core/src/indexing/indexSchemaCreator" |
|
||||
import { generate } from "shortid" |
|
||||
|
|
||||
export { canDeleteIndex } from "../../../../core/src/templateApi/canDeleteIndex" |
|
||||
export { canDeleteModel } from "../../../../core/src/templateApi/canDeleteModel" |
|
||||
export { userWithFullAccess } from "../../../../core/src/index" |
|
||||
export { joinKey } from "../../../../core/src/common" |
|
||||
export { getExactNodeForKey } from "../../../../core/src/templateApi/hierarchy" |
|
||||
export const pipe = common.$ |
export const pipe = common.$ |
||||
|
|
||||
export const events = common.eventsList |
export const events = common.eventsList |
||||
|
|
||||
export const getNode = (hierarchy, nodeId) => |
|
||||
pipe(hierarchy, [ |
|
||||
hierarchyFunctions.getFlattenedHierarchy, |
|
||||
find(n => n.nodeId === nodeId || n.nodeKey() === nodeId), |
|
||||
]) |
|
||||
|
|
||||
export const constructHierarchy = node => { |
|
||||
if (!node) return node |
|
||||
return templateApi(node).constructHierarchy(node) |
|
||||
} |
|
||||
|
|
||||
export const createNewHierarchy = () => { |
|
||||
return templateApi().getNewRootLevel() |
|
||||
} |
|
||||
|
|
||||
export const templateApi = hierarchy => getTemplateApi({ hierarchy }) |
|
||||
export const authApi = (hierarchy, actions) => |
|
||||
getAuthApi({ |
|
||||
hierarchy, |
|
||||
actions: keyBy("name")(actions), |
|
||||
publish: () => { }, |
|
||||
}) |
|
||||
|
|
||||
export const allTypes = templateApi({}).allTypes |
|
||||
|
|
||||
export const validate = { |
|
||||
all: templateApi({}).validateAll, |
|
||||
node: templateApi({}).validateNode, |
|
||||
field: templateApi({}).validateField, |
|
||||
} |
|
||||
|
|
||||
export const getPotentialReverseReferenceIndexes = (hierarchy, refIndex) => { |
|
||||
const res = pipe(hierarchy, [ |
|
||||
hierarchyFunctions.getFlattenedHierarchy, |
|
||||
filter( |
|
||||
n => |
|
||||
hierarchyFunctions.isAncestor(refIndex)(n) || |
|
||||
hierarchyFunctions.isAncestor(refIndex)(n.parent()) |
|
||||
), |
|
||||
map(n => n.indexes), |
|
||||
flatten, |
|
||||
filter(hierarchyFunctions.isReferenceIndex), |
|
||||
]) |
|
||||
|
|
||||
return res |
|
||||
} |
|
||||
|
|
||||
export const getPotentialReferenceIndexes = (hierarchy, model) => |
|
||||
pipe(hierarchy, [ |
|
||||
hierarchyFunctions.getFlattenedHierarchy, |
|
||||
filter(hierarchyFunctions.isAncestorIndex), |
|
||||
filter( |
|
||||
i => |
|
||||
hierarchyFunctions.isAncestor(model)(i.parent()) || |
|
||||
i.parent().nodeId === model.parent().nodeId || |
|
||||
hierarchyFunctions.isRoot(i.parent()) |
|
||||
), |
|
||||
]) |
|
||||
|
|
||||
export const isIndex = hierarchyFunctions.isIndex |
|
||||
export const isModel = hierarchyFunctions.isModel |
|
||||
export const nodeNameFromNodeKey = hierarchyFunctions.nodeNameFromNodeKey |
|
||||
|
|
||||
export const getDefaultTypeOptions = type => |
|
||||
!type ? {} : allTypes[type].getDefaultOptions() |
|
||||
|
|
||||
export const getNewAction = () => templateApi({}).createAction() |
|
||||
export const getNewTrigger = () => templateApi({}).createTrigger() |
|
||||
|
|
||||
export const validateActions = actions => |
|
||||
templateApi({}).validateActions(actions) |
|
||||
export const validateTriggers = (triggers, actions) => |
|
||||
templateApi({}).validateTriggers(triggers, actions) |
|
||||
|
|
||||
export const generateFullPermissions = (hierarchy, actions) => |
|
||||
authApi(hierarchy, actions).generateFullPermissions() |
|
||||
|
|
||||
export const getNewAccessLevel = () => authApi().getNewAccessLevel() |
|
||||
|
|
||||
export const validateAccessLevels = (hierarchy, actions, accessLevels) => |
|
||||
authApi(hierarchy, actions).validateAccessLevels(accessLevels) |
|
||||
|
|
||||
export const getIndexNodes = hierarchy => |
|
||||
pipe(hierarchy, [ |
|
||||
hierarchyFunctions.getFlattenedHierarchy, |
|
||||
filter(hierarchyFunctions.isIndex), |
|
||||
]) |
|
||||
|
|
||||
export const getRecordNodes = hierarchy => |
|
||||
pipe(hierarchy, [ |
|
||||
hierarchyFunctions.getFlattenedHierarchy, |
|
||||
filter(hierarchyFunctions.isModel), |
|
||||
]) |
|
||||
|
|
||||
export const getIndexSchema = hierarchy => index => |
|
||||
generateSchema(hierarchy, index) |
|
||||
|
|
||||
export const getNewRecord = _getNew |
|
||||
|
|
||||
export const getNewInstance = (appId, name) => { |
|
||||
const id = `2-${generate()}` |
|
||||
return { |
|
||||
key: `/applications/${appId}/instances/${id}`, |
|
||||
active: true, |
|
||||
version: { key: "" }, |
|
||||
isNew: true, |
|
||||
type: "instance", |
|
||||
datastoreconfig: "", |
|
||||
id, |
|
||||
name, |
|
||||
} |
|
||||
} |
|
||||
@ -1,335 +0,0 @@ |
|||||
<script> |
|
||||
import { splitName } from "./pagesParsing/splitRootComponentName.js" |
|
||||
import { store } from "builderStore" |
|
||||
import { |
|
||||
find, |
|
||||
sortBy, |
|
||||
groupBy, |
|
||||
values, |
|
||||
filter, |
|
||||
map, |
|
||||
uniqBy, |
|
||||
flatten, |
|
||||
} from "lodash/fp" |
|
||||
import { ImageIcon, InputIcon, LayoutIcon } from "components/common/Icons/" |
|
||||
import Select from "components/common/Select.svelte" |
|
||||
import Button from "components/common/PlusButton.svelte" |
|
||||
import ConfirmDialog from "components/common/ConfirmDialog.svelte" |
|
||||
import { |
|
||||
getRecordNodes, |
|
||||
getIndexNodes, |
|
||||
getIndexSchema, |
|
||||
pipe, |
|
||||
} from "components/common/core" |
|
||||
|
|
||||
export let toggleTab |
|
||||
|
|
||||
let componentLibraries = [] |
|
||||
let current_view = "text" |
|
||||
let selectedComponent = null |
|
||||
let selectedLib |
|
||||
let selectTemplateDialog |
|
||||
let templateInstances = [] |
|
||||
let selectedTemplateInstance |
|
||||
|
|
||||
//Info: Components seem to be generated from individual templates. Will this be the same going forward |
|
||||
$: templatesByComponent = groupBy(t => t.component)($store.templates) |
|
||||
$: hierarchy = $store.hierarchy |
|
||||
$: libraryModules = $store.libraries |
|
||||
$: standaloneTemplates = pipe( |
|
||||
templatesByComponent, |
|
||||
[ |
|
||||
values, |
|
||||
flatten, |
|
||||
filter(t => !$store.components.some(c => c.name === t.component)), |
|
||||
map(t => ({ name: splitName(t.component).componentName, template: t })), |
|
||||
uniqBy(t => t.name), |
|
||||
] |
|
||||
) |
|
||||
|
|
||||
const addRootComponent = (component, allComponents) => { |
|
||||
const { libName } = splitName(component.name) |
|
||||
let group = find(r => r.libName === libName)(allComponents) |
|
||||
|
|
||||
if (!group) { |
|
||||
group = { |
|
||||
libName, |
|
||||
components: [], |
|
||||
} |
|
||||
|
|
||||
allComponents.push(group) |
|
||||
} |
|
||||
|
|
||||
group.components.push(component) |
|
||||
} |
|
||||
|
|
||||
const onComponentChosen = component => { |
|
||||
if (component.template) { |
|
||||
onTemplateChosen(component.template) |
|
||||
} else { |
|
||||
store.addChildComponent(component.name) |
|
||||
toggleTab() |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
//Info: Called from menu beside components with presets and templates |
|
||||
const onTemplateChosen = template => { |
|
||||
selectedComponent = null |
|
||||
const { componentName, libName } = splitName(template.name) |
|
||||
//Info: how will DB changes effect this? |
|
||||
const templateOptions = { |
|
||||
records: getRecordNodes(hierarchy), |
|
||||
indexes: getIndexNodes(hierarchy), |
|
||||
helpers: { |
|
||||
indexSchema: getIndexSchema(hierarchy), |
|
||||
}, |
|
||||
} |
|
||||
//Info: go off and get template instances by library and component name |
|
||||
//libraryModules and hierarchies (used above) come from builderStore |
|
||||
templateInstances = libraryModules[libName][componentName](templateOptions) |
|
||||
if (!templateInstances || templateInstances.length === 0) return |
|
||||
selectedTemplateInstance = templateInstances[0].name |
|
||||
selectTemplateDialog.show() |
|
||||
} |
|
||||
|
|
||||
const onTemplateInstanceChosen = () => { |
|
||||
selectedComponent = null |
|
||||
const instance = templateInstances.find( |
|
||||
i => i.name === selectedTemplateInstance |
|
||||
) |
|
||||
debugger |
|
||||
store.addTemplatedComponent(instance.props) |
|
||||
toggleTab() |
|
||||
} |
|
||||
|
|
||||
function generate_components_list(components) { |
|
||||
debugger |
|
||||
return ($store.currentFrontEndType === "page" |
|
||||
? $store.builtins.concat(components) |
|
||||
: components |
|
||||
).concat(standaloneTemplates) |
|
||||
} |
|
||||
|
|
||||
$: { |
|
||||
const newComponentLibraries = [] |
|
||||
|
|
||||
for (let comp of sortBy(["name"])($store.components)) { |
|
||||
addRootComponent(comp, newComponentLibraries) |
|
||||
} |
|
||||
|
|
||||
componentLibraries = newComponentLibraries |
|
||||
if (!selectedLib) selectedLib = newComponentLibraries[0].libName |
|
||||
} |
|
||||
|
|
||||
$: componentLibrary = componentLibraries.find(l => l.libName === selectedLib) |
|
||||
</script> |
|
||||
|
|
||||
<div class="root"> |
|
||||
<Select on:change={e => (selectedLib = e.target.value)}> |
|
||||
{#each componentLibraries as lib} |
|
||||
<option value={lib.libName}>{lib.libName}</option> |
|
||||
{/each} |
|
||||
</Select> |
|
||||
|
|
||||
<div class="library-container"> |
|
||||
<!-- <ul> |
|
||||
<li> |
|
||||
<button |
|
||||
class:selected={current_view === 'text'} |
|
||||
on:click={() => (current_view = 'text')}> |
|
||||
<InputIcon /> |
|
||||
</button> |
|
||||
</li> |
|
||||
<li> |
|
||||
<button |
|
||||
class:selected={current_view === 'layout'} |
|
||||
on:click={() => (current_view = 'layout')}> |
|
||||
<LayoutIcon /> |
|
||||
</button> |
|
||||
</li> |
|
||||
<li> |
|
||||
<button |
|
||||
class:selected={current_view === 'media'} |
|
||||
on:click={() => (current_view = 'media')}> |
|
||||
<ImageIcon /> |
|
||||
</button> |
|
||||
</li> |
|
||||
</ul> --> |
|
||||
|
|
||||
{#if componentLibrary} |
|
||||
{#each generate_components_list(componentLibrary.components) as component} |
|
||||
<div class="component-container"> |
|
||||
<div class="component" on:click={() => onComponentChosen(component)}> |
|
||||
<div class="name">{splitName(component.name).componentName}</div> |
|
||||
{#if (component.presets || templatesByComponent[component.name]) && component.name === selectedComponent} |
|
||||
<ul class="preset-menu"> |
|
||||
{#if component.presets} |
|
||||
<span>{splitName(component.name).componentName} Presets</span> |
|
||||
{#each Object.keys(component.presets) as preset} |
|
||||
<li |
|
||||
on:click|stopPropagation={() => onComponentChosen(component, preset)}> |
|
||||
{preset} |
|
||||
</li> |
|
||||
{/each} |
|
||||
{/if} |
|
||||
{#if templatesByComponent[component.name]} |
|
||||
<span> |
|
||||
{splitName(component.name).componentName} Templates |
|
||||
</span> |
|
||||
{#each templatesByComponent[component.name] as template} |
|
||||
<li |
|
||||
on:click|stopPropagation={() => onTemplateChosen(template)}> |
|
||||
{template.description} |
|
||||
</li> |
|
||||
{/each} |
|
||||
{/if} |
|
||||
</ul> |
|
||||
{/if} |
|
||||
</div> |
|
||||
{#if component.presets || templatesByComponent[component.name]} |
|
||||
<Button |
|
||||
on:click={() => { |
|
||||
selectedComponent = selectedComponent ? null : component.name |
|
||||
}}> |
|
||||
<span |
|
||||
class="open-presets" |
|
||||
class:open={selectedComponent === component.name}> |
|
||||
... |
|
||||
</span> |
|
||||
</Button> |
|
||||
{/if} |
|
||||
</div> |
|
||||
{/each} |
|
||||
{/if} |
|
||||
</div> |
|
||||
|
|
||||
</div> |
|
||||
|
|
||||
<ConfirmDialog |
|
||||
bind:this={selectTemplateDialog} |
|
||||
title="Choose Template" |
|
||||
onCancel={() => (selectedComponent = null)} |
|
||||
onOk={onTemplateInstanceChosen}> |
|
||||
{#each templateInstances.map(i => i.name) as instance} |
|
||||
<div class="uk-margin uk-grid-small uk-child-width-auto uk-grid"> |
|
||||
<label> |
|
||||
<input |
|
||||
class="uk-radio" |
|
||||
type="radio" |
|
||||
bind:group={selectedTemplateInstance} |
|
||||
value={instance} /> |
|
||||
<span class="template-instance-label">{instance}</span> |
|
||||
</label> |
|
||||
</div> |
|
||||
{/each} |
|
||||
</ConfirmDialog> |
|
||||
|
|
||||
<style> |
|
||||
.root { |
|
||||
display: flex; |
|
||||
flex-direction: column; |
|
||||
} |
|
||||
|
|
||||
.library-container { |
|
||||
padding: 0 0 10px 0; |
|
||||
flex: 1 1 auto; |
|
||||
min-height: 0px; |
|
||||
margin-top: 20px; |
|
||||
} |
|
||||
|
|
||||
.component-container { |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
} |
|
||||
|
|
||||
.component { |
|
||||
position: relative; |
|
||||
padding: 0 15px; |
|
||||
cursor: pointer; |
|
||||
border: 1px solid #d8d8d8; |
|
||||
border-radius: 2px; |
|
||||
margin: 5px 0; |
|
||||
height: 40px; |
|
||||
box-sizing: border-box; |
|
||||
color: #000333; |
|
||||
display: flex; |
|
||||
align-items: center; |
|
||||
flex: 1; |
|
||||
margin-right: 5px; |
|
||||
} |
|
||||
|
|
||||
.component:hover { |
|
||||
background-color: var(--lightslate); |
|
||||
} |
|
||||
|
|
||||
.component > .name { |
|
||||
color: #000333; |
|
||||
display: inline-block; |
|
||||
font-size: 13px; |
|
||||
opacity: 0.8; |
|
||||
} |
|
||||
|
|
||||
ul { |
|
||||
list-style: none; |
|
||||
display: flex; |
|
||||
padding: 0; |
|
||||
} |
|
||||
|
|
||||
.preset-menu { |
|
||||
flex-direction: column; |
|
||||
position: absolute; |
|
||||
top: 25px; |
|
||||
left: 0; |
|
||||
right: 0; |
|
||||
z-index: 1; |
|
||||
background: #fafafa; |
|
||||
padding: 10px; |
|
||||
border-radius: 2px; |
|
||||
color: var(--secondary80); |
|
||||
} |
|
||||
|
|
||||
.preset-menu > span { |
|
||||
font-size: 13px; |
|
||||
text-transform: uppercase; |
|
||||
margin-top: 5px; |
|
||||
} |
|
||||
|
|
||||
.preset-menu li { |
|
||||
font-size: 14px; |
|
||||
margin-top: 13px; |
|
||||
} |
|
||||
|
|
||||
.preset-menu li:hover { |
|
||||
font-weight: bold; |
|
||||
} |
|
||||
|
|
||||
li { |
|
||||
margin-right: 20px; |
|
||||
background: none; |
|
||||
border-radius: 5px; |
|
||||
} |
|
||||
|
|
||||
/* li button { |
|
||||
width: 100%; |
|
||||
height: 100%; |
|
||||
background: none; |
|
||||
border: none; |
|
||||
border-radius: 5px; |
|
||||
padding: 13px; |
|
||||
outline: none; |
|
||||
cursor: pointer; |
|
||||
} */ |
|
||||
|
|
||||
/* .selected { |
|
||||
color: var(--button-text); |
|
||||
background: var(--background-button) !important; |
|
||||
} */ |
|
||||
|
|
||||
.open { |
|
||||
color: rgba(0, 85, 255, 1); |
|
||||
} |
|
||||
|
|
||||
.template-instance-label { |
|
||||
margin-left: 20px; |
|
||||
} |
|
||||
</style> |
|
||||
@ -1,134 +0,0 @@ |
|||||
<script> |
|
||||
import { store } from "builderStore" |
|
||||
import Textbox from "components/common/Textbox.svelte" |
|
||||
import Button from "components/common/Button.svelte" |
|
||||
import IconButton from "components/common/IconButton.svelte" |
|
||||
import { libraryDependencies } from "./pagesParsing/findDependencies" |
|
||||
import UIkit from "uikit" |
|
||||
import { libsFromPages } from "builderStore/loadComponentLibraries" |
|
||||
let addNewLib = "" |
|
||||
let addNewStylesheet = "" |
|
||||
let modalElement |
|
||||
|
|
||||
$: components = $store.components |
|
||||
|
|
||||
const removeLibrary = lib => { |
|
||||
const dependencies = libraryDependencies(components, lib) |
|
||||
if (dependencies.length > 0) return |
|
||||
store.removeComponentLibrary(lib) |
|
||||
} |
|
||||
|
|
||||
const addLib = () => { |
|
||||
store.addComponentLibrary(addNewLib).then(() => { |
|
||||
addNewLib = "" |
|
||||
}) |
|
||||
} |
|
||||
|
|
||||
const removeStylesheet = stylesheet => { |
|
||||
store.removeStylesheet(stylesheet) |
|
||||
} |
|
||||
|
|
||||
const addStylesheet = () => { |
|
||||
if (addNewStylesheet) store.addStylesheet(addNewStylesheet) |
|
||||
} |
|
||||
|
|
||||
export const close = () => { |
|
||||
UIkit.modal(modalElement).hide() |
|
||||
} |
|
||||
|
|
||||
export const show = () => { |
|
||||
UIkit.modal(modalElement).show() |
|
||||
} |
|
||||
</script> |
|
||||
|
|
||||
<div bind:this={modalElement} id="new-component-modal" uk-modal> |
|
||||
<div class="uk-modal-dialog"> |
|
||||
|
|
||||
<div class="uk-modal-header header"> |
|
||||
<div>Settings</div> |
|
||||
<div> |
|
||||
<IconButton icon="x" on:click={close} /> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<div class="uk-modal-body uk-form-horizontal"> |
|
||||
|
|
||||
<div class="section-container"> |
|
||||
<p> |
|
||||
Component Libraries |
|
||||
<span> |
|
||||
<input bind:value={addNewLib} /> |
|
||||
<Button color="primary-outline" on:click={addLib}>Add</Button> |
|
||||
</span> |
|
||||
</p> |
|
||||
{#each $store.pages[$store.currentPageName].componentLibraries as lib} |
|
||||
<div> |
|
||||
<span class="row-text">{lib}</span> |
|
||||
<IconButton icon="x" on:click={() => removeLibrary(lib)} /> |
|
||||
</div> |
|
||||
{/each} |
|
||||
</div> |
|
||||
|
|
||||
<div class="section-container"> |
|
||||
<p> |
|
||||
Stylesheets |
|
||||
<span> |
|
||||
<input bind:value={addNewStylesheet} /> |
|
||||
<Button color="primary-outline" on:click={addStylesheet}> |
|
||||
Add |
|
||||
</Button> |
|
||||
</span> |
|
||||
</p> |
|
||||
{#each $store.pages[$store.currentPageName].stylesheets as stylesheet} |
|
||||
<div> |
|
||||
<span class="row-text">{stylesheet}</span> |
|
||||
<IconButton |
|
||||
icon="x" |
|
||||
on:click={() => removeStylesheet(stylesheet)} /> |
|
||||
</div> |
|
||||
{/each} |
|
||||
</div> |
|
||||
|
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
|
|
||||
<style> |
|
||||
.section-container { |
|
||||
padding: 15px; |
|
||||
border-style: dotted; |
|
||||
border-width: 1px; |
|
||||
border-color: var(--lightslate); |
|
||||
border-radius: 2px; |
|
||||
} |
|
||||
|
|
||||
.section-container:nth-child(1) { |
|
||||
margin-bottom: 15px; |
|
||||
} |
|
||||
|
|
||||
.row-text { |
|
||||
margin-right: 15px; |
|
||||
color: var(--primary100); |
|
||||
} |
|
||||
|
|
||||
input { |
|
||||
margin-right: 15px; |
|
||||
} |
|
||||
|
|
||||
p > span { |
|
||||
margin-left: 30px; |
|
||||
} |
|
||||
|
|
||||
.header { |
|
||||
display: grid; |
|
||||
grid-template-columns: [title] 1fr [icon] auto; |
|
||||
} |
|
||||
|
|
||||
.header > div:nth-child(1) { |
|
||||
grid-column-start: title; |
|
||||
} |
|
||||
|
|
||||
.header > div:nth-child(2) { |
|
||||
grid-column-start: icon; |
|
||||
} |
|
||||
</style> |
|
||||
@ -1,100 +0,0 @@ |
|||||
<script> |
|
||||
import { getContext } from "svelte" |
|
||||
const { open, close } = getContext("simple-modal") |
|
||||
|
|
||||
import ButtonGroup from "components/common/ButtonGroup.svelte" |
|
||||
import Button from "components/common/Button.svelte" |
|
||||
import ActionButton from "components/common/ActionButton.svelte" |
|
||||
import { store, backendUiStore } from "builderStore" |
|
||||
import { |
|
||||
generateFullPermissions, |
|
||||
getNewAccessLevel, |
|
||||
} from "components/common/core" |
|
||||
import getIcon from "components/common/icon" |
|
||||
import AccessLevelView from "components/accessLevels/AccessLevelView.svelte" |
|
||||
|
|
||||
let editingLevel = null |
|
||||
let editingLevelIsNew = false |
|
||||
let allPermissions = [] |
|
||||
store.subscribe(db => { |
|
||||
allPermissions = generateFullPermissions(db.hierarchy, db.actions) |
|
||||
}) |
|
||||
|
|
||||
const openModal = (level, newLevel) => { |
|
||||
editingLevel = level |
|
||||
editingLevelIsNew = newLevel |
|
||||
open(AccessLevelView, { |
|
||||
level: editingLevel, |
|
||||
allPermissions, |
|
||||
onFinished: onEditingFinished, |
|
||||
isNew: editingLevelIsNew, |
|
||||
allLevels: $store.accessLevels.levels, |
|
||||
hierarchy: $store.hierarchy, |
|
||||
actions: $store.actions, |
|
||||
close: close, |
|
||||
title: "Access Level", |
|
||||
}) |
|
||||
} |
|
||||
|
|
||||
let cancel = () => { |
|
||||
editingAction = null |
|
||||
close() |
|
||||
} |
|
||||
|
|
||||
let onEditingFinished = level => { |
|
||||
if (level) { |
|
||||
store.saveLevel(level, editingLevelIsNew, editingLevel) |
|
||||
} |
|
||||
editingLevel = null |
|
||||
close() |
|
||||
} |
|
||||
|
|
||||
const getPermissionsString = perms => { |
|
||||
return `${perms.length} / ${allPermissions.length}` |
|
||||
} |
|
||||
</script> |
|
||||
|
|
||||
<div class="root"> |
|
||||
<ButtonGroup> |
|
||||
<ActionButton primary on:click={() => openModal(getNewAccessLevel(), true)}> |
|
||||
Create New Access Level |
|
||||
</ActionButton> |
|
||||
</ButtonGroup> |
|
||||
|
|
||||
{#if $store.accessLevels} |
|
||||
<table class="fields-table uk-table uk-table-small"> |
|
||||
<thead> |
|
||||
<tr> |
|
||||
<th>Name</th> |
|
||||
<th>Permissions</th> |
|
||||
<th /> |
|
||||
</tr> |
|
||||
</thead> |
|
||||
<tbody> |
|
||||
{#each $store.accessLevels.levels as level} |
|
||||
<tr> |
|
||||
<td>{level.name}</td> |
|
||||
<td>{getPermissionsString(level.permissions)}</td> |
|
||||
<td class="edit-button"> |
|
||||
<span on:click={() => openModal(level, false)}> |
|
||||
{@html getIcon('edit')} |
|
||||
</span> |
|
||||
<span on:click={() => store.deleteLevel(level)}> |
|
||||
{@html getIcon('trash')} |
|
||||
</span> |
|
||||
</td> |
|
||||
</tr> |
|
||||
{/each} |
|
||||
</tbody> |
|
||||
</table> |
|
||||
{:else}(no actions added){/if} |
|
||||
|
|
||||
</div> |
|
||||
|
|
||||
<style> |
|
||||
.root { |
|
||||
height: 100%; |
|
||||
position: relative; |
|
||||
padding: 1.5rem; |
|
||||
} |
|
||||
</style> |
|
||||
@ -1,22 +0,0 @@ |
|||||
const handler = require("./instanceHandler") |
|
||||
|
|
||||
module.exports = { |
|
||||
command: "instance <appname> [config]", |
|
||||
desc: "Create a new instance for an app", |
|
||||
builder: yargs => { |
|
||||
yargs.positional("appname", { |
|
||||
type: "string", |
|
||||
describe: "the name of the app to create an instance", |
|
||||
alias: "a", |
|
||||
}) |
|
||||
|
|
||||
yargs.positional("config", { |
|
||||
type: "string", |
|
||||
describe: |
|
||||
"config file to use. optional, defaults to config.js. Use 'dev' as shorthand for 'config.dev.js' ", |
|
||||
alias: "c", |
|
||||
default: "config.js", |
|
||||
}) |
|
||||
}, |
|
||||
handler, |
|
||||
} |
|
||||
@ -1,116 +0,0 @@ |
|||||
const inquirer = require("inquirer") |
|
||||
const { readJSON } = require("fs-extra") |
|
||||
const { join } = require("path") |
|
||||
const chalk = require("chalk") |
|
||||
const fp = require("lodash/fp") |
|
||||
const { getAppContext } = require("../../common") |
|
||||
const passwordQuestion = require("@inquirer/password") |
|
||||
|
|
||||
module.exports = opts => { |
|
||||
run(opts) |
|
||||
} |
|
||||
|
|
||||
const run = async opts => { |
|
||||
try { |
|
||||
const appContext = await getAppContext({ |
|
||||
configName: opts.config, |
|
||||
masterIsCreated: true, |
|
||||
}) |
|
||||
opts.appContext = appContext |
|
||||
opts.datapath = "./.data" |
|
||||
await fetchUserLevels(opts) |
|
||||
await prompts(opts) |
|
||||
await createInstance(opts) |
|
||||
console.log( |
|
||||
chalk.green(`Budibase instance created for app ${opts.appname}.`) |
|
||||
) |
|
||||
} catch (error) { |
|
||||
console.error( |
|
||||
chalk.red( |
|
||||
`Error creating instance of app ${opts.appname}: ${error.message}` |
|
||||
) |
|
||||
) |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
const fetchUserLevels = async opts => { |
|
||||
const accessLevels = await readJSON( |
|
||||
join( |
|
||||
opts.appContext.config.latestPackagesFolder || ".", |
|
||||
opts.appname, |
|
||||
"access_levels.json" |
|
||||
) |
|
||||
) |
|
||||
|
|
||||
if (accessLevels.levels.length === 0) |
|
||||
throw new Error("No access levels. Use the builder to create one") |
|
||||
|
|
||||
opts.accessLevels = accessLevels.levels |
|
||||
} |
|
||||
|
|
||||
const prompts = async opts => { |
|
||||
const questions = [ |
|
||||
{ |
|
||||
type: "input", |
|
||||
name: "username", |
|
||||
message: "Username: ", |
|
||||
validate: function(value) { |
|
||||
return !!value || "Please enter a username" |
|
||||
}, |
|
||||
}, |
|
||||
] |
|
||||
|
|
||||
if (opts.accessLevels.length === 1) { |
|
||||
opts.userAccessLevel = opts.accessLevels[0].name |
|
||||
} else { |
|
||||
questions.push({ |
|
||||
type: "input", |
|
||||
name: "userAccessLevel", |
|
||||
message: `Access Level [${fp.join(", ")( |
|
||||
opts.accessLevels.map(l => l.name) |
|
||||
)}]: `,
|
|
||||
choices: opts.accessLevels.map(l => l.name), |
|
||||
}) |
|
||||
} |
|
||||
|
|
||||
const answers = await inquirer.prompt(questions) |
|
||||
const password = await passwordQuestion({ |
|
||||
message: "Password for Admin: ", |
|
||||
mask: "*", |
|
||||
}) |
|
||||
const passwordConfirm = await passwordQuestion({ |
|
||||
message: "Confirm Password: ", |
|
||||
mask: "*", |
|
||||
}) |
|
||||
|
|
||||
if (password !== passwordConfirm) throw new Error("Passwords do not match!") |
|
||||
|
|
||||
opts.username = answers.username |
|
||||
opts.password = password |
|
||||
if (opts.accessLevels.length > 1) { |
|
||||
opts.userAccessLevel = answers.userAccessLevel |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
const createInstance = async opts => { |
|
||||
const bb = opts.appContext.master.bbMaster |
|
||||
|
|
||||
const app = await opts.appContext.master.getApplication(opts.appname) |
|
||||
const instance = bb.recordApi.getNew(`${app.key}/instances`, "instance") |
|
||||
instance.name = "dev instance" |
|
||||
instance.active = true |
|
||||
instance.version = { key: "" } |
|
||||
|
|
||||
const user = bb.authApi.getNewUser() |
|
||||
user.accessLevels.push(opts.userAccessLevel) |
|
||||
user.name = opts.username |
|
||||
|
|
||||
await bb.recordApi.save(instance) |
|
||||
const savedInstance = await bb.recordApi.load(instance.key) |
|
||||
await opts.appContext.master.createAppUser( |
|
||||
opts.appname, |
|
||||
savedInstance, |
|
||||
user, |
|
||||
opts.password |
|
||||
) |
|
||||
} |
|
||||
File diff suppressed because it is too large
@ -1,5 +1,4 @@ |
|||||
"use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports, "__esModule", { value: true });Object.defineProperty(exports, "validateRecord", { enumerable: true, get: function get() {return _validateRecord.validateRecord;} });Object.defineProperty(exports, "events", { enumerable: true, get: function get() {return _events.events;} });Object.defineProperty(exports, "safeParseField", { enumerable: true, get: function get() {return _types.safeParseField;} });Object.defineProperty(exports, "schemaValidator", { enumerable: true, get: function get() {return _schemaValidation["default"];} });var _validateRecord = require("./records/validateRecord"); |
"use strict";var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports, "__esModule", { value: true });Object.defineProperty(exports, "events", { enumerable: true, get: function get() {return _events.events;} });Object.defineProperty(exports, "safeParseField", { enumerable: true, get: function get() {return _types.safeParseField;} });Object.defineProperty(exports, "schemaValidator", { enumerable: true, get: function get() {return _schemaValidation["default"];} });var _events = require("./common/events"); |
||||
var _events = require("./common/events"); |
|
||||
var _types = require("./schema/types"); |
var _types = require("./schema/types"); |
||||
var _schemaValidation = _interopRequireDefault(require("./schemaValidation")); |
var _schemaValidation = _interopRequireDefault(require("./schemaValidation")); |
||||
//# sourceMappingURL=index.js.map
|
//# sourceMappingURL=index.js.map
|
||||
@ -1 +1 @@ |
|||||
{"version":3,"sources":["../src/index.js"],"names":[],"mappings":"kpBAAA;AACA;AACA;AACA","sourcesContent":["export { validateRecord } from \"./records/validateRecord\";\nexport { events } from \"./common/events\";\nexport { safeParseField } from \"./schema/types\";\nexport { default as schemaValidator } from \"./schemaValidation\";"],"file":"index.js"} |
{"version":3,"sources":["../src/index.js"],"names":[],"mappings":"6gBAAA;AACA;AACA","sourcesContent":["export { events } from \"./common/events\";\nexport { safeParseField } from \"./schema/types\";\nexport { default as schemaValidator } from \"./schemaValidation\";"],"file":"index.js"} |
||||
@ -1,17 +0,0 @@ |
|||||
"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.getNewRecord = void 0;var _shortid = require("shortid"); |
|
||||
|
|
||||
var getNewRecord = function getNewRecord(schema, modelName) { |
|
||||
var model = schema.findModel(modelName); |
|
||||
|
|
||||
var record = { |
|
||||
_id: (0, _shortid.generate)(), |
|
||||
modelId: model._id }; |
|
||||
|
|
||||
|
|
||||
for (var field in model.schema.properties) { |
|
||||
record[field] = field["default"]; |
|
||||
} |
|
||||
|
|
||||
return record; |
|
||||
};exports.getNewRecord = getNewRecord; |
|
||||
//# sourceMappingURL=getNewRecord.js.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"sources":["../../src/records/getNewRecord.js"],"names":["getNewRecord","schema","modelName","model","findModel","record","_id","modelId","field","properties"],"mappings":"yGAAA;;AAEO,IAAMA,YAAY,GAAG,SAAfA,YAAe,CAACC,MAAD,EAASC,SAAT,EAAuB;AACjD,MAAMC,KAAK,GAAGF,MAAM,CAACG,SAAP,CAAiBF,SAAjB,CAAd;;AAEA,MAAMG,MAAM,GAAG;AACbC,IAAAA,GAAG,EAAE,wBADQ;AAEbC,IAAAA,OAAO,EAAEJ,KAAK,CAACG,GAFF,EAAf;;;AAKA,OAAK,IAAIE,KAAT,IAAkBL,KAAK,CAACF,MAAN,CAAaQ,UAA/B,EAA2C;AACzCJ,IAAAA,MAAM,CAACG,KAAD,CAAN,GAAgBA,KAAK,WAArB;AACD;;AAED,SAAOH,MAAP;AACD,CAbM,C","sourcesContent":["import { generate } from \"shortid\"\n\nexport const getNewRecord = (schema, modelName) => {\n const model = schema.findModel(modelName)\n\n const record = {\n _id: generate(),\n modelId: model._id,\n }\n\n for (let field in model.schema.properties) {\n record[field] = field.default\n }\n\n return record\n}\n"],"file":"getNewRecord.js"} |
|
||||
@ -1,31 +0,0 @@ |
|||||
"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.commonRecordValidationRules = exports.getNewRecordValidationRule = void 0;var getNewRecordValidationRule = function getNewRecordValidationRule( |
|
||||
invalidField, |
|
||||
messageWhenInvalid, |
|
||||
expressionWhenValid) {return ( |
|
||||
{ |
|
||||
invalidField: invalidField, |
|
||||
messageWhenInvalid: messageWhenInvalid, |
|
||||
expressionWhenValid: expressionWhenValid });};exports.getNewRecordValidationRule = getNewRecordValidationRule; |
|
||||
|
|
||||
|
|
||||
var commonRecordValidationRules = { |
|
||||
fieldNotEmpty: function fieldNotEmpty(fieldName) {return ( |
|
||||
getNewRecordValidationRule( |
|
||||
fieldName, "".concat( |
|
||||
fieldName, " is empty"), "record['".concat( |
|
||||
fieldName, "'] && record['").concat(fieldName, "'].length > 0")));}, |
|
||||
|
|
||||
|
|
||||
fieldBetween: function fieldBetween(fieldName, min, max) {return ( |
|
||||
getNewRecordValidationRule( |
|
||||
fieldName, "".concat( |
|
||||
fieldName, " must be between ").concat(min.toString(), " and ").concat(max.toString()), "record['".concat( |
|
||||
fieldName, "'] >= ").concat(min, " && record['").concat(fieldName, "'] <= ").concat(max, " ")));}, |
|
||||
|
|
||||
|
|
||||
fieldGreaterThan: function fieldGreaterThan(fieldName, min, max) {return ( |
|
||||
getNewRecordValidationRule( |
|
||||
fieldName, "".concat( |
|
||||
fieldName, " must be greater than ").concat(min.toString(), " and ").concat(max.toString()), "record['".concat( |
|
||||
fieldName, "'] >= ").concat(min, " ")));} };exports.commonRecordValidationRules = commonRecordValidationRules; |
|
||||
//# sourceMappingURL=recordValidationRules.js.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"sources":["../../src/records/recordValidationRules.js"],"names":["getNewRecordValidationRule","invalidField","messageWhenInvalid","expressionWhenValid","commonRecordValidationRules","fieldNotEmpty","fieldName","fieldBetween","min","max","toString","fieldGreaterThan"],"mappings":"6JAAO,IAAMA,0BAA0B,GAAG,SAA7BA,0BAA6B;AACxCC,YADwC;AAExCC,kBAFwC;AAGxCC,mBAHwC;AAIpC;AACJF,MAAAA,YAAY,EAAZA,YADI;AAEJC,MAAAA,kBAAkB,EAAlBA,kBAFI;AAGJC,MAAAA,mBAAmB,EAAnBA,mBAHI,EAJoC,GAAnC,C;;;AAUA,IAAMC,2BAA2B,GAAG;AACzCC,EAAAA,aAAa,EAAE,uBAAAC,SAAS;AACtBN,MAAAA,0BAA0B;AACxBM,MAAAA,SADwB;AAErBA,MAAAA,SAFqB;AAGbA,MAAAA,SAHa,2BAGaA,SAHb,mBADJ,GADiB;;;AAQzCC,EAAAA,YAAY,EAAE,sBAACD,SAAD,EAAYE,GAAZ,EAAiBC,GAAjB;AACZT,MAAAA,0BAA0B;AACxBM,MAAAA,SADwB;AAErBA,MAAAA,SAFqB,8BAEQE,GAAG,CAACE,QAAJ,EAFR,kBAE8BD,GAAG,CAACC,QAAJ,EAF9B;AAGbJ,MAAAA,SAHa,mBAGKE,GAHL,0BAGwBF,SAHxB,mBAG0CG,GAH1C,OADd,GAR2B;;;AAezCE,EAAAA,gBAAgB,EAAE,0BAACL,SAAD,EAAYE,GAAZ,EAAiBC,GAAjB;AAChBT,MAAAA,0BAA0B;AACxBM,MAAAA,SADwB;AAErBA,MAAAA,SAFqB,mCAEaE,GAAG,CAACE,QAAJ,EAFb,kBAEmCD,GAAG,CAACC,QAAJ,EAFnC;AAGbJ,MAAAA,SAHa,mBAGKE,GAHL,QADV,GAfuB,EAApC,C","sourcesContent":["export const getNewRecordValidationRule = (\n invalidField,\n messageWhenInvalid,\n expressionWhenValid\n) => ({\n invalidField,\n messageWhenInvalid,\n expressionWhenValid,\n})\n\nexport const commonRecordValidationRules = {\n fieldNotEmpty: fieldName =>\n getNewRecordValidationRule(\n fieldName,\n `${fieldName} is empty`,\n `record['${fieldName}'] && record['${fieldName}'].length > 0`\n ),\n\n fieldBetween: (fieldName, min, max) =>\n getNewRecordValidationRule(\n fieldName,\n `${fieldName} must be between ${min.toString()} and ${max.toString()}`,\n `record['${fieldName}'] >= ${min} && record['${fieldName}'] <= ${max} `\n ),\n\n fieldGreaterThan: (fieldName, min, max) =>\n getNewRecordValidationRule(\n fieldName,\n `${fieldName} must be greater than ${min.toString()} and ${max.toString()}`,\n `record['${fieldName}'] >= ${min} `\n ),\n}\n"],"file":"recordValidationRules.js"} |
|
||||
@ -1,86 +0,0 @@ |
|||||
"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.validateRecord = void 0;var _fp = require("lodash/fp"); |
|
||||
var _compileCode = require("../common/compileCode"); |
|
||||
var _index = require("../schema/types/index.js"); |
|
||||
|
|
||||
|
|
||||
|
|
||||
var _index2 = require("../common/index.js");function _createForOfIteratorHelper(o) {if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) {var i = 0;var F = function F() {};return { s: F, n: function n() {if (i >= o.length) return { done: true };return { done: false, value: o[i++] };}, e: function e(_e) {throw _e;}, f: F };}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");}var it,normalCompletion = true,didErr = false,err;return { s: function s() {it = o[Symbol.iterator]();}, n: function n() {var step = it.next();normalCompletion = step.done;return step;}, e: function e(_e2) {didErr = true;err = _e2;}, f: function f() {try {if (!normalCompletion && it["return"] != null) it["return"]();} finally {if (didErr) throw err;}} };}function _unsupportedIterableToArray(o, minLen) {if (!o) return;if (typeof o === "string") return _arrayLikeToArray(o, minLen);var n = Object.prototype.toString.call(o).slice(8, -1);if (n === "Object" && o.constructor) n = o.constructor.name;if (n === "Map" || n === "Set") return Array.from(n);if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);}function _arrayLikeToArray(arr, len) {if (len == null || len > arr.length) len = arr.length;for (var i = 0, arr2 = new Array(len); i < len; i++) {arr2[i] = arr[i];}return arr2;} |
|
||||
|
|
||||
var fieldParseError = function fieldParseError(fieldName, value) {return { |
|
||||
fields: [fieldName], |
|
||||
message: "Could not parse field ".concat(fieldName, ":").concat(value) };}; |
|
||||
|
|
||||
|
|
||||
var validateAllFieldParse = function validateAllFieldParse(record, model) {return ( |
|
||||
(0, _index2.$)(model.fields, [ |
|
||||
(0, _fp.map)(function (f) {return { name: f.name, parseResult: (0, _index.validateFieldParse)(f, record) };}), |
|
||||
(0, _fp.reduce)(function (errors, f) { |
|
||||
if (f.parseResult.success) return errors; |
|
||||
errors.push(fieldParseError(f.name, f.parseResult.value)); |
|
||||
return errors; |
|
||||
}, [])]));}; |
|
||||
|
|
||||
|
|
||||
var validateAllTypeConstraints = function validateAllTypeConstraints(record, model) { |
|
||||
var errors = [];var _iterator = _createForOfIteratorHelper( |
|
||||
model.fields),_step;try {var _loop = function _loop() {var field = _step.value; |
|
||||
(0, _index2.$)((0, _index.validateTypeConstraints)(field, record), [ |
|
||||
(0, _fp.filter)(_index2.isNonEmptyString), |
|
||||
(0, _fp.map)(function (m) {return { message: m, fields: [field.name] };}), |
|
||||
(0, _fp.each)(function (e) {return errors.push(e);})]);};for (_iterator.s(); !(_step = _iterator.n()).done;) {_loop(); |
|
||||
|
|
||||
}} catch (err) {_iterator.e(err);} finally {_iterator.f();} |
|
||||
return errors; |
|
||||
}; |
|
||||
|
|
||||
var runRecordValidationRules = function runRecordValidationRules(record, model) { |
|
||||
var runValidationRule = function runValidationRule(rule) { |
|
||||
var isValid = (0, _compileCode.compileCode)(rule.expressionWhenValid); |
|
||||
var expressionContext = { record: record }; |
|
||||
return isValid(expressionContext) ? |
|
||||
{ valid: true } : |
|
||||
{ |
|
||||
valid: false, |
|
||||
fields: rule.invalidFields, |
|
||||
message: rule.messageWhenInvalid }; |
|
||||
|
|
||||
}; |
|
||||
|
|
||||
return (0, _index2.$)(model.validationRules, [ |
|
||||
(0, _fp.map)(runValidationRule), |
|
||||
_fp.flatten, |
|
||||
(0, _fp.filter)(function (r) {return r.valid === false;}), |
|
||||
(0, _fp.map)(function (r) {return { fields: r.fields, message: r.message };})]); |
|
||||
|
|
||||
}; |
|
||||
|
|
||||
var validateRecord = function validateRecord(schema, record) { |
|
||||
var model = schema.findModel(record._modelId); |
|
||||
var fieldParseFails = validateAllFieldParse(record, model); |
|
||||
|
|
||||
// non parsing would cause further issues - exit here
|
|
||||
if (!(0, _fp.isEmpty)(fieldParseFails)) { |
|
||||
return { isValid: false, errors: fieldParseFails }; |
|
||||
} |
|
||||
|
|
||||
var recordValidationRuleFails = runRecordValidationRules(record, model); |
|
||||
var typeContraintFails = validateAllTypeConstraints(record, model); |
|
||||
|
|
||||
if ( |
|
||||
(0, _fp.isEmpty)(fieldParseFails) && |
|
||||
(0, _fp.isEmpty)(recordValidationRuleFails) && |
|
||||
(0, _fp.isEmpty)(typeContraintFails)) |
|
||||
{ |
|
||||
return { isValid: true, errors: [] }; |
|
||||
} |
|
||||
|
|
||||
return { |
|
||||
isValid: false, |
|
||||
errors: (0, _fp.union)( |
|
||||
fieldParseFails, |
|
||||
typeContraintFails, |
|
||||
recordValidationRuleFails) }; |
|
||||
|
|
||||
|
|
||||
};exports.validateRecord = validateRecord; |
|
||||
//# sourceMappingURL=validateRecord.js.map
|
|
||||
File diff suppressed because one or more lines are too long
@ -1,68 +0,0 @@ |
|||||
"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports["default"] = void 0;var _fp = require("lodash/fp"); |
|
||||
var _typeHelpers = require("./typeHelpers"); |
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
var _index = require("../../common/index.js"); |
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
var arrayFunctions = function arrayFunctions() {return ( |
|
||||
(0, _typeHelpers.typeFunctions)({ |
|
||||
"default": (0, _fp.constant)([]) }));}; |
|
||||
|
|
||||
|
|
||||
var mapToParsedArrary = function mapToParsedArrary(type) {return ( |
|
||||
(0, _index.$$)( |
|
||||
(0, _fp.map)(function (i) {return type.safeParseValue(i);}), |
|
||||
_typeHelpers.parsedSuccess));}; |
|
||||
|
|
||||
|
|
||||
var arrayTryParse = function arrayTryParse(type) {return ( |
|
||||
(0, _index.switchCase)([_fp.isArray, mapToParsedArrary(type)], [_index.defaultCase, _typeHelpers.parsedFailed]));}; |
|
||||
|
|
||||
var typeName = function typeName(type) {return "array<".concat(type, ">");}; |
|
||||
|
|
||||
var options = { |
|
||||
maxLength: { |
|
||||
defaultValue: 10000, |
|
||||
isValid: _index.isSafeInteger, |
|
||||
requirementDescription: "must be a positive integer", |
|
||||
parse: _index.toNumberOrNull }, |
|
||||
|
|
||||
minLength: { |
|
||||
defaultValue: 0, |
|
||||
isValid: function isValid(n) {return (0, _index.isSafeInteger)(n) && n >= 0;}, |
|
||||
requirementDescription: "must be a positive integer", |
|
||||
parse: _index.toNumberOrNull } }; |
|
||||
|
|
||||
|
|
||||
|
|
||||
var typeConstraints = [ |
|
||||
(0, _typeHelpers.makerule)( |
|
||||
function (val, opts) {return val === null || val.length >= opts.minLength;}, |
|
||||
function (val, opts) {return "must choose ".concat(opts.minLength, " or more options");}), |
|
||||
|
|
||||
(0, _typeHelpers.makerule)( |
|
||||
function (val, opts) {return val === null || val.length <= opts.maxLength;}, |
|
||||
function (val, opts) {return "cannot choose more than ".concat(opts.maxLength, " options");})];var _default = |
|
||||
|
|
||||
|
|
||||
|
|
||||
function _default(type) {return ( |
|
||||
(0, _typeHelpers.getDefaultExport)( |
|
||||
typeName(type.name), |
|
||||
arrayTryParse(type), |
|
||||
arrayFunctions(type), |
|
||||
options, |
|
||||
typeConstraints, |
|
||||
[type.sampleValue], |
|
||||
JSON.stringify));};exports["default"] = _default; |
|
||||
//# sourceMappingURL=array.js.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"sources":["../../../src/schema/types/array.js"],"names":["arrayFunctions","mapToParsedArrary","type","i","safeParseValue","parsedSuccess","arrayTryParse","isArray","defaultCase","parsedFailed","typeName","options","maxLength","defaultValue","isValid","isSafeInteger","requirementDescription","parse","toNumberOrNull","minLength","n","typeConstraints","val","opts","length","name","sampleValue","JSON","stringify"],"mappings":"uGAAA;AACA;;;;;;;AAOA;;;;;;;;AAQA,IAAMA,cAAc,GAAG,SAAjBA,cAAiB;AACrB,oCAAc;AACZ,iBAAS,kBAAS,EAAT,CADG,EAAd,CADqB,GAAvB;;;AAKA,IAAMC,iBAAiB,GAAG,SAApBA,iBAAoB,CAAAC,IAAI;AAC5B;AACE,iBAAI,UAAAC,CAAC,UAAID,IAAI,CAACE,cAAL,CAAoBD,CAApB,CAAJ,EAAL,CADF;AAEEE,8BAFF,CAD4B,GAA9B;;;AAMA,IAAMC,aAAa,GAAG,SAAhBA,aAAgB,CAAAJ,IAAI;AACxB,2BAAW,CAACK,WAAD,EAAUN,iBAAiB,CAACC,IAAD,CAA3B,CAAX,EAA+C,CAACM,kBAAD,EAAcC,yBAAd,CAA/C,CADwB,GAA1B;;AAGA,IAAMC,QAAQ,GAAG,SAAXA,QAAW,CAAAR,IAAI,0BAAaA,IAAb,QAArB;;AAEA,IAAMS,OAAO,GAAG;AACdC,EAAAA,SAAS,EAAE;AACTC,IAAAA,YAAY,EAAE,KADL;AAETC,IAAAA,OAAO,EAAEC,oBAFA;AAGTC,IAAAA,sBAAsB,EAAE,4BAHf;AAITC,IAAAA,KAAK,EAAEC,qBAJE,EADG;;AAOdC,EAAAA,SAAS,EAAE;AACTN,IAAAA,YAAY,EAAE,CADL;AAETC,IAAAA,OAAO,EAAE,iBAAAM,CAAC,UAAI,0BAAcA,CAAd,KAAoBA,CAAC,IAAI,CAA7B,EAFD;AAGTJ,IAAAA,sBAAsB,EAAE,4BAHf;AAITC,IAAAA,KAAK,EAAEC,qBAJE,EAPG,EAAhB;;;;AAeA,IAAMG,eAAe,GAAG;AACtB;AACE,UAACC,GAAD,EAAMC,IAAN,UAAeD,GAAG,KAAK,IAAR,IAAgBA,GAAG,CAACE,MAAJ,IAAcD,IAAI,CAACJ,SAAlD,EADF;AAEE,UAACG,GAAD,EAAMC,IAAN,gCAA8BA,IAAI,CAACJ,SAAnC,uBAFF,CADsB;;AAKtB;AACE,UAACG,GAAD,EAAMC,IAAN,UAAeD,GAAG,KAAK,IAAR,IAAgBA,GAAG,CAACE,MAAJ,IAAcD,IAAI,CAACX,SAAlD,EADF;AAEE,UAACU,GAAD,EAAMC,IAAN,4CAA0CA,IAAI,CAACX,SAA/C,eAFF,CALsB,CAAxB,C;;;;AAWe,kBAAAV,IAAI;AACjB;AACEQ,IAAAA,QAAQ,CAACR,IAAI,CAACuB,IAAN,CADV;AAEEnB,IAAAA,aAAa,CAACJ,IAAD,CAFf;AAGEF,IAAAA,cAAc,CAACE,IAAD,CAHhB;AAIES,IAAAA,OAJF;AAKEU,IAAAA,eALF;AAME,KAACnB,IAAI,CAACwB,WAAN,CANF;AAOEC,IAAAA,IAAI,CAACC,SAPP,CADiB,G","sourcesContent":["import { map, constant, isArray } from \"lodash/fp\"\r\nimport {\r\n typeFunctions,\r\n makerule,\r\n parsedFailed,\r\n getDefaultExport,\r\n parsedSuccess,\r\n} from \"./typeHelpers\"\r\nimport {\r\n switchCase,\r\n defaultCase,\r\n toNumberOrNull,\r\n $$,\r\n isSafeInteger,\r\n} from \"../../common/index.js\"\r\n\r\nconst arrayFunctions = () =>\r\n typeFunctions({\r\n default: constant([]),\r\n })\r\n\r\nconst mapToParsedArrary = type =>\r\n $$(\r\n map(i => type.safeParseValue(i)),\r\n parsedSuccess\r\n )\r\n\r\nconst arrayTryParse = type =>\r\n switchCase([isArray, mapToParsedArrary(type)], [defaultCase, parsedFailed])\r\n\r\nconst typeName = type => `array<${type}>`\r\n\r\nconst options = {\r\n maxLength: {\r\n defaultValue: 10000,\r\n isValid: isSafeInteger,\r\n requirementDescription: \"must be a positive integer\",\r\n parse: toNumberOrNull,\r\n },\r\n minLength: {\r\n defaultValue: 0,\r\n isValid: n => isSafeInteger(n) && n >= 0,\r\n requirementDescription: \"must be a positive integer\",\r\n parse: toNumberOrNull,\r\n },\r\n}\r\n\r\nconst typeConstraints = [\r\n makerule(\r\n (val, opts) => val === null || val.length >= opts.minLength,\r\n (val, opts) => `must choose ${opts.minLength} or more options`\r\n ),\r\n makerule(\r\n (val, opts) => val === null || val.length <= opts.maxLength,\r\n (val, opts) => `cannot choose more than ${opts.maxLength} options`\r\n ),\r\n]\r\n\r\nexport default type =>\r\n getDefaultExport(\r\n typeName(type.name),\r\n arrayTryParse(type),\r\n arrayFunctions(type),\r\n options,\r\n typeConstraints,\r\n [type.sampleValue],\r\n JSON.stringify\r\n )\r\n"],"file":"array.js"} |
|
||||
@ -1,52 +0,0 @@ |
|||||
"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports["default"] = void 0;var _fp = require("lodash/fp"); |
|
||||
var _typeHelpers = require("./typeHelpers"); |
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
var _index = require("../../common/index.js"); |
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
var boolFunctions = (0, _typeHelpers.typeFunctions)({ |
|
||||
"default": (0, _fp.constant)(null) }); |
|
||||
|
|
||||
|
|
||||
var boolTryParse = (0, _index.switchCase)( |
|
||||
[_fp.isBoolean, _typeHelpers.parsedSuccess], |
|
||||
[_fp.isNull, _typeHelpers.parsedSuccess], |
|
||||
[(0, _index.isOneOf)("true", "1", "yes", "on"), function () {return (0, _typeHelpers.parsedSuccess)(true);}], |
|
||||
[(0, _index.isOneOf)("false", "0", "no", "off"), function () {return (0, _typeHelpers.parsedSuccess)(false);}], |
|
||||
[_index.defaultCase, _typeHelpers.parsedFailed]); |
|
||||
|
|
||||
|
|
||||
var options = { |
|
||||
allowNulls: { |
|
||||
defaultValue: true, |
|
||||
isValid: _fp.isBoolean, |
|
||||
requirementDescription: "must be a true or false", |
|
||||
parse: _index.toBoolOrNull } }; |
|
||||
|
|
||||
|
|
||||
|
|
||||
var typeConstraints = [ |
|
||||
(0, _typeHelpers.makerule)( |
|
||||
function (val, opts) {return opts.allowNulls === true || val !== null;}, |
|
||||
function () {return "field cannot be null";})];var _default = |
|
||||
|
|
||||
|
|
||||
|
|
||||
(0, _typeHelpers.getDefaultExport)( |
|
||||
"bool", |
|
||||
boolTryParse, |
|
||||
boolFunctions, |
|
||||
options, |
|
||||
typeConstraints, |
|
||||
true, |
|
||||
JSON.stringify);exports["default"] = _default; |
|
||||
//# sourceMappingURL=bool.js.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"sources":["../../../src/schema/types/bool.js"],"names":["boolFunctions","boolTryParse","isBoolean","parsedSuccess","isNull","defaultCase","parsedFailed","options","allowNulls","defaultValue","isValid","requirementDescription","parse","toBoolOrNull","typeConstraints","val","opts","JSON","stringify"],"mappings":"uGAAA;AACA;;;;;;;AAOA;;;;;;;AAOA,IAAMA,aAAa,GAAG,gCAAc;AAClC,aAAS,kBAAS,IAAT,CADyB,EAAd,CAAtB;;;AAIA,IAAMC,YAAY,GAAG;AACnB,CAACC,aAAD,EAAYC,0BAAZ,CADmB;AAEnB,CAACC,UAAD,EAASD,0BAAT,CAFmB;AAGnB,CAAC,oBAAQ,MAAR,EAAgB,GAAhB,EAAqB,KAArB,EAA4B,IAA5B,CAAD,EAAoC,oBAAM,gCAAc,IAAd,CAAN,EAApC,CAHmB;AAInB,CAAC,oBAAQ,OAAR,EAAiB,GAAjB,EAAsB,IAAtB,EAA4B,KAA5B,CAAD,EAAqC,oBAAM,gCAAc,KAAd,CAAN,EAArC,CAJmB;AAKnB,CAACE,kBAAD,EAAcC,yBAAd,CALmB,CAArB;;;AAQA,IAAMC,OAAO,GAAG;AACdC,EAAAA,UAAU,EAAE;AACVC,IAAAA,YAAY,EAAE,IADJ;AAEVC,IAAAA,OAAO,EAAER,aAFC;AAGVS,IAAAA,sBAAsB,EAAE,yBAHd;AAIVC,IAAAA,KAAK,EAAEC,mBAJG,EADE,EAAhB;;;;AASA,IAAMC,eAAe,GAAG;AACtB;AACE,UAACC,GAAD,EAAMC,IAAN,UAAeA,IAAI,CAACR,UAAL,KAAoB,IAApB,IAA4BO,GAAG,KAAK,IAAnD,EADF;AAEE,oBAAM,sBAAN,EAFF,CADsB,CAAxB,C;;;;AAOe;AACb,MADa;AAEbd,YAFa;AAGbD,aAHa;AAIbO,OAJa;AAKbO,eALa;AAMb,IANa;AAObG,IAAI,CAACC,SAPQ,C","sourcesContent":["import { constant, isBoolean, isNull } from \"lodash/fp\"\r\nimport {\r\n typeFunctions,\r\n makerule,\r\n parsedFailed,\r\n parsedSuccess,\r\n getDefaultExport,\r\n} from \"./typeHelpers\"\r\nimport {\r\n switchCase,\r\n defaultCase,\r\n isOneOf,\r\n toBoolOrNull,\r\n} from \"../../common/index.js\"\r\n\r\nconst boolFunctions = typeFunctions({\r\n default: constant(null),\r\n})\r\n\r\nconst boolTryParse = switchCase(\r\n [isBoolean, parsedSuccess],\r\n [isNull, parsedSuccess],\r\n [isOneOf(\"true\", \"1\", \"yes\", \"on\"), () => parsedSuccess(true)],\r\n [isOneOf(\"false\", \"0\", \"no\", \"off\"), () => parsedSuccess(false)],\r\n [defaultCase, parsedFailed]\r\n)\r\n\r\nconst options = {\r\n allowNulls: {\r\n defaultValue: true,\r\n isValid: isBoolean,\r\n requirementDescription: \"must be a true or false\",\r\n parse: toBoolOrNull,\r\n },\r\n}\r\n\r\nconst typeConstraints = [\r\n makerule(\r\n (val, opts) => opts.allowNulls === true || val !== null,\r\n () => \"field cannot be null\"\r\n ),\r\n]\r\n\r\nexport default getDefaultExport(\r\n \"bool\",\r\n boolTryParse,\r\n boolFunctions,\r\n options,\r\n typeConstraints,\r\n true,\r\n JSON.stringify\r\n)\r\n"],"file":"bool.js"} |
|
||||
@ -1,62 +0,0 @@ |
|||||
"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports["default"] = exports.isLegalFilename = void 0;var _fp = require("lodash/fp"); |
|
||||
var _typeHelpers = require("./typeHelpers"); |
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
var _index = require("../../common/index.js"); |
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
var illegalCharacters = "*?\\/:<>|\0\b\f\v"; |
|
||||
|
|
||||
var isLegalFilename = function isLegalFilename(filePath) { |
|
||||
var fn = fileName(filePath); |
|
||||
return ( |
|
||||
fn.length <= 255 && |
|
||||
(0, _fp.intersection)(fn.split(""))(illegalCharacters.split("")).length === 0 && |
|
||||
(0, _index.none)(function (f) {return f === "..";})((0, _index.splitKey)(filePath))); |
|
||||
|
|
||||
};exports.isLegalFilename = isLegalFilename; |
|
||||
|
|
||||
var fileNothing = function fileNothing() {return { relativePath: "", size: 0 };}; |
|
||||
|
|
||||
var fileFunctions = (0, _typeHelpers.typeFunctions)({ |
|
||||
"default": fileNothing }); |
|
||||
|
|
||||
|
|
||||
var fileTryParse = function fileTryParse(v) {return ( |
|
||||
(0, _index.switchCase)( |
|
||||
[isValidFile, _typeHelpers.parsedSuccess], |
|
||||
[_fp.isNull, function () {return (0, _typeHelpers.parsedSuccess)(fileNothing());}], |
|
||||
[_index.defaultCase, _typeHelpers.parsedFailed])( |
|
||||
v));}; |
|
||||
|
|
||||
var fileName = function fileName(filePath) {return (0, _index.$)(filePath, [_index.splitKey, _fp.last]);}; |
|
||||
|
|
||||
var isValidFile = function isValidFile(f) {return ( |
|
||||
!(0, _fp.isNull)(f) && |
|
||||
(0, _fp.has)("relativePath")(f) && |
|
||||
(0, _fp.has)("size")(f) && |
|
||||
(0, _fp.isNumber)(f.size) && |
|
||||
(0, _fp.isString)(f.relativePath) && |
|
||||
isLegalFilename(f.relativePath));}; |
|
||||
|
|
||||
var options = {}; |
|
||||
|
|
||||
var typeConstraints = [];var _default = |
|
||||
|
|
||||
(0, _typeHelpers.getDefaultExport)( |
|
||||
"file", |
|
||||
fileTryParse, |
|
||||
fileFunctions, |
|
||||
options, |
|
||||
typeConstraints, |
|
||||
{ relativePath: "some_file.jpg", size: 1000 }, |
|
||||
JSON.stringify);exports["default"] = _default; |
|
||||
//# sourceMappingURL=file.js.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"sources":["../../../src/schema/types/file.js"],"names":["illegalCharacters","isLegalFilename","filePath","fn","fileName","length","split","f","fileNothing","relativePath","size","fileFunctions","fileTryParse","v","isValidFile","parsedSuccess","isNull","defaultCase","parsedFailed","splitKey","last","options","typeConstraints","JSON","stringify"],"mappings":"iIAAA;AACA;;;;;;AAMA;;;;;;;;AAQA,IAAMA,iBAAiB,GAAG,mBAA1B;;AAEO,IAAMC,eAAe,GAAG,SAAlBA,eAAkB,CAAAC,QAAQ,EAAI;AACzC,MAAMC,EAAE,GAAGC,QAAQ,CAACF,QAAD,CAAnB;AACA;AACEC,IAAAA,EAAE,CAACE,MAAH,IAAa,GAAb;AACA,0BAAaF,EAAE,CAACG,KAAH,CAAS,EAAT,CAAb,EAA2BN,iBAAiB,CAACM,KAAlB,CAAwB,EAAxB,CAA3B,EAAwDD,MAAxD,KAAmE,CADnE;AAEA,qBAAK,UAAAE,CAAC,UAAIA,CAAC,KAAK,IAAV,EAAN,EAAsB,qBAASL,QAAT,CAAtB,CAHF;;AAKD,CAPM,C;;AASP,IAAMM,WAAW,GAAG,SAAdA,WAAc,WAAO,EAAEC,YAAY,EAAE,EAAhB,EAAoBC,IAAI,EAAE,CAA1B,EAAP,EAApB;;AAEA,IAAMC,aAAa,GAAG,gCAAc;AAClC,aAASH,WADyB,EAAd,CAAtB;;;AAIA,IAAMI,YAAY,GAAG,SAAfA,YAAe,CAAAC,CAAC;AACpB;AACE,KAACC,WAAD,EAAcC,0BAAd,CADF;AAEE,KAACC,UAAD,EAAS,oBAAM,gCAAcR,WAAW,EAAzB,CAAN,EAAT,CAFF;AAGE,KAACS,kBAAD,EAAcC,yBAAd,CAHF;AAIEL,IAAAA,CAJF,CADoB,GAAtB;;AAOA,IAAMT,QAAQ,GAAG,SAAXA,QAAW,CAAAF,QAAQ,UAAI,cAAEA,QAAF,EAAY,CAACiB,eAAD,EAAWC,QAAX,CAAZ,CAAJ,EAAzB;;AAEA,IAAMN,WAAW,GAAG,SAAdA,WAAc,CAAAP,CAAC;AACnB,KAAC,gBAAOA,CAAP,CAAD;AACA,iBAAI,cAAJ,EAAoBA,CAApB,CADA;AAEA,iBAAI,MAAJ,EAAYA,CAAZ,CAFA;AAGA,sBAASA,CAAC,CAACG,IAAX,CAHA;AAIA,sBAASH,CAAC,CAACE,YAAX,CAJA;AAKAR,IAAAA,eAAe,CAACM,CAAC,CAACE,YAAH,CANI,GAArB;;AAQA,IAAMY,OAAO,GAAG,EAAhB;;AAEA,IAAMC,eAAe,GAAG,EAAxB,C;;AAEe;AACb,MADa;AAEbV,YAFa;AAGbD,aAHa;AAIbU,OAJa;AAKbC,eALa;AAMb,EAAEb,YAAY,EAAE,eAAhB,EAAiCC,IAAI,EAAE,IAAvC,EANa;AAOba,IAAI,CAACC,SAPQ,C","sourcesContent":["import { last, has, isString, intersection, isNull, isNumber } from \"lodash/fp\"\r\nimport {\r\n typeFunctions,\r\n parsedFailed,\r\n parsedSuccess,\r\n getDefaultExport,\r\n} from \"./typeHelpers\"\r\nimport {\r\n switchCase,\r\n defaultCase,\r\n none,\r\n $,\r\n splitKey,\r\n} from \"../../common/index.js\"\r\n\r\nconst illegalCharacters = \"*?\\\\/:<>|\\0\\b\\f\\v\"\r\n\r\nexport const isLegalFilename = filePath => {\r\n const fn = fileName(filePath)\r\n return (\r\n fn.length <= 255 &&\r\n intersection(fn.split(\"\"))(illegalCharacters.split(\"\")).length === 0 &&\r\n none(f => f === \"..\")(splitKey(filePath))\r\n )\r\n}\r\n\r\nconst fileNothing = () => ({ relativePath: \"\", size: 0 })\r\n\r\nconst fileFunctions = typeFunctions({\r\n default: fileNothing,\r\n})\r\n\r\nconst fileTryParse = v =>\r\n switchCase(\r\n [isValidFile, parsedSuccess],\r\n [isNull, () => parsedSuccess(fileNothing())],\r\n [defaultCase, parsedFailed]\r\n )(v)\r\n\r\nconst fileName = filePath => $(filePath, [splitKey, last])\r\n\r\nconst isValidFile = f =>\r\n !isNull(f) &&\r\n has(\"relativePath\")(f) &&\r\n has(\"size\")(f) &&\r\n isNumber(f.size) &&\r\n isString(f.relativePath) &&\r\n isLegalFilename(f.relativePath)\r\n\r\nconst options = {}\r\n\r\nconst typeConstraints = []\r\n\r\nexport default getDefaultExport(\r\n \"file\",\r\n fileTryParse,\r\n fileFunctions,\r\n options,\r\n typeConstraints,\r\n { relativePath: \"some_file.jpg\", size: 1000 },\r\n JSON.stringify\r\n)\r\n"],"file":"file.js"} |
|
||||
@ -1,59 +0,0 @@ |
|||||
"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports["default"] = void 0;var _lodash = require("lodash"); |
|
||||
var _typeHelpers = require("./typeHelpers"); |
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
var _index = require("../../common/index.js"); |
|
||||
|
|
||||
var objectFunctions = function objectFunctions(definition, allTypes) {return ( |
|
||||
(0, _typeHelpers.typeFunctions)({ |
|
||||
"default": (0, _lodash.constant)(null), |
|
||||
initialise: function initialise() {return ( |
|
||||
(0, _index.$)((0, _lodash.keys)(definition), [ |
|
||||
(0, _lodash.map)(function () { |
|
||||
var defClone = (0, _lodash.clone)(definition); |
|
||||
for (var k in defClone) { |
|
||||
defClone[k] = allTypes[k].getNew(); |
|
||||
} |
|
||||
return defClone; |
|
||||
})]));} }));}; |
|
||||
|
|
||||
|
|
||||
|
|
||||
var parseObject = function parseObject(definition, allTypes) {return function (record) { |
|
||||
var defClone = (0, _lodash.clone)(definition); |
|
||||
for (var k in defClone) { |
|
||||
var type = allTypes[defClone[k]]; |
|
||||
defClone[k] = (0, _lodash.has)(record, k) ? |
|
||||
type.safeParseValue(record[k]) : |
|
||||
type.getNew(); |
|
||||
} |
|
||||
return (0, _typeHelpers.parsedSuccess)(defClone); |
|
||||
};}; |
|
||||
|
|
||||
var objectTryParse = function objectTryParse(definition, allTypes) {return ( |
|
||||
(0, _index.switchCase)( |
|
||||
[_lodash.isNull, _typeHelpers.parsedSuccess], |
|
||||
[_lodash.isObject, parseObject(definition, allTypes)], |
|
||||
[_index.defaultCase, _typeHelpers.parsedFailed]));};var _default = |
|
||||
|
|
||||
|
|
||||
function _default( |
|
||||
typeName, |
|
||||
definition, |
|
||||
allTypes, |
|
||||
defaultOptions, |
|
||||
typeConstraints, |
|
||||
sampleValue) {return ( |
|
||||
|
|
||||
(0, _typeHelpers.getDefaultExport)( |
|
||||
typeName, |
|
||||
objectTryParse(definition, allTypes), |
|
||||
objectFunctions(definition, allTypes), |
|
||||
defaultOptions, |
|
||||
typeConstraints, |
|
||||
sampleValue, |
|
||||
JSON.stringify));};exports["default"] = _default; |
|
||||
//# sourceMappingURL=object.js.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"sources":["../../../src/schema/types/object.js"],"names":["objectFunctions","definition","allTypes","initialise","defClone","k","getNew","parseObject","record","type","safeParseValue","objectTryParse","isNull","parsedSuccess","isObject","defaultCase","parsedFailed","typeName","defaultOptions","typeConstraints","sampleValue","JSON","stringify"],"mappings":"uGAAA;AACA;;;;;;AAMA;;AAEA,IAAMA,eAAe,GAAG,SAAlBA,eAAkB,CAACC,UAAD,EAAaC,QAAb;AACtB,oCAAc;AACZ,iBAAS,sBAAS,IAAT,CADG;AAEZC,MAAAA,UAAU,EAAE;AACV,wBAAE,kBAAKF,UAAL,CAAF,EAAoB;AAClB,2BAAI,YAAM;AACR,gBAAMG,QAAQ,GAAG,mBAAMH,UAAN,CAAjB;AACA,iBAAK,IAAMI,CAAX,IAAgBD,QAAhB,EAA0B;AACxBA,cAAAA,QAAQ,CAACC,CAAD,CAAR,GAAcH,QAAQ,CAACG,CAAD,CAAR,CAAYC,MAAZ,EAAd;AACD;AACD,mBAAOF,QAAP;AACD,WAND,CADkB,CAApB,CADU,GAFA,EAAd,CADsB,GAAxB;;;;AAeA,IAAMG,WAAW,GAAG,SAAdA,WAAc,CAACN,UAAD,EAAaC,QAAb,UAA0B,UAAAM,MAAM,EAAI;AACtD,QAAMJ,QAAQ,GAAG,mBAAMH,UAAN,CAAjB;AACA,SAAK,IAAMI,CAAX,IAAgBD,QAAhB,EAA0B;AACxB,UAAMK,IAAI,GAAGP,QAAQ,CAACE,QAAQ,CAACC,CAAD,CAAT,CAArB;AACAD,MAAAA,QAAQ,CAACC,CAAD,CAAR,GAAc,iBAAIG,MAAJ,EAAYH,CAAZ;AACVI,MAAAA,IAAI,CAACC,cAAL,CAAoBF,MAAM,CAACH,CAAD,CAA1B,CADU;AAEVI,MAAAA,IAAI,CAACH,MAAL,EAFJ;AAGD;AACD,WAAO,gCAAcF,QAAd,CAAP;AACD,GATmB,EAApB;;AAWA,IAAMO,cAAc,GAAG,SAAjBA,cAAiB,CAACV,UAAD,EAAaC,QAAb;AACrB;AACE,KAACU,cAAD,EAASC,0BAAT,CADF;AAEE,KAACC,gBAAD,EAAWP,WAAW,CAACN,UAAD,EAAaC,QAAb,CAAtB,CAFF;AAGE,KAACa,kBAAD,EAAcC,yBAAd,CAHF,CADqB,GAAvB,C;;;AAOe;AACbC,QADa;AAEbhB,UAFa;AAGbC,QAHa;AAIbgB,cAJa;AAKbC,eALa;AAMbC,WANa;;AAQb;AACEH,IAAAA,QADF;AAEEN,IAAAA,cAAc,CAACV,UAAD,EAAaC,QAAb,CAFhB;AAGEF,IAAAA,eAAe,CAACC,UAAD,EAAaC,QAAb,CAHjB;AAIEgB,IAAAA,cAJF;AAKEC,IAAAA,eALF;AAMEC,IAAAA,WANF;AAOEC,IAAAA,IAAI,CAACC,SAPP,CARa,G","sourcesContent":["import { keys, isObject, has, clone, map, isNull, constant } from \"lodash\"\r\nimport {\r\n typeFunctions,\r\n parsedFailed,\r\n parsedSuccess,\r\n getDefaultExport,\r\n} from \"./typeHelpers\"\r\nimport { switchCase, defaultCase, $ } from \"../../common/index.js\"\r\n\r\nconst objectFunctions = (definition, allTypes) =>\r\n typeFunctions({\r\n default: constant(null),\r\n initialise: () =>\r\n $(keys(definition), [\r\n map(() => {\r\n const defClone = clone(definition)\r\n for (const k in defClone) {\r\n defClone[k] = allTypes[k].getNew()\r\n }\r\n return defClone\r\n }),\r\n ]),\r\n })\r\n\r\nconst parseObject = (definition, allTypes) => record => {\r\n const defClone = clone(definition)\r\n for (const k in defClone) {\r\n const type = allTypes[defClone[k]]\r\n defClone[k] = has(record, k)\r\n ? type.safeParseValue(record[k])\r\n : type.getNew()\r\n }\r\n return parsedSuccess(defClone)\r\n}\r\n\r\nconst objectTryParse = (definition, allTypes) =>\r\n switchCase(\r\n [isNull, parsedSuccess],\r\n [isObject, parseObject(definition, allTypes)],\r\n [defaultCase, parsedFailed]\r\n )\r\n\r\nexport default (\r\n typeName,\r\n definition,\r\n allTypes,\r\n defaultOptions,\r\n typeConstraints,\r\n sampleValue\r\n) =>\r\n getDefaultExport(\r\n typeName,\r\n objectTryParse(definition, allTypes),\r\n objectFunctions(definition, allTypes),\r\n defaultOptions,\r\n typeConstraints,\r\n sampleValue,\r\n JSON.stringify\r\n )\r\n"],"file":"object.js"} |
|
||||
@ -1,74 +0,0 @@ |
|||||
"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports["default"] = void 0;var _fp = require("lodash/fp"); |
|
||||
var _typeHelpers = require("./typeHelpers"); |
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
var _index = require("../../common/index.js"); |
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
var stringFunctions = (0, _typeHelpers.typeFunctions)({ |
|
||||
"default": (0, _fp.constant)(null) }); |
|
||||
|
|
||||
|
|
||||
var stringTryParse = (0, _index.switchCase)( |
|
||||
[_fp.isString, _typeHelpers.parsedSuccess], |
|
||||
[_fp.isNull, _typeHelpers.parsedSuccess], |
|
||||
[_index.defaultCase, function (v) {return (0, _typeHelpers.parsedSuccess)(v.toString());}]); |
|
||||
|
|
||||
|
|
||||
var options = { |
|
||||
maxLength: { |
|
||||
defaultValue: null, |
|
||||
isValid: function isValid(n) {return n === null || (0, _index.isSafeInteger)(n) && n > 0;}, |
|
||||
requirementDescription: |
|
||||
"max length must be null (no limit) or a greater than zero integer", |
|
||||
parse: _index.toNumberOrNull }, |
|
||||
|
|
||||
values: { |
|
||||
defaultValue: null, |
|
||||
isValid: function isValid(v) {return ( |
|
||||
v === null || (0, _index.isArrayOfString)(v) && v.length > 0 && v.length < 10000);}, |
|
||||
requirementDescription: |
|
||||
"'values' must be null (no values) or an array of at least one string", |
|
||||
parse: function parse(s) {return s;} }, |
|
||||
|
|
||||
allowDeclaredValuesOnly: { |
|
||||
defaultValue: false, |
|
||||
isValid: _fp.isBoolean, |
|
||||
requirementDescription: "allowDeclaredValuesOnly must be true or false", |
|
||||
parse: _index.toBoolOrNull } }; |
|
||||
|
|
||||
|
|
||||
|
|
||||
var typeConstraints = [ |
|
||||
(0, _typeHelpers.makerule)( |
|
||||
function (val, opts) {return ( |
|
||||
val === null || opts.maxLength === null || val.length <= opts.maxLength);}, |
|
||||
function (val, opts) {return "value exceeds maximum length of ".concat(opts.maxLength);}), |
|
||||
|
|
||||
(0, _typeHelpers.makerule)( |
|
||||
function (val, opts) {return ( |
|
||||
val === null || |
|
||||
opts.allowDeclaredValuesOnly === false || |
|
||||
(0, _fp.includes)(val)(opts.values));}, |
|
||||
function (val) {return "\"".concat(val, "\" does not exist in the list of allowed values");})];var _default = |
|
||||
|
|
||||
|
|
||||
|
|
||||
(0, _typeHelpers.getDefaultExport)( |
|
||||
"string", |
|
||||
stringTryParse, |
|
||||
stringFunctions, |
|
||||
options, |
|
||||
typeConstraints, |
|
||||
"abcde", |
|
||||
function (str) {return str;});exports["default"] = _default; |
|
||||
//# sourceMappingURL=string.js.map
|
|
||||
@ -1 +0,0 @@ |
|||||
{"version":3,"sources":["../../../src/schema/types/string.js"],"names":["stringFunctions","stringTryParse","isString","parsedSuccess","isNull","defaultCase","v","toString","options","maxLength","defaultValue","isValid","n","requirementDescription","parse","toNumberOrNull","values","length","s","allowDeclaredValuesOnly","isBoolean","toBoolOrNull","typeConstraints","val","opts","str"],"mappings":"uGAAA;AACA;;;;;;AAMA;;;;;;;;;AASA,IAAMA,eAAe,GAAG,gCAAc;AACpC,aAAS,kBAAS,IAAT,CAD2B,EAAd,CAAxB;;;AAIA,IAAMC,cAAc,GAAG;AACrB,CAACC,YAAD,EAAWC,0BAAX,CADqB;AAErB,CAACC,UAAD,EAASD,0BAAT,CAFqB;AAGrB,CAACE,kBAAD,EAAc,UAAAC,CAAC,UAAI,gCAAcA,CAAC,CAACC,QAAF,EAAd,CAAJ,EAAf,CAHqB,CAAvB;;;AAMA,IAAMC,OAAO,GAAG;AACdC,EAAAA,SAAS,EAAE;AACTC,IAAAA,YAAY,EAAE,IADL;AAETC,IAAAA,OAAO,EAAE,iBAAAC,CAAC,UAAIA,CAAC,KAAK,IAAN,IAAe,0BAAcA,CAAd,KAAoBA,CAAC,GAAG,CAA3C,EAFD;AAGTC,IAAAA,sBAAsB;AACpB,uEAJO;AAKTC,IAAAA,KAAK,EAAEC,qBALE,EADG;;AAQdC,EAAAA,MAAM,EAAE;AACNN,IAAAA,YAAY,EAAE,IADR;AAENC,IAAAA,OAAO,EAAE,iBAAAL,CAAC;AACRA,QAAAA,CAAC,KAAK,IAAN,IAAe,4BAAgBA,CAAhB,KAAsBA,CAAC,CAACW,MAAF,GAAW,CAAjC,IAAsCX,CAAC,CAACW,MAAF,GAAW,KADxD,GAFJ;AAINJ,IAAAA,sBAAsB;AACpB,0EALI;AAMNC,IAAAA,KAAK,EAAE,eAAAI,CAAC,UAAIA,CAAJ,EANF,EARM;;AAgBdC,EAAAA,uBAAuB,EAAE;AACvBT,IAAAA,YAAY,EAAE,KADS;AAEvBC,IAAAA,OAAO,EAAES,aAFc;AAGvBP,IAAAA,sBAAsB,EAAE,+CAHD;AAIvBC,IAAAA,KAAK,EAAEO,mBAJgB,EAhBX,EAAhB;;;;AAwBA,IAAMC,eAAe,GAAG;AACtB;AACE,UAACC,GAAD,EAAMC,IAAN;AACED,IAAAA,GAAG,KAAK,IAAR,IAAgBC,IAAI,CAACf,SAAL,KAAmB,IAAnC,IAA2Cc,GAAG,CAACN,MAAJ,IAAcO,IAAI,CAACf,SADhE,GADF;AAGE,UAACc,GAAD,EAAMC,IAAN,oDAAkDA,IAAI,CAACf,SAAvD,GAHF,CADsB;;AAMtB;AACE,UAACc,GAAD,EAAMC,IAAN;AACED,IAAAA,GAAG,KAAK,IAAR;AACAC,IAAAA,IAAI,CAACL,uBAAL,KAAiC,KADjC;AAEA,sBAASI,GAAT,EAAcC,IAAI,CAACR,MAAnB,CAHF,GADF;AAKE,UAAAO,GAAG,sBAAQA,GAAR,sDALL,CANsB,CAAxB,C;;;;AAee;AACb,QADa;AAEbtB,cAFa;AAGbD,eAHa;AAIbQ,OAJa;AAKbc,eALa;AAMb,OANa;AAOb,UAAAG,GAAG,UAAIA,GAAJ,EAPU,C","sourcesContent":["import { constant, isString, isNull, includes, isBoolean } from \"lodash/fp\"\r\nimport {\r\n typeFunctions,\r\n makerule,\r\n parsedSuccess,\r\n getDefaultExport,\r\n} from \"./typeHelpers\"\r\nimport {\r\n switchCase,\r\n defaultCase,\r\n toBoolOrNull,\r\n toNumberOrNull,\r\n isSafeInteger,\r\n isArrayOfString,\r\n} from \"../../common/index.js\"\r\n\r\nconst stringFunctions = typeFunctions({\r\n default: constant(null),\r\n})\r\n\r\nconst stringTryParse = switchCase(\r\n [isString, parsedSuccess],\r\n [isNull, parsedSuccess],\r\n [defaultCase, v => parsedSuccess(v.toString())]\r\n)\r\n\r\nconst options = {\r\n maxLength: {\r\n defaultValue: null,\r\n isValid: n => n === null || (isSafeInteger(n) && n > 0),\r\n requirementDescription:\r\n \"max length must be null (no limit) or a greater than zero integer\",\r\n parse: toNumberOrNull,\r\n },\r\n values: {\r\n defaultValue: null,\r\n isValid: v =>\r\n v === null || (isArrayOfString(v) && v.length > 0 && v.length < 10000),\r\n requirementDescription:\r\n \"'values' must be null (no values) or an array of at least one string\",\r\n parse: s => s,\r\n },\r\n allowDeclaredValuesOnly: {\r\n defaultValue: false,\r\n isValid: isBoolean,\r\n requirementDescription: \"allowDeclaredValuesOnly must be true or false\",\r\n parse: toBoolOrNull,\r\n },\r\n}\r\n\r\nconst typeConstraints = [\r\n makerule(\r\n (val, opts) =>\r\n val === null || opts.maxLength === null || val.length <= opts.maxLength,\r\n (val, opts) => `value exceeds maximum length of ${opts.maxLength}`\r\n ),\r\n makerule(\r\n (val, opts) =>\r\n val === null ||\r\n opts.allowDeclaredValuesOnly === false ||\r\n includes(val)(opts.values),\r\n val => `\"${val}\" does not exist in the list of allowed values`\r\n ),\r\n]\r\n\r\nexport default getDefaultExport(\r\n \"string\",\r\n stringTryParse,\r\n stringFunctions,\r\n options,\r\n typeConstraints,\r\n \"abcde\",\r\n str => str\r\n)\r\n"],"file":"string.js"} |
|
||||
@ -1,90 +0,0 @@ |
|||||
"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.getDefaultExport = exports.parsedSuccess = exports.parsedFailed = exports.makerule = exports.validateTypeConstraints = exports.typeFunctions = exports.getNewValue = exports.getSafeValueParser = exports.getSafeFieldParser = void 0;var _lodash = require("lodash"); |
|
||||
var _fp = require("lodash/fp"); |
|
||||
var _index = require("../../common/index.js");function _createForOfIteratorHelper(o) {if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) {if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) {var i = 0;var F = function F() {};return { s: F, n: function n() {if (i >= o.length) return { done: true };return { done: false, value: o[i++] };}, e: function e(_e) {throw _e;}, f: F };}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");}var it,normalCompletion = true,didErr = false,err;return { s: function s() {it = o[Symbol.iterator]();}, n: function n() {var step = it.next();normalCompletion = step.done;return step;}, e: function e(_e2) {didErr = true;err = _e2;}, f: function f() {try {if (!normalCompletion && it["return"] != null) it["return"]();} finally {if (didErr) throw err;}} };}function _unsupportedIterableToArray(o, minLen) {if (!o) return;if (typeof o === "string") return _arrayLikeToArray(o, minLen);var n = Object.prototype.toString.call(o).slice(8, -1);if (n === "Object" && o.constructor) n = o.constructor.name;if (n === "Map" || n === "Set") return Array.from(n);if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);}function _arrayLikeToArray(arr, len) {if (len == null || len > arr.length) len = arr.length;for (var i = 0, arr2 = new Array(len); i < len; i++) {arr2[i] = arr[i];}return arr2;} |
|
||||
|
|
||||
var getSafeFieldParser = function getSafeFieldParser(tryParse, defaultValueFunctions) {return function ( |
|
||||
field, |
|
||||
record) |
|
||||
{ |
|
||||
if ((0, _fp.has)(field.name)(record)) { |
|
||||
return getSafeValueParser( |
|
||||
tryParse, |
|
||||
defaultValueFunctions)( |
|
||||
record[field.name]); |
|
||||
} |
|
||||
return defaultValueFunctions[field.getUndefinedValue](); |
|
||||
};};exports.getSafeFieldParser = getSafeFieldParser; |
|
||||
|
|
||||
var getSafeValueParser = function getSafeValueParser( |
|
||||
tryParse, |
|
||||
defaultValueFunctions) {return ( |
|
||||
function (value) { |
|
||||
var parsed = tryParse(value); |
|
||||
if (parsed.success) { |
|
||||
return parsed.value; |
|
||||
} |
|
||||
return defaultValueFunctions["default"](); |
|
||||
});};exports.getSafeValueParser = getSafeValueParser; |
|
||||
|
|
||||
var getNewValue = function getNewValue(tryParse, defaultValueFunctions) {return function (field) { |
|
||||
var getInitialValue = |
|
||||
(0, _fp.isUndefined)(field) || (0, _fp.isUndefined)(field.getInitialValue) ? |
|
||||
"default" : |
|
||||
field.getInitialValue; |
|
||||
|
|
||||
return (0, _fp.has)(getInitialValue)(defaultValueFunctions) ? |
|
||||
defaultValueFunctions[getInitialValue]() : |
|
||||
getSafeValueParser(tryParse, defaultValueFunctions)(getInitialValue); |
|
||||
};};exports.getNewValue = getNewValue; |
|
||||
|
|
||||
var typeFunctions = function typeFunctions(specificFunctions) {return ( |
|
||||
(0, _lodash.merge)( |
|
||||
{ |
|
||||
value: _fp.constant, |
|
||||
"null": (0, _fp.constant)(null) }, |
|
||||
|
|
||||
specificFunctions));};exports.typeFunctions = typeFunctions; |
|
||||
|
|
||||
|
|
||||
var validateTypeConstraints = function validateTypeConstraints(validationRules) {return function (field, record) { |
|
||||
var fieldValue = record[field.name]; |
|
||||
var validateRule = function validateRule(r) {return ( |
|
||||
!r.isValid(fieldValue, field.typeOptions) ? |
|
||||
r.getMessage(fieldValue, field.typeOptions) : |
|
||||
"");}; |
|
||||
|
|
||||
var errors = [];var _iterator = _createForOfIteratorHelper( |
|
||||
validationRules),_step;try {for (_iterator.s(); !(_step = _iterator.n()).done;) {var r = _step.value; |
|
||||
var err = validateRule(r); |
|
||||
if ((0, _index.isNotEmpty)(err)) errors.push(err); |
|
||||
}} catch (err) {_iterator.e(err);} finally {_iterator.f();} |
|
||||
|
|
||||
return errors; |
|
||||
};};exports.validateTypeConstraints = validateTypeConstraints; |
|
||||
|
|
||||
var _getDefaultOptions = (0, _fp.mapValues)(function (v) {return v.defaultValue;}); |
|
||||
|
|
||||
var makerule = function makerule(isValid, getMessage) {return { isValid: isValid, getMessage: getMessage };};exports.makerule = makerule; |
|
||||
var parsedFailed = function parsedFailed(val) {return { success: false, value: val };};exports.parsedFailed = parsedFailed; |
|
||||
var parsedSuccess = function parsedSuccess(val) {return { success: true, value: val };};exports.parsedSuccess = parsedSuccess; |
|
||||
var getDefaultExport = function getDefaultExport( |
|
||||
name, |
|
||||
tryParse, |
|
||||
functions, |
|
||||
options, |
|
||||
validationRules, |
|
||||
sampleValue, |
|
||||
_stringify) {return ( |
|
||||
{ |
|
||||
getNew: getNewValue(tryParse, functions), |
|
||||
safeParseField: getSafeFieldParser(tryParse, functions), |
|
||||
safeParseValue: getSafeValueParser(tryParse, functions), |
|
||||
tryParse: tryParse, |
|
||||
name: name, |
|
||||
getDefaultOptions: function getDefaultOptions() {return _getDefaultOptions((0, _fp.cloneDeep)(options));}, |
|
||||
optionDefinitions: options, |
|
||||
validateTypeConstraints: validateTypeConstraints(validationRules), |
|
||||
sampleValue: sampleValue, |
|
||||
stringify: function stringify(val) {return val === null || val === undefined ? "" : _stringify(val);}, |
|
||||
getDefaultValue: functions["default"] });};exports.getDefaultExport = getDefaultExport; |
|
||||
//# sourceMappingURL=typeHelpers.js.map
|
|
||||
File diff suppressed because one or more lines are too long
@ -1,4 +1,3 @@ |
|||||
export { validateRecord } from "./records/validateRecord"; |
|
||||
export { events } from "./common/events"; |
export { events } from "./common/events"; |
||||
export { safeParseField } from "./schema/types"; |
export { safeParseField } from "./schema/types"; |
||||
export { default as schemaValidator } from "./schemaValidation"; |
export { default as schemaValidator } from "./schemaValidation"; |
||||
@ -1,16 +0,0 @@ |
|||||
import { generate } from "shortid" |
|
||||
|
|
||||
export const getNewRecord = (schema, modelName) => { |
|
||||
const model = schema.findModel(modelName) |
|
||||
|
|
||||
const record = { |
|
||||
_id: generate(), |
|
||||
modelId: model._id, |
|
||||
} |
|
||||
|
|
||||
for (let field in model.schema.properties) { |
|
||||
record[field] = field.default |
|
||||
} |
|
||||
|
|
||||
return record |
|
||||
} |
|
||||
@ -1,32 +0,0 @@ |
|||||
export const getNewRecordValidationRule = ( |
|
||||
invalidField, |
|
||||
messageWhenInvalid, |
|
||||
expressionWhenValid |
|
||||
) => ({ |
|
||||
invalidField, |
|
||||
messageWhenInvalid, |
|
||||
expressionWhenValid, |
|
||||
}) |
|
||||
|
|
||||
export const commonRecordValidationRules = { |
|
||||
fieldNotEmpty: fieldName => |
|
||||
getNewRecordValidationRule( |
|
||||
fieldName, |
|
||||
`${fieldName} is empty`, |
|
||||
`record['${fieldName}'] && record['${fieldName}'].length > 0` |
|
||||
), |
|
||||
|
|
||||
fieldBetween: (fieldName, min, max) => |
|
||||
getNewRecordValidationRule( |
|
||||
fieldName, |
|
||||
`${fieldName} must be between ${min.toString()} and ${max.toString()}`, |
|
||||
`record['${fieldName}'] >= ${min} && record['${fieldName}'] <= ${max} ` |
|
||||
), |
|
||||
|
|
||||
fieldGreaterThan: (fieldName, min, max) => |
|
||||
getNewRecordValidationRule( |
|
||||
fieldName, |
|
||||
`${fieldName} must be greater than ${min.toString()} and ${max.toString()}`, |
|
||||
`record['${fieldName}'] >= ${min} ` |
|
||||
), |
|
||||
} |
|
||||
@ -1,85 +0,0 @@ |
|||||
import { map, reduce, filter, isEmpty, flatten, each, union } from "lodash/fp"; |
|
||||
import { compileCode } from "../common/compileCode"; |
|
||||
import { |
|
||||
validateFieldParse, |
|
||||
validateTypeConstraints, |
|
||||
} from "../schema/types/index.js" |
|
||||
import { $, isNonEmptyString } from "../common/index.js" |
|
||||
|
|
||||
const fieldParseError = (fieldName, value) => ({ |
|
||||
fields: [fieldName], |
|
||||
message: `Could not parse field ${fieldName}:${value}`, |
|
||||
}) |
|
||||
|
|
||||
const validateAllFieldParse = (record, model) => |
|
||||
$(model.fields, [ |
|
||||
map(f => ({ name: f.name, parseResult: validateFieldParse(f, record) })), |
|
||||
reduce((errors, f) => { |
|
||||
if (f.parseResult.success) return errors |
|
||||
errors.push(fieldParseError(f.name, f.parseResult.value)) |
|
||||
return errors |
|
||||
}, []), |
|
||||
]) |
|
||||
|
|
||||
const validateAllTypeConstraints = (record, model) => { |
|
||||
const errors = [] |
|
||||
for (const field of model.fields) { |
|
||||
$(validateTypeConstraints(field, record), [ |
|
||||
filter(isNonEmptyString), |
|
||||
map(m => ({ message: m, fields: [field.name] })), |
|
||||
each(e => errors.push(e)), |
|
||||
]) |
|
||||
} |
|
||||
return errors |
|
||||
} |
|
||||
|
|
||||
const runRecordValidationRules = (record, model) => { |
|
||||
const runValidationRule = rule => { |
|
||||
const isValid = compileCode(rule.expressionWhenValid) |
|
||||
const expressionContext = { record } |
|
||||
return isValid(expressionContext) |
|
||||
? { valid: true } |
|
||||
: { |
|
||||
valid: false, |
|
||||
fields: rule.invalidFields, |
|
||||
message: rule.messageWhenInvalid, |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
return $(model.validationRules, [ |
|
||||
map(runValidationRule), |
|
||||
flatten, |
|
||||
filter(r => r.valid === false), |
|
||||
map(r => ({ fields: r.fields, message: r.message })), |
|
||||
]) |
|
||||
} |
|
||||
|
|
||||
export const validateRecord = (schema, record) => { |
|
||||
const model = schema.findModel(record._modelId) |
|
||||
const fieldParseFails = validateAllFieldParse(record, model) |
|
||||
|
|
||||
// non parsing would cause further issues - exit here
|
|
||||
if (!isEmpty(fieldParseFails)) { |
|
||||
return { isValid: false, errors: fieldParseFails } |
|
||||
} |
|
||||
|
|
||||
const recordValidationRuleFails = runRecordValidationRules(record, model) |
|
||||
const typeContraintFails = validateAllTypeConstraints(record, model) |
|
||||
|
|
||||
if ( |
|
||||
isEmpty(fieldParseFails) && |
|
||||
isEmpty(recordValidationRuleFails) && |
|
||||
isEmpty(typeContraintFails) |
|
||||
) { |
|
||||
return { isValid: true, errors: [] } |
|
||||
} |
|
||||
|
|
||||
return { |
|
||||
isValid: false, |
|
||||
errors: union( |
|
||||
fieldParseFails, |
|
||||
typeContraintFails, |
|
||||
recordValidationRuleFails |
|
||||
), |
|
||||
} |
|
||||
} |
|
||||
@ -1,5 +1,5 @@ |
|||||
const CouchDB = require("../../db"); |
const CouchDB = require("../../db"); |
||||
const { schemaValidator } = require("../../../common"); |
const { schemaValidator } = require("../../../common/lib"); |
||||
|
|
||||
exports.save = async function(ctx) { |
exports.save = async function(ctx) { |
||||
const db = new CouchDB(ctx.params.instanceId); |
const db = new CouchDB(ctx.params.instanceId); |
||||
@ -0,0 +1,132 @@ |
|||||
|
const Router = require("@koa/router"); |
||||
|
const StatusCodes = require("../../utilities/statusCodes") |
||||
|
const routeHandlers = require("../../middleware/routeHandlers") |
||||
|
|
||||
|
const router = Router(); |
||||
|
|
||||
|
// async function isAuthenticated(ctx, next) {
|
||||
|
// if (ctx.isAuthenticated) {
|
||||
|
// await next()
|
||||
|
// } else {
|
||||
|
// ctx.response.status = StatusCodes.UNAUTHORIZED
|
||||
|
// }
|
||||
|
// }
|
||||
|
|
||||
|
// router.use(isAuthenticated)
|
||||
|
|
||||
|
// router.post(
|
||||
|
// "/_builder/instance/:appname/:instanceid/api/upgradeData",
|
||||
|
// routeHandlers.upgradeData
|
||||
|
// )
|
||||
|
|
||||
|
// router.post("/:appname/api/changeMyPassword", routeHandlers.changeMyPassword)
|
||||
|
|
||||
|
// router.post(
|
||||
|
// "/_builder/instance/:appname/:instanceid/api/changeMyPassword",
|
||||
|
// routeHandlers.changeMyPassword
|
||||
|
// )
|
||||
|
|
||||
|
router.post( |
||||
|
"/:appname/api/executeAction/:actionname", |
||||
|
routeHandlers.executeAction |
||||
|
) |
||||
|
|
||||
|
router.post( |
||||
|
"/_builder/instance/:appname/:instanceid/api/executeAction/:actionname", |
||||
|
routeHandlers.executeAction |
||||
|
) |
||||
|
|
||||
|
// router.post("/:appname/api/createUser", routeHandlers.createUser)
|
||||
|
|
||||
|
// router.post(
|
||||
|
// "/_builder/instance/:appname/:instanceid/api/createUser",
|
||||
|
// routeHandlers.createUser
|
||||
|
// )
|
||||
|
|
||||
|
// router.post("/:appname/api/enableUser", routeHandlers.enableUser)
|
||||
|
|
||||
|
// router.post(
|
||||
|
// "/_builder/instance/:appname/:instanceid/api/enableUser",
|
||||
|
// routeHandlers.enableUser
|
||||
|
// )
|
||||
|
|
||||
|
// router.post("/:appname/api/disableUser", routeHandlers.disableUser)
|
||||
|
|
||||
|
// router.post(
|
||||
|
// "/_builder/instance/:appname/:instanceid/api/disableUser",
|
||||
|
// routeHandlers.disableUser
|
||||
|
// )
|
||||
|
|
||||
|
// router.get("/:appname/api/users", routeHandlers.getUsers)
|
||||
|
|
||||
|
// router.get(
|
||||
|
// "/_builder/instance/:appname/:instanceid/api/users",
|
||||
|
// routeHandlers.getUsers
|
||||
|
// )
|
||||
|
|
||||
|
// router.get("/:appname/api/accessLevels", routeHandlers.getAccessLevels)
|
||||
|
|
||||
|
// router.get(
|
||||
|
// "/_builder/instance/:appname/:instanceid/api/accessLevels",
|
||||
|
// routeHandlers.getAccessLevels
|
||||
|
// )
|
||||
|
|
||||
|
// router.get("/:appname/api/listRecords/*", routeHandlers.listRecordsGet)
|
||||
|
|
||||
|
// router.get(
|
||||
|
// "/_builder/instance/:appname/:instanceid/api/listRecords/*",
|
||||
|
// routeHandlers.listRecordsGet
|
||||
|
// )
|
||||
|
|
||||
|
// router.post("/:appname/api/listRecords/*", routeHandlers.listRecordsPost)
|
||||
|
|
||||
|
// router.post(
|
||||
|
// "/_builder/instance/:appname/:instanceid/api/listRecords/*",
|
||||
|
// routeHandlers.listRecordsPost
|
||||
|
// )
|
||||
|
|
||||
|
// router.post("/:appname/api/aggregates/*", routeHandlers.aggregatesPost)
|
||||
|
|
||||
|
// router.post(
|
||||
|
// "/_builder/instance/:appname/:instanceid/api/aggregates/*",
|
||||
|
// routeHandlers.aggregatesPost
|
||||
|
// )
|
||||
|
|
||||
|
// router.post("/:appname/api/files/*", routeHandlers.postFiles)
|
||||
|
|
||||
|
// router.post(
|
||||
|
// "/_builder/instance/:appname/:instanceid/api/files/*",
|
||||
|
// routeHandlers.postFiles
|
||||
|
// )
|
||||
|
|
||||
|
// router.post("/:appname/api/record/*", routeHandlers.saveRecord)
|
||||
|
|
||||
|
// router.post(
|
||||
|
// "/_builder/instance/:appname/:instanceid/api/record/*",
|
||||
|
// routeHandlers.saveRecord
|
||||
|
// )
|
||||
|
|
||||
|
// router.get("/:appname/api/lookup_field/*", routeHandlers.lookupField)
|
||||
|
|
||||
|
// router.get(
|
||||
|
// "/_builder/instance/:appname/:instanceid/api/lookup_field/*",
|
||||
|
// routeHandlers.lookupField
|
||||
|
// )
|
||||
|
|
||||
|
// router.get("/:appname/api/record/*", routeHandlers.getRecord)
|
||||
|
|
||||
|
// router.get(
|
||||
|
// "/_builder/instance/:appname/:instanceid/api/record/*",
|
||||
|
// routeHandlers.getRecord
|
||||
|
// )
|
||||
|
|
||||
|
// router.del("/:appname/api/record/*", routeHandlers.deleteRecord)
|
||||
|
|
||||
|
// router.del(
|
||||
|
// "/_builder/instance/:appname/:instanceid/api/record/*",
|
||||
|
// routeHandlers.deleteRecord
|
||||
|
// )
|
||||
|
|
||||
|
// router.post("/:appname/api/apphierarchy", routeHandlers.saveAppHierarchy)
|
||||
|
|
||||
|
module.exports = router |
||||
@ -1,13 +1,11 @@ |
|||||
const pageRoutes = require("./pages"); |
const pageRoutes = require("./pages"); |
||||
const componentRoutes = require("./components"); |
const componentRoutes = require("./components"); |
||||
const userRoutes = require("./user"); |
const userRoutes = require("./user"); |
||||
const appsRoutes = require("./apps"); |
|
||||
const authenticatedRoutes = require("./authenticated"); |
const authenticatedRoutes = require("./authenticated"); |
||||
|
|
||||
module.exports = { |
module.exports = { |
||||
pageRoutes, |
pageRoutes, |
||||
componentRoutes, |
componentRoutes, |
||||
appsRoutes, |
|
||||
userRoutes, |
userRoutes, |
||||
authenticatedRoutes |
authenticatedRoutes |
||||
}; |
}; |
||||
@ -0,0 +1,12 @@ |
|||||
|
const Router = require("@koa/router"); |
||||
|
const controller = require("../../controllers/page"); |
||||
|
|
||||
|
const router = Router(); |
||||
|
|
||||
|
router |
||||
|
.get("/api/:instanceId/pages", controller.fetch) |
||||
|
.post("/api/:instanceId/pages", controller.save) |
||||
|
.delete("/api/:instanceId/:pageId/:revId", controller.destroy); |
||||
|
|
||||
|
|
||||
|
module.exports = router; |
||||
@ -0,0 +1,12 @@ |
|||||
|
const Router = require("@koa/router"); |
||||
|
const controller = require("../../controllers/screen"); |
||||
|
|
||||
|
const router = Router(); |
||||
|
|
||||
|
router |
||||
|
.get("/api/:instanceId/screens", controller.fetch) |
||||
|
.post("/api/:instanceId/screens", controller.save) |
||||
|
.delete("/api/:instanceId/:screenId/:revId", controller.destroy); |
||||
|
|
||||
|
|
||||
|
module.exports = router; |
||||
@ -0,0 +1,32 @@ |
|||||
|
const Router = require("@koa/router") |
||||
|
|
||||
|
const router = new Router() |
||||
|
|
||||
|
// router.post("/:appname/api/authenticate", routeHandlers.authenticate)
|
||||
|
|
||||
|
// router.post(
|
||||
|
// "/_builder/instance/:appname/:instanceid/api/authenticate",
|
||||
|
// routeHandlers.authenticate
|
||||
|
// )
|
||||
|
|
||||
|
// router.post(
|
||||
|
// "/_builder/instance/:appname/:instanceid/api/setPasswordFromTemporaryCode",
|
||||
|
// routeHandlers.setPasswordFromTemporaryCode
|
||||
|
// )
|
||||
|
|
||||
|
// router.post(
|
||||
|
// "/_builder/instance/:appname/:instanceid/api/createTemporaryAccess",
|
||||
|
// routeHandlers.createTemporaryAccess
|
||||
|
// )
|
||||
|
|
||||
|
// router.post(
|
||||
|
// "/:appname/api/createTemporaryAccess",
|
||||
|
// routeHandlers.createTemporaryAccess
|
||||
|
// )
|
||||
|
|
||||
|
// router.post(
|
||||
|
// "/:appname/api/setPasswordFromTemporaryCode",
|
||||
|
// routeHandlers.setPasswordFromTemporaryCode
|
||||
|
// )
|
||||
|
|
||||
|
module.exports = router |
||||
@ -1 +0,0 @@ |
|||||
dist/ |
|
||||
@ -1,175 +0,0 @@ |
|||||
{ |
|
||||
"version":0, |
|
||||
"levels":[ |
|
||||
{ |
|
||||
"name": "owner", |
|
||||
"permissions": [ |
|
||||
{ |
|
||||
"type": "create record", |
|
||||
"nodeKey": "/applications/1-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "update record", |
|
||||
"nodeKey": "/applications/1-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "delete record", |
|
||||
"nodeKey": "/applications/1-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "read record", |
|
||||
"nodeKey": "/applications/1-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "create record", |
|
||||
"nodeKey": "/applications/1-{id}/users/8-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "update record", |
|
||||
"nodeKey": "/applications/1-{id}/users/8-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "delete record", |
|
||||
"nodeKey": "/applications/1-{id}/users/8-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "read record", |
|
||||
"nodeKey": "/applications/1-{id}/users/8-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "create record", |
|
||||
"nodeKey": "/applications/1-{id}/instances/2-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "update record", |
|
||||
"nodeKey": "/applications/1-{id}/instances/2-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "delete record", |
|
||||
"nodeKey": "/applications/1-{id}/instances/2-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "read record", |
|
||||
"nodeKey": "/applications/1-{id}/instances/2-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "create record", |
|
||||
"nodeKey": "/applications/1-{id}/versions/3-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "update record", |
|
||||
"nodeKey": "/applications/1-{id}/versions/3-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "delete record", |
|
||||
"nodeKey": "/applications/1-{id}/versions/3-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "read record", |
|
||||
"nodeKey": "/applications/1-{id}/versions/3-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "create record", |
|
||||
"nodeKey": "/applications/1-{id}/sessions/16-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "update record", |
|
||||
"nodeKey": "/applications/1-{id}/sessions/16-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "delete record", |
|
||||
"nodeKey": "/applications/1-{id}/sessions/16-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "read record", |
|
||||
"nodeKey": "/applications/1-{id}/sessions/16-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "create record", |
|
||||
"nodeKey": "/sessions/17-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "update record", |
|
||||
"nodeKey": "/sessions/17-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "delete record", |
|
||||
"nodeKey": "/sessions/17-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "read record", |
|
||||
"nodeKey": "/sessions/17-{id}" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "read index", |
|
||||
"nodeKey": "/mastersessions_by_user" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "read index", |
|
||||
"nodeKey": "/all_applications" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "read index", |
|
||||
"nodeKey": "/applications/1-{id}/allinstances" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "read index", |
|
||||
"nodeKey": "/applications/1-{id}/sessions_by_user" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "read index", |
|
||||
"nodeKey": "/applications/1-{id}/user_name_lookup" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "read index", |
|
||||
"nodeKey": "/applications/1-{id}/all_versions" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "read index", |
|
||||
"nodeKey": "/applications/1-{id}/instances/2-{id}/users_on_this_instance" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "read index", |
|
||||
"nodeKey": "/applications/1-{id}/versions/3-{id}/instances_for_this_version" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "read index", |
|
||||
"nodeKey": "/applications/1-{id}/versions/3-{id}/instances_on_this_version" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "write templates" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "create user" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "set password" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "create temporary access" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "enable or disable user" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "write access levels" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "list users" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "list access levels" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "manage index" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "manage collection" |
|
||||
}, |
|
||||
{ |
|
||||
"type": "set user access levels" |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
@ -1,527 +0,0 @@ |
|||||
{ |
|
||||
"hierarchy": { |
|
||||
"name": "root", |
|
||||
"type": "root", |
|
||||
"children": [ |
|
||||
{ |
|
||||
"name": "application", |
|
||||
"type": "record", |
|
||||
"fields": [ |
|
||||
{ |
|
||||
"name": "name", |
|
||||
"type": "string", |
|
||||
"typeOptions": { |
|
||||
"maxLength": 500, |
|
||||
"values": null, |
|
||||
"allowDeclaredValuesOnly": false |
|
||||
}, |
|
||||
"label": "Name", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
}, |
|
||||
{ |
|
||||
"name": "domain", |
|
||||
"type": "string", |
|
||||
"typeOptions": { |
|
||||
"maxLength": 500, |
|
||||
"values": null, |
|
||||
"allowDeclaredValuesOnly": false |
|
||||
}, |
|
||||
"label": "domain", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
}, |
|
||||
{ |
|
||||
"name": "application_resolve_strategy", |
|
||||
"type": "string", |
|
||||
"typeOptions": { |
|
||||
"maxLength": 100, |
|
||||
"values": [ |
|
||||
"domain", |
|
||||
"path" |
|
||||
], |
|
||||
"allowDeclaredValuesOnly": true |
|
||||
}, |
|
||||
"label": "Resolve Application By", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
}, |
|
||||
{ |
|
||||
"name": "defaultVersion", |
|
||||
"type": "reference", |
|
||||
"typeOptions": { |
|
||||
"indexNodeKey": "/applications/1-{id}/all_versions", |
|
||||
"reverseIndexNodeKeys": [ |
|
||||
"/applications/1-{id}/versions/3-{id}/isdefault" |
|
||||
], |
|
||||
"displayValue": "name" |
|
||||
}, |
|
||||
"label": "Default Version", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
} |
|
||||
], |
|
||||
"children": [ |
|
||||
{ |
|
||||
"name": "user", |
|
||||
"type": "record", |
|
||||
"fields": [ |
|
||||
{ |
|
||||
"name": "name", |
|
||||
"type": "string", |
|
||||
"typeOptions": { |
|
||||
"maxLength": 200, |
|
||||
"values": null, |
|
||||
"allowDeclaredValuesOnly": false |
|
||||
}, |
|
||||
"label": "Name (unique)", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
}, |
|
||||
{ |
|
||||
"name": "active", |
|
||||
"type": "bool", |
|
||||
"typeOptions": { |
|
||||
"allowNulls": false |
|
||||
}, |
|
||||
"label": "Is Active", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
}, |
|
||||
{ |
|
||||
"name": "createdByMaster", |
|
||||
"type": "bool", |
|
||||
"typeOptions": { |
|
||||
"allowNulls": false |
|
||||
}, |
|
||||
"label": "Created by Master", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
}, |
|
||||
{ |
|
||||
"name": "instance", |
|
||||
"type": "reference", |
|
||||
"typeOptions": { |
|
||||
"indexNodeKey": "/applications/1-{id}/allinstances", |
|
||||
"reverseIndexNodeKeys": [ |
|
||||
"/applications/1-{id}/instances/2-{id}/users_on_this_instance" |
|
||||
], |
|
||||
"displayValue": "name" |
|
||||
}, |
|
||||
"label": "Instance", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
} |
|
||||
], |
|
||||
"children": [], |
|
||||
"validationRules": [], |
|
||||
"nodeId": 8, |
|
||||
"indexes": [], |
|
||||
"allidsShardFactor": "64", |
|
||||
"collectionName": "users", |
|
||||
"isSingle": false |
|
||||
}, |
|
||||
{ |
|
||||
"name": "instance", |
|
||||
"type": "record", |
|
||||
"fields": [ |
|
||||
{ |
|
||||
"name": "name", |
|
||||
"type": "string", |
|
||||
"typeOptions": { |
|
||||
"maxLength": 1000, |
|
||||
"values": null, |
|
||||
"allowDeclaredValuesOnly": false |
|
||||
}, |
|
||||
"label": "Name", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
}, |
|
||||
{ |
|
||||
"name": "active", |
|
||||
"type": "bool", |
|
||||
"typeOptions": { |
|
||||
"allowNulls": false |
|
||||
}, |
|
||||
"label": "Is Active", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
}, |
|
||||
{ |
|
||||
"name": "version", |
|
||||
"type": "reference", |
|
||||
"typeOptions": { |
|
||||
"indexNodeKey": "/applications/1-{id}/all_versions", |
|
||||
"reverseIndexNodeKeys": [ |
|
||||
"/applications/1-{id}/versions/3-{id}/instances_on_this_version" |
|
||||
], |
|
||||
"displayValue": "name" |
|
||||
}, |
|
||||
"label": "Version", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
}, |
|
||||
{ |
|
||||
"name": "datastoreconfig", |
|
||||
"type": "string", |
|
||||
"typeOptions": { |
|
||||
"maxLength": 1000, |
|
||||
"values": null, |
|
||||
"allowDeclaredValuesOnly": false |
|
||||
}, |
|
||||
"label": "Datastore Config", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
} |
|
||||
], |
|
||||
"children": [], |
|
||||
"validationRules": [], |
|
||||
"nodeId": 2, |
|
||||
"indexes": [ |
|
||||
{ |
|
||||
"name": "users_on_this_instance", |
|
||||
"type": "index", |
|
||||
"map": "return {...record};", |
|
||||
"filter": "", |
|
||||
"indexType": "reference", |
|
||||
"getShardName": "", |
|
||||
"getSortKey": "record.id", |
|
||||
"aggregateGroups": [], |
|
||||
"allowedModelNodeIds": [], |
|
||||
"nodeId": 15 |
|
||||
} |
|
||||
], |
|
||||
"allidsShardFactor": 1, |
|
||||
"collectionName": "instances", |
|
||||
"isSingle": false |
|
||||
}, |
|
||||
{ |
|
||||
"name": "version", |
|
||||
"type": "record", |
|
||||
"fields": [ |
|
||||
{ |
|
||||
"name": "name", |
|
||||
"type": "string", |
|
||||
"typeOptions": { |
|
||||
"maxLength": 200, |
|
||||
"values": null, |
|
||||
"allowDeclaredValuesOnly": false |
|
||||
}, |
|
||||
"label": "Name", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
}, |
|
||||
{ |
|
||||
"name": "defaultAccessLevel", |
|
||||
"type": "string", |
|
||||
"typeOptions": { |
|
||||
"maxLength": 200, |
|
||||
"values": null, |
|
||||
"allowDeclaredValuesOnly": false |
|
||||
}, |
|
||||
"label": "Default Access Level", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
} |
|
||||
], |
|
||||
"children": [], |
|
||||
"validationRules": [], |
|
||||
"nodeId": 3, |
|
||||
"indexes": [ |
|
||||
{ |
|
||||
"name": "instances_for_this_version", |
|
||||
"type": "index", |
|
||||
"map": "return {name:record.name};", |
|
||||
"filter": "", |
|
||||
"indexType": "ancestor", |
|
||||
"getShardName": "", |
|
||||
"getSortKey": "record.id", |
|
||||
"aggregateGroups": [], |
|
||||
"allowedModelNodeIds": [], |
|
||||
"nodeId": 9 |
|
||||
}, |
|
||||
{ |
|
||||
"name": "instances_on_this_version", |
|
||||
"type": "index", |
|
||||
"map": "return {...record};", |
|
||||
"filter": "", |
|
||||
"indexType": "reference", |
|
||||
"getShardName": "", |
|
||||
"getSortKey": "record.id", |
|
||||
"aggregateGroups": [], |
|
||||
"allowedModelNodeIds": [], |
|
||||
"nodeId": 10 |
|
||||
}, |
|
||||
{ |
|
||||
"name": "isdefault", |
|
||||
"type": "index", |
|
||||
"map": "return {};", |
|
||||
"filter": "", |
|
||||
"indexType": "reference", |
|
||||
"getShardName": "", |
|
||||
"getSortKey": "record.id", |
|
||||
"aggregateGroups": [], |
|
||||
"allowedModelNodeIds": [], |
|
||||
"nodeId": 28 |
|
||||
} |
|
||||
], |
|
||||
"allidsShardFactor": 1, |
|
||||
"collectionName": "versions", |
|
||||
"isSingle": false |
|
||||
}, |
|
||||
{ |
|
||||
"name": "session", |
|
||||
"type": "record", |
|
||||
"fields": [ |
|
||||
{ |
|
||||
"name": "created", |
|
||||
"type": "number", |
|
||||
"typeOptions": { |
|
||||
"minValue": 0, |
|
||||
"maxValue": 99999999999999, |
|
||||
"decimalPlaces": 0 |
|
||||
}, |
|
||||
"label": "Created", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
}, |
|
||||
{ |
|
||||
"name": "user_json", |
|
||||
"type": "string", |
|
||||
"typeOptions": { |
|
||||
"maxLength": null, |
|
||||
"values": null, |
|
||||
"allowDeclaredValuesOnly": false |
|
||||
}, |
|
||||
"label": "User Json", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
}, |
|
||||
{ |
|
||||
"name": "instanceDatastoreConfig", |
|
||||
"type": "string", |
|
||||
"typeOptions": { |
|
||||
"maxLength": null, |
|
||||
"values": null, |
|
||||
"allowDeclaredValuesOnly": false |
|
||||
}, |
|
||||
"label": "Instance Datastore Config", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
}, |
|
||||
{ |
|
||||
"name": "instanceKey", |
|
||||
"type": "string", |
|
||||
"typeOptions": { |
|
||||
"maxLength": null, |
|
||||
"values": null, |
|
||||
"allowDeclaredValuesOnly": false |
|
||||
}, |
|
||||
"label": "Instance Key", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
}, |
|
||||
{ |
|
||||
"name": "instanceVersion", |
|
||||
"type": "string", |
|
||||
"typeOptions": { |
|
||||
"maxLength": null, |
|
||||
"values": null, |
|
||||
"allowDeclaredValuesOnly": false |
|
||||
}, |
|
||||
"label": "Instance Version", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
}, |
|
||||
{ |
|
||||
"name": "username", |
|
||||
"type": "string", |
|
||||
"typeOptions": { |
|
||||
"maxLength": null, |
|
||||
"values": null, |
|
||||
"allowDeclaredValuesOnly": false |
|
||||
}, |
|
||||
"label": "User", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
} |
|
||||
], |
|
||||
"children": [], |
|
||||
"validationRules": [], |
|
||||
"nodeId": 16, |
|
||||
"indexes": [], |
|
||||
"allidsShardFactor": 1, |
|
||||
"collectionName": "sessions", |
|
||||
"isSingle": false |
|
||||
} |
|
||||
], |
|
||||
"validationRules": [], |
|
||||
"nodeId": 1, |
|
||||
"indexes": [ |
|
||||
{ |
|
||||
"name": "allinstances", |
|
||||
"type": "index", |
|
||||
"map": "return {...record};", |
|
||||
"filter": "", |
|
||||
"indexType": "ancestor", |
|
||||
"getShardName": "", |
|
||||
"getSortKey": "record.id", |
|
||||
"aggregateGroups": [], |
|
||||
"allowedModelNodeIds": [ |
|
||||
2 |
|
||||
], |
|
||||
"nodeId": 23 |
|
||||
}, |
|
||||
{ |
|
||||
"name": "sessions_by_user", |
|
||||
"type": "index", |
|
||||
"map": "return {username:record.username};", |
|
||||
"filter": "", |
|
||||
"indexType": "ancestor", |
|
||||
"getShardName": "return record.username.substring(0,2)", |
|
||||
"getSortKey": "record.id", |
|
||||
"aggregateGroups": [], |
|
||||
"allowedModelNodeIds": [ |
|
||||
16 |
|
||||
], |
|
||||
"nodeId": 24 |
|
||||
}, |
|
||||
{ |
|
||||
"name": "user_name_lookup", |
|
||||
"type": "index", |
|
||||
"map": "return ({name:record.name, instanceKey:record.instance.key ? record.instance.key : '', instanceDatastoreConfig:record.instance.datastoreconfig ? record.instance.datastoreconfig : 'nothing'});", |
|
||||
"filter": "", |
|
||||
"indexType": "ancestor", |
|
||||
"getShardName": "return record.name.substring(0,2)", |
|
||||
"getSortKey": "record.id", |
|
||||
"aggregateGroups": [], |
|
||||
"allowedModelNodeIds": [ |
|
||||
8 |
|
||||
], |
|
||||
"nodeId": 25 |
|
||||
}, |
|
||||
{ |
|
||||
"name": "all_versions", |
|
||||
"type": "index", |
|
||||
"map": "return {...record};", |
|
||||
"filter": "", |
|
||||
"indexType": "ancestor", |
|
||||
"getShardName": "", |
|
||||
"getSortKey": "record.id", |
|
||||
"aggregateGroups": [], |
|
||||
"allowedModelNodeIds": [ |
|
||||
3 |
|
||||
], |
|
||||
"nodeId": 26 |
|
||||
} |
|
||||
], |
|
||||
"allidsShardFactor": 64, |
|
||||
"collectionName": "applications", |
|
||||
"isSingle": false |
|
||||
}, |
|
||||
{ |
|
||||
"name": "mastersession", |
|
||||
"type": "record", |
|
||||
"fields": [ |
|
||||
{ |
|
||||
"name": "user_json", |
|
||||
"type": "string", |
|
||||
"typeOptions": { |
|
||||
"maxLength": 10000, |
|
||||
"values": null, |
|
||||
"allowDeclaredValuesOnly": false |
|
||||
}, |
|
||||
"label": "User Json", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
}, |
|
||||
{ |
|
||||
"name": "username", |
|
||||
"type": "string", |
|
||||
"typeOptions": { |
|
||||
"maxLength": null, |
|
||||
"values": null, |
|
||||
"allowDeclaredValuesOnly": false |
|
||||
}, |
|
||||
"label": "User", |
|
||||
"getInitialValue": "default", |
|
||||
"getUndefinedValue": "default" |
|
||||
} |
|
||||
], |
|
||||
"children": [], |
|
||||
"validationRules": [], |
|
||||
"nodeId": 17, |
|
||||
"indexes": [], |
|
||||
"allidsShardFactor": 64, |
|
||||
"collectionName": "sessions", |
|
||||
"isSingle": false |
|
||||
} |
|
||||
], |
|
||||
"pathMaps": [], |
|
||||
"indexes": [ |
|
||||
{ |
|
||||
"name": "all_applications", |
|
||||
"type": "index", |
|
||||
"map": "return {...record};", |
|
||||
"filter": "", |
|
||||
"indexType": "ancestor", |
|
||||
"getShardName": "", |
|
||||
"getSortKey": "record.id", |
|
||||
"aggregateGroups": [], |
|
||||
"allowedModelNodeIds": [ |
|
||||
1 |
|
||||
], |
|
||||
"nodeId": 22 |
|
||||
}, |
|
||||
{ |
|
||||
"name": "mastersessions_by_user", |
|
||||
"type": "index", |
|
||||
"map": "return {username:record.username};", |
|
||||
"filter": "", |
|
||||
"indexType": "ancestor", |
|
||||
"getShardName": "return record.username.substring(0,2)", |
|
||||
"getSortKey": "record.id", |
|
||||
"aggregateGroups": [], |
|
||||
"allowedModelNodeIds": [ |
|
||||
17 |
|
||||
], |
|
||||
"nodeId": 27 |
|
||||
} |
|
||||
], |
|
||||
"nodeId": 0 |
|
||||
}, |
|
||||
"triggers": [ |
|
||||
{ |
|
||||
"actionName": "initialise_instance", |
|
||||
"eventName": "recordApi:save:onRecordCreated", |
|
||||
"optionsCreator": "return ({ instance:context.record, apis });", |
|
||||
"condition": "context.record.type === \"instance\"" |
|
||||
}, |
|
||||
{ |
|
||||
"actionName": "create_user", |
|
||||
"eventName": "recordApi:save:onRecordCreated", |
|
||||
"optionsCreator": "return ({ user:context.record, apis });", |
|
||||
"condition": "context.record.type === \"user\" && context.record.createdByMaster === true" |
|
||||
} |
|
||||
], |
|
||||
"actions": [ |
|
||||
{ |
|
||||
"name": "initialise_instance", |
|
||||
"behaviourSource": "main", |
|
||||
"behaviourName": "initialiseInstance", |
|
||||
"initialOptions": {} |
|
||||
}, |
|
||||
{ |
|
||||
"name": "create_user", |
|
||||
"behaviourSource": "main", |
|
||||
"behaviourName": "createNewUser", |
|
||||
"initialOptions": {} |
|
||||
}, |
|
||||
{ |
|
||||
"name": "set_default_version", |
|
||||
"behaviourSource": "main", |
|
||||
"behaviourName": "setDefaultVersion", |
|
||||
"initialOptions": {} |
|
||||
} |
|
||||
] |
|
||||
} |
|
||||
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue