Merge pull request #2899 from Budibase/develop

Develop -> master
This commit is contained in:
Martin McKeaveney 2021-10-06 15:09:44 +01:00 committed by GitHub
commit fdceeaccbc
32 changed files with 337 additions and 1526 deletions

View File

@ -96,6 +96,10 @@ spec:
value: worker-service:{{ .Values.services.worker.port }}
- name: COOKIE_DOMAIN
value: {{ .Values.globals.cookieDomain | quote }}
- name: ACCOUNT_PORTAL_URL
value: {{ .Values.globals.accountPortalUrl | quote }}
- name: ACCOUNT_PORTAL_API_KEY
value: {{ .Values.globals.accountPortalApiKey | quote }}
image: budibase/apps
imagePullPolicy: Always
name: bbapps

View File

@ -1,5 +1,5 @@
{
"version": "0.9.151",
"version": "0.9.152-alpha.0",
"npmClient": "yarn",
"packages": [
"packages/*"

View File

@ -1,6 +1,6 @@
{
"name": "@budibase/auth",
"version": "0.9.151",
"version": "0.9.152-alpha.0",
"description": "Authentication middlewares for budibase builder and apps",
"main": "src/index.js",
"author": "Budibase",

View File

@ -1,7 +1,7 @@
{
"name": "@budibase/bbui",
"description": "A UI solution used in the different Budibase projects.",
"version": "0.9.151",
"version": "0.9.152-alpha.0",
"license": "AGPL-3.0",
"svelte": "src/index.js",
"module": "dist/bbui.es.js",
@ -78,7 +78,7 @@
"@spectrum-css/underlay": "^2.0.9",
"@spectrum-css/vars": "^3.0.1",
"dayjs": "^1.10.4",
"svelte-flatpickr": "^3.1.0",
"svelte-flatpickr": "^3.2.3",
"svelte-portal": "^1.0.0"
},
"gitHead": "d1836a898cab3f8ab80ee6d8f42be1a9eed7dcdc"

View File

@ -26,6 +26,7 @@
altFormat: enableTime ? "F j Y, H:i" : "F j, Y",
wrap: true,
appendTo,
disableMobile: "true",
}
const handleChange = event => {

View File

@ -2415,10 +2415,10 @@ supports-color@^7.0.0, supports-color@^7.1.0:
dependencies:
has-flag "^4.0.0"
svelte-flatpickr@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/svelte-flatpickr/-/svelte-flatpickr-3.1.0.tgz#ad83588430dbd55196a1a258b8ba27e7f9c1ee37"
integrity sha512-zKyV+ukeVuJ8CW0Ing3T19VSekc4bPkou/5Riutt1yATrLvSsanNqcgqi7Q5IePvIoOF9GJ5OtHvn1qK9Wx9BQ==
svelte-flatpickr@^3.2.3:
version "3.2.3"
resolved "https://registry.yarnpkg.com/svelte-flatpickr/-/svelte-flatpickr-3.2.3.tgz#db5dd7ad832ef83262b45e09737955ad3d591fc8"
integrity sha512-PNkqK4Napx8nTvCwkaUXdnKo8dISThaxEOK+szTUXcY6H0dQM0TSyuoMaVWY2yX7pM+PN5cpCQCcVe8YvTRFSw==
dependencies:
flatpickr "^4.5.2"

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

View File

@ -30,7 +30,7 @@ Cypress.Commands.add("login", () => {
Cypress.Commands.add("createApp", name => {
cy.visit(`localhost:${Cypress.env("PORT")}/builder`)
cy.wait(500)
cy.contains(/Create (new )?app/).click()
cy.contains(/Start from scratch/).click()
cy.get(".spectrum-Modal")
.within(() => {
cy.get("input").eq(0).type(name).should("have.value", name).blur()

View File

@ -4,7 +4,7 @@
<meta charset='utf8'>
<meta name='viewport' content='width=device-width'>
<title>Budibase</title>
<link rel='icon' href='/src/favicon.ico'>
<link rel='icon' href='/src/favicon.png'>
<link rel="preconnect" href="https://fonts.gstatic.com" />
<link
href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600;700&display=swap"

View File

@ -1,6 +1,6 @@
{
"name": "@budibase/builder",
"version": "0.9.151",
"version": "0.9.152-alpha.0",
"license": "AGPL-3.0",
"private": true,
"scripts": {
@ -65,10 +65,10 @@
}
},
"dependencies": {
"@budibase/bbui": "^0.9.151",
"@budibase/client": "^0.9.151",
"@budibase/bbui": "^0.9.152-alpha.0",
"@budibase/client": "^0.9.152-alpha.0",
"@budibase/colorpicker": "1.1.2",
"@budibase/string-templates": "^0.9.151",
"@budibase/string-templates": "^0.9.152-alpha.0",
"@sentry/browser": "5.19.1",
"@spectrum-css/page": "^3.0.1",
"@spectrum-css/vars": "^3.0.1",

View File

@ -15,7 +15,6 @@ import {
database,
tables,
} from "stores/backend"
import { fetchComponentLibDefinitions } from "../loadComponentLibraries"
import api from "../api"
import { FrontendTypes } from "constants"
@ -25,6 +24,7 @@ import {
findComponentParent,
findClosestMatchingComponent,
findAllMatchingComponents,
findComponent,
} from "../storeUtils"
import { uuid } from "../uuid"
import { removeBindings } from "../dataBinding"
@ -464,6 +464,24 @@ export const getFrontendStore = () => {
if (!asset) {
return
}
// Fetch full definition
component = findComponent(asset.props, component._id)
// Ensure we aren't deleting the screen slot
if (component._component?.endsWith("/screenslot")) {
throw "You can't delete the screen slot"
}
// Ensure we aren't deleting something that contains the screen slot
const screenslot = findComponentType(
component,
"@budibase/standard-components/screenslot"
)
if (screenslot != null) {
throw "You can't delete a component that contains the screen slot"
}
const parent = findComponentParent(asset.props, component._id)
if (parent) {
parent._children = parent._children.filter(

View File

@ -6,7 +6,13 @@
import { Screen } from "builderStore/store/screenTemplates/utils/Screen"
import { FrontendTypes } from "constants"
import ConfirmDialog from "components/common/ConfirmDialog.svelte"
import { ProgressCircle, Layout, Heading, Body } from "@budibase/bbui"
import {
ProgressCircle,
Layout,
Heading,
Body,
notifications,
} from "@budibase/bbui"
import ErrorSVG from "assets/error.svg?raw"
import { findComponent, findComponentPath } from "builderStore/storeUtils"
@ -166,10 +172,15 @@
confirmDeleteDialog.show()
}
const deleteComponent = () => {
store.actions.components.delete({ _id: idToDelete })
const deleteComponent = async () => {
try {
await store.actions.components.delete({ _id: idToDelete })
} catch (error) {
notifications.error(error)
}
idToDelete = null
}
const cancelDeleteComponent = () => {
idToDelete = null
}

View File

@ -84,7 +84,7 @@
</div>
</div>
<div class="setting">
<Label size="L">Primary color</Label>
<Label size="L">Accent color</Label>
<ColorPicker
spectrumTheme={$store.theme}
value={$store.customTheme?.primaryColor || defaultTheme.primaryColor}
@ -92,7 +92,7 @@
/>
</div>
<div class="setting">
<Label size="L">Primary color (hover)</Label>
<Label size="L">Accent color (hover)</Label>
<ColorPicker
spectrumTheme={$store.theme}
value={$store.customTheme?.primaryColorHover ||

View File

@ -3,7 +3,7 @@
import { store, currentAsset } from "builderStore"
import ConfirmDialog from "components/common/ConfirmDialog.svelte"
import { findComponentParent } from "builderStore/storeUtils"
import { ActionMenu, MenuItem, Icon } from "@budibase/bbui"
import { ActionMenu, MenuItem, Icon, notifications } from "@budibase/bbui"
export let component
@ -51,7 +51,11 @@
}
const deleteComponent = async () => {
await store.actions.components.delete(component)
try {
await store.actions.components.delete(component)
} catch (error) {
notifications.error(error)
}
}
const storeComponentForCopy = (cut = false) => {

View File

@ -17,6 +17,7 @@
import { capitalise } from "helpers"
import { goto } from "@roxi/routify"
import { APP_NAME_REGEX } from "constants"
import TemplateList from "./TemplateList.svelte"
export let template
@ -31,12 +32,16 @@
APP_NAME_REGEX,
"App name must be letters, numbers and spaces only"
),
file: template ? mixed().required("Please choose a file to import") : null,
file: template?.fromFile
? mixed().required("Please choose a file to import")
: null,
}
let submitting = false
let valid = false
$: checkValidity($values, validator)
$: showTemplateSelection = !template?.fromFile && !template?.key
onMount(async () => {
await hostingStore.actions.fetchDeployedApps()
@ -73,7 +78,7 @@
submitting = true
// Check a template exists if we are important
if (template && !$values.file) {
if (template?.fromFile && !$values.file) {
$errors.file = "Please choose a file to import"
valid = false
submitting = false
@ -133,33 +138,59 @@
}
</script>
<ModalContent
title={template ? "Import app" : "Create app"}
confirmText={template ? "Import app" : "Create app"}
onConfirm={createNewApp}
disabled={!valid}
>
{#if template}
<Dropzone
error={$touched.file && $errors.file}
gallery={false}
label="File to import"
value={[$values.file]}
on:change={e => {
$values.file = e.detail?.[0]
$touched.file = true
{#if showTemplateSelection}
<ModalContent
title={"Get started quickly"}
showConfirmButton={false}
size="L"
onConfirm={() => {
showTemplateSelection = false
return false
}}
showCancelButton={false}
showCloseIcon={false}
>
<Body size="M">Select a template below, or start from scratch.</Body>
<TemplateList
onSelect={selected => {
if (!selected) {
showTemplateSelection = false
return
}
template = selected
}}
/>
{/if}
<Body size="S">
Give your new app a name, and choose which groups have access (paid plans
only).
</Body>
<Input
bind:value={$values.name}
error={$touched.name && $errors.name}
on:blur={() => ($touched.name = true)}
label="Name"
/>
<Checkbox label="Group access" disabled value={true} text="All users" />
</ModalContent>
</ModalContent>
{:else}
<ModalContent
title={template?.fromFile ? "Import app" : "Create app"}
confirmText={template?.fromFile ? "Import app" : "Create app"}
onConfirm={createNewApp}
disabled={!valid}
>
{#if template?.fromFile}
<Dropzone
error={$touched.file && $errors.file}
gallery={false}
label="File to import"
value={[$values.file]}
on:change={e => {
$values.file = e.detail?.[0]
$touched.file = true
}}
/>
{/if}
<Body size="S">
Give your new app a name, and choose which groups have access (paid plans
only).
</Body>
<Input
bind:value={$values.name}
error={$touched.name && $errors.name}
on:blur={() => ($touched.name = true)}
label="Name"
/>
<Checkbox label="Group access" disabled value={true} text="All users" />
</ModalContent>
{/if}

View File

@ -1,5 +1,5 @@
<script>
import { Button, Heading, Body } from "@budibase/bbui"
import { Heading, Layout, Icon } from "@budibase/bbui"
import Spinner from "components/common/Spinner.svelte"
import api from "builderStore/api"
@ -13,8 +13,7 @@
let templatesPromise = fetchTemplates()
</script>
<div class="root">
<Heading size="M">Start With a Template</Heading>
<Layout gap="XS" noPadding>
{#await templatesPromise}
<div class="spinner-container">
<Spinner size="30" />
@ -22,41 +21,69 @@
{:then templates}
<div class="templates">
{#each templates as template}
<div class="templates-card">
<Heading size="S">{template.name}</Heading>
<Body size="M" grey>{template.category}</Body>
<Body size="S" black>{template.description}</Body>
<div><img alt="template" src={template.image} width="100%" /></div>
<div class="card-footer">
<Button secondary on:click={() => onSelect(template)}>
Create
{template.name}
</Button>
<div class="template" on:click={() => onSelect(template)}>
<div
class="background-icon"
style={`background: ${template.background};`}
>
<Icon name={template.icon} />
</div>
<Heading size="XS">{template.name}</Heading>
<p class="detail">{template?.category?.toUpperCase()}</p>
</div>
{/each}
<div class="template start-from-scratch" on:click={() => onSelect(null)}>
<div class="background-icon" style={`background: var(--background);`}>
<Icon name="Add" />
</div>
<Heading size="XS">Start from scratch</Heading>
<p class="detail">BLANK</p>
</div>
</div>
{:catch err}
<h1 style="color:red">{err}</h1>
{/await}
</div>
</Layout>
<style>
.templates {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
grid-gap: var(--layout-m);
width: 100%;
grid-gap: var(--spacing-m);
grid-template-columns: 1fr;
justify-content: start;
margin-top: 15px;
}
.templates-card {
background-color: var(--background);
padding: var(--spacing-xl);
border-radius: var(--border-radius-m);
border: var(--border-dark);
.background-icon {
padding: 10px;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
width: 18px;
color: white;
}
.card-footer {
margin-top: var(--spacing-m);
.template {
height: 60px;
display: grid;
grid-gap: var(--layout-m);
grid-template-columns: 5% 1fr 15%;
border: 1px solid #494949;
align-items: center;
cursor: pointer;
border-radius: 4px;
background: #1a1a1a;
padding: 8px 16px;
}
.detail {
text-align: right;
}
.start-from-scratch {
background: var(--spectrum-global-color-gray-50);
margin-top: 20px;
}
</style>

View File

@ -25,9 +25,9 @@
title="Self-host Budibase"
confirmText="Self-host Budibase"
>
<span
>Self-host budibase for free to get unlimited apps and more - and it only
takes a few minutes!</span
>
<span>
Self-host budibase for free to get unlimited apps and more - and it only
takes a few minutes!
</span>
</ModalContent>
</Modal>

View File

@ -20,25 +20,29 @@
return
}
// e.g. ['tenant', 'budibase', 'app'] vs ['budibase', 'app']
let urlTenantId
const hostParts = host.split(".")
if (hostParts.length > 2) {
urlTenantId = hostParts[0]
}
// no tenant in the url - send to account portal to fix this
if (!urlTenantId) {
window.location.href = $admin.accountPortalUrl
return
}
if (user && user.tenantId) {
let urlTenantId
const hostParts = host.split(".")
// only run validation when we know we are in a tenant url
// not when we visit the root budibase.app domain
// e.g. ['tenant', 'budibase', 'app'] vs ['budibase', 'app']
if (hostParts.length > 2) {
urlTenantId = hostParts[0]
} else {
// no tenant in the url - send to account portal to fix this
window.location.href = $admin.accountPortalUrl
return
}
if (user.tenantId !== urlTenantId) {
// user should not be here - play it safe and log them out
await auth.logout()
await auth.setOrganisation(null)
return
}
} else {
// no user - set the org according to the url
await auth.setOrganisation(urlTenantId)
}
}

View File

@ -159,8 +159,6 @@
cursor: pointer;
filter: brightness(110%);
}
.group {
}
.app {
display: grid;
grid-template-columns: auto 1fr auto;

View File

@ -8,10 +8,8 @@
ButtonGroup,
Select,
Modal,
ModalContent,
Page,
notifications,
Body,
Search,
} from "@budibase/bbui"
import CreateAppModal from "components/start/CreateAppModal.svelte"
@ -270,22 +268,7 @@
{#if !enrichedApps.length && !creatingApp && loaded}
<div class="empty-wrapper">
<Modal inline>
<ModalContent
title="Create your first app"
confirmText="Create app"
showCancelButton={false}
showCloseIcon={false}
onConfirm={initiateAppCreation}
size="M"
>
<div slot="footer">
<Button on:click={initiateAppImport} secondary>Import app</Button>
</div>
<Body size="S">
The purpose of the Budibase builder is to help you build beautiful,
powerful applications quickly and easily.
</Body>
</ModalContent>
<CreateAppModal {template} />
</Modal>
</div>
{/if}

View File

@ -1,6 +1,6 @@
{
"name": "@budibase/cli",
"version": "0.9.151",
"version": "0.9.152-alpha.0",
"description": "Budibase CLI, for developers, self hosting and migrations.",
"main": "src/index.js",
"bin": {

View File

@ -1,6 +1,6 @@
{
"name": "@budibase/client",
"version": "0.9.151",
"version": "0.9.152-alpha.0",
"license": "MPL-2.0",
"module": "dist/budibase-client.js",
"main": "dist/budibase-client.js",
@ -19,9 +19,9 @@
"dev:builder": "rollup -cw"
},
"dependencies": {
"@budibase/bbui": "^0.9.151",
"@budibase/bbui": "^0.9.152-alpha.0",
"@budibase/standard-components": "^0.9.139",
"@budibase/string-templates": "^0.9.151",
"@budibase/string-templates": "^0.9.152-alpha.0",
"regexparam": "^1.3.0",
"shortid": "^2.2.15",
"svelte-spa-router": "^3.0.5"

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
{
"name": "@budibase/server",
"email": "hi@budibase.com",
"version": "0.9.151",
"version": "0.9.152-alpha.0",
"description": "Budibase Web Server",
"main": "src/index.js",
"repository": {
@ -66,9 +66,9 @@
"author": "Budibase",
"license": "AGPL-3.0-or-later",
"dependencies": {
"@budibase/auth": "^0.9.151",
"@budibase/client": "^0.9.151",
"@budibase/string-templates": "^0.9.151",
"@budibase/auth": "^0.9.152-alpha.0",
"@budibase/client": "^0.9.152-alpha.0",
"@budibase/string-templates": "^0.9.152-alpha.0",
"@elastic/elasticsearch": "7.10.0",
"@koa/router": "8.0.0",
"@sendgrid/mail": "7.1.1",

View File

@ -76,8 +76,9 @@ exports.getTemplateStream = async template => {
if (template.file) {
return fs.createReadStream(template.file.path)
} else {
const tmpPath = await exports.downloadTemplate(...template.key.split("/"))
return fs.createReadStream(join(tmpPath, "db", "dump.txt"))
const [type, name] = template.key.split("/")
const tmpPath = await exports.downloadTemplate(type, name)
return fs.createReadStream(join(tmpPath, name, "db", "dump.txt"))
}
}

View File

@ -22,7 +22,7 @@
"array"
],
"numArgs": 1,
"example": "{{ avg [1,2,3,4,5] }} -> 3",
"example": "{{ avg 1 2 3 4 5 }} -> 3",
"description": "<p>Returns the average of all numbers in the given array.</p>\n"
},
"ceil": {
@ -154,7 +154,7 @@
"value"
],
"numArgs": 1,
"example": "{{ arrayify \"foo\" }} -> [\"foo\"]",
"example": "{{ arrayify 'foo' }} -> ['foo']",
"description": "<p>Cast the given <code>value</code> to an array.</p>\n"
},
"before": {
@ -290,7 +290,7 @@
"prop"
],
"numArgs": 2,
"example": "{{pluck [{ 'name': 'Bob' }] \"name\" }} -> ['Bob']",
"example": "{{pluck [{ 'name': 'Bob' }] 'name' }} -> ['Bob']",
"description": "<p>Map over the given object or array or objects and create an array of values from the given <code>prop</code>. Dot-notation may be used (as a string) to get nested properties.</p>\n"
},
"reverse": {
@ -326,7 +326,7 @@
"props"
],
"numArgs": 2,
"example": "{{ sortBy [{a: 'zzz'}, {a: 'aaa'}] \"a\" }} -> [{\"a\":\"aaa\"}, {\"a\":\"zzz\"}]",
"example": "{{ sortBy [{a: 'zzz'}, {a: 'aaa'}] 'a' }} -> [{'a':'aaa'}, {'a':'zzz'}]",
"description": "<p>Sort an <code>array</code>. If an array of objects is passed, you may optionally pass a <code>key</code> to sort on as the second argument. You may alternatively pass a sorting function as the second argument.</p>\n"
},
"withAfter": {
@ -471,7 +471,7 @@
"precision"
],
"numArgs": 2,
"example": "{{toPrecision \"1.1234\" 2}}",
"example": "{{toPrecision '1.1234' 2}}",
"description": "<p>Returns a string representing the <code>Number</code> object to the specified precision.</p>\n"
}
},
@ -481,7 +481,7 @@
"str"
],
"numArgs": 1,
"example": "{{ encodeURI \"https://myurl?Hello There\" }} -> https://myurl?Hello%20There",
"example": "{{ encodeURI 'https://myurl?Hello There' }} -> https://myurl?Hello%20There",
"description": "<p>Encodes a Uniform Resource Identifier (URI) component by replacing each instance of certain characters by one, two, three, or four escape sequences representing the UTF-8 encoding of the character.</p>\n"
},
"escape": {
@ -489,7 +489,7 @@
"str"
],
"numArgs": 1,
"example": "{{ escape \"https://myurl?Hello+There\" }} -> https://myurl?Hello%20There",
"example": "{{ escape 'https://myurl?Hello+There' }} -> https://myurl?Hello%20There",
"description": "<p>Escape the given string by replacing characters with escape sequences. Useful for allowing the string to be used in a URL, etc.</p>\n"
},
"decodeURI": {
@ -497,7 +497,7 @@
"str"
],
"numArgs": 1,
"example": "{{ escape \"https://myurl?Hello%20There\" }} -> https://myurl?Hello+There",
"example": "{{ escape 'https://myurl?Hello%20There' }} -> https://myurl?Hello+There",
"description": "<p>Decode a Uniform Resource Identifier (URI) component.</p>\n"
},
"url_encode": {
@ -516,7 +516,7 @@
"href"
],
"numArgs": 2,
"example": "{{ urlResolve \"https://myurl\" \"/api/test\" }} -> https://myurl/api/test",
"example": "{{ urlResolve 'https://myurl' '/api/test' }} -> https://myurl/api/test",
"description": "<p>Take a base URL, and a href URL, and resolve them as a browser would for an anchor tag.</p>\n"
},
"urlParse": {
@ -524,7 +524,7 @@
"str"
],
"numArgs": 1,
"example": "{{ urlParse \"https://myurl/api/test\" }}",
"example": "{{ urlParse 'https://myurl/api/test' }}",
"description": "<p>Parses a <code>url</code> string into an object.</p>\n"
},
"stripQuerystring": {
@ -532,7 +532,7 @@
"url"
],
"numArgs": 1,
"example": "{{ stripQueryString \"https://myurl/api/test?foo=bar\" }} -> \"https://myurl/api/test\"",
"example": "{{ stripQueryString 'https://myurl/api/test?foo=bar' }} -> 'https://myurl/api/test'",
"description": "<p>Strip the query string from the given <code>url</code>.</p>\n"
},
"stripProtocol": {
@ -540,7 +540,7 @@
"str"
],
"numArgs": 1,
"example": "{{ stripProtocol \"https://myurl/api/test\" }} -> \"myurl/api/test\"",
"example": "{{ stripProtocol 'https://myurl/api/test' }} -> 'myurl/api/test'",
"description": "<p>Strip protocol from a <code>url</code>. Useful for displaying media that may have an &#39;http&#39; protocol on secure connections.</p>\n"
}
},
@ -551,7 +551,7 @@
"suffix"
],
"numArgs": 2,
"example": "{{append \"index\" \".html\"}} -> index.html",
"example": "{{append 'index' '.html'}} -> index.html",
"description": "<p>Append the specified <code>suffix</code> to the given string.</p>\n"
},
"camelcase": {
@ -559,7 +559,7 @@
"string"
],
"numArgs": 1,
"example": "{{camelcase \"foo bar baz\"}} -> fooBarBaz",
"example": "{{camelcase 'foo bar baz'}} -> fooBarBaz",
"description": "<p>camelCase the characters in the given <code>string</code>.</p>\n"
},
"capitalize": {
@ -567,7 +567,7 @@
"str"
],
"numArgs": 1,
"example": "{{capitalize \"foo bar baz\"}} -> Foo bar baz",
"example": "{{capitalize 'foo bar baz'}} -> Foo bar baz",
"description": "<p>Capitalize the first word in a sentence.</p>\n"
},
"capitalizeAll": {
@ -575,7 +575,7 @@
"str"
],
"numArgs": 1,
"example": "{{ capitalizeAll \"foo bar baz\"}} -> Foo Bar Baz",
"example": "{{ capitalizeAll 'foo bar baz'}} -> Foo Bar Baz",
"description": "<p>Capitalize all words in a string.</p>\n"
},
"center": {
@ -584,7 +584,7 @@
"spaces"
],
"numArgs": 2,
"example": "{{ center \"test\" 1}} -> \" test \"",
"example": "{{ center 'test' 1}} -> ' test '",
"description": "<p>Center a string using non-breaking spaces</p>\n"
},
"chop": {
@ -592,7 +592,7 @@
"string"
],
"numArgs": 1,
"example": "{{ chop \" ABC \"}} -> \"ABC\"",
"example": "{{ chop ' ABC '}} -> 'ABC'",
"description": "<p>Like trim, but removes both extraneous whitespace <strong>and non-word characters</strong> from the beginning and end of a string.</p>\n"
},
"dashcase": {
@ -600,7 +600,7 @@
"string"
],
"numArgs": 1,
"example": "{{dashcase \"a-b-c d_e\"}} -> a-b-c-d-e",
"example": "{{dashcase 'a-b-c d_e'}} -> a-b-c-d-e",
"description": "<p>dash-case the characters in <code>string</code>. Replaces non-word characters and periods with hyphens.</p>\n"
},
"dotcase": {
@ -608,7 +608,7 @@
"string"
],
"numArgs": 1,
"example": "{{dotcase \"a-b-c d_e\"}} -> a.b.c.d.e",
"example": "{{dotcase 'a-b-c d_e'}} -> a.b.c.d.e",
"description": "<p>dot.case the characters in <code>string</code>.</p>\n"
},
"downcase": {
@ -616,7 +616,7 @@
"string"
],
"numArgs": 1,
"example": "{{downcase \"aBcDeF\"}} -> abcdef",
"example": "{{downcase 'aBcDeF'}} -> abcdef",
"description": "<p>Lowercase all of the characters in the given string. Alias for <a href=\"#lowercase\">lowercase</a>.</p>\n"
},
"ellipsis": {
@ -625,7 +625,7 @@
"length"
],
"numArgs": 2,
"example": "{{ellipsis \"foo bar baz\", 7}} -> foo bar…",
"example": "{{ellipsis 'foo bar baz', 7}} -> foo bar…",
"description": "<p>Truncates a string to the specified <code>length</code>, and appends it with an elipsis, <code>…</code>.</p>\n"
},
"hyphenate": {
@ -633,7 +633,7 @@
"str"
],
"numArgs": 1,
"example": "{{hyphenate \"foo bar baz qux\"}} -> foo-bar-baz-qux",
"example": "{{hyphenate 'foo bar baz qux'}} -> foo-bar-baz-qux",
"description": "<p>Replace spaces in a string with hyphens.</p>\n"
},
"isString": {
@ -641,7 +641,7 @@
"value"
],
"numArgs": 1,
"example": "{{isString \"foo\"}} -> true",
"example": "{{isString 'foo'}} -> true",
"description": "<p>Return true if <code>value</code> is a string.</p>\n"
},
"lowercase": {
@ -649,7 +649,7 @@
"str"
],
"numArgs": 1,
"example": "{{lowercase \"Foo BAR baZ\"}} -> foo bar baz",
"example": "{{lowercase 'Foo BAR baZ'}} -> foo bar baz",
"description": "<p>Lowercase all characters in the given string.</p>\n"
},
"occurrences": {
@ -658,7 +658,7 @@
"substring"
],
"numArgs": 2,
"example": "{{occurrences \"foo bar foo bar baz\" \"foo\"}} -> 2",
"example": "{{occurrences 'foo bar foo bar baz' 'foo'}} -> 2",
"description": "<p>Return the number of occurrences of <code>substring</code> within the given <code>string</code>.</p>\n"
},
"pascalcase": {
@ -666,7 +666,7 @@
"string"
],
"numArgs": 1,
"example": "{{pascalcase \"foo bar baz\"}} -> FooBarBaz",
"example": "{{pascalcase 'foo bar baz'}} -> FooBarBaz",
"description": "<p>PascalCase the characters in <code>string</code>.</p>\n"
},
"pathcase": {
@ -674,7 +674,7 @@
"string"
],
"numArgs": 1,
"example": "{{pathcase \"a-b-c d_e\"}} -> a/b/c/d/e",
"example": "{{pathcase 'a-b-c d_e'}} -> a/b/c/d/e",
"description": "<p>path/case the characters in <code>string</code>.</p>\n"
},
"plusify": {
@ -682,7 +682,7 @@
"str"
],
"numArgs": 1,
"example": "{{plusify \"foo bar baz\"}} -> foo+bar+baz",
"example": "{{plusify 'foo bar baz'}} -> foo+bar+baz",
"description": "<p>Replace spaces in the given string with pluses.</p>\n"
},
"prepend": {
@ -691,7 +691,7 @@
"prefix"
],
"numArgs": 2,
"example": "{{prepend \"bar\" \"foo-\"}} -> foo-bar",
"example": "{{prepend 'bar' 'foo-'}} -> foo-bar",
"description": "<p>Prepends the given <code>string</code> with the specified <code>prefix</code>.</p>\n"
},
"raw": {
@ -708,7 +708,7 @@
"substring"
],
"numArgs": 2,
"example": "{{remove \"a b a b a b\" \"a \"}} -> b b b",
"example": "{{remove 'a b a b a b' 'a '}} -> b b b",
"description": "<p>Remove all occurrences of <code>substring</code> from the given <code>str</code>.</p>\n"
},
"removeFirst": {
@ -717,7 +717,7 @@
"substring"
],
"numArgs": 2,
"example": "{{remove \"a b a b a b\" \"a\"}} -> b a b a b",
"example": "{{remove 'a b a b a b' 'a'}} -> b a b a b",
"description": "<p>Remove the first occurrence of <code>substring</code> from the given <code>str</code>.</p>\n"
},
"replace": {
@ -727,7 +727,7 @@
"b"
],
"numArgs": 3,
"example": "{{replace \"a b a b a b\" \"a\" \"z\"}} -> z b z b z b",
"example": "{{replace 'a b a b a b' 'a' 'z'}} -> z b z b z b",
"description": "<p>Replace all occurrences of substring <code>a</code> with substring <code>b</code>.</p>\n"
},
"replaceFirst": {
@ -737,7 +737,7 @@
"b"
],
"numArgs": 3,
"example": "{{replace \"a b a b a b\" \"a\" \"z\"}} -> z b a b a b",
"example": "{{replace 'a b a b a b' 'a' 'z'}} -> z b a b a b",
"description": "<p>Replace the first occurrence of substring <code>a</code> with substring <code>b</code>.</p>\n"
},
"sentence": {
@ -745,7 +745,7 @@
"str"
],
"numArgs": 1,
"example": "{{sentence \"hello world. goodbye world.\"}} -> Hello world. Goodbye world.",
"example": "{{sentence 'hello world. goodbye world.'}} -> Hello world. Goodbye world.",
"description": "<p>Sentence case the given string</p>\n"
},
"snakecase": {
@ -753,7 +753,7 @@
"string"
],
"numArgs": 1,
"example": "{{snakecase \"a-b-c d_e\"}} -> a_b_c_d_e",
"example": "{{snakecase 'a-b-c d_e'}} -> a_b_c_d_e",
"description": "<p>snake_case the characters in the given <code>string</code>.</p>\n"
},
"split": {
@ -761,7 +761,7 @@
"string"
],
"numArgs": 1,
"example": "{{split \"a,b,c\"}} -> ['a', 'b', 'c']",
"example": "{{split 'a,b,c'}} -> ['a', 'b', 'c']",
"description": "<p>Split <code>string</code> by the given <code>character</code>.</p>\n"
},
"startsWith": {
@ -771,7 +771,7 @@
"options"
],
"numArgs": 3,
"example": "{{#startsWith \"Goodbye\" \"Hello, world!\"}} Yep {{else}} Nope {{/startsWith}} -> Nope",
"example": "{{#startsWith 'Goodbye' 'Hello, world!'}} Yep {{else}} Nope {{/startsWith}} -> Nope",
"description": "<p>Tests whether a string begins with the given prefix.</p>\n"
},
"titleize": {
@ -779,7 +779,7 @@
"str"
],
"numArgs": 1,
"example": "{{#titleize \"this is title case\" }} -> This Is Title Case",
"example": "{{#titleize 'this is title case' }} -> This Is Title Case",
"description": "<p>Title case the given string.</p>\n"
},
"trim": {
@ -787,7 +787,7 @@
"string"
],
"numArgs": 1,
"example": "{{trim \" ABC \" }} -> ABC",
"example": "{{trim ' ABC ' }} -> ABC",
"description": "<p>Removes extraneous whitespace from the beginning and end of a string.</p>\n"
},
"trimLeft": {
@ -795,7 +795,7 @@
"string"
],
"numArgs": 1,
"example": "{{trimLeft \" ABC \" }} -> \"ABC \"",
"example": "{{trimLeft ' ABC ' }} -> 'ABC '",
"description": "<p>Removes extraneous whitespace from the beginning of a string.</p>\n"
},
"trimRight": {
@ -803,7 +803,7 @@
"string"
],
"numArgs": 1,
"example": "{{trimRight \" ABC \" }} -> \" ABC \"",
"example": "{{trimRight ' ABC ' }} -> ' ABC '",
"description": "<p>Removes extraneous whitespace from the end of a string.</p>\n"
},
"truncate": {
@ -813,7 +813,7 @@
"suffix"
],
"numArgs": 3,
"example": "{{truncate \"foo bar baz\" 7 }} -> foo bar",
"example": "{{truncate 'foo bar baz' 7 }} -> foo bar",
"description": "<p>Truncate a string to the specified <code>length</code>. Also see <a href=\"#ellipsis\">ellipsis</a>.</p>\n"
},
"truncateWords": {
@ -823,7 +823,7 @@
"suffix"
],
"numArgs": 3,
"example": "{{truncateWords \"foo bar baz\" 1 }} -> foo",
"example": "{{truncateWords 'foo bar baz' 1 }} -> foo",
"description": "<p>Truncate a string to have the specified number of words. Also see <a href=\"#truncate\">truncate</a>.</p>\n"
},
"upcase": {
@ -831,7 +831,7 @@
"string"
],
"numArgs": 1,
"example": "{{upcase \"aBcDef\"}} -> ABCDEF",
"example": "{{upcase 'aBcDef'}} -> ABCDEF",
"description": "<p>Uppercase all of the characters in the given string. Alias for <a href=\"#uppercase\">uppercase</a>.</p>\n"
},
"uppercase": {
@ -840,7 +840,7 @@
"options"
],
"numArgs": 2,
"example": "{{uppercase \"aBcDef\"}} -> ABCDEF",
"example": "{{uppercase 'aBcDef'}} -> ABCDEF",
"description": "<p>Uppercase all of the characters in the given string. If used as a block helper it will uppercase the entire block. This helper does not support inverse blocks.</p>\n"
}
},
@ -863,7 +863,7 @@
"options"
],
"numArgs": 4,
"example": "{{compare 10 \"<\" 5 }} -> true",
"example": "{{compare 10 '<' 5 }} -> true",
"description": "<p>Render a block when a comparison of the first and third arguments returns true. The second argument is the [arithemetic operator][operators] to use. You may also optionally specify an inverse block to render when falsy.</p>\n"
},
"contains": {
@ -874,7 +874,7 @@
"options"
],
"numArgs": 4,
"example": "{{#contains ['a', 'b', 'c'] \"d\"}} This will not be rendered. {{else}} This will be rendered. {{/contains}}",
"example": "{{#contains ['a', 'b', 'c'] 'd'}} This will not be rendered. {{else}} This will be rendered. {{/contains}}",
"description": "<p>Block helper that renders the block if <code>collection</code> has the given <code>value</code>, using strict equality (<code>===</code>) for comparison, otherwise the inverse block is rendered (if specified). If a <code>startIndex</code> is specified and is negative, it is used as the offset from the end of the collection.</p>\n"
},
"default": {
@ -883,8 +883,8 @@
"defaultValue"
],
"numArgs": 2,
"example": "{{default null null \"default\"}} -> default",
"description": "<p>Returns the first value that is not undefined, otherwise the &quot;default&quot; value is returned.</p>\n"
"example": "{{default null null 'default'}} -> default",
"description": "<p>Returns the first value that is not undefined, otherwise the &#39;default&#39; value is returned.</p>\n"
},
"eq": {
"args": [
@ -894,7 +894,7 @@
],
"numArgs": 3,
"example": "{{#eq 3 3}} equal{{else}} not equal{{/eq}} -> equal",
"description": "<p>Block helper that renders a block if <code>a</code> is <strong>equal to</strong> <code>b</code>. If an inverse block is specified it will be rendered when falsy. You may optionally use the <code>compare=&quot;&quot;</code> hash argument for the second value.</p>\n"
"description": "<p>Block helper that renders a block if <code>a</code> is <strong>equal to</strong> <code>b</code>. If an inverse block is specified it will be rendered when falsy. You may optionally use the <code>compare=&#39;&#39;</code> hash argument for the second value.</p>\n"
},
"gt": {
"args": [
@ -904,7 +904,7 @@
],
"numArgs": 3,
"example": "{{#gt 4 3}} greater than{{else}} not greater than{{/gt}} -> greater than",
"description": "<p>Block helper that renders a block if <code>a</code> is <strong>greater than</strong> <code>b</code>. If an inverse block is specified it will be rendered when falsy. You may optionally use the <code>compare=&quot;&quot;</code> hash argument for the second value.</p>\n"
"description": "<p>Block helper that renders a block if <code>a</code> is <strong>greater than</strong> <code>b</code>. If an inverse block is specified it will be rendered when falsy. You may optionally use the <code>compare=&#39;&#39;</code> hash argument for the second value.</p>\n"
},
"gte": {
"args": [
@ -914,7 +914,7 @@
],
"numArgs": 3,
"example": "{{#gte 4 3}} greater than or equal{{else}} not greater than{{/gte}} -> greater than or equal",
"description": "<p>Block helper that renders a block if <code>a</code> is <strong>greater than or equal to</strong> <code>b</code>. If an inverse block is specified it will be rendered when falsy. You may optionally use the <code>compare=&quot;&quot;</code> hash argument for the second value.</p>\n"
"description": "<p>Block helper that renders a block if <code>a</code> is <strong>greater than or equal to</strong> <code>b</code>. If an inverse block is specified it will be rendered when falsy. You may optionally use the <code>compare=&#39;&#39;</code> hash argument for the second value.</p>\n"
},
"has": {
"args": [
@ -923,7 +923,7 @@
"options"
],
"numArgs": 3,
"example": "{{#has \"foobar\" \"foo\"}} has it{{else}} doesn't{{/has}} -> has it",
"example": "{{#has 'foobar' 'foo'}} has it{{else}} doesn't{{/has}} -> has it",
"description": "<p>Block helper that renders a block if <code>value</code> has <code>pattern</code>. If an inverse block is specified it will be rendered when falsy.</p>\n"
},
"isFalsey": {
@ -932,7 +932,7 @@
"options"
],
"numArgs": 2,
"example": "{{isFalsey \"\" }} -> true",
"example": "{{isFalsey '' }} -> true",
"description": "<p>Returns true if the given <code>value</code> is falsey. Uses the [falsey][] library for comparisons. Please see that library for more information or to report bugs with this helper.</p>\n"
},
"isTruthy": {
@ -941,7 +941,7 @@
"options"
],
"numArgs": 2,
"example": "{{isTruthy \"12\" }} -> true",
"example": "{{isTruthy '12' }} -> true",
"description": "<p>Returns true if the given <code>value</code> is truthy. Uses the [falsey][] library for comparisons. Please see that library for more information or to report bugs with this helper.</p>\n"
},
"ifEven": {
@ -999,7 +999,7 @@
],
"numArgs": 2,
"example": "{{#lt 2 3}} less than {{else}} more than or equal {{/lt}} -> less than",
"description": "<p>Block helper that renders a block if <code>a</code> is <strong>less than</strong> <code>b</code>. If an inverse block is specified it will be rendered when falsy. You may optionally use the <code>compare=&quot;&quot;</code> hash argument for the second value.</p>\n"
"description": "<p>Block helper that renders a block if <code>a</code> is <strong>less than</strong> <code>b</code>. If an inverse block is specified it will be rendered when falsy. You may optionally use the <code>compare=&#39;&#39;</code> hash argument for the second value.</p>\n"
},
"lte": {
"args": [
@ -1009,7 +1009,7 @@
],
"numArgs": 3,
"example": "{{#lte 2 3}} less than or equal {{else}} more than {{/lte}} -> less than or equal",
"description": "<p>Block helper that renders a block if <code>a</code> is <strong>less than or equal to</strong> <code>b</code>. If an inverse block is specified it will be rendered when falsy. You may optionally use the <code>compare=&quot;&quot;</code> hash argument for the second value.</p>\n"
"description": "<p>Block helper that renders a block if <code>a</code> is <strong>less than or equal to</strong> <code>b</code>. If an inverse block is specified it will be rendered when falsy. You may optionally use the <code>compare=&#39;&#39;</code> hash argument for the second value.</p>\n"
},
"neither": {
"args": [

View File

@ -1,6 +1,6 @@
{
"name": "@budibase/string-templates",
"version": "0.9.151",
"version": "0.9.152-alpha.0",
"description": "Handlebars wrapper for Budibase templating.",
"main": "src/index.cjs",
"module": "dist/bundle.mjs",
@ -20,7 +20,7 @@
"manifest": "node ./scripts/gen-collection-info.js"
},
"dependencies": {
"@budibase/handlebars-helpers": "^0.11.4",
"@budibase/handlebars-helpers": "^0.11.6",
"dayjs": "^1.10.4",
"handlebars": "^4.7.6",
"handlebars-utils": "^1.0.6",

View File

@ -270,35 +270,31 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
"@budibase/handlebars-helpers@^0.11.4":
version "0.11.4"
resolved "https://registry.yarnpkg.com/@budibase/handlebars-helpers/-/handlebars-helpers-0.11.4.tgz#8acfa2ee84134f7be4b2906e710fce6d25c5d000"
integrity sha512-AJNJYlJnxZmn9QJ8tBl8nrm4YxbwHP4AR0pbiVGK+EoOylkNBlUnZ/QDL1VyqM5fTkAE/Z2IZVLKrrG3kxuWLA==
"@budibase/handlebars-helpers@^0.11.6":
version "0.11.6"
resolved "https://registry.yarnpkg.com/@budibase/handlebars-helpers/-/handlebars-helpers-0.11.6.tgz#00e924a0142aac41c07e3d104607759635eec952"
integrity sha512-FLtCWkh0cNHC0/X6Pt5Xjmp4/r4tCpv5f5sP1JcZsaSKPyE5gpNu/+fqUxgDTzVS3PVo0KE6hdRPKVWvVqwPEw==
dependencies:
arr-flatten "^1.1.0"
array-sort "^0.1.4"
define-property "^1.0.0"
array-sort "^1.0.0"
define-property "^2.0.2"
extend-shallow "^3.0.2"
"falsey" "^0.3.2"
"falsey" "^1.0.0"
for-in "^1.0.2"
for-own "^1.0.0"
get-object "^0.2.0"
get-value "^2.0.6"
handlebars "^4.0.11"
get-value "^3.0.1"
handlebars "^4.7.7"
handlebars-utils "^1.0.6"
has-value "^1.0.0"
has-value "^2.0.2"
helper-date "^1.0.1"
helper-markdown "^1.0.0"
helper-md "^0.2.2"
html-tag "^2.0.0"
is-even "^1.0.0"
is-glob "^4.0.0"
is-number "^4.0.0"
kind-of "^6.0.0"
logging-helpers "^1.0.0"
micromatch "^3.1.4"
is-glob "^4.0.1"
kind-of "^6.0.3"
micromatch "^3.1.5"
relative "^3.0.2"
striptags "^3.1.0"
striptags "^3.1.1"
to-gfm-code-block "^0.1.1"
year "^0.2.1"
@ -693,130 +689,6 @@ ajv@^6.12.3:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
ansi-bgblack@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz#a68ba5007887701b6aafbe3fa0dadfdfa8ee3ca2"
integrity sha1-poulAHiHcBtqr74/oNrf36juPKI=
dependencies:
ansi-wrap "0.1.0"
ansi-bgblue@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-bgblue/-/ansi-bgblue-0.1.1.tgz#67bdc04edc9b9b5278969da196dea3d75c8c3613"
integrity sha1-Z73ATtybm1J4lp2hlt6j11yMNhM=
dependencies:
ansi-wrap "0.1.0"
ansi-bgcyan@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-bgcyan/-/ansi-bgcyan-0.1.1.tgz#58489425600bde9f5507068dd969ebfdb50fe768"
integrity sha1-WEiUJWAL3p9VBwaN2Wnr/bUP52g=
dependencies:
ansi-wrap "0.1.0"
ansi-bggreen@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-bggreen/-/ansi-bggreen-0.1.1.tgz#4e3191248529943f4321e96bf131d1c13816af49"
integrity sha1-TjGRJIUplD9DIelr8THRwTgWr0k=
dependencies:
ansi-wrap "0.1.0"
ansi-bgmagenta@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-bgmagenta/-/ansi-bgmagenta-0.1.1.tgz#9b28432c076eaa999418672a3efbe19391c2c7a1"
integrity sha1-myhDLAduqpmUGGcqPvvhk5HCx6E=
dependencies:
ansi-wrap "0.1.0"
ansi-bgred@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-bgred/-/ansi-bgred-0.1.1.tgz#a76f92838382ba43290a6c1778424f984d6f1041"
integrity sha1-p2+Sg4OCukMpCmwXeEJPmE1vEEE=
dependencies:
ansi-wrap "0.1.0"
ansi-bgwhite@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-bgwhite/-/ansi-bgwhite-0.1.1.tgz#6504651377a58a6ececd0331994e480258e11ba8"
integrity sha1-ZQRlE3elim7OzQMxmU5IAljhG6g=
dependencies:
ansi-wrap "0.1.0"
ansi-bgyellow@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-bgyellow/-/ansi-bgyellow-0.1.1.tgz#c3fe2eb08cd476648029e6874d15a0b38f61d44f"
integrity sha1-w/4usIzUdmSAKeaHTRWgs49h1E8=
dependencies:
ansi-wrap "0.1.0"
ansi-black@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-black/-/ansi-black-0.1.1.tgz#f6185e889360b2545a1ec50c0bf063fc43032453"
integrity sha1-9hheiJNgslRaHsUMC/Bj/EMDJFM=
dependencies:
ansi-wrap "0.1.0"
ansi-blue@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-blue/-/ansi-blue-0.1.1.tgz#15b804990e92fc9ca8c5476ce8f699777c21edbf"
integrity sha1-FbgEmQ6S/JyoxUds6PaZd3wh7b8=
dependencies:
ansi-wrap "0.1.0"
ansi-bold@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-bold/-/ansi-bold-0.1.1.tgz#3e63950af5acc2ae2e670e6f67deb115d1a5f505"
integrity sha1-PmOVCvWswq4uZw5vZ96xFdGl9QU=
dependencies:
ansi-wrap "0.1.0"
ansi-colors@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-0.2.0.tgz#72c31de2a0d9a2ccd0cac30cc9823eeb2f6434b5"
integrity sha1-csMd4qDZoszQysMMyYI+6y9kNLU=
dependencies:
ansi-bgblack "^0.1.1"
ansi-bgblue "^0.1.1"
ansi-bgcyan "^0.1.1"
ansi-bggreen "^0.1.1"
ansi-bgmagenta "^0.1.1"
ansi-bgred "^0.1.1"
ansi-bgwhite "^0.1.1"
ansi-bgyellow "^0.1.1"
ansi-black "^0.1.1"
ansi-blue "^0.1.1"
ansi-bold "^0.1.1"
ansi-cyan "^0.1.1"
ansi-dim "^0.1.1"
ansi-gray "^0.1.1"
ansi-green "^0.1.1"
ansi-grey "^0.1.1"
ansi-hidden "^0.1.1"
ansi-inverse "^0.1.1"
ansi-italic "^0.1.1"
ansi-magenta "^0.1.1"
ansi-red "^0.1.1"
ansi-reset "^0.1.1"
ansi-strikethrough "^0.1.1"
ansi-underline "^0.1.1"
ansi-white "^0.1.1"
ansi-yellow "^0.1.1"
lazy-cache "^2.0.1"
ansi-cyan@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873"
integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=
dependencies:
ansi-wrap "0.1.0"
ansi-dim@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-dim/-/ansi-dim-0.1.1.tgz#40de4c603aa8086d8e7a86b8ff998d5c36eefd6c"
integrity sha1-QN5MYDqoCG2Oeoa4/5mNXDbu/Ww=
dependencies:
ansi-wrap "0.1.0"
ansi-escapes@^4.2.1:
version "4.3.1"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61"
@ -824,81 +696,11 @@ ansi-escapes@^4.2.1:
dependencies:
type-fest "^0.11.0"
ansi-gray@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251"
integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE=
dependencies:
ansi-wrap "0.1.0"
ansi-green@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-green/-/ansi-green-0.1.1.tgz#8a5d9a979e458d57c40e33580b37390b8e10d0f7"
integrity sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=
dependencies:
ansi-wrap "0.1.0"
ansi-grey@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-grey/-/ansi-grey-0.1.1.tgz#59d98b6ac2ba19f8a51798e9853fba78339a33c1"
integrity sha1-WdmLasK6GfilF5jphT+6eDOaM8E=
dependencies:
ansi-wrap "0.1.0"
ansi-hidden@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-hidden/-/ansi-hidden-0.1.1.tgz#ed6a4c498d2bb7cbb289dbf2a8d1dcc8567fae0f"
integrity sha1-7WpMSY0rt8uyidvyqNHcyFZ/rg8=
dependencies:
ansi-wrap "0.1.0"
ansi-inverse@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-inverse/-/ansi-inverse-0.1.1.tgz#b6af45826fe826bfb528a6c79885794355ccd269"
integrity sha1-tq9Fgm/oJr+1KKbHmIV5Q1XM0mk=
dependencies:
ansi-wrap "0.1.0"
ansi-italic@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-italic/-/ansi-italic-0.1.1.tgz#104743463f625c142a036739cf85eda688986f23"
integrity sha1-EEdDRj9iXBQqA2c5z4XtpoiYbyM=
dependencies:
ansi-wrap "0.1.0"
ansi-magenta@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-magenta/-/ansi-magenta-0.1.1.tgz#063b5ba16fb3f23e1cfda2b07c0a89de11e430ae"
integrity sha1-BjtboW+z8j4c/aKwfAqJ3hHkMK4=
dependencies:
ansi-wrap "0.1.0"
ansi-red@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c"
integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=
dependencies:
ansi-wrap "0.1.0"
ansi-regex@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
ansi-reset@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-reset/-/ansi-reset-0.1.1.tgz#e7e71292c3c7ddcd4d62ef4a6c7c05980911c3b7"
integrity sha1-5+cSksPH3c1NYu9KbHwFmAkRw7c=
dependencies:
ansi-wrap "0.1.0"
ansi-strikethrough@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-strikethrough/-/ansi-strikethrough-0.1.1.tgz#d84877140b2cff07d1c93ebce69904f68885e568"
integrity sha1-2Eh3FAss/wfRyT685pkE9oiF5Wg=
dependencies:
ansi-wrap "0.1.0"
ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
@ -913,32 +715,6 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
dependencies:
color-convert "^2.0.1"
ansi-underline@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-underline/-/ansi-underline-0.1.1.tgz#dfc920f4c97b5977ea162df8ffb988308aaa71a4"
integrity sha1-38kg9Ml7WXfqFi34/7mIMIqqcaQ=
dependencies:
ansi-wrap "0.1.0"
ansi-white@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-white/-/ansi-white-0.1.1.tgz#9c77b7c193c5ee992e6011d36ec4c921b4578944"
integrity sha1-nHe3wZPF7pkuYBHTbsTJIbRXiUQ=
dependencies:
ansi-wrap "0.1.0"
ansi-wrap@0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768=
ansi-yellow@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-yellow/-/ansi-yellow-0.1.1.tgz#cb9356f2f46c732f0e3199e6102955a77da83c1d"
integrity sha1-y5NW8vRscy8OMZnmEClVp32oPB0=
dependencies:
ansi-wrap "0.1.0"
anymatch@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
@ -977,10 +753,10 @@ arr-union@^3.1.0:
resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
array-sort@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-0.1.4.tgz#662855eaeb671b4188df4451b2f24a0753992b23"
integrity sha512-BNcM+RXxndPxiZ2rd76k6nyQLRZr2/B/sdi8pQ+Joafr5AH279L40dfokSUTp8O+AaqYjXWhblBWa2st2nc4fQ==
array-sort@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a"
integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==
dependencies:
default-compare "^1.0.0"
get-value "^2.0.6"
@ -1786,11 +1562,6 @@ error-ex@^1.3.1:
dependencies:
is-arrayish "^0.2.1"
error-symbol@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/error-symbol/-/error-symbol-0.1.0.tgz#0a4dae37d600d15a29ba453d8ef920f1844333f6"
integrity sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y=
escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
@ -1963,12 +1734,10 @@ extsprintf@^1.2.0:
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
"falsey@^0.3.2":
version "0.3.2"
resolved "https://registry.yarnpkg.com/falsey/-/falsey-0.3.2.tgz#b21c90c5c34660fc192bf909575db95b6880d597"
integrity sha512-lxEuefF5MBIVDmE6XeqCdM4BWk1+vYmGZtkbKZ/VFcg6uBBw6fXNEbWmxCjDdQlFc9hy450nkiWwM3VAW6G1qg==
dependencies:
kind-of "^5.0.2"
"falsey@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/falsey/-/falsey-1.0.0.tgz#71bdd775c24edad9f2f5c015ce8be24400bb5d7d"
integrity sha512-zMDNZ/Ipd8MY0+346CPvhzP1AsiVyNfTOayJza4reAIWf72xbkuFUDcJNxSAsQE1b9Bu0wijKb8Ngnh/a7fI5w==
fast-deep-equal@^3.1.1:
version "3.1.3"
@ -2017,18 +1786,11 @@ find-up@^4.0.0, find-up@^4.1.0:
locate-path "^5.0.0"
path-exists "^4.0.0"
for-in@^1.0.1, for-in@^1.0.2:
for-in@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
for-own@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=
dependencies:
for-in "^1.0.1"
foreach@~2.0.1:
version "2.0.5"
resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
@ -2129,6 +1891,13 @@ get-value@^2.0.3, get-value@^2.0.6:
resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
get-value@^3.0.0, get-value@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/get-value/-/get-value-3.0.1.tgz#5efd2a157f1d6a516d7524e124ac52d0a39ef5a8"
integrity sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==
dependencies:
isobject "^3.0.1"
getpass@^0.1.1:
version "0.1.7"
resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
@ -2180,7 +1949,7 @@ handlebars-utils@^1.0.2, handlebars-utils@^1.0.4, handlebars-utils@^1.0.6:
kind-of "^6.0.0"
typeof-article "^0.1.1"
handlebars@^4.0.11, handlebars@^4.7.6:
handlebars@^4.7.6, handlebars@^4.7.7:
version "4.7.7"
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1"
integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==
@ -2233,6 +2002,14 @@ has-value@^1.0.0:
has-values "^1.0.0"
isobject "^3.0.0"
has-value@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/has-value/-/has-value-2.0.2.tgz#d0f12e8780ba8e90e66ad1a21c707fdb67c25658"
integrity sha512-ybKOlcRsK2MqrM3Hmz/lQxXHZ6ejzSPzpNabKB45jb5qDgJvKPa3SdapTsTLwEb9WltgWpOmNax7i+DzNOk4TA==
dependencies:
get-value "^3.0.0"
has-values "^2.0.1"
has-values@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
@ -2246,6 +2023,13 @@ has-values@^1.0.0:
is-number "^3.0.0"
kind-of "^4.0.0"
has-values@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/has-values/-/has-values-2.0.1.tgz#3876200ff86d8a8546a9264a952c17d5fc17579d"
integrity sha512-+QdH3jOmq9P8GfdjFg0eJudqx1FqU62NQJ4P16rOEHeRdl7ckgwn6uqQjzYE0ZoHVV/e5E2esuJ5Gl5+HUW19w==
dependencies:
kind-of "^6.0.2"
has@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
@ -2389,11 +2173,6 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
info-symbol@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/info-symbol/-/info-symbol-0.1.0.tgz#27841d72867ddb4242cd612d79c10633881c6a78"
integrity sha1-J4QdcoZ920JCzWEtecEGM4gcang=
inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
@ -2513,10 +2292,10 @@ is-generator-fn@^2.0.0:
resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
is-glob@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
is-glob@^4.0.1:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
dependencies:
is-extglob "^2.1.1"
@ -2539,11 +2318,6 @@ is-number@^3.0.0:
dependencies:
kind-of "^3.0.2"
is-number@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
@ -3186,7 +2960,7 @@ kind-of@^5.0.0, kind-of@^5.0.2:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
kind-of@^6.0.0, kind-of@^6.0.2:
kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
@ -3196,13 +2970,6 @@ kleur@^3.0.3:
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
lazy-cache@^2.0.1:
version "2.0.2"
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264"
integrity sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=
dependencies:
set-getter "^0.1.0"
level-blobs@^0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/level-blobs/-/level-blobs-0.1.7.tgz#9ab9b97bb99f1edbf9f78a3433e21ed56386bdaf"
@ -3343,35 +3110,6 @@ lodash@^4.17.19, lodash@^4.17.20:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
log-ok@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/log-ok/-/log-ok-0.1.1.tgz#bea3dd36acd0b8a7240d78736b5b97c65444a334"
integrity sha1-vqPdNqzQuKckDXhza1uXxlREozQ=
dependencies:
ansi-green "^0.1.1"
success-symbol "^0.1.0"
log-utils@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/log-utils/-/log-utils-0.2.1.tgz#a4c217a0dd9a50515d9b920206091ab3d4e031cf"
integrity sha1-pMIXoN2aUFFdm5ICBgkas9TgMc8=
dependencies:
ansi-colors "^0.2.0"
error-symbol "^0.1.0"
info-symbol "^0.1.0"
log-ok "^0.1.1"
success-symbol "^0.1.0"
time-stamp "^1.0.1"
warning-symbol "^0.1.0"
logging-helpers@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/logging-helpers/-/logging-helpers-1.0.0.tgz#b5a37b32ad53eb0137c58c7898a47b175ddb7c36"
integrity sha512-qyIh2goLt1sOgQQrrIWuwkRjUx4NUcEqEGAcYqD8VOnOC6ItwkrVE8/tA4smGpjzyp4Svhc6RodDp9IO5ghpyA==
dependencies:
isobject "^3.0.0"
log-utils "^0.2.1"
lru-cache@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
@ -3443,7 +3181,7 @@ merge-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
micromatch@^3.1.4:
micromatch@^3.1.4, micromatch@^3.1.5:
version "3.1.10"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
@ -4272,13 +4010,6 @@ set-blocking@^2.0.0:
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
set-getter@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376"
integrity sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=
dependencies:
to-object-path "^0.3.0"
set-value@^2.0.0, set-value@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
@ -4551,15 +4282,10 @@ strip-final-newline@^2.0.0:
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
striptags@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.1.1.tgz#c8c3e7fdd6fb4bb3a32a3b752e5b5e3e38093ebd"
integrity sha1-yMPn/db7S7OjKjt1LltePjgJPr0=
success-symbol@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/success-symbol/-/success-symbol-0.1.0.tgz#24022e486f3bf1cdca094283b769c472d3b72897"
integrity sha1-JAIuSG878c3KCUKDt2nEctO3KJc=
striptags@^3.1.1:
version "3.2.0"
resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.2.0.tgz#cc74a137db2de8b0b9a370006334161f7dd67052"
integrity sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==
supports-color@^5.3.0:
version "5.5.0"
@ -4627,11 +4353,6 @@ through2@^2.0.0:
readable-stream "~2.3.6"
xtend "~4.0.1"
time-stamp@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3"
integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=
tmpl@1.0.x:
version "1.0.5"
resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
@ -4878,11 +4599,6 @@ walker@^1.0.7, walker@~1.0.5:
dependencies:
makeerror "1.0.x"
warning-symbol@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/warning-symbol/-/warning-symbol-0.1.0.tgz#bb31dd11b7a0f9d67ab2ed95f457b65825bbad21"
integrity sha1-uzHdEbeg+dZ6su2V9Fe2WCW7rSE=
webidl-conversions@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff"

View File

@ -1,7 +1,7 @@
{
"name": "@budibase/worker",
"email": "hi@budibase.com",
"version": "0.9.151",
"version": "0.9.152-alpha.0",
"description": "Budibase background service",
"main": "src/index.js",
"repository": {
@ -27,8 +27,8 @@
"author": "Budibase",
"license": "AGPL-3.0-or-later",
"dependencies": {
"@budibase/auth": "^0.9.151",
"@budibase/string-templates": "^0.9.151",
"@budibase/auth": "^0.9.152-alpha.0",
"@budibase/string-templates": "^0.9.152-alpha.0",
"@koa/router": "^8.0.0",
"@techpass/passport-openidconnect": "^0.3.0",
"aws-sdk": "^2.811.0",

View File

@ -6,7 +6,7 @@
<tr>
<td class="content-cell">
<div class="f-fallback">
<h1>Hi {{ email }},</h1>
<h1>Hi {{#if name}}{{ name }}{{else}}{{ email }}{{/if}},</h1>
<p>You recently requested to reset your password for your {{ company }} account in your Budibase platform. Use the button below to reset it. <strong>This password reset is only valid for the next 24 hours.</strong></p>
<!-- Action -->
<table class="body-action" align="center" width="100%" cellpadding="0" cellspacing="0" role="presentation">

View File

@ -6,7 +6,7 @@
<tr>
<td class="content-cell">
<div class="f-fallback">
<h1>Welcome, {{ email }}!</h1>
<h1>Welcome, {{#if name}}{{ name }}{{else}}{{ email }}{{/if}}!</h1>
<p>Thanks for getting started with {{ company }}'s Budibase platform.</p>
<p>For reference, here's how to login:</p>
<table class="attributes" width="100%" cellpadding="0" cellspacing="0" role="presentation">

View File

@ -83,10 +83,15 @@ async function buildEmail(purpose, email, context, { user, contents } = {}) {
}
base = base.contents
body = body.contents
let name = user ? user.name : undefined
if (user && !name && user.firstName) {
name = user.lastName ? `${user.firstName} ${user.lastName}` : user.firstName
}
context = {
...context,
contents,
email,
name,
user: user || {},
}