diff --git a/.DS_Store b/.DS_Store
deleted file mode 100644
index 6f251e0f..00000000
Binary files a/.DS_Store and /dev/null differ
diff --git a/.gitignore b/.gitignore
index 585a5657..ce02f237 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,10 @@
+.DS_Store
.vscode
node_modules
docs
lib
dist
.dccache
+# ignore nyc output
+.nyc_output
+coverage
diff --git a/Changelog.md b/Changelog.md
index e8ae3304..7292834a 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -24,6 +24,13 @@
- FIO-8288: do not validate dates in textfield components with calendar widgets
- FIO-8254 fixed available values validation error for Select component
- FIO-8281: fixed sync validation error for select component with url data src
+ - update validate required recursion to not recurse when nested data type
+ - FIO-7675: remove Map Key From Core (cycled out)
+ - FIO-8027 added Cloudflare Turnstile as a captcha Provider
+ - Fixing the truncate multiple spaces so it does not mutate the data in the validation system
+ - FIO-8354: fallback to passing response in argument if response.body is undefined
+ - Changes to the Experimental Exports, and changes for 5.x Renderer
+ - Experimental component changes
## 2.0.0-rc.24
diff --git a/package.json b/package.json
index 20b16004..c18f888a 100644
--- a/package.json
+++ b/package.json
@@ -14,7 +14,7 @@
"./error": "./lib/error/index.js"
},
"scripts": {
- "test": "TEST=1 mocha -r ts-node/register -r tsconfig-paths/register -r mock-local-storage -r jsdom-global/register -b -t 0 'src/**/__tests__/*.test.ts'",
+ "test": "TEST=1 nyc --reporter=lcov --reporter=text --reporter=text-summary mocha -r ts-node/register -r tsconfig-paths/register -r mock-local-storage -r jsdom-global/register -t 0 'src/**/__tests__/*.test.ts'",
"lib": "tsc --project tsconfig.json && tsc-alias -p tsconfig.json",
"replace": "node -r tsconfig-paths/register -r ts-node/register ./lib/base/array/ArrayComponent.js",
"test:debug": "mocha -r ts-node/register -r tsconfig-paths/register -r mock-local-storage -r jsdom-global/register --debug-brk --inspect '**/*.spec.ts'",
@@ -75,6 +75,7 @@
"mocha": "^10.4.0",
"mocha-jsdom": "^2.0.0",
"mock-local-storage": "^1.1.20",
+ "nyc": "^15.1.0",
"power-assert": "^1.6.1",
"sinon": "^17.0.2",
"ts-loader": "^9.5.0",
@@ -101,5 +102,23 @@
"json-logic-js": "^2.0.2",
"lodash": "^4.17.21",
"moment": "^2.29.4"
+ },
+ "nyc": {
+ "check-coverage": true,
+ "statements": 62,
+ "branches": 52,
+ "functions": 57,
+ "lines": 60,
+ "include": [
+ "src/**/*.ts",
+ "src/**/*.js"
+ ],
+ "exclude": [
+ "src/**/*.test.ts",
+ "src/**/__tests__/",
+ "src/experimental/**/*.ts",
+ "src/types/**/*.ts"
+ ],
+ "all": true
}
-}
+}
\ No newline at end of file
diff --git a/src/process/__tests__/process.test.ts b/src/process/__tests__/process.test.ts
index a6f05eea..527eb6b7 100644
--- a/src/process/__tests__/process.test.ts
+++ b/src/process/__tests__/process.test.ts
@@ -1,5 +1,5 @@
-import { expect } from "chai";
-import { processSync, ProcessTargets } from "../index";
+import { expect } from 'chai';
+import { processSync, ProcessTargets } from '../index';
import { ValidationScope } from 'types';
const assert = require('assert');
const form1 = require('./fixtures/form1.json');
@@ -68,2872 +68,2865 @@ describe('Process Tests', () => {
*/
describe('Process Tests', () => {
- it('Should submit data within a nested form.', async () => {
- const form = {
- _id: {
+ it('Should submit data within a nested form.', async () => {
+ const form = {
+ _id: {},
+ title: 'parent-fio-8023',
+ name: 'parentFio8023',
+ path: 'parentfio8023',
+ type: 'form',
+ display: 'wizard',
+ tags: [],
+ deleted: null,
+ access: [
+ {
+ type: 'read_all',
+ roles: [{}, {}, {}],
+ },
+ ],
+ submissionAccess: [],
+ owner: {},
+ components: [
+ {
+ title: 'Nested Wizard',
+ breadcrumbClickable: true,
+ buttonSettings: {
+ previous: true,
+ cancel: true,
+ next: true,
+ },
+ collapsible: false,
+ key: 'page1',
+ type: 'panel',
+ label: 'Nested Wizard',
+ tableView: false,
+ components: [
+ {
+ label: 'HTML',
+ attrs: [
+ {
+ attr: '',
+ value: '',
+ },
+ ],
+ content:
+ '- Nested Wizard inside Parent Form\n
- Nested Wizard pages should follow the Parent Wizard page\n
- No Nested Wizard pages should display in a Parent Wizard page\n
- Should not be able to submit the Parent Wizard until all the Child and Parent field validation is satisified',
+ refreshOnChange: false,
+ key: 'html',
+ type: 'htmlelement',
+ tableView: false,
+ input: false,
},
- title: "parent-fio-8023",
- name: "parentFio8023",
- path: "parentfio8023",
- type: "form",
- display: "wizard",
- tags: [
- ],
- deleted: null,
- access: [
- {
- type: "read_all",
- roles: [
+ {
+ label: 'Parent Text',
+ tableView: true,
+ validate: {
+ required: true,
+ },
+ key: 'parentText',
+ type: 'textfield',
+ input: true,
+ },
+ {
+ label: 'Parent Number',
+ mask: false,
+ spellcheck: true,
+ tableView: false,
+ delimiter: false,
+ requireDecimal: false,
+ inputFormat: 'plain',
+ validate: {
+ required: true,
+ },
+ key: 'parentNumber',
+ type: 'number',
+ input: true,
+ },
+ {
+ label: 'Signature',
+ tableView: false,
+ validate: {
+ required: true,
+ },
+ key: 'signature',
+ type: 'signature',
+ input: true,
+ },
+ ],
+ input: false,
+ },
+ {
+ title: 'Nested EditGrid/DataGrid',
+ breadcrumbClickable: true,
+ buttonSettings: {
+ previous: true,
+ cancel: true,
+ next: true,
+ },
+ collapsible: false,
+ tableView: false,
+ key: 'page2',
+ type: 'panel',
+ label: 'Page 2',
+ input: false,
+ components: [
+ {
+ label: 'Form',
+ tableView: true,
+ form: '65ea3662705068f84a93c781',
+ useOriginalRevision: false,
+ key: 'form1',
+ type: 'form',
+ revision: '1',
+ input: true,
+ components: [
+ {
+ title: 'Basic Components',
+ theme: 'info',
+ breadcrumbClickable: true,
+ buttonSettings: {
+ previous: true,
+ cancel: true,
+ next: true,
+ },
+ collapsible: false,
+ key: 'page1',
+ type: 'panel',
+ label: 'Basic Components',
+ tableView: false,
+ components: [
+ {
+ label: 'Number',
+ mask: false,
+ spellcheck: true,
+ tableView: false,
+ delimiter: false,
+ requireDecimal: false,
+ inputFormat: 'plain',
+ validate: {
+ required: true,
+ },
+ key: 'number',
+ type: 'number',
+ input: true,
+ },
+ {
+ label: 'Checkbox',
+ tableView: false,
+ validate: {
+ required: true,
+ },
+ key: 'checkbox',
+ type: 'checkbox',
+ input: true,
+ defaultValue: false,
+ },
+ {
+ label: 'Select Boxes',
+ optionsLabelPosition: 'right',
+ tableView: false,
+ values: [
{
+ label: 'SB - A',
+ value: 'sbA',
+ shortcut: '',
},
{
+ label: 'SB - B',
+ value: 'sbB',
+ shortcut: '',
},
{
+ label: 'SB - C',
+ value: 'sbC',
+ shortcut: '',
},
- ],
- },
- ],
- submissionAccess: [
- ],
- owner: {
- },
- components: [
- {
- title: "Nested Wizard",
- breadcrumbClickable: true,
- buttonSettings: {
- previous: true,
- cancel: true,
- next: true,
- },
- collapsible: false,
- key: "page1",
- type: "panel",
- label: "Nested Wizard",
- tableView: false,
- components: [
{
- label: "HTML",
- attrs: [
- {
- attr: "",
- value: "",
- },
- ],
- content: "- Nested Wizard inside Parent Form\n
- Nested Wizard pages should follow the Parent Wizard page\n
- No Nested Wizard pages should display in a Parent Wizard page\n
- Should not be able to submit the Parent Wizard until all the Child and Parent field validation is satisified",
- refreshOnChange: false,
- key: "html",
- type: "htmlelement",
- tableView: false,
- input: false,
+ label: 'SB - D',
+ value: 'sbD',
+ shortcut: '',
},
+ ],
+ validate: {
+ required: true,
+ },
+ key: 'selectBoxes1',
+ type: 'selectboxes',
+ input: true,
+ inputType: 'checkbox',
+ defaultValue: {
+ '': false,
+ sbA: false,
+ sbB: false,
+ sbC: false,
+ sbD: false,
+ },
+ },
+ {
+ label: 'Select',
+ widget: 'choicesjs',
+ tableView: true,
+ data: {
+ values: [
+ {
+ label: 'SA',
+ value: 'sa',
+ },
+ {
+ label: 'Sb',
+ value: 'sb',
+ },
+ {
+ label: 'SC',
+ value: 'sc',
+ },
+ ],
+ },
+ validate: {
+ required: true,
+ },
+ key: 'select1',
+ type: 'select',
+ input: true,
+ },
+ {
+ label: 'Select - URL',
+ widget: 'choicesjs',
+ tableView: true,
+ dataSrc: 'url',
+ data: {
+ url: 'https://cdn.rawgit.com/mshafrir/2646763/raw/states_titlecase.json',
+ headers: [
+ {
+ key: '',
+ value: '',
+ },
+ ],
+ },
+ template: '{{ item.name }}',
+ validate: {
+ required: true,
+ },
+ key: 'selectUrl',
+ type: 'select',
+ input: true,
+ disableLimit: false,
+ },
+ {
+ label: 'Radio',
+ optionsLabelPosition: 'right',
+ inline: false,
+ tableView: false,
+ values: [
{
- label: "Parent Text",
- tableView: true,
- validate: {
- required: true,
- },
- key: "parentText",
- type: "textfield",
- input: true,
+ label: 'Ra',
+ value: 'ra',
+ shortcut: '',
},
{
- label: "Parent Number",
- mask: false,
- spellcheck: true,
- tableView: false,
- delimiter: false,
- requireDecimal: false,
- inputFormat: "plain",
- validate: {
- required: true,
- },
- key: "parentNumber",
- type: "number",
- input: true,
+ label: 'Rb',
+ value: 'rb',
+ shortcut: '',
},
{
- label: "Signature",
- tableView: false,
- validate: {
- required: true,
- },
- key: "signature",
- type: "signature",
- input: true,
+ label: 'Rc',
+ value: 'rc',
+ shortcut: '',
},
- ],
- input: false,
+ ],
+ validate: {
+ required: true,
+ },
+ key: 'radio1',
+ type: 'radio',
+ input: true,
+ },
+ ],
+ input: false,
},
{
- title: "Nested EditGrid/DataGrid",
- breadcrumbClickable: true,
- buttonSettings: {
- previous: true,
- cancel: true,
- next: true,
+ title: 'Advanced',
+ theme: 'primary',
+ breadcrumbClickable: true,
+ buttonSettings: {
+ previous: true,
+ cancel: true,
+ next: true,
+ },
+ collapsible: false,
+ key: 'page2',
+ type: 'panel',
+ label: 'Advanced',
+ tableView: false,
+ input: false,
+ components: [
+ {
+ label: 'Email',
+ tableView: true,
+ validate: {
+ required: true,
+ },
+ key: 'email',
+ type: 'email',
+ input: true,
+ },
+ {
+ label: 'Url',
+ tableView: true,
+ validate: {
+ required: true,
+ },
+ key: 'url',
+ type: 'url',
+ input: true,
+ },
+ {
+ label: 'Phone Number',
+ tableView: true,
+ validate: {
+ required: true,
+ },
+ key: 'phoneNumber',
+ type: 'phoneNumber',
+ input: true,
+ },
+ {
+ label: 'Tags',
+ tableView: false,
+ validate: {
+ required: true,
+ },
+ key: 'tags',
+ type: 'tags',
+ input: true,
},
- collapsible: false,
- tableView: false,
- key: "page2",
- type: "panel",
- label: "Page 2",
- input: false,
- components: [
+ {
+ label: 'Address',
+ tableView: false,
+ provider: 'google',
+ validate: {
+ required: true,
+ },
+ key: 'address',
+ type: 'address',
+ providerOptions: {
+ params: {
+ key: '',
+ region: '',
+ autocompleteOptions: {},
+ },
+ },
+ input: true,
+ components: [
{
- label: "Form",
- tableView: true,
- form: "65ea3662705068f84a93c781",
- useOriginalRevision: false,
- key: "form1",
- type: "form",
- revision: "1",
- input: true,
- components: [
- {
- title: "Basic Components",
- theme: "info",
- breadcrumbClickable: true,
- buttonSettings: {
- previous: true,
- cancel: true,
- next: true,
- },
- collapsible: false,
- key: "page1",
- type: "panel",
- label: "Basic Components",
- tableView: false,
- components: [
- {
- label: "Number",
- mask: false,
- spellcheck: true,
- tableView: false,
- delimiter: false,
- requireDecimal: false,
- inputFormat: "plain",
- validate: {
- required: true,
- },
- key: "number",
- type: "number",
- input: true,
- },
- {
- label: "Checkbox",
- tableView: false,
- validate: {
- required: true,
- },
- key: "checkbox",
- type: "checkbox",
- input: true,
- defaultValue: false,
- },
- {
- label: "Select Boxes",
- optionsLabelPosition: "right",
- tableView: false,
- values: [
- {
- label: "SB - A",
- value: "sbA",
- shortcut: "",
- },
- {
- label: "SB - B",
- value: "sbB",
- shortcut: "",
- },
- {
- label: "SB - C",
- value: "sbC",
- shortcut: "",
- },
- {
- label: "SB - D",
- value: "sbD",
- shortcut: "",
- },
- ],
- validate: {
- required: true,
- },
- key: "selectBoxes1",
- type: "selectboxes",
- input: true,
- inputType: "checkbox",
- defaultValue: {
- "": false,
- sbA: false,
- sbB: false,
- sbC: false,
- sbD: false,
- },
- },
- {
- label: "Select",
- widget: "choicesjs",
- tableView: true,
- data: {
- values: [
- {
- label: "SA",
- value: "sa",
- },
- {
- label: "Sb",
- value: "sb",
- },
- {
- label: "SC",
- value: "sc",
- },
- ],
- },
- validate: {
- required: true,
- },
- key: "select1",
- type: "select",
- input: true,
- },
- {
- label: "Select - URL",
- widget: "choicesjs",
- tableView: true,
- dataSrc: "url",
- data: {
- url: "https://cdn.rawgit.com/mshafrir/2646763/raw/states_titlecase.json",
- headers: [
- {
- key: "",
- value: "",
- },
- ],
- },
- template: "{{ item.name }}",
- validate: {
- required: true,
- },
- key: "selectUrl",
- type: "select",
- input: true,
- disableLimit: false,
- },
- {
- label: "Radio",
- optionsLabelPosition: "right",
- inline: false,
- tableView: false,
- values: [
- {
- label: "Ra",
- value: "ra",
- shortcut: "",
- },
- {
- label: "Rb",
- value: "rb",
- shortcut: "",
- },
- {
- label: "Rc",
- value: "rc",
- shortcut: "",
- },
- ],
- validate: {
- required: true,
- },
- key: "radio1",
- type: "radio",
- input: true,
- },
- ],
- input: false,
- },
- {
- title: "Advanced",
- theme: "primary",
- breadcrumbClickable: true,
- buttonSettings: {
- previous: true,
- cancel: true,
- next: true,
- },
- collapsible: false,
- key: "page2",
- type: "panel",
- label: "Advanced",
- tableView: false,
- input: false,
- components: [
- {
- label: "Email",
- tableView: true,
- validate: {
- required: true,
- },
- key: "email",
- type: "email",
- input: true,
- },
- {
- label: "Url",
- tableView: true,
- validate: {
- required: true,
- },
- key: "url",
- type: "url",
- input: true,
- },
- {
- label: "Phone Number",
- tableView: true,
- validate: {
- required: true,
- },
- key: "phoneNumber",
- type: "phoneNumber",
- input: true,
- },
- {
- label: "Tags",
- tableView: false,
- validate: {
- required: true,
- },
- key: "tags",
- type: "tags",
- input: true,
- },
- {
- label: "Address",
- tableView: false,
- provider: "google",
- validate: {
- required: true,
- },
- key: "address",
- type: "address",
- providerOptions: {
- params: {
- key: "",
- region: "",
- autocompleteOptions: {
- },
- },
- },
- input: true,
- components: [
- {
- label: "Address 1",
- tableView: false,
- key: "address1",
- type: "textfield",
- input: true,
- customConditional: "show = _.get(instance, 'parent.manualMode', false);",
- },
- {
- label: "Address 2",
- tableView: false,
- key: "address2",
- type: "textfield",
- input: true,
- customConditional: "show = _.get(instance, 'parent.manualMode', false);",
- },
- {
- label: "City",
- tableView: false,
- key: "city",
- type: "textfield",
- input: true,
- customConditional: "show = _.get(instance, 'parent.manualMode', false);",
- },
- {
- label: "State",
- tableView: false,
- key: "state",
- type: "textfield",
- input: true,
- customConditional: "show = _.get(instance, 'parent.manualMode', false);",
- },
- {
- label: "Country",
- tableView: false,
- key: "country",
- type: "textfield",
- input: true,
- customConditional: "show = _.get(instance, 'parent.manualMode', false);",
- },
- {
- label: "Zip Code",
- tableView: false,
- key: "zip",
- type: "textfield",
- input: true,
- customConditional: "show = _.get(instance, 'parent.manualMode', false);",
- },
- ],
- },
- {
- label: "Date / Time",
- tableView: false,
- enableMinDateInput: false,
- datePicker: {
- disableWeekends: false,
- disableWeekdays: false,
- },
- enableMaxDateInput: false,
- validate: {
- required: true,
- },
- key: "dateTime",
- type: "datetime",
- input: true,
- widget: {
- type: "calendar",
- displayInTimezone: "viewer",
- locale: "en",
- useLocaleSettings: false,
- allowInput: true,
- mode: "single",
- enableTime: true,
- noCalendar: false,
- format: "yyyy-MM-dd hh:mm a",
- hourIncrement: 1,
- minuteIncrement: 1,
- time_24hr: false,
- minDate: null,
- disableWeekends: false,
- disableWeekdays: false,
- maxDate: null,
- },
- },
- {
- label: "Day",
- hideInputLabels: false,
- inputsLabelPosition: "top",
- useLocaleSettings: false,
- tableView: false,
- fields: {
- day: {
- hide: false,
- required: true,
- },
- month: {
- hide: false,
- required: true,
- },
- year: {
- hide: false,
- required: true,
- },
- },
- key: "day",
- type: "day",
- input: true,
- defaultValue: "00/00/0000",
- },
- {
- label: "Time",
- tableView: true,
- dataFormat: "HH:mm:ss a",
- validate: {
- required: true,
- },
- key: "time",
- type: "time",
- input: true,
- inputMask: "99:99",
- },
- {
- label: "Currency",
- mask: false,
- spellcheck: true,
- tableView: false,
- currency: "USD",
- inputFormat: "plain",
- validate: {
- required: true,
- },
- key: "currency",
- type: "currency",
- input: true,
- delimiter: true,
- },
- {
- label: "Signature",
- tableView: false,
- validate: {
- required: true,
- },
- key: "signature",
- type: "signature",
- input: true,
- },
- ],
- },
- {
- title: "DataGrid / EditGrid",
- theme: "danger",
- breadcrumbClickable: true,
- buttonSettings: {
- previous: true,
- cancel: true,
- next: true,
- },
- collapsible: false,
- key: "page3",
- type: "panel",
- label: "DataGrid / EditGrid",
- tableView: false,
- input: false,
- components: [
- {
- label: "Data Grid",
- reorder: false,
- addAnotherPosition: "bottom",
- defaultOpen: false,
- layoutFixed: false,
- enableRowGroups: false,
- tableView: false,
- defaultValue: [
- {
- },
- ],
- key: "dataGrid",
- type: "datagrid",
- input: true,
- components: [
- {
- label: "Checkbox",
- tableView: false,
- validate: {
- required: true,
- },
- key: "checkbox",
- type: "checkbox",
- input: true,
- defaultValue: false,
- },
- {
- label: "Select",
- widget: "choicesjs",
- tableView: true,
- dataSrc: "resource",
- data: {
- resource: "65e9eb1aee138974f569d619",
- },
- valueProperty: "data.text",
- template: "{{ item.data.text }}",
- validate: {
- select: false,
- },
- key: "select",
- type: "select",
- searchField: "data.text__regex",
- input: true,
- addResource: false,
- reference: false,
- },
- {
- label: "Radio",
- optionsLabelPosition: "right",
- inline: false,
- tableView: false,
- values: [
- {
- label: "Ra",
- value: "ra",
- shortcut: "",
- },
- {
- label: "Rb",
- value: "rb",
- shortcut: "",
- },
- {
- label: "Rc",
- value: "rc",
- shortcut: "",
- },
- ],
- validate: {
- required: true,
- },
- key: "radio1",
- type: "radio",
- input: true,
- },
- ],
- },
- {
- label: "Edit Grid",
- tableView: true,
- rowDrafts: false,
- key: "editGrid",
- type: "editgrid",
- input: true,
- components: [
- {
- label: "Date / Time",
- tableView: true,
- enableMinDateInput: false,
- datePicker: {
- disableWeekends: false,
- disableWeekdays: false,
- },
- enableMaxDateInput: false,
- validate: {
- required: true,
- },
- key: "dateTime",
- type: "datetime",
- input: true,
- widget: {
- type: "calendar",
- displayInTimezone: "viewer",
- locale: "en",
- useLocaleSettings: false,
- allowInput: true,
- mode: "single",
- enableTime: true,
- noCalendar: false,
- format: "yyyy-MM-dd hh:mm a",
- hourIncrement: 1,
- minuteIncrement: 1,
- time_24hr: false,
- minDate: null,
- disableWeekends: false,
- disableWeekdays: false,
- maxDate: null,
- },
- },
- {
- label: "Address",
- tableView: true,
- provider: "google",
- key: "address",
- type: "address",
- providerOptions: {
- params: {
- key: "",
- region: "",
- autocompleteOptions: {
- },
- },
- },
- input: true,
- components: [
- {
- label: "Address 1",
- tableView: false,
- key: "address1",
- type: "textfield",
- input: true,
- customConditional: "show = _.get(instance, 'parent.manualMode', false);",
- },
- {
- label: "Address 2",
- tableView: false,
- key: "address2",
- type: "textfield",
- input: true,
- customConditional: "show = _.get(instance, 'parent.manualMode', false);",
- },
- {
- label: "City",
- tableView: false,
- key: "city",
- type: "textfield",
- input: true,
- customConditional: "show = _.get(instance, 'parent.manualMode', false);",
- },
- {
- label: "State",
- tableView: false,
- key: "state",
- type: "textfield",
- input: true,
- customConditional: "show = _.get(instance, 'parent.manualMode', false);",
- },
- {
- label: "Country",
- tableView: false,
- key: "country",
- type: "textfield",
- input: true,
- customConditional: "show = _.get(instance, 'parent.manualMode', false);",
- },
- {
- label: "Zip Code",
- tableView: false,
- key: "zip",
- type: "textfield",
- input: true,
- customConditional: "show = _.get(instance, 'parent.manualMode', false);",
- },
- ],
- },
- ],
- },
- ],
- },
- ],
+ label: 'Address 1',
+ tableView: false,
+ key: 'address1',
+ type: 'textfield',
+ input: true,
+ customConditional:
+ "show = _.get(instance, 'parent.manualMode', false);",
},
- ],
- },
- ],
- settings: {
- share: {
- theme: "",
- showHeader: true,
- },
- },
- properties: {
- },
- project: {
- },
- controller: "",
- revisions: "",
- submissionRevisions: "",
- _vid: 0,
- created: "2024-03-07T21:50:03.872Z",
- modified: "2024-03-07T21:50:03.879Z",
- machineName: "authoring-oaomxjpqpoigtqg:parentFio8023",
- __v: 0,
- };
- const submission = {
- data: {
- parentText: "test",
- signature: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABgAAAACWCAYAAAAYAUMPAAAAAXNSR0IArs4c6QAAFkZJREFUeF7t3SFsHGcWB/Cv2CAo8MoTnQrCksiVysyuMFLCgwod4KXngBgWpTigsGHLTurKV3YgqlRyJK5UYrz4Tp97u9rsOWvv8+zOm29+Q6Ik+82893sf2v/OzBfz+eV/ioMAAQIECBAgQIAAAQIECBAgQIAAAQIECBBoSuALAUBT89QMAQIECBAgQIAAAQIECBAgQIAAAQIECBC4EhAA2AgECBAgQIAAAQIECBAgQIAAAQIECBAgQKBBAQFAg0PVEgECBAgQIECAAAECBAgQIECAAAECBAgQEADYAwQIECBAgAABAgQIECBAgAABAgQIECBAoEEBAUCDQ9USAQIECBAgQIAAAQIECBAgQIAAAQIECBAQANgDBAgQIECAAAECBAgQIECAAAECBAgQIECgQQEBQIND1RIBAgQIECBAgAABAgQIECBAgAABAgQIEBAA2AMECBAgQIAAAQIECBAgQIAAAQIECBAgQKBBAQFAg0PVEgECBAgQIECAAAECBAgQIECAAAECBAgQEADYAwQIECBAgAABAgQIECBAgAABAgQIECBAoEEBAUCDQ9USAQIECBAgQIAAAQIECBAgQIAAAQIECBAQANgDBAgQIECAAAECBAgQIECAAAECBAgQIECgQQEBQIND1RIBAgQIECBAgAABAgQIECBAgAABAgQIEBAA2AMECBAgQIAAAQIECBAgQIAAAQIECBAgQKBBAQFAg0PVEgECBAgQIECAAAECBAgQIECAAAECBAgQEADYAwQIECBAgAABAgQIECBAgAABAgQIECBAoEEBAUCDQ9USAQIECBAgQIAAAQIECBAgQIAAAQIECBAQANgDBAgQIECAAAECBAgQIECAAAECBAgQIECgQQEBQIND1RIBAgQIECBAgAABAgQIECBAgAABAgQIEBAA2AMECBAgQIAAAQIECBAgQIAAAQIECBAgQKBBAQFAg0PVEgECBAgQIECAAAECBAgQIECAAAECBAgQEADYA6kFjo6+LYeHT8pk8ip1nYojQIAAAQIECBAgQIAAAQIECBAgQIBANgEBQLaJqGcpMJudlz8DgKdlOv2JDAECBAgQIECAAAECBAgQIECAAAECBAhsISAA2ALLR/crsAgA6lXn88v9XtzVCBAgQIAAAQIECBAgQIAAAQIECBAgMHABAcDAB9hy+QKAlqerNwIECBAgQIAAAQIECBAgQIAAAQIEdi0gANi1sPOHBQQAYToLCRAgQIAAAQIECBAgQIAAAQIECBAgUAQANkFagdUAoL4DoL4LwEGAAAECBAgQIECAAAECBAgQIECAAAECtxMQANzOyad6EBAA9IDukgQIECBAgAABAgQIECBAgAABAgQINCMgAGhmlG02cnBw/6qxk5PjMpm8arNJXREgQIAAAQIECBAgQIAAAQIECBAgQGAHAgKAHaA6ZXcCAoDuLJ2JAAECBAgQIECAAAECBAgQIECAAIFxCQgAxjXvwXUrABjcyBRMgAABAgQIECBAgAABAgQIECBAgEASAQFAkkEo43qBRQBQXwBcXwTsIECAAAECBAgQIECAAAECBAgQIECAAIHbCQgAbufkUz0JCAB6gndZAgQIECBAgAABAgQIECBAgAABAgQGLyAAGPwI225gEQDULufzy7ab1R0BAgQIECBAgAABAgQIECBAgAABAgQ6FBAAdIjpVN0LCAC6N3VGAgQIECBAgAABAgQIECBAgAABAgTGISAAGMecb+xyNjsv9Tn72Y7VAKC+AyBjjdnM1EOAAAECBAgQIECAAAECBAgQIECAAIEqIAAY8T6oX/qfnp6V+ufiODk5Ll9//TTNF+1HR98u6xMAjHizap0AAQIECBAgQIAAAQIECBAgQIAAga0FBABbkw1/wenpm/L69dnGRp4/f1YuLi7KdPq+14ZXA4AaTkwmr3qtx8UJECBAgAABAgQIECBAgAABAgQIECAwFAEBwFAm1WGdL19+V969+/FWZ/zqq7+WN2/+3tsdAQKAW43JhwgQIECAAAECBAgQIECAAAECBAgQIPB/AgKAEW6Kx4+/KR8+/PpJ5/XZ+quPAlr9z/p/k8lxLyGAAGCEG1TLBAgQIECAAAECBAgQIECAAAECBAh0IiAA6IRxWCdZfbFu/YX/L7/8Y9nApscD9fEM/tV6ahBRa3AQIECAAAECBAgQIECAAAECBAgQIECAwM0CAoCbjZr6RP2Vf/1V/eL43Jf6n3tM0L6fwy8AaGr7aYYAAQIECBAgQIAAAQIECBAgQIAAgT0KCAD2iJ3lUqt3AGz6Vf/n7gbYZwggAMiya9RBgAABAgQIECBAgAABAgQIECBAgMDQBAQAQ5tYB/WuBgA3fZnfdwggAOhg4E5BgAABAgQIECBAgAABAgQIECBAgMAoBQQAIxz7p1+qPynT6fuNCn2+F0AAMMINqmUCBAgQIECAAAECBAgQIECAAAECBDoREAB0wjisk6w+3//evXvljz/+fWMD9d0Bp6dnpf65fsznlzeuj36gvq9gcU0vAY4qWkeAAAECBAgQIECAAAECBAgQIECAwBgFBAAjnPpdflV/3d0Au/xiXgAwwg2qZQIECBAgQIAAAQIECBAgQIAAAQIEOhEQAHTCOKyTrH+Jv+0v+PcZAggAhrW3VEuAAAECBAgQIECAAAECBAgQIECAQB4BAUCeWeytkrvcAbAo8roQ4KYXCkcaFABE1KwhQIAAAQIECBAgQIAAAQIECBAgQIBAKQKAEe6Cu94BsCkEmE5/KvWRQF0dAoCuJJ2HAAECBAgQIECAAAECBAgQIECAAIGxCQgAxjbxUkpXAUClWz/Xl1/+pfz22786U10NAHZxh0FnhToRAQIECBAgQIAAAQIECBAgQIAAAQIEkgkIAJINZB/ldBkA1HpXv6Svf3/x4ll5+/b7TloRAHTC6CQECBAgQIAAAQIECBAgQIAAAQIECIxQQAAwwqF38Q6AdbYHDx6Vi4vfl//c1a/1Dw7uL8/Z9eOFRjh6LRMgQIAAAQIECBAgQIAAAQIECBAgMCIBAcCIhr1o9eXL78q7dz8uO5/PL++sMJudX90JsHp0EQI8fPiofPz4Z7DQxfnu3KgTECBAgAABAgQIECBAgAABAgQIECBAYCACAoCBDKrLMrt+BNCitl2EAKt3Fjx//qz88EM3jxbq0tO5CBAgQIAAAQIECBAgQIAAAQIECBAgkFFAAJBxKjuuaf2Z/V3cAbApBLjLo3u8A2DHm8HpCRAgQIAAAQIECBAgQIAAAQIECBBoVkAA0OxoP9/YLgOAetX1Owzqv0VDgNVaDw+fXp3HQYAAAQIECBAgQIAAAQIECBAgQIAAAQI3CwgAbjZq7hPrAUD0y/lNMF2FAO4AaG77aYgAAQIECBAgQIAAAQIECBAgQIAAgT0JCAD2BJ3pMvsIAGq/XYQAAoBMO0ctBAgQIECAAAECBAgQIECAAAECBAgMSUAAMKRpdVTrrh8BtFrmdSHANu8cEAB0NHSnIUCAAAECBAgQIECAAAECBAgQIEBgdAICgNGNvJR9BgCVdz0E2OZZ/gcH95cTOjk5LpPJqxFOTMsECBAgQIAAAQIECBAgQIAAAQIECBDYXkAAsL3Z4Fc8fPiofPz4+7KPXbwDYB0pGgKsBgD7qHPww9UAAQIECBAgQIAAAQIECBAgQIAAAQIE/icgABjhVnjw4FG5uNhvAFCZ10OAFy+elbdvv984AQHACDeolgkQIECAAAECBAgQIECAAAECBAgQ6ERAANAJ47BOsvqleq18n4/Wmc3Orx5BtDg2PQ5o/bPuABjWPlMtAQIECBAgQIAAAQIECBAgQIAAAQL9CggA+vXv5ep9BgC14etCgMnkuNQwYPUQAPSyPVyUAAECBAgQIECAAAECBAgQIECAAIFGBAQAjQxymzb6DgAWIcDp6dlVGLA4Dg+flOn0/fLv648McgfANlP2WQIECBAgQIAAAQIECBAgQIAAAQIExi4gABjhDsgQACzY6+OAPg0Bnpb6RX891uuczy9HOC0tEyBAgAABAgQIECBAgAABAgQIECBAICYgAIi5DXrV+hfrff+y/vHjb8qHD78uTes7Cerx+vXZ8t82vStg0MNQPAECBAgQIECAAAECBAgQIECAAAECBHYkIADYEWzm064+WifLF+vrIcC6X98hReZ5qo0AAQIECBAgQIAAAQIECBAgQIAAAQLXCQgARrovFo/dWX/xbp8c63cmLGrJElL0aePaBAgQIECAAAECBAgQIECAAAECBAgQ2FZAALCtmM/vTKCGEvWdAOuHX//vjNyJCRAgQIAAAQIECBAgQIAAAQIECBBoWEAA0PBwh9ra0dHfymz2z6vy/fp/qFNUNwECBAgQIECAAAECBAgQIECAAAECfQsIAPqegOtfK1DvBvj55/MymbwiRIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAYH/AuX7sgv4DBgrAAAAAElFTkSuQmCC",
- form1: {
- form: "65ea3662705068f84a93c781",
- owner: "65ea3601c3792e416cabcb2a",
- roles: [
- ],
- access: [
- ],
- metadata: {
- selectData: {
- form1: {
- data: {
- select1: {
- label: "Sb",
- },
- },
- },
+ {
+ label: 'Address 2',
+ tableView: false,
+ key: 'address2',
+ type: 'textfield',
+ input: true,
+ customConditional:
+ "show = _.get(instance, 'parent.manualMode', false);",
+ },
+ {
+ label: 'City',
+ tableView: false,
+ key: 'city',
+ type: 'textfield',
+ input: true,
+ customConditional:
+ "show = _.get(instance, 'parent.manualMode', false);",
+ },
+ {
+ label: 'State',
+ tableView: false,
+ key: 'state',
+ type: 'textfield',
+ input: true,
+ customConditional:
+ "show = _.get(instance, 'parent.manualMode', false);",
+ },
+ {
+ label: 'Country',
+ tableView: false,
+ key: 'country',
+ type: 'textfield',
+ input: true,
+ customConditional:
+ "show = _.get(instance, 'parent.manualMode', false);",
},
- timezone: "America/Chicago",
- offset: -360,
- origin: "http://localhost:3000",
- referrer: "",
- browserName: "Netscape",
- userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
- pathName: "/",
- onLine: true,
- headers: {
- host: "localhost:3000",
- connection: "keep-alive",
- "content-length": "9020",
- pragma: "no-cache",
- "cache-control": "no-cache",
- "sec-ch-ua": "\"Chromium\";v=\"122\", \"Not(A:Brand\";v=\"24\", \"Brave\";v=\"122\"",
- accept: "application/json",
- "content-type": "application/json",
- "sec-ch-ua-mobile": "?0",
- "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
- "sec-ch-ua-platform": "\"macOS\"",
- "sec-gpc": "1",
- "accept-language": "en-US,en",
- origin: "http://localhost:3000",
- "sec-fetch-site": "same-origin",
- "sec-fetch-mode": "cors",
- "sec-fetch-dest": "empty",
- referer: "http://localhost:3000/",
- "accept-encoding": "gzip, deflate, br",
+ {
+ label: 'Zip Code',
+ tableView: false,
+ key: 'zip',
+ type: 'textfield',
+ input: true,
+ customConditional:
+ "show = _.get(instance, 'parent.manualMode', false);",
},
+ ],
},
- data: {
- number: 23,
- checkbox: true,
- selectBoxes1: {
- sbA: false,
- sbB: true,
- sbC: false,
- sbD: false,
+ {
+ label: 'Date / Time',
+ tableView: false,
+ enableMinDateInput: false,
+ datePicker: {
+ disableWeekends: false,
+ disableWeekdays: false,
+ },
+ enableMaxDateInput: false,
+ validate: {
+ required: true,
+ },
+ key: 'dateTime',
+ type: 'datetime',
+ input: true,
+ widget: {
+ type: 'calendar',
+ displayInTimezone: 'viewer',
+ locale: 'en',
+ useLocaleSettings: false,
+ allowInput: true,
+ mode: 'single',
+ enableTime: true,
+ noCalendar: false,
+ format: 'yyyy-MM-dd hh:mm a',
+ hourIncrement: 1,
+ minuteIncrement: 1,
+ time_24hr: false,
+ minDate: null,
+ disableWeekends: false,
+ disableWeekdays: false,
+ maxDate: null,
+ },
+ },
+ {
+ label: 'Day',
+ hideInputLabels: false,
+ inputsLabelPosition: 'top',
+ useLocaleSettings: false,
+ tableView: false,
+ fields: {
+ day: {
+ hide: false,
+ required: true,
},
- select1: "sb",
- selectUrl: {
- name: "Alaska",
- abbreviation: "AK",
+ month: {
+ hide: false,
+ required: true,
},
- radio1: "ra",
- email: "travis@form.io",
- url: "google.com",
- phoneNumber: "(234) 234-2342",
- tags: "test",
- address: {
- address_components: [
- {
- long_name: "12342",
- short_name: "12342",
- types: [
- "street_number",
- ],
- },
- {
- long_name: "Coit Road",
- short_name: "Coit Rd",
- types: [
- "route",
- ],
- },
- {
- long_name: "North Dallas",
- short_name: "North Dallas",
- types: [
- "neighborhood",
- "political",
- ],
- },
- {
- long_name: "Dallas",
- short_name: "Dallas",
- types: [
- "locality",
- "political",
- ],
- },
- {
- long_name: "Dallas County",
- short_name: "Dallas County",
- types: [
- "administrative_area_level_2",
- "political",
- ],
- },
- {
- long_name: "Texas",
- short_name: "TX",
- types: [
- "administrative_area_level_1",
- "political",
- ],
- },
- {
- long_name: "United States",
- short_name: "US",
- types: [
- "country",
- "political",
- ],
- },
- {
- long_name: "75243",
- short_name: "75243",
- types: [
- "postal_code",
- ],
- },
- {
- long_name: "2308",
- short_name: "2308",
- types: [
- "postal_code_suffix",
- ],
- },
- ],
- formatted_address: "12342 Coit Rd, Dallas, TX 75243, USA",
- geometry: {
- location: {
- lat: 32.9165814,
- lng: -96.76889729999999,
- },
- viewport: {
- south: 32.9151396697085,
- west: -96.7703730302915,
- north: 32.9178376302915,
- east: -96.76767506970849,
- },
- },
- place_id: "ChIJrbdWEhUgTIYRl5rVJe8Zl6A",
- plus_code: {
- compound_code: "W68J+JC Dallas, TX, USA",
- global_code: "8645W68J+JC",
- },
- types: [
- "street_address",
- ],
- formattedPlace: "12342 Coit Rd, Dallas, TX 75243, USA",
+ year: {
+ hide: false,
+ required: true,
},
- dateTime: "2024-03-14T17:00:00.000Z",
- day: "03/23/2029",
- time: "15:30:00 pm",
- currency: 2,
- signature: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABgAAAACWCAYAAAAYAUMPAAAAAXNSR0IArs4c6QAAFBBJREFUeF7t3bFuE1kUBuChTk2J8h4gU6ekXInnIAWu7YLUKXbrFJRs5xqLlFugFS9BRZF6V9cro6yJsePjMWfOfCOhFHjunPOdW/n3zDy5u/v6T+cgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIESgk8EQCUmqdmCBAgQIAAAQIECBAgQIAAAQIECBAgQIDASkAAYCMQIECAAAECBAgQIECAAAECBAgQIECAAIGCAgKAgkPVEgECBAgQIECAAAECBAgQIECAAAECBAgQEADYAwQIECBAgAABAgQIECBAgAABAgQIECBAoKCAAKDgULVEgAABAgQIECBAgAABAgQIECBAgAABAgQEAPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAoKCAAKDhULREgQIAAAQIECBAgQIAAAQIECBAgQIAAAQGAPUCAAAECBAgQIECAAAECBAgQIECAAAECBAoKCAAKDlVLBAgQIECAAAECBAgQIECAAAECBAgQIEBAAGAPECBAgAABAgQIECBAgAABAgQIECBAgACBggICgIJD1RIBAgQIECBAgAABAgQIECBAgAABAgQIEBAA2AMECBAgQIAAAQIECBAgQIAAAQIECBAgQKCggACg4FC1RIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBAD2AAECBAgQIECAAAECBAgQIECAAAECBAgQKCggACg4VC0RIECAAAECBAgQIECAAAECBAgQIECAAAEBgD1AgAABAgQIECBAgAABAgQIECBAgAABAgQKCggACg5VSwQIECBAgAABAgQIECBAgAABAgQIECBAQABgDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAgYICAoCCQ9USAQIECBAgQIAAAQIECBAgQIAAAQIECBAQANgDBAgQIECAAAECBAgQIECAAAECBAgQIECgoIAAoOBQtUSAAAECBAgQIECAAAECBAgQIECAAAECBAQA9gABAgQIECBAgAABAgQIECBAgAABAgQIECgoIAAoOFQtESBAgAABAgQIECBAgAABAgQIECBAgAABAYA9QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECgoIAAoOVUsECBAgQIAAAQIECBAgQIAAAQIECBAgQEAAYA8QIECAAAECBAgQIECAAAECBAgQIECAAIGCAgKAgkPVEgECBAgQIECAAAECBAgQIECAAAECBAgQEADYAwQIECBAgAABAgQIECBAgAABAgQIECBAoKCAAKDgULVEgAABAgQIECBAgAABAgQIECBAgAABAgQEAPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAoKCAAKDhULREgQIAAAQIECBAgQIAAAQIECBAgQIAAAQGAPUCAAAECBAgQIECAAAECBAgQIECAAAECBAoKCAAKDlVLBAgQIECAAAECBAgQIECAAAECBAgQIEBAAGAPECBAgAABAgQIECBAgAABAgQIECBAgACBggICgIJD1RIBAgQIECBAgAABAgQIECBAgAABAgQIEBAA2AMECBAgQIAAAQIECBAgQIAAAQIECBAgQKCggACg4FC1RIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBAD2AAECBAgQIECAAAECBAgQIECAAAECBAgQKCggACg4VC0RIECAAAECBAgQIECAAAECBAgQIECAAAEBgD1AgAABAgQIECBAgAABAgQIECBAgAABAgQKCggACg5VSwQIECBAgAABAgQIECBAgAABAgQIECBAQABgDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAgYICAoCCQ9USAQIECBAgQIAAAQIECBAgQIAAAQIECBAQANgDBAgQIECAAAECBAgQIECAAAECBAgQIECgoIAAoOBQtUSAAAECBAgQIECAAAECBAgQIECAAAECBAQA9gABAgQIECBAgAABAgQIECBAgAABAgQIECgoIAAoOFQtESBAgAABAgQIECBAgAABAgQIECBAgAABAYA9QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECgoIAAoOVUsECBAgQIAAAQIECBAgQIAAAQIECBAgQEAAYA8QIECAAAECBAgQIECAAAECBAgQIECAAIGCAgKAgkPVEgECBAgQIECAAAECBAgQIECAAAECBAgQEADYAwQIECBAgAABAgQIECBAgAABAgQIECBAoKCAAKDgULVEgAABAgQIECBAgAABAgQIECBAgAABAgQEAPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAoKCAAKDhULREgQIAAAQIECBAgQIAAAQIECBAgQIAAAQGAPUCAAAECBAgQIECAAAECBAgQIECAAAECBAoKCAAKDlVLBAgQIECAAAECBAgQIECAAAECBAgQIEBAAGAPECBAgAABAgQIECBAgAABAgQIECBAgACBggICgIJD1RIBAgQIECBAgAABAgQIECBAgAABAgQIEBAA2AMECBAgQIAAAQIECBAgQIAAAQIECBAgQKCggACg4FC1RIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBAD2AAECBAgQIECAAAECBAgQIECAAAECBAgQKCggACg4VC0RIECAAAECBAgQIECAAAECBAgQIECAAAEBgD1AgAABAgQIECBAgAABAgQIECBAgAABAgQKCggACg5VSwQIECBAgAABAgQIECBAgAABAgQIECBAQABgD5xMYLn81H38+Kl7+fLF6m87lsvb1d/J5Pnq73R6ebJ6XIgAAQIECBAgQIAAAQIECBAgQIAAAQKVBQQAlaebqLfZ7F03n1/tVdFk8mIVCAgD9uLyIQIECBAgQIAAAQIECBAgQIAAAQIECDwoIACwMU4icHb29KDrrIOAFgo4CBAgQIAAAQIECBAgQIAAAQIECBAgQGB/AQHA/lY+eaBAe/TPxcWrA8/+77QWAEynb1Z/HQQIECBAgAABAgQIECBAgAABAgQIECCwW0AAsNvIJ44g8JhHAP3scoKAIwzDEgQIECBAgAABAgQIECBAgAABAgQIjEJAADCKMedosoUA66O9CHjzaC8Gbi8FbncM7DpaELBYfNj1Mf9PgAABAgQIECBAgAABAgQIECBAgACB0QoIAEY7+tyNt7Dg+vqP7tu3b1sLFQLknqHqCBAgQIAAAQIECBAgQIAAAQIECBD4tQICgF/r7+o7BNrdALPZ1da7As7Pn3VfvvzFkQABAgQIECBAgAABAgQIECBAgAABAgQ2BAQAtsQgBHYFAe1xQF4QPIhRKpIAAQIECBAgQIAAAQIECBAgQIAAgRMJCABOBO0yxxPY9kJhLwg+nrGVCBAgQIAAAQIECBAgQIAAAQIECBAYvoAAYPgzHGUH19e/dzc377vPn//+of+3b9900+nlKF00TYAAAQIECBAgQIAAAQIECBAgQIAAgbWAAMBeGLSAuwEGPT7FEyBAgAABAgQIECBAgAABAgQIECDQo4AAoEdcS59G4GfvB3A3wGlm4CoECBAgQIAAAQIECBAgQIAAAQIECOQTEADkm4mKDhRwN8CBcE4jQIAAAQIECBAgQIAAAQIECBAgQKCkgACg5FjH3dTFxauu3RWweXhJ8Lj3he4JECBAgAABAgQIECBAgAABAgQIjE1AADC2iY+kX48FGsmgtUmAAAECBAgQIECAAAECBAgQIECAwFYBAYDNUVogw2OBWg3L5W23WHwoba05AgQIECBAgAABAgQIECBAgAABAgRyCQgAcs1DNT0JbHssUN8vCW53IrRrt6Pva/VEZ1kCBAgQIECAAAECBAgQIECAAAECBAYqIAAY6OCU/XiBbY8F6vPdAPcDgHYddwE8fm7OIECAAAECBAgQIECAAAECBAgQIEDgMAEBwGFuzhqwwLYgoK9f6J+dPf2udXf3dcBySidAgAABAgQIECBAgAABAgQIECBAYEgCAoAhTUutRxV4KAjo426A+wFAuwOgXcNBgAABAgQIECBAgAABAgQIECBAgACBvgUEAH0LWz+9wENBwDHvBhAApN8CCiRAgAABAgQIECBAgAABAgQIECBQUkAAUHKsmjpEYDZ7183nV99PnUyed4vFn4cs9b9z7r+A+JjBQrgwCxAgQIAAAQIECBAgQIAAAQIECBAgUFpAAFB6vJo7RGAzCIh+ae8OgEOm4BwCBAgQIECAAAECBAgQIECAAAECBKICAoCooPPLCjwUBLRmp9PLvXveXMNLgPem80ECBAgQIECAAAECBAgQIECAAAECBIICAoAgoNNrC2x+gb/u9vz8Wff69W87w4D7v/5vL/9tLwF2ECBAgAABAgQIECBAgAABAgQIECBA4BQCAoBTKLvG4AW2BQHt8UDt2LwroL1Y+Obm/erf+mhf/rcQwEGAAAECBAgQIECAAAECBAgQIECAAIFTCAgATqHsGmUEWhDQvtxfLm9/6Gn95X77/83Dr//LbAGNECBAgAABAgQIECBAgAABAgQIEBiMgABgMKNSaCaBFgS0Yz6/2qssv/7fi8mHCBAgQIAAAQIECBAgQIAAAQIECBA4ooAA4IiYlhqfwD5BQHtM0GNeHDw+RR0TIECAAAECBAgQIECAAAECBAgQINCHgACgD1VrjlJg/egfz/kf5fg1TYAAAQIECBAgQIAAAQIECBAgQCCdgAAg3UgURIAAAQIECBAgQIAAAQIECBAgQIAAAQIE4gICgLihFQgQIECAAAECBAgQIECAAAECBAgQIECAQDoBAUC6kSiIAAECBAgQIECAAAECBAgQIECAAAECBAjEBQQAcUMrECBAgAABAgQIECBAgAABAgQIECBAgACBdAICgHQjURABAgQIECBAgAABAgQIECBAgAABAgQIEIgLCADihlYgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLpBAQA6UaiIAIECBAgQIAAAQIECBAgQIAAAQIECBAgEBcQAMQNrUCAAAECBAgQIECAAAECBAgQIECAAAECBNIJCADSjURBBAgQIECAAAECBAgQIECAAAECBAgQIEAgLiAAiBtagQABAgQIECBAgAABAgQIECBAgAABAgQIpBMQAKQbiYIIECBAgAABAgQIECBAgAABAgQIECBAgEBcQAAQN7QCAQIECBAgQIAAAQIECBAgQIAAAQIECBBIJyAASDcSBREgQIAAAQIECBAgQIAAAQIECBAgQIAAgbiAACBuaAUCBAgQIECAAAECBAgQIECAAAECBAgQIJBOQACQbiQKIkCAAAECBAgQIECAAAECBAgQIECAAAECcQEBQNzQCgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACDdSBREgAABAgQIECBAgAABAgQIECBAgAABAgTiAgKAuKEVCBAgQIAAAQIECBAgQIAAAQIECBAgQIBAOgEBQLqRKIgAAQIECBAgQIAAAQIECBAgQIAAAQIECMQFBABxQysQIECAAAECBAgQIECAAAECBAgQIECAAIF0AgKAdCNREAECBAgQIECAAAECBAgQIECAAAECBAgQiAsIAOKGViBAgAABAgQIECBAgAABAgQIECBAgAABAukEBADpRqIgAgQIECBAgAABAgQIECBAgAABAgQIECAQFxAAxA2tQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gkIANKNREEECBAgQIAAAQIECBAgQIAAAQIECBAgQCAuIACIG1qBAAECBAgQIECAAAECBAgQIECAAAECBAikExAApBuJgggQIECAAAECBAgQIECAAAECBAgQIECAQFxAABA3tAIBAgQIECBAgAABAgQIECBAgAABAgQIEEgnIABINxIFESBAgAABAgQIECBAgAABAgQIECBAgACBuIAAIG5oBQIECBAgQIAAAQIECBAgQIAAAQIECBAgkE5AAJBuJAoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQJxAQFA3NAKBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAIN1IFESAAAECBAgQIECAAAECBAgQIECAAAECBOICAoC4oRUIECBAgAABAgQIECBAgAABAgQIECBAgEA6AQFAupEoiAABAgQIECBAgAABAgQIECBAgAABAgQIxAUEAHFDKxAgQIAAAQIECBAgQIAAAQIECBAgQIAAgXQCAoB0I1EQAQIECBAgQIAAAQIECBAgQIAAAQIECBCICwgA4oZWIECAAAECBAgQIECAAAECBAgQIECAAAEC6QQEAOlGoiACBAgQIECAAAECBAgQIECAAAECBAgQIBAXEADEDa1AgAABAgQIECBAgAABAgQIECBAgAABAgTSCQgA0o1EQQQIECBAgAABAgQIECBAgAABAgQIECBAIC4gAIgbWoEAAQIECBAgQIAAAQIECBAgQIAAAQIECKQTEACkG4mCCBAgQIAAAQIECBAgQIAAAQIECBAgQIBAXEAAEDe0AgECBAgQIECAAAECBAgQIECAAAECBAgQSCcgAEg3EgURIECAAAECBAgQIECAAAECBAgQIECAAIG4gAAgbmgFAgQIECBAgAABAgQIECBAgAABAgQIECCQTkAAkG4kCiJAgAABAgQIECBAgAABAgQIECBAgAABAnEBAUDc0AoECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAg3UgURIAAAQIECBAgQIAAAQIECBAgQIAAAQIE4gICgLihFQgQIECAAAECBAgQIECAAAECBAgQIECAQDoBAUC6kSiIAAECBAgQIECAAAECBAgQIECAAAECBAjEBQQAcUMrECBAgAABAgQIECBAgAABAgQIECBAgACBdAICgHQjURABAgQIECBAgAABAgQIECBAgAABAgQIEIgL/AseLFj8GyK16AAAAABJRU5ErkJggg==",
- dataGrid: [
- {
- checkbox: true,
- select: "",
- radio1: "rb",
- },
- ],
+ },
+ key: 'day',
+ type: 'day',
+ input: true,
+ defaultValue: '00/00/0000',
},
- _id: "65ea36dd705068f84a93c9c3",
- _fvid: 1,
- project: "65ea3620705068f84a93c694",
- state: "submitted",
- externalIds: [
- ],
- created: "2024-03-07T21:51:25.110Z",
- modified: "2024-03-07T21:51:25.110Z",
- },
- parentNumber: 234,
- },
- owner: "65ea3601c3792e416cabcb2a",
- access: [
- ],
- metadata: {
- timezone: "America/Chicago",
- offset: -360,
- origin: "http://localhost:3000",
- referrer: "",
- browserName: "Netscape",
- userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
- pathName: "/",
- onLine: true,
- headers: {
- "accept-language": "en-US,en",
- "cache-control": "no-cache",
- connection: "keep-alive",
- origin: "http://localhost:3000",
- pragma: "no-cache",
- referer: "http://localhost:3000/",
- "sec-fetch-dest": "empty",
- "sec-fetch-mode": "cors",
- "sec-fetch-site": "same-origin",
- "sec-gpc": "1",
- "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
- accept: "application/json",
- "content-type": "application/json",
- "sec-ch-ua": "\"Chromium\";v=\"122\", \"Not(A:Brand\";v=\"24\", \"Brave\";v=\"122\"",
- "sec-ch-ua-mobile": "?0",
- "sec-ch-ua-platform": "\"macOS\"",
- host: "localhost:3000",
- "accept-encoding": "gzip, deflate, br",
- "content-length": "18055",
- },
- },
- _vnote: "",
- state: "submitted",
- form: "65ea368b705068f84a93c87a",
- };
-
- const errors: any = [];
- const context = {
- form,
- submission,
- data: submission.data,
- components: form.components,
- processors: ProcessTargets.submission,
- scope: { errors },
- config: {
- server: true
- }
- };
- processSync(context);
- submission.data = context.data;
- context.processors = ProcessTargets.evaluator;
- processSync(context);
- assert.equal(context.scope.errors.length, 0);
- });
-
- it('Should process nested form data correctly', async () => {
- const submission = {
- data: {
- submit: true,
- child: {
- data: {
- input: "4",
- output: 200,
+ {
+ label: 'Time',
+ tableView: true,
+ dataFormat: 'HH:mm:ss a',
+ validate: {
+ required: true,
+ },
+ key: 'time',
+ type: 'time',
+ input: true,
+ inputMask: '99:99',
},
- },
- },
- owner: "65df88d8a98df60a25008300",
- access: [
- ],
- metadata: {
- headers: {
- "accept-language": "en-US,en",
- "cache-control": "no-cache",
- connection: "keep-alive",
- origin: "http://localhost:3000",
- pragma: "no-cache",
- referer: "http://localhost:3000/",
- "sec-fetch-dest": "empty",
- "sec-fetch-mode": "cors",
- "sec-fetch-site": "same-origin",
- "sec-gpc": "1",
- "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
- accept: "application/json",
- "content-type": "application/json",
- "sec-ch-ua": "\"Chromium\";v=\"122\", \"Not(A:Brand\";v=\"24\", \"Brave\";v=\"122\"",
- "sec-ch-ua-mobile": "?0",
- "sec-ch-ua-platform": "\"macOS\"",
- host: "localhost:3000",
- "accept-encoding": "gzip, deflate, br",
- "content-length": "172",
- },
- },
- form: "65e74c65ef4451c9ede341e3",
- };
- const form = {
- title: "Parent Form",
- name: "parentForm",
- path: "parentform",
- type: "form",
- display: "form",
- tags: [
- ],
- deleted: null,
- access: [
- {
- type: "create_own",
- roles: [
- ],
- },
- {
- type: "create_all",
- roles: [
- ],
- },
- {
- type: "read_own",
- roles: [
- ],
+ {
+ label: 'Currency',
+ mask: false,
+ spellcheck: true,
+ tableView: false,
+ currency: 'USD',
+ inputFormat: 'plain',
+ validate: {
+ required: true,
+ },
+ key: 'currency',
+ type: 'currency',
+ input: true,
+ delimiter: true,
+ },
+ {
+ label: 'Signature',
+ tableView: false,
+ validate: {
+ required: true,
+ },
+ key: 'signature',
+ type: 'signature',
+ input: true,
+ },
+ ],
},
{
- type: "read_all",
- roles: [
+ title: 'DataGrid / EditGrid',
+ theme: 'danger',
+ breadcrumbClickable: true,
+ buttonSettings: {
+ previous: true,
+ cancel: true,
+ next: true,
+ },
+ collapsible: false,
+ key: 'page3',
+ type: 'panel',
+ label: 'DataGrid / EditGrid',
+ tableView: false,
+ input: false,
+ components: [
+ {
+ label: 'Data Grid',
+ reorder: false,
+ addAnotherPosition: 'bottom',
+ defaultOpen: false,
+ layoutFixed: false,
+ enableRowGroups: false,
+ tableView: false,
+ defaultValue: [{}],
+ key: 'dataGrid',
+ type: 'datagrid',
+ input: true,
+ components: [
{
+ label: 'Checkbox',
+ tableView: false,
+ validate: {
+ required: true,
+ },
+ key: 'checkbox',
+ type: 'checkbox',
+ input: true,
+ defaultValue: false,
},
{
+ label: 'Select',
+ widget: 'choicesjs',
+ tableView: true,
+ dataSrc: 'resource',
+ data: {
+ resource: '65e9eb1aee138974f569d619',
+ },
+ valueProperty: 'data.text',
+ template: '{{ item.data.text }}',
+ validate: {
+ select: false,
+ },
+ key: 'select',
+ type: 'select',
+ searchField: 'data.text__regex',
+ input: true,
+ addResource: false,
+ reference: false,
},
{
+ label: 'Radio',
+ optionsLabelPosition: 'right',
+ inline: false,
+ tableView: false,
+ values: [
+ {
+ label: 'Ra',
+ value: 'ra',
+ shortcut: '',
+ },
+ {
+ label: 'Rb',
+ value: 'rb',
+ shortcut: '',
+ },
+ {
+ label: 'Rc',
+ value: 'rc',
+ shortcut: '',
+ },
+ ],
+ validate: {
+ required: true,
+ },
+ key: 'radio1',
+ type: 'radio',
+ input: true,
},
- ],
- },
- {
- type: "update_own",
- roles: [
- ],
- },
- {
- type: "update_all",
- roles: [
- ],
- },
- {
- type: "delete_own",
- roles: [
- ],
- },
- {
- type: "delete_all",
- roles: [
- ],
- },
- {
- type: "team_read",
- roles: [
- ],
- },
- {
- type: "team_write",
- roles: [
- ],
+ ],
+ },
+ {
+ label: 'Edit Grid',
+ tableView: true,
+ rowDrafts: false,
+ key: 'editGrid',
+ type: 'editgrid',
+ input: true,
+ components: [
+ {
+ label: 'Date / Time',
+ tableView: true,
+ enableMinDateInput: false,
+ datePicker: {
+ disableWeekends: false,
+ disableWeekdays: false,
+ },
+ enableMaxDateInput: false,
+ validate: {
+ required: true,
+ },
+ key: 'dateTime',
+ type: 'datetime',
+ input: true,
+ widget: {
+ type: 'calendar',
+ displayInTimezone: 'viewer',
+ locale: 'en',
+ useLocaleSettings: false,
+ allowInput: true,
+ mode: 'single',
+ enableTime: true,
+ noCalendar: false,
+ format: 'yyyy-MM-dd hh:mm a',
+ hourIncrement: 1,
+ minuteIncrement: 1,
+ time_24hr: false,
+ minDate: null,
+ disableWeekends: false,
+ disableWeekdays: false,
+ maxDate: null,
+ },
+ },
+ {
+ label: 'Address',
+ tableView: true,
+ provider: 'google',
+ key: 'address',
+ type: 'address',
+ providerOptions: {
+ params: {
+ key: '',
+ region: '',
+ autocompleteOptions: {},
+ },
+ },
+ input: true,
+ components: [
+ {
+ label: 'Address 1',
+ tableView: false,
+ key: 'address1',
+ type: 'textfield',
+ input: true,
+ customConditional:
+ "show = _.get(instance, 'parent.manualMode', false);",
+ },
+ {
+ label: 'Address 2',
+ tableView: false,
+ key: 'address2',
+ type: 'textfield',
+ input: true,
+ customConditional:
+ "show = _.get(instance, 'parent.manualMode', false);",
+ },
+ {
+ label: 'City',
+ tableView: false,
+ key: 'city',
+ type: 'textfield',
+ input: true,
+ customConditional:
+ "show = _.get(instance, 'parent.manualMode', false);",
+ },
+ {
+ label: 'State',
+ tableView: false,
+ key: 'state',
+ type: 'textfield',
+ input: true,
+ customConditional:
+ "show = _.get(instance, 'parent.manualMode', false);",
+ },
+ {
+ label: 'Country',
+ tableView: false,
+ key: 'country',
+ type: 'textfield',
+ input: true,
+ customConditional:
+ "show = _.get(instance, 'parent.manualMode', false);",
+ },
+ {
+ label: 'Zip Code',
+ tableView: false,
+ key: 'zip',
+ type: 'textfield',
+ input: true,
+ customConditional:
+ "show = _.get(instance, 'parent.manualMode', false);",
+ },
+ ],
+ },
+ ],
+ },
+ ],
},
- {
- type: "team_admin",
- roles: [
- ],
+ ],
+ },
+ ],
+ },
+ ],
+ settings: {
+ share: {
+ theme: '',
+ showHeader: true,
+ },
+ },
+ properties: {},
+ project: {},
+ controller: '',
+ revisions: '',
+ submissionRevisions: '',
+ _vid: 0,
+ created: '2024-03-07T21:50:03.872Z',
+ modified: '2024-03-07T21:50:03.879Z',
+ machineName: 'authoring-oaomxjpqpoigtqg:parentFio8023',
+ __v: 0,
+ };
+ const submission = {
+ data: {
+ parentText: 'test',
+ signature:
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABgAAAACWCAYAAAAYAUMPAAAAAXNSR0IArs4c6QAAFkZJREFUeF7t3SFsHGcWB/Cv2CAo8MoTnQrCksiVysyuMFLCgwod4KXngBgWpTigsGHLTurKV3YgqlRyJK5UYrz4Tp97u9rsOWvv8+zOm29+Q6Ik+82893sf2v/OzBfz+eV/ioMAAQIECBAgQIAAAQIECBAgQIAAAQIECBBoSuALAUBT89QMAQIECBAgQIAAAQIECBAgQIAAAQIECBC4EhAA2AgECBAgQIAAAQIECBAgQIAAAQIECBAgQKBBAQFAg0PVEgECBAgQIECAAAECBAgQIECAAAECBAgQEADYAwQIECBAgAABAgQIECBAgAABAgQIECBAoEEBAUCDQ9USAQIECBAgQIAAAQIECBAgQIAAAQIECBAQANgDBAgQIECAAAECBAgQIECAAAECBAgQIECgQQEBQIND1RIBAgQIECBAgAABAgQIECBAgAABAgQIEBAA2AMECBAgQIAAAQIECBAgQIAAAQIECBAgQKBBAQFAg0PVEgECBAgQIECAAAECBAgQIECAAAECBAgQEADYAwQIECBAgAABAgQIECBAgAABAgQIECBAoEEBAUCDQ9USAQIECBAgQIAAAQIECBAgQIAAAQIECBAQANgDBAgQIECAAAECBAgQIECAAAECBAgQIECgQQEBQIND1RIBAgQIECBAgAABAgQIECBAgAABAgQIEBAA2AMECBAgQIAAAQIECBAgQIAAAQIECBAgQKBBAQFAg0PVEgECBAgQIECAAAECBAgQIECAAAECBAgQEADYAwQIECBAgAABAgQIECBAgAABAgQIECBAoEEBAUCDQ9USAQIECBAgQIAAAQIECBAgQIAAAQIECBAQANgDBAgQIECAAAECBAgQIECAAAECBAgQIECgQQEBQIND1RIBAgQIECBAgAABAgQIECBAgAABAgQIEBAA2AMECBAgQIAAAQIECBAgQIAAAQIECBAgQKBBAQFAg0PVEgECBAgQIECAAAECBAgQIECAAAECBAgQEADYA6kFjo6+LYeHT8pk8ip1nYojQIAAAQIECBAgQIAAAQIECBAgQIBANgEBQLaJqGcpMJudlz8DgKdlOv2JDAECBAgQIECAAAECBAgQIECAAAECBAhsISAA2ALLR/crsAgA6lXn88v9XtzVCBAgQIAAAQIECBAgQIAAAQIECBAgMHABAcDAB9hy+QKAlqerNwIECBAgQIAAAQIECBAgQIAAAQIEdi0gANi1sPOHBQQAYToLCRAgQIAAAQIECBAgQIAAAQIECBAgUAQANkFagdUAoL4DoL4LwEGAAAECBAgQIECAAAECBAgQIECAAAECtxMQANzOyad6EBAA9IDukgQIECBAgAABAgQIECBAgAABAgQINCMgAGhmlG02cnBw/6qxk5PjMpm8arNJXREgQIAAAQIECBAgQIAAAQIECBAgQGAHAgKAHaA6ZXcCAoDuLJ2JAAECBAgQIECAAAECBAgQIECAAIFxCQgAxjXvwXUrABjcyBRMgAABAgQIECBAgAABAgQIECBAgEASAQFAkkEo43qBRQBQXwBcXwTsIECAAAECBAgQIECAAAECBAgQIECAAIHbCQgAbufkUz0JCAB6gndZAgQIECBAgAABAgQIECBAgAABAgQGLyAAGPwI225gEQDULufzy7ab1R0BAgQIECBAgAABAgQIECBAgAABAgQ6FBAAdIjpVN0LCAC6N3VGAgQIECBAgAABAgQIECBAgAABAgTGISAAGMecb+xyNjsv9Tn72Y7VAKC+AyBjjdnM1EOAAAECBAgQIECAAAECBAgQIECAAIEqIAAY8T6oX/qfnp6V+ufiODk5Ll9//TTNF+1HR98u6xMAjHizap0AAQIECBAgQIAAAQIECBAgQIAAga0FBABbkw1/wenpm/L69dnGRp4/f1YuLi7KdPq+14ZXA4AaTkwmr3qtx8UJECBAgAABAgQIECBAgAABAgQIECAwFAEBwFAm1WGdL19+V969+/FWZ/zqq7+WN2/+3tsdAQKAW43JhwgQIECAAAECBAgQIECAAAECBAgQIPB/AgKAEW6Kx4+/KR8+/PpJ5/XZ+quPAlr9z/p/k8lxLyGAAGCEG1TLBAgQIECAAAECBAgQIECAAAECBAh0IiAA6IRxWCdZfbFu/YX/L7/8Y9nApscD9fEM/tV6ahBRa3AQIECAAAECBAgQIECAAAECBAgQIECAwM0CAoCbjZr6RP2Vf/1V/eL43Jf6n3tM0L6fwy8AaGr7aYYAAQIECBAgQIAAAQIECBAgQIAAgT0KCAD2iJ3lUqt3AGz6Vf/n7gbYZwggAMiya9RBgAABAgQIECBAgAABAgQIECBAgMDQBAQAQ5tYB/WuBgA3fZnfdwggAOhg4E5BgAABAgQIECBAgAABAgQIECBAgMAoBQQAIxz7p1+qPynT6fuNCn2+F0AAMMINqmUCBAgQIECAAAECBAgQIECAAAECBDoREAB0wjisk6w+3//evXvljz/+fWMD9d0Bp6dnpf65fsznlzeuj36gvq9gcU0vAY4qWkeAAAECBAgQIECAAAECBAgQIECAwBgFBAAjnPpdflV/3d0Au/xiXgAwwg2qZQIECBAgQIAAAQIECBAgQIAAAQIEOhEQAHTCOKyTrH+Jv+0v+PcZAggAhrW3VEuAAAECBAgQIECAAAECBAgQIECAQB4BAUCeWeytkrvcAbAo8roQ4KYXCkcaFABE1KwhQIAAAQIECBAgQIAAAQIECBAgQIBAKQKAEe6Cu94BsCkEmE5/KvWRQF0dAoCuJJ2HAAECBAgQIECAAAECBAgQIECAAIGxCQgAxjbxUkpXAUClWz/Xl1/+pfz22786U10NAHZxh0FnhToRAQIECBAgQIAAAQIECBAgQIAAAQIEkgkIAJINZB/ldBkA1HpXv6Svf3/x4ll5+/b7TloRAHTC6CQECBAgQIAAAQIECBAgQIAAAQIECIxQQAAwwqF38Q6AdbYHDx6Vi4vfl//c1a/1Dw7uL8/Z9eOFRjh6LRMgQIAAAQIECBAgQIAAAQIECBAgMCIBAcCIhr1o9eXL78q7dz8uO5/PL++sMJudX90JsHp0EQI8fPiofPz4Z7DQxfnu3KgTECBAgAABAgQIECBAgAABAgQIECBAYCACAoCBDKrLMrt+BNCitl2EAKt3Fjx//qz88EM3jxbq0tO5CBAgQIAAAQIECBAgQIAAAQIECBAgkFFAAJBxKjuuaf2Z/V3cAbApBLjLo3u8A2DHm8HpCRAgQIAAAQIECBAgQIAAAQIECBBoVkAA0OxoP9/YLgOAetX1Owzqv0VDgNVaDw+fXp3HQYAAAQIECBAgQIAAAQIECBAgQIAAAQI3CwgAbjZq7hPrAUD0y/lNMF2FAO4AaG77aYgAAQIECBAgQIAAAQIECBAgQIAAgT0JCAD2BJ3pMvsIAGq/XYQAAoBMO0ctBAgQIECAAAECBAgQIECAAAECBAgMSUAAMKRpdVTrrh8BtFrmdSHANu8cEAB0NHSnIUCAAAECBAgQIECAAAECBAgQIEBgdAICgNGNvJR9BgCVdz0E2OZZ/gcH95cTOjk5LpPJqxFOTMsECBAgQIAAAQIECBAgQIAAAQIECBDYXkAAsL3Z4Fc8fPiofPz4+7KPXbwDYB0pGgKsBgD7qHPww9UAAQIECBAgQIAAAQIECBAgQIAAAQIE/icgABjhVnjw4FG5uNhvAFCZ10OAFy+elbdvv984AQHACDeolgkQIECAAAECBAgQIECAAAECBAgQ6ERAANAJ47BOsvqleq18n4/Wmc3Orx5BtDg2PQ5o/bPuABjWPlMtAQIECBAgQIAAAQIECBAgQIAAAQL9CggA+vXv5ep9BgC14etCgMnkuNQwYPUQAPSyPVyUAAECBAgQIECAAAECBAgQIECAAIFGBAQAjQxymzb6DgAWIcDp6dlVGLA4Dg+flOn0/fLv648McgfANlP2WQIECBAgQIAAAQIECBAgQIAAAQIExi4gABjhDsgQACzY6+OAPg0Bnpb6RX891uuczy9HOC0tEyBAgAABAgQIECBAgAABAgQIECBAICYgAIi5DXrV+hfrff+y/vHjb8qHD78uTes7Cerx+vXZ8t82vStg0MNQPAECBAgQIECAAAECBAgQIECAAAECBHYkIADYEWzm064+WifLF+vrIcC6X98hReZ5qo0AAQIECBAgQIAAAQIECBAgQIAAAQLXCQgARrovFo/dWX/xbp8c63cmLGrJElL0aePaBAgQIECAAAECBAgQIECAAAECBAgQ2FZAALCtmM/vTKCGEvWdAOuHX//vjNyJCRAgQIAAAQIECBAgQIAAAQIECBBoWEAA0PBwh9ra0dHfymz2z6vy/fp/qFNUNwECBAgQIECAAAECBAgQIECAAAECfQsIAPqegOtfK1DvBvj55/MymbwiRIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAQEBQADNEgIECBAgQIAAAQIECBAgQIAAAQIECBAgkF1AAJB9QuojQIAAAQIECBAgQIAAAQIECBAgQIAAAQIBAQFAAM0SAgQIECBAgAABAgQIECBAgAABAgQIECCQXUAAkH1C6iNAgAABAgQIECBAgAABAgQIECBAgAABAgEBAUAAzRICBAgQIECAAAECBAgQIECAAAECBAgQIJBdQACQfULqI0CAAAECBAgQIECAAAECBAgQIECAAAECAYH/AuX7sgv4DBgrAAAAAElFTkSuQmCC',
+ form1: {
+ form: '65ea3662705068f84a93c781',
+ owner: '65ea3601c3792e416cabcb2a',
+ roles: [],
+ access: [],
+ metadata: {
+ selectData: {
+ form1: {
+ data: {
+ select1: {
+ label: 'Sb',
+ },
},
- ],
- submissionAccess: [
+ },
+ },
+ timezone: 'America/Chicago',
+ offset: -360,
+ origin: 'http://localhost:3000',
+ referrer: '',
+ browserName: 'Netscape',
+ userAgent:
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
+ pathName: '/',
+ onLine: true,
+ headers: {
+ host: 'localhost:3000',
+ connection: 'keep-alive',
+ 'content-length': '9020',
+ pragma: 'no-cache',
+ 'cache-control': 'no-cache',
+ 'sec-ch-ua':
+ '"Chromium";v="122", "Not(A:Brand";v="24", "Brave";v="122"',
+ accept: 'application/json',
+ 'content-type': 'application/json',
+ 'sec-ch-ua-mobile': '?0',
+ 'user-agent':
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
+ 'sec-ch-ua-platform': '"macOS"',
+ 'sec-gpc': '1',
+ 'accept-language': 'en-US,en',
+ origin: 'http://localhost:3000',
+ 'sec-fetch-site': 'same-origin',
+ 'sec-fetch-mode': 'cors',
+ 'sec-fetch-dest': 'empty',
+ referer: 'http://localhost:3000/',
+ 'accept-encoding': 'gzip, deflate, br',
+ },
+ },
+ data: {
+ number: 23,
+ checkbox: true,
+ selectBoxes1: {
+ sbA: false,
+ sbB: true,
+ sbC: false,
+ sbD: false,
+ },
+ select1: 'sb',
+ selectUrl: {
+ name: 'Alaska',
+ abbreviation: 'AK',
+ },
+ radio1: 'ra',
+ email: 'travis@form.io',
+ url: 'google.com',
+ phoneNumber: '(234) 234-2342',
+ tags: 'test',
+ address: {
+ address_components: [
{
- type: "create_own",
- roles: [
- ],
+ long_name: '12342',
+ short_name: '12342',
+ types: ['street_number'],
},
{
- type: "create_all",
- roles: [
- ],
+ long_name: 'Coit Road',
+ short_name: 'Coit Rd',
+ types: ['route'],
},
{
- type: "read_own",
- roles: [
- ],
+ long_name: 'North Dallas',
+ short_name: 'North Dallas',
+ types: ['neighborhood', 'political'],
},
{
- type: "read_all",
- roles: [
- ],
+ long_name: 'Dallas',
+ short_name: 'Dallas',
+ types: ['locality', 'political'],
},
{
- type: "update_own",
- roles: [
- ],
+ long_name: 'Dallas County',
+ short_name: 'Dallas County',
+ types: ['administrative_area_level_2', 'political'],
},
{
- type: "update_all",
- roles: [
- ],
+ long_name: 'Texas',
+ short_name: 'TX',
+ types: ['administrative_area_level_1', 'political'],
},
{
- type: "delete_own",
- roles: [
- ],
+ long_name: 'United States',
+ short_name: 'US',
+ types: ['country', 'political'],
},
{
- type: "delete_all",
- roles: [
- ],
+ long_name: '75243',
+ short_name: '75243',
+ types: ['postal_code'],
},
{
- type: "team_read",
- roles: [
- ],
+ long_name: '2308',
+ short_name: '2308',
+ types: ['postal_code_suffix'],
},
- {
- type: "team_write",
- roles: [
- ],
+ ],
+ formatted_address: '12342 Coit Rd, Dallas, TX 75243, USA',
+ geometry: {
+ location: {
+ lat: 32.9165814,
+ lng: -96.76889729999999,
},
- {
- type: "team_admin",
- roles: [
- ],
+ viewport: {
+ south: 32.9151396697085,
+ west: -96.7703730302915,
+ north: 32.9178376302915,
+ east: -96.76767506970849,
},
- ],
- owner: {
+ },
+ place_id: 'ChIJrbdWEhUgTIYRl5rVJe8Zl6A',
+ plus_code: {
+ compound_code: 'W68J+JC Dallas, TX, USA',
+ global_code: '8645W68J+JC',
+ },
+ types: ['street_address'],
+ formattedPlace: '12342 Coit Rd, Dallas, TX 75243, USA',
},
- components: [
- {
- label: "Child",
- tableView: true,
- form: "65e74c2aef4451c9ede34105",
- useOriginalRevision: false,
- reference: false,
- key: "child",
- type: "form",
- input: true,
- components: [
- {
- label: "Input",
- applyMaskOn: "change",
- tableView: true,
- key: "input",
- type: "textfield",
- input: true,
- },
- {
- label: "Output",
- applyMaskOn: "change",
- disabled: true,
- tableView: true,
- calculateValue: "value = parseInt(data.input) * 5;",
- calculateServer: true,
- key: "output",
- type: "textfield",
- input: true,
- },
- {
- type: "button",
- label: "Submit",
- key: "submit",
- disableOnInvalid: true,
- input: true,
- tableView: false,
- },
- ],
- },
- {
- type: "button",
- label: "Submit",
- key: "submit",
- disableOnInvalid: true,
- input: true,
- tableView: false,
- },
+ dateTime: '2024-03-14T17:00:00.000Z',
+ day: '03/23/2029',
+ time: '15:30:00 pm',
+ currency: 2,
+ signature:
+ 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABgAAAACWCAYAAAAYAUMPAAAAAXNSR0IArs4c6QAAFBBJREFUeF7t3bFuE1kUBuChTk2J8h4gU6ekXInnIAWu7YLUKXbrFJRs5xqLlFugFS9BRZF6V9cro6yJsePjMWfOfCOhFHjunPOdW/n3zDy5u/v6T+cgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIESgk8EQCUmqdmCBAgQIAAAQIECBAgQIAAAQIECBAgQIDASkAAYCMQIECAAAECBAgQIECAAAECBAgQIECAAIGCAgKAgkPVEgECBAgQIECAAAECBAgQIECAAAECBAgQEADYAwQIECBAgAABAgQIECBAgAABAgQIECBAoKCAAKDgULVEgAABAgQIECBAgAABAgQIECBAgAABAgQEAPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAoKCAAKDhULREgQIAAAQIECBAgQIAAAQIECBAgQIAAAQGAPUCAAAECBAgQIECAAAECBAgQIECAAAECBAoKCAAKDlVLBAgQIECAAAECBAgQIECAAAECBAgQIEBAAGAPECBAgAABAgQIECBAgAABAgQIECBAgACBggICgIJD1RIBAgQIECBAgAABAgQIECBAgAABAgQIEBAA2AMECBAgQIAAAQIECBAgQIAAAQIECBAgQKCggACg4FC1RIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBAD2AAECBAgQIECAAAECBAgQIECAAAECBAgQKCggACg4VC0RIECAAAECBAgQIECAAAECBAgQIECAAAEBgD1AgAABAgQIECBAgAABAgQIECBAgAABAgQKCggACg5VSwQIECBAgAABAgQIECBAgAABAgQIECBAQABgDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAgYICAoCCQ9USAQIECBAgQIAAAQIECBAgQIAAAQIECBAQANgDBAgQIECAAAECBAgQIECAAAECBAgQIECgoIAAoOBQtUSAAAECBAgQIECAAAECBAgQIECAAAECBAQA9gABAgQIECBAgAABAgQIECBAgAABAgQIECgoIAAoOFQtESBAgAABAgQIECBAgAABAgQIECBAgAABAYA9QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECgoIAAoOVUsECBAgQIAAAQIECBAgQIAAAQIECBAgQEAAYA8QIECAAAECBAgQIECAAAECBAgQIECAAIGCAgKAgkPVEgECBAgQIECAAAECBAgQIECAAAECBAgQEADYAwQIECBAgAABAgQIECBAgAABAgQIECBAoKCAAKDgULVEgAABAgQIECBAgAABAgQIECBAgAABAgQEAPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAoKCAAKDhULREgQIAAAQIECBAgQIAAAQIECBAgQIAAAQGAPUCAAAECBAgQIECAAAECBAgQIECAAAECBAoKCAAKDlVLBAgQIECAAAECBAgQIECAAAECBAgQIEBAAGAPECBAgAABAgQIECBAgAABAgQIECBAgACBggICgIJD1RIBAgQIECBAgAABAgQIECBAgAABAgQIEBAA2AMECBAgQIAAAQIECBAgQIAAAQIECBAgQKCggACg4FC1RIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBAD2AAECBAgQIECAAAECBAgQIECAAAECBAgQKCggACg4VC0RIECAAAECBAgQIECAAAECBAgQIECAAAEBgD1AgAABAgQIECBAgAABAgQIECBAgAABAgQKCggACg5VSwQIECBAgAABAgQIECBAgAABAgQIECBAQABgDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAgYICAoCCQ9USAQIECBAgQIAAAQIECBAgQIAAAQIECBAQANgDBAgQIECAAAECBAgQIECAAAECBAgQIECgoIAAoOBQtUSAAAECBAgQIECAAAECBAgQIECAAAECBAQA9gABAgQIECBAgAABAgQIECBAgAABAgQIECgoIAAoOFQtESBAgAABAgQIECBAgAABAgQIECBAgAABAYA9QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECgoIAAoOVUsECBAgQIAAAQIECBAgQIAAAQIECBAgQEAAYA8QIECAAAECBAgQIECAAAECBAgQIECAAIGCAgKAgkPVEgECBAgQIECAAAECBAgQIECAAAECBAgQEADYAwQIECBAgAABAgQIECBAgAABAgQIECBAoKCAAKDgULVEgAABAgQIECBAgAABAgQIECBAgAABAgQEAPYAAQIECBAgQIAAAQIECBAgQIAAAQIECBAoKCAAKDhULREgQIAAAQIECBAgQIAAAQIECBAgQIAAAQGAPUCAAAECBAgQIECAAAECBAgQIECAAAECBAoKCAAKDlVLBAgQIECAAAECBAgQIECAAAECBAgQIEBAAGAPECBAgAABAgQIECBAgAABAgQIECBAgACBggICgIJD1RIBAgQIECBAgAABAgQIECBAgAABAgQIEBAA2AMECBAgQIAAAQIECBAgQIAAAQIECBAgQKCggACg4FC1RIAAAQIECBAgQIAAAQIECBAgQIAAAQIEBAD2AAECBAgQIECAAAECBAgQIECAAAECBAgQKCggACg4VC0RIECAAAECBAgQIECAAAECBAgQIECAAAEBgD1AgAABAgQIECBAgAABAgQIECBAgAABAgQKCggACg5VSwQIECBAgAABAgQIECBAgAABAgQIECBAQABgD5xMYLn81H38+Kl7+fLF6m87lsvb1d/J5Pnq73R6ebJ6XIgAAQIECBAgQIAAAQIECBAgQIAAAQKVBQQAlaebqLfZ7F03n1/tVdFk8mIVCAgD9uLyIQIECBAgQIAAAQIECBAgQIAAAQIECDwoIACwMU4icHb29KDrrIOAFgo4CBAgQIAAAQIECBAgQIAAAQIECBAgQGB/AQHA/lY+eaBAe/TPxcWrA8/+77QWAEynb1Z/HQQIECBAgAABAgQIECBAgAABAgQIECCwW0AAsNvIJ44g8JhHAP3scoKAIwzDEgQIECBAgAABAgQIECBAgAABAgQIjEJAADCKMedosoUA66O9CHjzaC8Gbi8FbncM7DpaELBYfNj1Mf9PgAABAgQIECBAgAABAgQIECBAgACB0QoIAEY7+tyNt7Dg+vqP7tu3b1sLFQLknqHqCBAgQIAAAQIECBAgQIAAAQIECBD4tQICgF/r7+o7BNrdALPZ1da7As7Pn3VfvvzFkQABAgQIECBAgAABAgQIECBAgAABAgQ2BAQAtsQgBHYFAe1xQF4QPIhRKpIAAQIECBAgQIAAAQIECBAgQIAAgRMJCABOBO0yxxPY9kJhLwg+nrGVCBAgQIAAAQIECBAgQIAAAQIECBAYvoAAYPgzHGUH19e/dzc377vPn//+of+3b9900+nlKF00TYAAAQIECBAgQIAAAQIECBAgQIAAgbWAAMBeGLSAuwEGPT7FEyBAgAABAgQIECBAgAABAgQIECDQo4AAoEdcS59G4GfvB3A3wGlm4CoECBAgQIAAAQIECBAgQIAAAQIECOQTEADkm4mKDhRwN8CBcE4jQIAAAQIECBAgQIAAAQIECBAgQKCkgACg5FjH3dTFxauu3RWweXhJ8Lj3he4JECBAgAABAgQIECBAgAABAgQIjE1AADC2iY+kX48FGsmgtUmAAAECBAgQIECAAAECBAgQIECAwFYBAYDNUVogw2OBWg3L5W23WHwoba05AgQIECBAgAABAgQIECBAgAABAgRyCQgAcs1DNT0JbHssUN8vCW53IrRrt6Pva/VEZ1kCBAgQIECAAAECBAgQIECAAAECBAYqIAAY6OCU/XiBbY8F6vPdAPcDgHYddwE8fm7OIECAAAECBAgQIECAAAECBAgQIEDgMAEBwGFuzhqwwLYgoK9f6J+dPf2udXf3dcBySidAgAABAgQIECBAgAABAgQIECBAYEgCAoAhTUutRxV4KAjo426A+wFAuwOgXcNBgAABAgQIECBAgAABAgQIECBAgACBvgUEAH0LWz+9wENBwDHvBhAApN8CCiRAgAABAgQIECBAgAABAgQIECBQUkAAUHKsmjpEYDZ7183nV99PnUyed4vFn4cs9b9z7r+A+JjBQrgwCxAgQIAAAQIECBAgQIAAAQIECBAgUFpAAFB6vJo7RGAzCIh+ae8OgEOm4BwCBAgQIECAAAECBAgQIECAAAECBKICAoCooPPLCjwUBLRmp9PLvXveXMNLgPem80ECBAgQIECAAAECBAgQIECAAAECBIICAoAgoNNrC2x+gb/u9vz8Wff69W87w4D7v/5vL/9tLwF2ECBAgAABAgQIECBAgAABAgQIECBA4BQCAoBTKLvG4AW2BQHt8UDt2LwroL1Y+Obm/erf+mhf/rcQwEGAAAECBAgQIECAAAECBAgQIECAAIFTCAgATqHsGmUEWhDQvtxfLm9/6Gn95X77/83Dr//LbAGNECBAgAABAgQIECBAgAABAgQIEBiMgABgMKNSaCaBFgS0Yz6/2qssv/7fi8mHCBAgQIAAAQIECBAgQIAAAQIECBA4ooAA4IiYlhqfwD5BQHtM0GNeHDw+RR0TIECAAAECBAgQIECAAAECBAgQINCHgACgD1VrjlJg/egfz/kf5fg1TYAAAQIECBAgQIAAAQIECBAgQCCdgAAg3UgURIAAAQIECBAgQIAAAQIECBAgQIAAAQIE4gICgLihFQgQIECAAAECBAgQIECAAAECBAgQIECAQDoBAUC6kSiIAAECBAgQIECAAAECBAgQIECAAAECBAjEBQQAcUMrECBAgAABAgQIECBAgAABAgQIECBAgACBdAICgHQjURABAgQIECBAgAABAgQIECBAgAABAgQIEIgLCADihlYgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLpBAQA6UaiIAIECBAgQIAAAQIECBAgQIAAAQIECBAgEBcQAMQNrUCAAAECBAgQIECAAAECBAgQIECAAAECBNIJCADSjURBBAgQIECAAAECBAgQIECAAAECBAgQIEAgLiAAiBtagQABAgQIECBAgAABAgQIECBAgAABAgQIpBMQAKQbiYIIECBAgAABAgQIECBAgAABAgQIECBAgEBcQAAQN7QCAQIECBAgQIAAAQIECBAgQIAAAQIECBBIJyAASDcSBREgQIAAAQIECBAgQIAAAQIECBAgQIAAgbiAACBuaAUCBAgQIECAAAECBAgQIECAAAECBAgQIJBOQACQbiQKIkCAAAECBAgQIECAAAECBAgQIECAAAECcQEBQNzQCgQIECBAgAABAgQIECBAgAABAgQIECBAIJ2AACDdSBREgAABAgQIECBAgAABAgQIECBAgAABAgTiAgKAuKEVCBAgQIAAAQIECBAgQIAAAQIECBAgQIBAOgEBQLqRKIgAAQIECBAgQIAAAQIECBAgQIAAAQIECMQFBABxQysQIECAAAECBAgQIECAAAECBAgQIECAAIF0AgKAdCNREAECBAgQIECAAAECBAgQIECAAAECBAgQiAsIAOKGViBAgAABAgQIECBAgAABAgQIECBAgAABAukEBADpRqIgAgQIECBAgAABAgQIECBAgAABAgQIECAQFxAAxA2tQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gkIANKNREEECBAgQIAAAQIECBAgQIAAAQIECBAgQCAuIACIG1qBAAECBAgQIECAAAECBAgQIECAAAECBAikExAApBuJgggQIECAAAECBAgQIECAAAECBAgQIECAQFxAABA3tAIBAgQIECBAgAABAgQIECBAgAABAgQIEEgnIABINxIFESBAgAABAgQIECBAgAABAgQIECBAgACBuIAAIG5oBQIECBAgQIAAAQIECBAgQIAAAQIECBAgkE5AAJBuJAoiQIAAAQIECBAgQIAAAQIECBAgQIAAAQJxAQFA3NAKBAgQIECAAAECBAgQIECAAAECBAgQIEAgnYAAIN1IFESAAAECBAgQIECAAAECBAgQIECAAAECBOICAoC4oRUIECBAgAABAgQIECBAgAABAgQIECBAgEA6AQFAupEoiAABAgQIECBAgAABAgQIECBAgAABAgQIxAUEAHFDKxAgQIAAAQIECBAgQIAAAQIECBAgQIAAgXQCAoB0I1EQAQIECBAgQIAAAQIECBAgQIAAAQIECBCICwgA4oZWIECAAAECBAgQIECAAAECBAgQIECAAAEC6QQEAOlGoiACBAgQIECAAAECBAgQIECAAAECBAgQIBAXEADEDa1AgAABAgQIECBAgAABAgQIECBAgAABAgTSCQgA0o1EQQQIECBAgAABAgQIECBAgAABAgQIECBAIC4gAIgbWoEAAQIECBAgQIAAAQIECBAgQIAAAQIECKQTEACkG4mCCBAgQIAAAQIECBAgQIAAAQIECBAgQIBAXEAAEDe0AgECBAgQIECAAAECBAgQIECAAAECBAgQSCcgAEg3EgURIECAAAECBAgQIECAAAECBAgQIECAAIG4gAAgbmgFAgQIECBAgAABAgQIECBAgAABAgQIECCQTkAAkG4kCiJAgAABAgQIECBAgAABAgQIECBAgAABAnEBAUDc0AoECBAgQIAAAQIECBAgQIAAAQIECBAgQCCdgAAg3UgURIAAAQIECBAgQIAAAQIECBAgQIAAAQIE4gICgLihFQgQIECAAAECBAgQIECAAAECBAgQIECAQDoBAUC6kSiIAAECBAgQIECAAAECBAgQIECAAAECBAjEBQQAcUMrECBAgAABAgQIECBAgAABAgQIECBAgACBdAICgHQjURABAgQIECBAgAABAgQIECBAgAABAgQIEIgL/AseLFj8GyK16AAAAABJRU5ErkJggg==',
+ dataGrid: [
+ {
+ checkbox: true,
+ select: '',
+ radio1: 'rb',
+ },
],
- settings: {
+ },
+ _id: '65ea36dd705068f84a93c9c3',
+ _fvid: 1,
+ project: '65ea3620705068f84a93c694',
+ state: 'submitted',
+ externalIds: [],
+ created: '2024-03-07T21:51:25.110Z',
+ modified: '2024-03-07T21:51:25.110Z',
+ },
+ parentNumber: 234,
+ },
+ owner: '65ea3601c3792e416cabcb2a',
+ access: [],
+ metadata: {
+ timezone: 'America/Chicago',
+ offset: -360,
+ origin: 'http://localhost:3000',
+ referrer: '',
+ browserName: 'Netscape',
+ userAgent:
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
+ pathName: '/',
+ onLine: true,
+ headers: {
+ 'accept-language': 'en-US,en',
+ 'cache-control': 'no-cache',
+ connection: 'keep-alive',
+ origin: 'http://localhost:3000',
+ pragma: 'no-cache',
+ referer: 'http://localhost:3000/',
+ 'sec-fetch-dest': 'empty',
+ 'sec-fetch-mode': 'cors',
+ 'sec-fetch-site': 'same-origin',
+ 'sec-gpc': '1',
+ 'user-agent':
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
+ accept: 'application/json',
+ 'content-type': 'application/json',
+ 'sec-ch-ua':
+ '"Chromium";v="122", "Not(A:Brand";v="24", "Brave";v="122"',
+ 'sec-ch-ua-mobile': '?0',
+ 'sec-ch-ua-platform': '"macOS"',
+ host: 'localhost:3000',
+ 'accept-encoding': 'gzip, deflate, br',
+ 'content-length': '18055',
+ },
+ },
+ _vnote: '',
+ state: 'submitted',
+ form: '65ea368b705068f84a93c87a',
+ };
+
+ const errors: any = [];
+ const context = {
+ form,
+ submission,
+ data: submission.data,
+ components: form.components,
+ processors: ProcessTargets.submission,
+ scope: { errors },
+ config: {
+ server: true,
+ },
+ };
+ processSync(context);
+ submission.data = context.data;
+ context.processors = ProcessTargets.evaluator;
+ processSync(context);
+ assert.equal(context.scope.errors.length, 0);
+ });
+ it('should remove submission data not in a nested form definition', async function () {
+ const form = {
+ _id: {},
+ title: 'parent',
+ name: 'parent',
+ type: 'form',
+ components: [
+ {
+ type: 'checkbox',
+ label: 'A',
+ key: 'A',
+ input: true,
+ },
+ {
+ type: 'checkbox',
+ label: 'B',
+ key: 'B',
+ input: true,
+ },
+ {
+ key: 'child',
+ label: 'child',
+ form: 'child form',
+ type: 'form',
+ input: true,
+ reference: false,
+ clearOnHide: false,
+ components: [
+ {
+ label: 'Input',
+ key: 'input',
+ type: 'textfield',
+ input: true,
},
- properties: {
+ ],
+ },
+ ],
+ };
+ const submission = {
+ data: {
+ A: true,
+ B: true,
+ child: {
+ _id: 'submission id',
+ data: {
+ input: 'test',
+ invalid: 'invalid submission data',
+ },
+ },
+ },
+ };
+ const context = {
+ form,
+ submission,
+ data: submission.data,
+ components: form.components,
+ processors: ProcessTargets.submission,
+ scope: {},
+ config: {
+ server: true,
+ },
+ };
+ processSync(context);
+ expect(context.data).to.deep.include({
+ child: { _id: 'submission id', data: { input: 'test' } },
+ });
+ expect(context.data.child.data).to.not.have.property('invalid');
+ });
+ it('Should process nested form data correctly', async () => {
+ const submission = {
+ data: {
+ submit: true,
+ child: {
+ data: {
+ input: '4',
+ output: 200,
+ },
+ },
+ },
+ owner: '65df88d8a98df60a25008300',
+ access: [],
+ metadata: {
+ headers: {
+ 'accept-language': 'en-US,en',
+ 'cache-control': 'no-cache',
+ connection: 'keep-alive',
+ origin: 'http://localhost:3000',
+ pragma: 'no-cache',
+ referer: 'http://localhost:3000/',
+ 'sec-fetch-dest': 'empty',
+ 'sec-fetch-mode': 'cors',
+ 'sec-fetch-site': 'same-origin',
+ 'sec-gpc': '1',
+ 'user-agent':
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36',
+ accept: 'application/json',
+ 'content-type': 'application/json',
+ 'sec-ch-ua':
+ '"Chromium";v="122", "Not(A:Brand";v="24", "Brave";v="122"',
+ 'sec-ch-ua-mobile': '?0',
+ 'sec-ch-ua-platform': '"macOS"',
+ host: 'localhost:3000',
+ 'accept-encoding': 'gzip, deflate, br',
+ 'content-length': '172',
+ },
+ },
+ form: '65e74c65ef4451c9ede341e3',
+ };
+ const form = {
+ title: 'Parent Form',
+ name: 'parentForm',
+ path: 'parentform',
+ type: 'form',
+ display: 'form',
+ tags: [],
+ deleted: null,
+ access: [
+ {
+ type: 'create_own',
+ roles: [],
+ },
+ {
+ type: 'create_all',
+ roles: [],
+ },
+ {
+ type: 'read_own',
+ roles: [],
+ },
+ {
+ type: 'read_all',
+ roles: [{}, {}, {}],
+ },
+ {
+ type: 'update_own',
+ roles: [],
+ },
+ {
+ type: 'update_all',
+ roles: [],
+ },
+ {
+ type: 'delete_own',
+ roles: [],
+ },
+ {
+ type: 'delete_all',
+ roles: [],
+ },
+ {
+ type: 'team_read',
+ roles: [],
+ },
+ {
+ type: 'team_write',
+ roles: [],
+ },
+ {
+ type: 'team_admin',
+ roles: [],
+ },
+ ],
+ submissionAccess: [
+ {
+ type: 'create_own',
+ roles: [],
+ },
+ {
+ type: 'create_all',
+ roles: [],
+ },
+ {
+ type: 'read_own',
+ roles: [],
+ },
+ {
+ type: 'read_all',
+ roles: [],
+ },
+ {
+ type: 'update_own',
+ roles: [],
+ },
+ {
+ type: 'update_all',
+ roles: [],
+ },
+ {
+ type: 'delete_own',
+ roles: [],
+ },
+ {
+ type: 'delete_all',
+ roles: [],
+ },
+ {
+ type: 'team_read',
+ roles: [],
+ },
+ {
+ type: 'team_write',
+ roles: [],
+ },
+ {
+ type: 'team_admin',
+ roles: [],
+ },
+ ],
+ owner: {},
+ components: [
+ {
+ label: 'Child',
+ tableView: true,
+ form: '65e74c2aef4451c9ede34105',
+ useOriginalRevision: false,
+ reference: false,
+ key: 'child',
+ type: 'form',
+ input: true,
+ components: [
+ {
+ label: 'Input',
+ applyMaskOn: 'change',
+ tableView: true,
+ key: 'input',
+ type: 'textfield',
+ input: true,
},
- project: {
+ {
+ label: 'Output',
+ applyMaskOn: 'change',
+ disabled: true,
+ tableView: true,
+ calculateValue: 'value = parseInt(data.input) * 5;',
+ calculateServer: true,
+ key: 'output',
+ type: 'textfield',
+ input: true,
},
- controller: "",
- revisions: "",
- submissionRevisions: "",
- _vid: 0,
- created: "2024-03-05T16:46:29.859Z",
- modified: "2024-03-05T18:50:08.638Z",
- machineName: "tzcuqutdtlpgicr:parentForm",
- __v: 1,
- config: {
- appUrl: "http://localhost:3000/tzcuqutdtlpgicr",
+ {
+ type: 'button',
+ label: 'Submit',
+ key: 'submit',
+ disableOnInvalid: true,
+ input: true,
+ tableView: false,
},
- };
- const context = {
- form,
- submission,
- data: submission.data,
- components: form.components,
- processors: ProcessTargets.evaluator,
- scope: {},
- config: {
- server: true
- }
- };
- processSync(context);
- expect(context.data.child.data.output).to.equal(20);
- });
+ ],
+ },
+ {
+ type: 'button',
+ label: 'Submit',
+ key: 'submit',
+ disableOnInvalid: true,
+ input: true,
+ tableView: false,
+ },
+ ],
+ settings: {},
+ properties: {},
+ project: {},
+ controller: '',
+ revisions: '',
+ submissionRevisions: '',
+ _vid: 0,
+ created: '2024-03-05T16:46:29.859Z',
+ modified: '2024-03-05T18:50:08.638Z',
+ machineName: 'tzcuqutdtlpgicr:parentForm',
+ __v: 1,
+ config: {
+ appUrl: 'http://localhost:3000/tzcuqutdtlpgicr',
+ },
+ };
+ const context = {
+ form,
+ submission,
+ data: submission.data,
+ components: form.components,
+ processors: ProcessTargets.evaluator,
+ scope: {},
+ config: {
+ server: true,
+ },
+ };
+ processSync(context);
+ expect(context.data.child.data.output).to.equal(20);
+ });
- it('Should process nested data correctly.', async () => {
- const form = {
- _id: {
+ it('Should process nested data correctly.', async () => {
+ const form = {
+ _id: {},
+ title: 'parent',
+ name: 'parent',
+ path: 'parent',
+ type: 'form',
+ display: 'form',
+ tags: [],
+ deleted: null,
+ access: [
+ {
+ type: 'read_all',
+ roles: [{}, {}, {}],
+ },
+ ],
+ submissionAccess: [],
+ owner: {},
+ components: [
+ {
+ type: 'checkbox',
+ label: 'Show A',
+ key: 'showA',
+ input: true,
+ },
+ {
+ type: 'checkbox',
+ label: 'Show B',
+ key: 'showB',
+ input: true,
+ },
+ {
+ type: 'checkbox',
+ label: 'Show C',
+ key: 'showC',
+ input: true,
+ },
+ {
+ type: 'form',
+ form: '65e8786fc5dacf667eef12d2',
+ label: 'Child A',
+ key: 'childA',
+ input: true,
+ conditional: {
+ show: true,
+ when: 'showA',
+ eq: true,
+ },
+ components: [
+ {
+ type: 'textfield',
+ label: 'A',
+ key: 'a',
+ validate: {
+ required: true,
+ },
+ input: true,
},
- title: "parent",
- name: "parent",
- path: "parent",
- type: "form",
- display: "form",
- tags: [
- ],
- deleted: null,
- access: [
- {
- type: "read_all",
- roles: [
- {
- },
- {
- },
- {
- },
- ],
- },
- ],
- submissionAccess: [
- ],
- owner: {
+ {
+ type: 'textfield',
+ label: 'B',
+ key: 'b',
+ input: true,
},
- components: [
- {
- type: "checkbox",
- label: "Show A",
- key: "showA",
- input: true,
- },
- {
- type: "checkbox",
- label: "Show B",
- key: "showB",
- input: true,
- },
- {
- type: "checkbox",
- label: "Show C",
- key: "showC",
- input: true,
- },
- {
- type: "form",
- form: "65e8786fc5dacf667eef12d2",
- label: "Child A",
- key: "childA",
- input: true,
- conditional: {
- show: true,
- when: "showA",
- eq: true,
- },
- components: [
- {
- type: "textfield",
- label: "A",
- key: "a",
- validate: {
- required: true,
- },
- input: true,
- },
- {
- type: "textfield",
- label: "B",
- key: "b",
- input: true,
- },
- ],
- },
- {
- type: "form",
- form: "65e8786fc5dacf667eef12e0",
- label: "Child B",
- key: "childB",
- input: true,
- conditional: {
- show: true,
- when: "showB",
- eq: true,
- },
- components: [
- {
- type: "textfield",
- label: "C",
- key: "c",
- input: true,
- validate: {
- required: true,
- },
- },
- {
- type: "textfield",
- label: "D",
- key: "d",
- input: true,
- },
- ],
- },
- {
- type: "form",
- form: "65e8786fc5dacf667eef12ee",
- label: "Child C",
- key: "childC",
- conditional: {
- show: true,
- when: "showC",
- eq: true,
- },
- input: true,
- components: [
- {
- type: "textfield",
- label: "E",
- key: "e",
- input: true,
- validate: {
- required: true,
- },
- },
- {
- type: "textfield",
- label: "F",
- key: "f",
- input: true,
- },
- ],
- },
- ],
- created: "2024-03-06T14:06:39.724Z",
- modified: "2024-03-06T14:06:39.726Z",
- machineName: "parent",
- __v: 0,
- };
- const submission = {
- data: {
- showA: true,
- showB: true,
- showC: true,
- childA: {
- data: {
- a: "One",
- b: "Two",
- },
- },
- childB: {
- data: {
- c: "Three",
- d: "Four",
- },
- },
- childC: {
- data: {
- e: "Five",
- f: "Six",
- },
- },
+ ],
+ },
+ {
+ type: 'form',
+ form: '65e8786fc5dacf667eef12e0',
+ label: 'Child B',
+ key: 'childB',
+ input: true,
+ conditional: {
+ show: true,
+ when: 'showB',
+ eq: true,
+ },
+ components: [
+ {
+ type: 'textfield',
+ label: 'C',
+ key: 'c',
+ input: true,
+ validate: {
+ required: true,
+ },
},
- owner: "65e87843c5dacf667eeeecc1",
- access: [
- ],
- metadata: {
- headers: {
- host: "127.0.0.1:64851",
- "accept-encoding": "gzip, deflate",
- "content-type": "application/json",
- "content-length": "173",
- connection: "close",
- },
+ {
+ type: 'textfield',
+ label: 'D',
+ key: 'd',
+ input: true,
},
- form: "65e8786fc5dacf667eef12fc",
- };
-
- const errors: any = [];
- const context = {
- form,
- submission,
- data: submission.data,
- components: form.components,
- processors: ProcessTargets.submission,
- scope: { errors },
- config: {
- server: true
- }
- };
- processSync(context);
- submission.data = context.data;
- context.processors = ProcessTargets.evaluator;
- processSync(context);
- assert.equal(context.scope.errors.length, 0);
- assert.equal(context.data.showA, true);
- assert.equal(context.data.showB, true);
- assert.equal(context.data.showC, true);
- assert.deepEqual(context.data.childA.data, {
+ ],
+ },
+ {
+ type: 'form',
+ form: '65e8786fc5dacf667eef12ee',
+ label: 'Child C',
+ key: 'childC',
+ conditional: {
+ show: true,
+ when: 'showC',
+ eq: true,
+ },
+ input: true,
+ components: [
+ {
+ type: 'textfield',
+ label: 'E',
+ key: 'e',
+ input: true,
+ validate: {
+ required: true,
+ },
+ },
+ {
+ type: 'textfield',
+ label: 'F',
+ key: 'f',
+ input: true,
+ },
+ ],
+ },
+ ],
+ created: '2024-03-06T14:06:39.724Z',
+ modified: '2024-03-06T14:06:39.726Z',
+ machineName: 'parent',
+ __v: 0,
+ };
+ const submission = {
+ data: {
+ showA: true,
+ showB: true,
+ showC: true,
+ childA: {
+ data: {
a: 'One',
- b: 'Two'
- });
- assert.deepEqual(context.data.childB.data, {
+ b: 'Two',
+ },
+ },
+ childB: {
+ data: {
c: 'Three',
- d: 'Four'
- });
- assert.deepEqual(context.data.childC.data, {
+ d: 'Four',
+ },
+ },
+ childC: {
+ data: {
e: 'Five',
- f: 'Six'
- });
+ f: 'Six',
+ },
+ },
+ },
+ owner: '65e87843c5dacf667eeeecc1',
+ access: [],
+ metadata: {
+ headers: {
+ host: '127.0.0.1:64851',
+ 'accept-encoding': 'gzip, deflate',
+ 'content-type': 'application/json',
+ 'content-length': '173',
+ connection: 'close',
+ },
+ },
+ form: '65e8786fc5dacf667eef12fc',
+ };
+
+ const errors: any = [];
+ const context = {
+ form,
+ submission,
+ data: submission.data,
+ components: form.components,
+ processors: ProcessTargets.submission,
+ scope: { errors },
+ config: {
+ server: true,
+ },
+ };
+ processSync(context);
+ submission.data = context.data;
+ context.processors = ProcessTargets.evaluator;
+ processSync(context);
+ assert.equal(context.scope.errors.length, 0);
+ assert.equal(context.data.showA, true);
+ assert.equal(context.data.showB, true);
+ assert.equal(context.data.showC, true);
+ assert.deepEqual(context.data.childA.data, {
+ a: 'One',
+ b: 'Two',
+ });
+ assert.deepEqual(context.data.childB.data, {
+ c: 'Three',
+ d: 'Four',
});
+ assert.deepEqual(context.data.childC.data, {
+ e: 'Five',
+ f: 'Six',
+ });
+ });
- it('Should allow the submission to go through if the subform is conditionally hidden', async () => {
- const form = {
- _id: {
+ it('Should allow the submission to go through if the subform is conditionally hidden', async () => {
+ const form = {
+ _id: {},
+ title: 'parent',
+ name: 'parent',
+ path: 'parent',
+ type: 'form',
+ display: 'form',
+ tags: [],
+ deleted: null,
+ access: [
+ {
+ type: 'read_all',
+ roles: [{}, {}, {}],
+ },
+ ],
+ submissionAccess: [],
+ owner: {},
+ components: [
+ {
+ type: 'checkbox',
+ label: 'Show A',
+ key: 'showA',
+ input: true,
+ },
+ {
+ type: 'checkbox',
+ label: 'Show B',
+ key: 'showB',
+ input: true,
+ },
+ {
+ type: 'checkbox',
+ label: 'Show C',
+ key: 'showC',
+ input: true,
+ },
+ {
+ type: 'form',
+ form: '65e8786fc5dacf667eef12d2',
+ label: 'Child A',
+ key: 'childA',
+ input: true,
+ conditional: {
+ show: true,
+ when: 'showA',
+ eq: true,
+ },
+ components: [
+ {
+ type: 'textfield',
+ label: 'A',
+ key: 'a',
+ validate: {
+ required: true,
+ },
+ input: true,
},
- title: "parent",
- name: "parent",
- path: "parent",
- type: "form",
- display: "form",
- tags: [
- ],
- deleted: null,
- access: [
- {
- type: "read_all",
- roles: [
- {
- },
- {
- },
- {
- },
- ],
- },
- ],
- submissionAccess: [
- ],
- owner: {
+ {
+ type: 'textfield',
+ label: 'B',
+ key: 'b',
+ input: true,
},
- components: [
- {
- type: "checkbox",
- label: "Show A",
- key: "showA",
- input: true,
- },
- {
- type: "checkbox",
- label: "Show B",
- key: "showB",
- input: true,
- },
- {
- type: "checkbox",
- label: "Show C",
- key: "showC",
- input: true,
- },
- {
- type: "form",
- form: "65e8786fc5dacf667eef12d2",
- label: "Child A",
- key: "childA",
- input: true,
- conditional: {
- show: true,
- when: "showA",
- eq: true,
- },
- components: [
- {
- type: "textfield",
- label: "A",
- key: "a",
- validate: {
- required: true,
- },
- input: true,
- },
- {
- type: "textfield",
- label: "B",
- key: "b",
- input: true,
- },
- ],
- },
- {
- type: "form",
- form: "65e8786fc5dacf667eef12e0",
- label: "Child B",
- key: "childB",
- input: true,
- conditional: {
- show: true,
- when: "showB",
- eq: true,
- },
- components: [
- {
- type: "textfield",
- label: "C",
- key: "c",
- input: true,
- validate: {
- required: true,
- },
- },
- {
- type: "textfield",
- label: "D",
- key: "d",
- input: true,
- },
- ],
- },
- {
- type: "form",
- form: "65e8786fc5dacf667eef12ee",
- label: "Child C",
- key: "childC",
- conditional: {
- show: true,
- when: "showC",
- eq: true,
- },
- input: true,
- components: [
- {
- type: "textfield",
- label: "E",
- key: "e",
- input: true,
- validate: {
- required: true,
- },
- },
- {
- type: "textfield",
- label: "F",
- key: "f",
- input: true,
- },
- ],
- },
- ],
- created: "2024-03-06T14:06:39.724Z",
- modified: "2024-03-06T14:06:39.726Z",
- machineName: "parent",
- __v: 0,
- };
- const submission = {
- data: {
- showA: false,
- showB: true,
- showC: true,
- childB: {
- data: {
- c: 'Three',
- d: 'Four'
- }
- },
- childC: {
- data: {
- e: 'Five',
- f: 'Six'
- }
- }
+ ],
+ },
+ {
+ type: 'form',
+ form: '65e8786fc5dacf667eef12e0',
+ label: 'Child B',
+ key: 'childB',
+ input: true,
+ conditional: {
+ show: true,
+ when: 'showB',
+ eq: true,
+ },
+ components: [
+ {
+ type: 'textfield',
+ label: 'C',
+ key: 'c',
+ input: true,
+ validate: {
+ required: true,
+ },
},
- owner: "65e87843c5dacf667eeeecc1",
- access: [
- ],
- metadata: {
- headers: {
- host: "127.0.0.1:64851",
- "accept-encoding": "gzip, deflate",
- "content-type": "application/json",
- "content-length": "173",
- connection: "close",
- },
+ {
+ type: 'textfield',
+ label: 'D',
+ key: 'd',
+ input: true,
},
- form: "65e8786fc5dacf667eef12fc",
- };
-
- const errors: any = [];
- const context = {
- form,
- submission,
- data: submission.data,
- components: form.components,
- processors: ProcessTargets.submission,
- scope: { errors },
- config: {
- server: true
- }
- };
- processSync(context);
- submission.data = context.data;
- context.processors = ProcessTargets.evaluator;
- processSync(context);
- assert.equal(context.scope.errors.length, 0);
- assert.equal(context.data.showA, false);
- assert.equal(context.data.showB, true);
- assert.equal(context.data.showC, true);
- assert(!context.data.hasOwnProperty('childA'), 'The childA form should not be present.');
- assert.deepEqual(context.data.childB.data, {
+ ],
+ },
+ {
+ type: 'form',
+ form: '65e8786fc5dacf667eef12ee',
+ label: 'Child C',
+ key: 'childC',
+ conditional: {
+ show: true,
+ when: 'showC',
+ eq: true,
+ },
+ input: true,
+ components: [
+ {
+ type: 'textfield',
+ label: 'E',
+ key: 'e',
+ input: true,
+ validate: {
+ required: true,
+ },
+ },
+ {
+ type: 'textfield',
+ label: 'F',
+ key: 'f',
+ input: true,
+ },
+ ],
+ },
+ ],
+ created: '2024-03-06T14:06:39.724Z',
+ modified: '2024-03-06T14:06:39.726Z',
+ machineName: 'parent',
+ __v: 0,
+ };
+ const submission = {
+ data: {
+ showA: false,
+ showB: true,
+ showC: true,
+ childB: {
+ data: {
c: 'Three',
- d: 'Four'
- });
- assert.deepEqual(context.data.childC.data, {
+ d: 'Four',
+ },
+ },
+ childC: {
+ data: {
e: 'Five',
- f: 'Six'
- });
- });
+ f: 'Six',
+ },
+ },
+ },
+ owner: '65e87843c5dacf667eeeecc1',
+ access: [],
+ metadata: {
+ headers: {
+ host: '127.0.0.1:64851',
+ 'accept-encoding': 'gzip, deflate',
+ 'content-type': 'application/json',
+ 'content-length': '173',
+ connection: 'close',
+ },
+ },
+ form: '65e8786fc5dacf667eef12fc',
+ };
- it('Should process data within a fieldset properly.', async () => {
- const submission = {
- data: {
- firstName: 'Joe',
- lastName: 'Smith'
- }
- };
- const form = {
- components: [
- {
- type: 'fieldset',
- key: 'name',
- input: false,
- components: [
- {
- type: 'textfield',
- key: 'firstName',
- input: true
- },
- {
- type: 'textfield',
- key: 'lastName',
- input: true
- }
- ]
- }
- ]
- };
- const context = {
- form,
- submission,
- data: submission.data,
- components: form.components,
- processors: ProcessTargets.submission,
- scope: {},
- config: {
- server: true
- }
- };
- processSync(context);
- expect(context.data.firstName).to.equal('Joe');
- expect(context.data.lastName).to.equal('Smith');
+ const errors: any = [];
+ const context = {
+ form,
+ submission,
+ data: submission.data,
+ components: form.components,
+ processors: ProcessTargets.submission,
+ scope: { errors },
+ config: {
+ server: true,
+ },
+ };
+ processSync(context);
+ submission.data = context.data;
+ context.processors = ProcessTargets.evaluator;
+ processSync(context);
+ assert.equal(context.scope.errors.length, 0);
+ assert.equal(context.data.showA, false);
+ assert.equal(context.data.showB, true);
+ assert.equal(context.data.showC, true);
+ assert(
+ !context.data.hasOwnProperty('childA'),
+ 'The childA form should not be present.'
+ );
+ assert.deepEqual(context.data.childB.data, {
+ c: 'Three',
+ d: 'Four',
+ });
+ assert.deepEqual(context.data.childC.data, {
+ e: 'Five',
+ f: 'Six',
});
+ });
- it('Requires a conditionally visible field', async () => {
- const form = {
- components: [
- {
- "input": true,
- "tableView": true,
- "inputType": "radio",
- "label": "Selector",
- "key": "selector",
- "values": [
- {
- "value": "one",
- "label": "One"
- },
- {
- "value": "two",
- "label": "Two"
- }
- ],
- "defaultValue": "",
- "protected": false,
- "persistent": true,
- "validate": {
- "required": false,
- "custom": "",
- "customPrivate": false
- },
- "type": "radio",
- "conditional": {
- "show": "",
- "when": null,
- "eq": ""
- }
- },
- {
- "input": true,
- "tableView": true,
- "inputType": "text",
- "inputMask": "",
- "label": "Required Field",
- "key": "requiredField",
- "placeholder": "",
- "prefix": "",
- "suffix": "",
- "multiple": false,
- "defaultValue": "",
- "protected": false,
- "unique": false,
- "persistent": true,
- "validate": {
- "required": true,
- "minLength": "",
- "maxLength": "",
- "pattern": "",
- "custom": "",
- "customPrivate": false
- },
- "conditional": {
- "show": "true",
- "when": "selector",
- "eq": "two"
- },
- "type": "textfield"
- }
- ]
- }
+ it('Should process data within a fieldset properly.', async () => {
+ const submission = {
+ data: {
+ firstName: 'Joe',
+ lastName: 'Smith',
+ },
+ };
+ const form = {
+ components: [
+ {
+ type: 'fieldset',
+ key: 'name',
+ input: false,
+ components: [
+ {
+ type: 'textfield',
+ key: 'firstName',
+ input: true,
+ },
+ {
+ type: 'textfield',
+ key: 'lastName',
+ input: true,
+ },
+ ],
+ },
+ ],
+ };
+ const context = {
+ form,
+ submission,
+ data: submission.data,
+ components: form.components,
+ processors: ProcessTargets.submission,
+ scope: {},
+ config: {
+ server: true,
+ },
+ };
+ processSync(context);
+ expect(context.data.firstName).to.equal('Joe');
+ expect(context.data.lastName).to.equal('Smith');
+ });
- const submission = { data: { selector: 'two' } }
- const errors: any = [];
- const context = {
- form,
- submission,
- data: submission.data,
- components: form.components,
- processors: ProcessTargets.evaluator,
- scope: { errors },
- config: {
- server: true
- }
- };
- processSync(context);
- assert.equal(context.scope.errors.length, 1);
- assert.equal(context.scope.errors[0].errorKeyOrMessage, 'required');
- assert.equal(context.scope.errors[0].context.path, 'requiredField');
- });
+ it('Requires a conditionally visible field', async () => {
+ const form = {
+ components: [
+ {
+ input: true,
+ tableView: true,
+ inputType: 'radio',
+ label: 'Selector',
+ key: 'selector',
+ values: [
+ {
+ value: 'one',
+ label: 'One',
+ },
+ {
+ value: 'two',
+ label: 'Two',
+ },
+ ],
+ defaultValue: '',
+ protected: false,
+ persistent: true,
+ validate: {
+ required: false,
+ custom: '',
+ customPrivate: false,
+ },
+ type: 'radio',
+ conditional: {
+ show: '',
+ when: null,
+ eq: '',
+ },
+ },
+ {
+ input: true,
+ tableView: true,
+ inputType: 'text',
+ inputMask: '',
+ label: 'Required Field',
+ key: 'requiredField',
+ placeholder: '',
+ prefix: '',
+ suffix: '',
+ multiple: false,
+ defaultValue: '',
+ protected: false,
+ unique: false,
+ persistent: true,
+ validate: {
+ required: true,
+ minLength: '',
+ maxLength: '',
+ pattern: '',
+ custom: '',
+ customPrivate: false,
+ },
+ conditional: {
+ show: 'true',
+ when: 'selector',
+ eq: 'two',
+ },
+ type: 'textfield',
+ },
+ ],
+ };
- it('Doesn\'t require a conditionally hidden field', async () => {
- const form = {
- components: [
- {
- "input": true,
- "tableView": true,
- "inputType": "radio",
- "label": "Selector",
- "key": "selector",
- "values": [
- {
- "value": "one",
- "label": "One"
- },
- {
- "value": "two",
- "label": "Two"
- }
- ],
- "defaultValue": "",
- "protected": false,
- "persistent": true,
- "validate": {
- "required": false,
- "custom": "",
- "customPrivate": false
- },
- "type": "radio",
- "conditional": {
- "show": "",
- "when": null,
- "eq": ""
- }
- },
- {
- "input": true,
- "tableView": true,
- "inputType": "text",
- "inputMask": "",
- "label": "Required Field",
- "key": "requiredField",
- "placeholder": "",
- "prefix": "",
- "suffix": "",
- "multiple": false,
- "defaultValue": "",
- "protected": false,
- "unique": false,
- "persistent": true,
- "validate": {
- "required": true,
- "minLength": "",
- "maxLength": "",
- "pattern": "",
- "custom": "",
- "customPrivate": false
- },
- "conditional": {
- "show": "true",
- "when": "selector",
- "eq": "two"
- },
- "type": "textfield"
- }
- ]
- };
+ const submission = { data: { selector: 'two' } };
+ const errors: any = [];
+ const context = {
+ form,
+ submission,
+ data: submission.data,
+ components: form.components,
+ processors: ProcessTargets.evaluator,
+ scope: { errors },
+ config: {
+ server: true,
+ },
+ };
+ processSync(context);
+ assert.equal(context.scope.errors.length, 1);
+ assert.equal(context.scope.errors[0].errorKeyOrMessage, 'required');
+ assert.equal(context.scope.errors[0].context.path, 'requiredField');
+ });
- const submission = {
- data: {
- selector: 'one'
- }
- };
+ it("Doesn't require a conditionally hidden field", async () => {
+ const form = {
+ components: [
+ {
+ input: true,
+ tableView: true,
+ inputType: 'radio',
+ label: 'Selector',
+ key: 'selector',
+ values: [
+ {
+ value: 'one',
+ label: 'One',
+ },
+ {
+ value: 'two',
+ label: 'Two',
+ },
+ ],
+ defaultValue: '',
+ protected: false,
+ persistent: true,
+ validate: {
+ required: false,
+ custom: '',
+ customPrivate: false,
+ },
+ type: 'radio',
+ conditional: {
+ show: '',
+ when: null,
+ eq: '',
+ },
+ },
+ {
+ input: true,
+ tableView: true,
+ inputType: 'text',
+ inputMask: '',
+ label: 'Required Field',
+ key: 'requiredField',
+ placeholder: '',
+ prefix: '',
+ suffix: '',
+ multiple: false,
+ defaultValue: '',
+ protected: false,
+ unique: false,
+ persistent: true,
+ validate: {
+ required: true,
+ minLength: '',
+ maxLength: '',
+ pattern: '',
+ custom: '',
+ customPrivate: false,
+ },
+ conditional: {
+ show: 'true',
+ when: 'selector',
+ eq: 'two',
+ },
+ type: 'textfield',
+ },
+ ],
+ };
- const errors: any = [];
- const context = {
- form,
- submission,
- data: submission.data,
- components: form.components,
- processors: ProcessTargets.evaluator,
- scope: { errors },
- config: {
- server: true
- }
- };
- processSync(context);
- assert.equal(context.scope.errors.length, 0);
- });
+ const submission = {
+ data: {
+ selector: 'one',
+ },
+ };
- it('Allows a conditionally required field', async () => {
- const form = {
- components: [
- {
- "input": true,
- "tableView": true,
- "inputType": "radio",
- "label": "Selector",
- "key": "selector",
- "values": [
- {
- "value": "one",
- "label": "One"
- },
- {
- "value": "two",
- "label": "Two"
- }
- ],
- "defaultValue": "",
- "protected": false,
- "persistent": true,
- "validate": {
- "required": false,
- "custom": "",
- "customPrivate": false
- },
- "type": "radio",
- "conditional": {
- "show": "",
- "when": null,
- "eq": ""
- }
- },
- {
- "input": true,
- "tableView": true,
- "inputType": "text",
- "inputMask": "",
- "label": "Required Field",
- "key": "requiredField",
- "placeholder": "",
- "prefix": "",
- "suffix": "",
- "multiple": false,
- "defaultValue": "",
- "protected": false,
- "unique": false,
- "persistent": true,
- "validate": {
- "required": true,
- "minLength": "",
- "maxLength": "",
- "pattern": "",
- "custom": "",
- "customPrivate": false
- },
- "conditional": {
- "show": "true",
- "when": "selector",
- "eq": "two"
- },
- "type": "textfield"
- }
- ]
- };
+ const errors: any = [];
+ const context = {
+ form,
+ submission,
+ data: submission.data,
+ components: form.components,
+ processors: ProcessTargets.evaluator,
+ scope: { errors },
+ config: {
+ server: true,
+ },
+ };
+ processSync(context);
+ assert.equal(context.scope.errors.length, 0);
+ });
- const submission = {
- data: {
- selector: 'two',
- requiredField: 'Has a value'
- }
- };
+ it('Allows a conditionally required field', async () => {
+ const form = {
+ components: [
+ {
+ input: true,
+ tableView: true,
+ inputType: 'radio',
+ label: 'Selector',
+ key: 'selector',
+ values: [
+ {
+ value: 'one',
+ label: 'One',
+ },
+ {
+ value: 'two',
+ label: 'Two',
+ },
+ ],
+ defaultValue: '',
+ protected: false,
+ persistent: true,
+ validate: {
+ required: false,
+ custom: '',
+ customPrivate: false,
+ },
+ type: 'radio',
+ conditional: {
+ show: '',
+ when: null,
+ eq: '',
+ },
+ },
+ {
+ input: true,
+ tableView: true,
+ inputType: 'text',
+ inputMask: '',
+ label: 'Required Field',
+ key: 'requiredField',
+ placeholder: '',
+ prefix: '',
+ suffix: '',
+ multiple: false,
+ defaultValue: '',
+ protected: false,
+ unique: false,
+ persistent: true,
+ validate: {
+ required: true,
+ minLength: '',
+ maxLength: '',
+ pattern: '',
+ custom: '',
+ customPrivate: false,
+ },
+ conditional: {
+ show: 'true',
+ when: 'selector',
+ eq: 'two',
+ },
+ type: 'textfield',
+ },
+ ],
+ };
- const errors: any = [];
- const context = {
- form,
- submission,
- data: submission.data,
- components: form.components,
- processors: ProcessTargets.evaluator,
- scope: { errors },
- config: {
- server: true
- }
- };
- processSync(context);
- assert.equal(context.scope.errors.length, 0);
- });
+ const submission = {
+ data: {
+ selector: 'two',
+ requiredField: 'Has a value',
+ },
+ };
- it('Ignores conditionally hidden fields', async () => {
- const form = {
- components: [
- {
- "input": true,
- "tableView": true,
- "inputType": "radio",
- "label": "Selector",
- "key": "selector",
- "values": [
- {
- "value": "one",
- "label": "One"
- },
- {
- "value": "two",
- "label": "Two"
- }
- ],
- "defaultValue": "",
- "protected": false,
- "persistent": true,
- "validate": {
- "required": false,
- "custom": "",
- "customPrivate": false
- },
- "type": "radio",
- "conditional": {
- "show": "",
- "when": null,
- "eq": ""
- }
- },
- {
- "input": true,
- "tableView": true,
- "inputType": "text",
- "inputMask": "",
- "label": "Required Field",
- "key": "requiredField",
- "placeholder": "",
- "prefix": "",
- "suffix": "",
- "multiple": false,
- "defaultValue": "",
- "protected": false,
- "unique": false,
- "persistent": true,
- "validate": {
- "required": true,
- "minLength": "",
- "maxLength": "",
- "pattern": "",
- "custom": "",
- "customPrivate": false
- },
- "conditional": {
- "show": "true",
- "when": "selector",
- "eq": "two"
- },
- "type": "textfield"
- }
- ]
- };
+ const errors: any = [];
+ const context = {
+ form,
+ submission,
+ data: submission.data,
+ components: form.components,
+ processors: ProcessTargets.evaluator,
+ scope: { errors },
+ config: {
+ server: true,
+ },
+ };
+ processSync(context);
+ assert.equal(context.scope.errors.length, 0);
+ });
- const submission = {
- data: {
- selector: 'one',
- requiredField: 'Has a value'
- }
- };
+ it('Ignores conditionally hidden fields', async () => {
+ const form = {
+ components: [
+ {
+ input: true,
+ tableView: true,
+ inputType: 'radio',
+ label: 'Selector',
+ key: 'selector',
+ values: [
+ {
+ value: 'one',
+ label: 'One',
+ },
+ {
+ value: 'two',
+ label: 'Two',
+ },
+ ],
+ defaultValue: '',
+ protected: false,
+ persistent: true,
+ validate: {
+ required: false,
+ custom: '',
+ customPrivate: false,
+ },
+ type: 'radio',
+ conditional: {
+ show: '',
+ when: null,
+ eq: '',
+ },
+ },
+ {
+ input: true,
+ tableView: true,
+ inputType: 'text',
+ inputMask: '',
+ label: 'Required Field',
+ key: 'requiredField',
+ placeholder: '',
+ prefix: '',
+ suffix: '',
+ multiple: false,
+ defaultValue: '',
+ protected: false,
+ unique: false,
+ persistent: true,
+ validate: {
+ required: true,
+ minLength: '',
+ maxLength: '',
+ pattern: '',
+ custom: '',
+ customPrivate: false,
+ },
+ conditional: {
+ show: 'true',
+ when: 'selector',
+ eq: 'two',
+ },
+ type: 'textfield',
+ },
+ ],
+ };
- const errors: any = [];
- const context = {
- form,
- submission,
- data: submission.data,
- components: form.components,
- processors: ProcessTargets.evaluator,
- scope: { errors },
- config: {
- server: true
- }
- };
- processSync(context);
- assert.deepEqual(context.data, { selector: 'one' });
- assert.equal(context.scope.errors.length, 0);
- });
+ const submission = {
+ data: {
+ selector: 'one',
+ requiredField: 'Has a value',
+ },
+ };
+
+ const errors: any = [];
+ const context = {
+ form,
+ submission,
+ data: submission.data,
+ components: form.components,
+ processors: ProcessTargets.evaluator,
+ scope: { errors },
+ config: {
+ server: true,
+ },
+ };
+ processSync(context);
+ assert.deepEqual(context.data, { selector: 'one' });
+ assert.equal(context.scope.errors.length, 0);
+ });
+
+ it('Requires a conditionally visible field in a panel', async () => {
+ const form = {
+ components: [
+ {
+ input: true,
+ tableView: true,
+ inputType: 'radio',
+ label: 'Selector',
+ key: 'selector',
+ values: [
+ {
+ value: 'one',
+ label: 'One',
+ },
+ {
+ value: 'two',
+ label: 'Two',
+ },
+ ],
+ defaultValue: '',
+ protected: false,
+ persistent: true,
+ validate: {
+ required: false,
+ custom: '',
+ customPrivate: false,
+ },
+ type: 'radio',
+ conditional: {
+ show: '',
+ when: null,
+ eq: '',
+ },
+ },
+ {
+ input: false,
+ title: 'Panel',
+ theme: 'default',
+ components: [
+ {
+ input: true,
+ tableView: true,
+ inputType: 'text',
+ inputMask: '',
+ label: 'Required Field',
+ key: 'requiredField',
+ placeholder: '',
+ prefix: '',
+ suffix: '',
+ multiple: false,
+ defaultValue: '',
+ protected: false,
+ unique: false,
+ persistent: true,
+ validate: {
+ required: true,
+ minLength: '',
+ maxLength: '',
+ pattern: '',
+ custom: '',
+ customPrivate: false,
+ },
+ conditional: {
+ show: null,
+ when: null,
+ eq: '',
+ },
+ type: 'textfield',
+ },
+ ],
+ type: 'panel',
+ key: 'panel',
+ conditional: {
+ show: 'true',
+ when: 'selector',
+ eq: 'two',
+ },
+ },
+ ],
+ };
+
+ const submission = {
+ data: {
+ selector: 'two',
+ },
+ };
+
+ const errors: any = [];
+ const context = {
+ form,
+ submission,
+ data: submission.data,
+ components: form.components,
+ processors: ProcessTargets.evaluator,
+ scope: { errors },
+ config: {
+ server: true,
+ },
+ };
+ processSync(context);
+ assert.equal(context.scope.errors.length, 1);
+ assert.equal(context.scope.errors[0].errorKeyOrMessage, 'required');
+ assert.equal(context.scope.errors[0].context.path, 'requiredField');
+ });
+
+ it("Doesn't require a conditionally hidden field in a panel", async () => {
+ const form = {
+ components: [
+ {
+ input: true,
+ tableView: true,
+ inputType: 'radio',
+ label: 'Selector',
+ key: 'selector',
+ values: [
+ {
+ value: 'one',
+ label: 'One',
+ },
+ {
+ value: 'two',
+ label: 'Two',
+ },
+ ],
+ defaultValue: '',
+ protected: false,
+ persistent: true,
+ validate: {
+ required: false,
+ custom: '',
+ customPrivate: false,
+ },
+ type: 'radio',
+ conditional: {
+ show: '',
+ when: null,
+ eq: '',
+ },
+ },
+ {
+ input: false,
+ title: 'Panel',
+ theme: 'default',
+ components: [
+ {
+ input: true,
+ tableView: true,
+ inputType: 'text',
+ inputMask: '',
+ label: 'Required Field',
+ key: 'requiredField',
+ placeholder: '',
+ prefix: '',
+ suffix: '',
+ multiple: false,
+ defaultValue: '',
+ protected: false,
+ unique: false,
+ persistent: true,
+ validate: {
+ required: true,
+ minLength: '',
+ maxLength: '',
+ pattern: '',
+ custom: '',
+ customPrivate: false,
+ },
+ conditional: {
+ show: null,
+ when: null,
+ eq: '',
+ },
+ type: 'textfield',
+ },
+ ],
+ type: 'panel',
+ key: 'panel',
+ conditional: {
+ show: 'true',
+ when: 'selector',
+ eq: 'two',
+ },
+ },
+ ],
+ };
+
+ const submission = {
+ data: {
+ selector: 'one',
+ },
+ };
+
+ const errors: any = [];
+ const context = {
+ form,
+ submission,
+ data: submission.data,
+ components: form.components,
+ processors: ProcessTargets.evaluator,
+ scope: { errors },
+ config: {
+ server: true,
+ },
+ };
+ processSync(context);
+ assert.equal(context.scope.errors.length, 0);
+ });
+
+ it('Allows a conditionally required field in a panel', async () => {
+ const form = {
+ components: [
+ {
+ input: true,
+ tableView: true,
+ inputType: 'radio',
+ label: 'Selector',
+ key: 'selector',
+ values: [
+ {
+ value: 'one',
+ label: 'One',
+ },
+ {
+ value: 'two',
+ label: 'Two',
+ },
+ ],
+ defaultValue: '',
+ protected: false,
+ persistent: true,
+ validate: {
+ required: false,
+ custom: '',
+ customPrivate: false,
+ },
+ type: 'radio',
+ conditional: {
+ show: '',
+ when: null,
+ eq: '',
+ },
+ },
+ {
+ input: false,
+ title: 'Panel',
+ theme: 'default',
+ components: [
+ {
+ input: true,
+ tableView: true,
+ inputType: 'text',
+ inputMask: '',
+ label: 'Required Field',
+ key: 'requiredField',
+ placeholder: '',
+ prefix: '',
+ suffix: '',
+ multiple: false,
+ defaultValue: '',
+ protected: false,
+ unique: false,
+ persistent: true,
+ validate: {
+ required: true,
+ minLength: '',
+ maxLength: '',
+ pattern: '',
+ custom: '',
+ customPrivate: false,
+ },
+ conditional: {
+ show: null,
+ when: null,
+ eq: '',
+ },
+ type: 'textfield',
+ },
+ ],
+ type: 'panel',
+ key: 'panel',
+ conditional: {
+ show: 'true',
+ when: 'selector',
+ eq: 'two',
+ },
+ },
+ ],
+ };
- it('Requires a conditionally visible field in a panel', async () => {
- const form = {
- components: [
- {
- "input": true,
- "tableView": true,
- "inputType": "radio",
- "label": "Selector",
- "key": "selector",
- "values": [
- {
- "value": "one",
- "label": "One"
- },
- {
- "value": "two",
- "label": "Two"
- }
- ],
- "defaultValue": "",
- "protected": false,
- "persistent": true,
- "validate": {
- "required": false,
- "custom": "",
- "customPrivate": false
- },
- "type": "radio",
- "conditional": {
- "show": "",
- "when": null,
- "eq": ""
- }
- },
- {
- "input": false,
- "title": "Panel",
- "theme": "default",
- "components": [
- {
- "input": true,
- "tableView": true,
- "inputType": "text",
- "inputMask": "",
- "label": "Required Field",
- "key": "requiredField",
- "placeholder": "",
- "prefix": "",
- "suffix": "",
- "multiple": false,
- "defaultValue": "",
- "protected": false,
- "unique": false,
- "persistent": true,
- "validate": {
- "required": true,
- "minLength": "",
- "maxLength": "",
- "pattern": "",
- "custom": "",
- "customPrivate": false
- },
- "conditional": {
- "show": null,
- "when": null,
- "eq": ""
- },
- "type": "textfield"
- }
- ],
- "type": "panel",
- "key": "panel",
- "conditional": {
- "show": "true",
- "when": "selector",
- "eq": "two"
- }
- }
- ]
- };
+ const submission = {
+ data: {
+ selector: 'two',
+ requiredField: 'Has a value',
+ },
+ };
- const submission = {
- data: {
- selector: 'two'
- }
- };
+ const errors: any = [];
+ const context = {
+ form,
+ submission,
+ data: submission.data,
+ components: form.components,
+ processors: ProcessTargets.evaluator,
+ scope: { errors },
+ config: {
+ server: true,
+ },
+ };
+ processSync(context);
+ assert.equal(context.scope.errors.length, 0);
+ });
- const errors: any = [];
- const context = {
- form,
- submission,
- data: submission.data,
- components: form.components,
- processors: ProcessTargets.evaluator,
- scope: { errors },
- config: {
- server: true
- }
- };
- processSync(context);
- assert.equal(context.scope.errors.length, 1);
- assert.equal(context.scope.errors[0].errorKeyOrMessage, 'required');
- assert.equal(context.scope.errors[0].context.path, 'requiredField');
- });
+ it('Ignores conditionally hidden fields in a panel', async () => {
+ const form = {
+ components: [
+ {
+ input: true,
+ tableView: true,
+ inputType: 'radio',
+ label: 'Selector',
+ key: 'selector',
+ values: [
+ {
+ value: 'one',
+ label: 'One',
+ },
+ {
+ value: 'two',
+ label: 'Two',
+ },
+ ],
+ defaultValue: '',
+ protected: false,
+ persistent: true,
+ validate: {
+ required: false,
+ custom: '',
+ customPrivate: false,
+ },
+ type: 'radio',
+ conditional: {
+ show: '',
+ when: null,
+ eq: '',
+ },
+ },
+ {
+ input: false,
+ title: 'Panel',
+ theme: 'default',
+ components: [
+ {
+ input: true,
+ tableView: true,
+ inputType: 'text',
+ inputMask: '',
+ label: 'Required Field',
+ key: 'requiredField',
+ placeholder: '',
+ prefix: '',
+ suffix: '',
+ multiple: false,
+ defaultValue: '',
+ protected: false,
+ unique: false,
+ persistent: true,
+ validate: {
+ required: true,
+ minLength: '',
+ maxLength: '',
+ pattern: '',
+ custom: '',
+ customPrivate: false,
+ },
+ conditional: {
+ show: null,
+ when: null,
+ eq: '',
+ },
+ type: 'textfield',
+ },
+ ],
+ type: 'panel',
+ key: 'panel',
+ conditional: {
+ show: 'true',
+ when: 'selector',
+ eq: 'two',
+ },
+ },
+ ],
+ };
- it('Doesn\'t require a conditionally hidden field in a panel', async () => {
- const form = {
- components: [
- {
- "input": true,
- "tableView": true,
- "inputType": "radio",
- "label": "Selector",
- "key": "selector",
- "values": [
- {
- "value": "one",
- "label": "One"
- },
- {
- "value": "two",
- "label": "Two"
- }
- ],
- "defaultValue": "",
- "protected": false,
- "persistent": true,
- "validate": {
- "required": false,
- "custom": "",
- "customPrivate": false
- },
- "type": "radio",
- "conditional": {
- "show": "",
- "when": null,
- "eq": ""
- }
- },
- {
- "input": false,
- "title": "Panel",
- "theme": "default",
- "components": [
- {
- "input": true,
- "tableView": true,
- "inputType": "text",
- "inputMask": "",
- "label": "Required Field",
- "key": "requiredField",
- "placeholder": "",
- "prefix": "",
- "suffix": "",
- "multiple": false,
- "defaultValue": "",
- "protected": false,
- "unique": false,
- "persistent": true,
- "validate": {
- "required": true,
- "minLength": "",
- "maxLength": "",
- "pattern": "",
- "custom": "",
- "customPrivate": false
- },
- "conditional": {
- "show": null,
- "when": null,
- "eq": ""
- },
- "type": "textfield"
- }
- ],
- "type": "panel",
- "key": "panel",
- "conditional": {
- "show": "true",
- "when": "selector",
- "eq": "two"
- }
- }
- ]
- };
+ const submission = {
+ data: {
+ selector: 'one',
+ requiredField: 'Has a value',
+ },
+ };
- const submission = {
- data: {
- selector: 'one'
- }
- };
+ const errors: any = [];
+ const context = {
+ form,
+ submission,
+ data: submission.data,
+ components: form.components,
+ processors: ProcessTargets.evaluator,
+ scope: { errors },
+ config: {
+ server: true,
+ },
+ };
+ processSync(context);
+ assert.deepEqual(context.data, { selector: 'one' });
+ assert.equal(context.scope.errors.length, 0);
+ });
- const errors: any = [];
- const context = {
- form,
- submission,
- data: submission.data,
- components: form.components,
- processors: ProcessTargets.evaluator,
- scope: { errors },
- config: {
- server: true
- }
- };
- processSync(context);
- assert.equal(context.scope.errors.length, 0);
+ it('Should not include submission data for conditionally hidden fields', async () => {
+ const form = {
+ display: 'form',
+ components: [
+ {
+ type: 'textfield',
+ key: 'textField',
+ label: 'Text Field',
+ input: true,
+ },
+ {
+ type: 'textarea',
+ key: 'textArea',
+ label: 'Text Area',
+ input: true,
+ conditional: {
+ show: false,
+ conjunction: 'all',
+ conditions: [
+ {
+ component: 'textField',
+ operator: 'isEmpty',
+ },
+ ],
+ },
+ },
+ ],
+ };
- });
+ const submission = {
+ data: {
+ textField: '',
+ textArea: 'should not be in submission',
+ },
+ };
- it('Allows a conditionally required field in a panel', async () => {
- const form = {
- components: [
- {
- "input": true,
- "tableView": true,
- "inputType": "radio",
- "label": "Selector",
- "key": "selector",
- "values": [
- {
- "value": "one",
- "label": "One"
- },
- {
- "value": "two",
- "label": "Two"
- }
- ],
- "defaultValue": "",
- "protected": false,
- "persistent": true,
- "validate": {
- "required": false,
- "custom": "",
- "customPrivate": false
+ const context = {
+ form,
+ submission,
+ data: submission.data,
+ components: form.components,
+ processors: ProcessTargets.evaluator,
+ scope: {},
+ config: {
+ server: true,
+ },
+ };
+ processSync(context);
+ expect(context.data).to.deep.equal({ textField: '' });
+ });
+
+ it('Should not include submission data for logically hidden fields', async () => {
+ const form = {
+ display: 'form',
+ components: [
+ {
+ type: 'textfield',
+ key: 'textField',
+ label: 'Text Field',
+ input: true,
+ },
+ {
+ type: 'textarea',
+ key: 'textArea',
+ label: 'Text Area',
+ input: true,
+ logic: [
+ {
+ name: 'Hide When Empty',
+ trigger: {
+ type: 'simple' as const,
+ simple: {
+ show: true,
+ conjunction: 'all',
+ conditions: [
+ {
+ component: 'textField',
+ operator: 'isEmpty',
},
- "type": "radio",
- "conditional": {
- "show": "",
- "when": null,
- "eq": ""
- }
+ ],
},
- {
- "input": false,
- "title": "Panel",
- "theme": "default",
- "components": [
- {
- "input": true,
- "tableView": true,
- "inputType": "text",
- "inputMask": "",
- "label": "Required Field",
- "key": "requiredField",
- "placeholder": "",
- "prefix": "",
- "suffix": "",
- "multiple": false,
- "defaultValue": "",
- "protected": false,
- "unique": false,
- "persistent": true,
- "validate": {
- "required": true,
- "minLength": "",
- "maxLength": "",
- "pattern": "",
- "custom": "",
- "customPrivate": false
- },
- "conditional": {
- "show": null,
- "when": null,
- "eq": ""
- },
- "type": "textfield"
- }
- ],
- "type": "panel",
- "key": "panel",
- "conditional": {
- "show": "true",
- "when": "selector",
- "eq": "two"
- }
- }
- ]
- };
+ },
+ actions: [
+ {
+ name: 'Hide',
+ type: 'property' as const,
+ property: {
+ label: 'Hidden',
+ value: 'hidden',
+ type: 'boolean' as const,
+ },
+ state: true,
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ };
- const submission = {
- data: {
- selector: 'two',
- requiredField: 'Has a value'
- }
- };
+ const submission = {
+ data: {
+ textField: '',
+ textArea: 'should not be in submission',
+ },
+ };
- const errors: any = [];
- const context = {
- form,
- submission,
- data: submission.data,
- components: form.components,
- processors: ProcessTargets.evaluator,
- scope: { errors },
- config: {
- server: true
- }
- };
- processSync(context);
- assert.equal(context.scope.errors.length, 0);
+ const context = {
+ form,
+ submission,
+ data: submission.data,
+ components: form.components,
+ processors: ProcessTargets.evaluator,
+ scope: {},
+ config: {
+ server: true,
+ },
+ };
+ processSync(context);
+ expect(context.data).to.deep.equal({ textField: '' });
+ });
+
+ it('Should allow conditionally hidden text fields within DataGrid and EditGrids', async () => {
+ const form = {
+ display: 'form',
+ components: [
+ {
+ label: 'Edit Grid',
+ tableView: false,
+ rowDrafts: false,
+ key: 'editGrid',
+ type: 'editgrid',
+ displayAsTable: false,
+ input: true,
+ components: [
+ {
+ label: 'Select',
+ widget: 'choicesjs',
+ tableView: true,
+ data: {
+ values: [
+ {
+ label: 'Action1',
+ value: 'action1',
+ },
+ {
+ label: 'Custom',
+ value: 'custom',
+ },
+ ],
+ },
+ key: 'select',
+ type: 'select',
+ input: true,
+ },
+ {
+ label: 'Text Field',
+ applyMaskOn: 'change',
+ tableView: true,
+ key: 'textField',
+ conditional: {
+ show: true,
+ conjunction: 'all',
+ conditions: [
+ {
+ component: 'editGrid.select',
+ operator: 'isEqual',
+ value: 'custom',
+ },
+ ],
+ },
+ type: 'textfield',
+ input: true,
+ },
+ ],
+ },
+ {
+ type: 'button',
+ label: 'Submit',
+ key: 'submit',
+ disableOnInvalid: true,
+ input: true,
+ tableView: false,
+ },
+ ],
+ };
+
+ const submission = {
+ data: {
+ editGrid: [
+ {
+ select: 'action1',
+ },
+ {
+ select: 'custom',
+ textField: 'TEST',
+ },
+ ],
+ },
+ };
+ const context = {
+ form,
+ submission,
+ data: submission.data,
+ components: form.components,
+ processors: ProcessTargets.evaluator,
+ scope: {},
+ config: {
+ server: true,
+ },
+ };
+ processSync(context);
+ expect(context.data).to.deep.equal({
+ editGrid: [
+ {
+ select: 'action1',
+ },
+ {
+ select: 'custom',
+ textField: 'TEST',
+ },
+ ],
});
+ });
- it('Ignores conditionally hidden fields in a panel', async () => {
- const form = {
- components: [
- {
- "input": true,
- "tableView": true,
- "inputType": "radio",
- "label": "Selector",
- "key": "selector",
- "values": [
- {
- "value": "one",
- "label": "One"
- },
- {
- "value": "two",
- "label": "Two"
- }
- ],
- "defaultValue": "",
- "protected": false,
- "persistent": true,
- "validate": {
- "required": false,
- "custom": "",
- "customPrivate": false
- },
- "type": "radio",
- "conditional": {
- "show": "",
- "when": null,
- "eq": ""
- }
- },
- {
- "input": false,
- "title": "Panel",
- "theme": "default",
- "components": [
- {
- "input": true,
- "tableView": true,
- "inputType": "text",
- "inputMask": "",
- "label": "Required Field",
- "key": "requiredField",
- "placeholder": "",
- "prefix": "",
- "suffix": "",
- "multiple": false,
- "defaultValue": "",
- "protected": false,
- "unique": false,
- "persistent": true,
- "validate": {
- "required": true,
- "minLength": "",
- "maxLength": "",
- "pattern": "",
- "custom": "",
- "customPrivate": false
- },
- "conditional": {
- "show": null,
- "when": null,
- "eq": ""
- },
- "type": "textfield"
- }
- ],
- "type": "panel",
- "key": "panel",
- "conditional": {
- "show": "true",
- "when": "selector",
- "eq": "two"
- }
- }
- ]
- };
+ describe('Required component validation in nested form in DataGrid/EditGrid', () => {
+ const nestedForm = {
+ key: 'form',
+ type: 'form',
+ input: true,
+ components: [
+ {
+ key: 'textField',
+ type: 'textfield',
+ validate: {
+ required: true,
+ },
+ input: true,
+ },
+ ],
+ };
+ describe('For DataGrid:', () => {
+ const components = [
+ {
+ key: 'dataGrid',
+ type: 'datagrid',
+ input: true,
+ components: [nestedForm],
+ },
+ ];
+ it('Should validate required component when it is filled out', async () => {
const submission = {
- data: {
- selector: 'one',
- requiredField: 'Has a value'
- }
+ data: {
+ dataGrid: [
+ {
+ form: {
+ data: {
+ textField: 'test',
+ invalidField: 'bad',
+ },
+ },
+ },
+ {
+ invalidDataGridField: 'wrong',
+ },
+ ],
+ },
};
- const errors: any = [];
const context = {
- form,
- submission,
- data: submission.data,
- components: form.components,
- processors: ProcessTargets.evaluator,
- scope: { errors },
- config: {
- server: true
- }
+ form: { components },
+ submission,
+ data: submission.data,
+ components,
+ processors: ProcessTargets.submission,
+ scope: {},
+ config: {
+ server: true,
+ },
};
processSync(context);
- assert.deepEqual(context.data, { selector: 'one' });
- assert.equal(context.scope.errors.length, 0);
- });
-
- it('Should not include submission data for conditionally hidden fields', async () => {
- const form = {
- display: 'form',
- components: [
- {
- type: 'textfield',
- key: 'textField',
- label: 'Text Field',
- input: true,
- },
- {
- type: 'textarea',
- key: 'textArea',
- label: 'Text Area',
- input: true,
- conditional: {
- show: false,
- conjunction: 'all',
- conditions: [
- {
- component: 'textField',
- operator: 'isEmpty'
- }
- ]
- },
- }
- ]
- };
-
+ context.processors = ProcessTargets.evaluator;
+ processSync(context);
+ const errors = (context.scope as ValidationScope).errors;
+ expect(context.data).to.deep.equal({
+ dataGrid: [{ form: { data: { textField: 'test' } } }],
+ });
+ expect((context.scope as ValidationScope).errors).to.have.length(0);
+ expect;
+ });
+ it('Should not validate required component when it is not filled out', async () => {
const submission = {
- data: {
- textField: '',
- textArea: 'should not be in submission'
- }
+ data: {
+ dataGrid: [
+ {
+ form: {
+ data: {
+ textField: '',
+ },
+ },
+ },
+ ],
+ },
};
const context = {
- form,
- submission,
- data: submission.data,
- components: form.components,
- processors: ProcessTargets.evaluator,
- scope: {},
- config: {
- server: true
- }
+ form: { components },
+ submission,
+ data: submission.data,
+ components,
+ processors: ProcessTargets.submission,
+ scope: {},
+ config: {
+ server: true,
+ },
};
processSync(context);
- expect(context.data).to.deep.equal({ textField: '' });
+ context.processors = ProcessTargets.evaluator;
+ processSync(context);
+ expect((context.scope as ValidationScope).errors).to.have.length(1);
+ });
});
-
- it('Should not include submission data for logically hidden fields', async () => {
- const form = {
- display: 'form',
- components: [
- {
- type: 'textfield',
- key: 'textField',
- label: 'Text Field',
- input: true,
- },
- {
- type: 'textarea',
- key: 'textArea',
- label: 'Text Area',
- input: true,
- logic: [
- {
- name: 'Hide When Empty',
- trigger: {
- type: 'simple' as const,
- simple: {
- show: true,
- conjunction: 'all',
- conditions: [
- {
- component: 'textField',
- operator: 'isEmpty',
- },
- ],
- },
- },
- actions: [
- {
- name: 'Hide',
- type: 'property' as const,
- property: {
- label: 'Hidden',
- value: 'hidden',
- type: 'boolean' as const,
- },
- state: true,
- },
- ],
- },
- ]
- }
- ]
- };
-
+ describe('For EditGrid:', () => {
+ const components = [
+ {
+ key: 'editGrid',
+ type: 'editgrid',
+ input: true,
+ components: [nestedForm],
+ },
+ ];
+ it('Should validate required component when it is filled out', async () => {
const submission = {
- data: {
- textField: '',
- textArea: 'should not be in submission'
- }
+ data: {
+ editGrid: [
+ {
+ form: {
+ data: {
+ textField: 'test',
+ },
+ },
+ },
+ ],
+ },
};
const context = {
- form,
- submission,
- data: submission.data,
- components: form.components,
- processors: ProcessTargets.evaluator,
- scope: {},
- config: {
- server: true
- }
+ form: { components },
+ submission,
+ data: submission.data,
+ components,
+ processors: ProcessTargets.submission,
+ scope: {},
+ config: {
+ server: true,
+ },
};
processSync(context);
- expect(context.data).to.deep.equal({ textField: '' });
- });
-
- it('Should allow conditionally hidden text fields within DataGrid and EditGrids', async () => {
- const form = {
- display: 'form',
- components: [
- {
- "label": "Edit Grid",
- "tableView": false,
- "rowDrafts": false,
- "key": "editGrid",
- "type": "editgrid",
- "displayAsTable": false,
- "input": true,
- "components": [
- {
- "label": "Select",
- "widget": "choicesjs",
- "tableView": true,
- "data": {
- "values": [
- {
- "label": "Action1",
- "value": "action1"
- },
- {
- "label": "Custom",
- "value": "custom"
- }
- ]
- },
- "key": "select",
- "type": "select",
- "input": true
- },
- {
- "label": "Text Field",
- "applyMaskOn": "change",
- "tableView": true,
- "key": "textField",
- "conditional": {
- "show": true,
- "conjunction": "all",
- "conditions": [
- {
- "component": "editGrid.select",
- "operator": "isEqual",
- "value": "custom"
- }
- ]
- },
- "type": "textfield",
- "input": true
- }
- ]
- },
- {
- "type": "button",
- "label": "Submit",
- "key": "submit",
- "disableOnInvalid": true,
- "input": true,
- "tableView": false
- }
- ]
- };
-
+ context.processors = ProcessTargets.evaluator;
+ processSync(context);
+ expect((context.scope as ValidationScope).errors).to.have.length(0);
+ });
+ it('Should not validate required component when it is not filled out', async () => {
const submission = {
- data: {
- editGrid: [
- {
- "select": "action1"
- },
- {
- "select": "custom",
- "textField": "TEST"
- }
- ]
- }
+ data: {
+ editGrid: [
+ {
+ form: {
+ data: {
+ textField: '',
+ },
+ },
+ },
+ ],
+ },
};
const context = {
- form,
- submission,
- data: submission.data,
- components: form.components,
- processors: ProcessTargets.evaluator,
- scope: {},
- config: {
- server: true
- }
+ form: { components },
+ submission,
+ data: submission.data,
+ components,
+ processors: ProcessTargets.submission,
+ scope: {},
+ config: {
+ server: true,
+ },
};
processSync(context);
- expect(context.data).to.deep.equal({
- "editGrid": [
- {
- "select": "action1"
- },
- {
- "select": "custom",
- "textField": "TEST"
- }
- ]
- });
+ context.processors = ProcessTargets.evaluator;
+ processSync(context);
+ expect((context.scope as ValidationScope).errors).to.have.length(1);
+ });
});
-
- describe('Required component validation in nested form in DataGrid/EditGrid', () => {
- const nestedForm = [
- {
- key: 'form',
- type: 'form',
- input: true,
- components: [
- {
- key: 'textField',
- type: 'textfield',
- validate: {
- required: true
- },
- input: true
- }
- ]
- },
- ]
-
- describe('For DataGrid:', () => {
- const components = [
- {
- key: 'dataGrid',
- type: 'datagrid',
- input: true,
- components: nestedForm,
- }
- ];
- it('Should validate required component when it is filled out', async () => {
- const submission = {
- data: {
- dataGrid: [
- {
- form: {
- data: {
- textField: 'test'
- }
- }
- }
- ]
- }
- };
-
- const context = {
- form: { components },
- submission,
- data: submission.data,
- components,
- processors: ProcessTargets.submission,
- scope: {},
- config: {
- server: true
- }
- };
- processSync(context);
- context.processors = ProcessTargets.evaluator;
- processSync(context);
- expect((context.scope as ValidationScope).errors).to.have.length(0);
- });
- it('Should not validate required component when it is not filled out', async () => {
- const submission = {
- data: {
- dataGrid: [
- {
- form: {
- data: {
- textField: ''
- }
- }
- }
- ]
- }
- };
-
- const context = {
- form: { components },
- submission,
- data: submission.data,
- components,
- processors: ProcessTargets.submission,
- scope: {},
- config: {
- server: true
- }
- };
- processSync(context);
- context.processors = ProcessTargets.evaluator;
- processSync(context);
- expect((context.scope as ValidationScope).errors).to.have.length(1);
- });
- });
- describe('For EditGrid:', () => {
- const components = [
- {
- key: 'editGrid',
- type: 'editgrid',
- input: true,
- components: nestedForm,
- }
- ];
- it('Should validate required component when it is filled out', async () => {
- const submission = {
- data: {
- editGrid: [
- {
- form: {
- data: {
- textField: 'test'
- }
- }
- }
- ]
- }
- };
-
- const context = {
- form: { components },
- submission,
- data: submission.data,
- components,
- processors: ProcessTargets.submission,
- scope: {},
- config: {
- server: true
- }
- };
- processSync(context);
- context.processors = ProcessTargets.evaluator;
- processSync(context);
- expect((context.scope as ValidationScope).errors).to.have.length(0);
- });
- it('Should not validate required component when it is not filled out', async () => {
- const submission = {
- data: {
- editGrid: [
- {
- form: {
- data: {
- textField: ''
- }
- }
- }
- ]
- }
- };
-
- const context = {
- form: { components },
- submission,
- data: submission.data,
- components,
- processors: ProcessTargets.submission,
- scope: {},
- config: {
- server: true
- }
- };
- processSync(context);
- context.processors = ProcessTargets.evaluator;
- processSync(context);
- expect((context.scope as ValidationScope).errors).to.have.length(1);
- });
- });
- })
- /*
+ });
+ /*
it('Should not clearOnHide when set to false', async () => {
var components = [
{
diff --git a/src/process/filter/index.ts b/src/process/filter/index.ts
index 25441462..29552076 100644
--- a/src/process/filter/index.ts
+++ b/src/process/filter/index.ts
@@ -1,74 +1,93 @@
-import { FilterContext, FilterScope, ProcessorFn, ProcessorFnSync, ProcessorInfo } from "types";
-import { set } from 'lodash';
-import { Utils } from "utils";
-import { get, isObject } from "lodash";
-import { getComponentAbsolutePath } from "utils/formUtil";
-export const filterProcessSync: ProcessorFnSync = (context: FilterContext) => {
- const { scope, component } = context;
- let { value } = context;
- const absolutePath = getComponentAbsolutePath(component);
- if (!scope.filter) scope.filter = {};
- if (value !== undefined) {
- const modelType = Utils.getModelType(component);
- switch (modelType) {
- case 'dataObject':
- scope.filter[absolutePath] = {
- compModelType: modelType,
- include: true,
- value: {data: {}}
- };
- break;
- case 'array':
- scope.filter[absolutePath] = {
- compModelType: modelType,
- include: true,
- };
- break;
- case 'object':
- if (component.type !== 'container') {
- scope.filter[absolutePath] = {
- compModelType: modelType,
- include: true,
- };
- }
- break;
- default:
- scope.filter[absolutePath] = {
- compModelType: modelType,
- include: true,
- };
- break;
+import {
+ FilterContext,
+ FilterScope,
+ ProcessorFn,
+ ProcessorFnSync,
+ ProcessorInfo,
+} from 'types';
+import set from 'lodash/fp/set';
+import { Utils } from 'utils';
+import { get } from 'lodash';
+import { getComponentAbsolutePath } from 'utils/formUtil';
+export const filterProcessSync: ProcessorFnSync = (
+ context: FilterContext
+) => {
+ const { scope, component } = context;
+ let { value } = context;
+ const absolutePath = getComponentAbsolutePath(component);
+
+ if (!scope.filter) scope.filter = {};
+ if (value !== undefined) {
+ const modelType = Utils.getModelType(component);
+ switch (modelType) {
+ case 'dataObject':
+ scope.filter[absolutePath] = {
+ compModelType: modelType,
+ include: true,
+ value: { data: {} },
+ };
+ break;
+ case 'array':
+ scope.filter[absolutePath] = {
+ compModelType: modelType,
+ include: true,
+ };
+ break;
+ case 'object':
+ if (component.type !== 'container') {
+ scope.filter[absolutePath] = {
+ compModelType: modelType,
+ include: true,
+ };
}
+ break;
+ default:
+ scope.filter[absolutePath] = {
+ compModelType: modelType,
+ include: true,
+ };
+ break;
}
+ }
};
-export const filterProcess: ProcessorFn = async (context: FilterContext) => {
- return filterProcessSync(context);
+export const filterProcess: ProcessorFn = async (
+ context: FilterContext
+) => {
+ return filterProcessSync(context);
};
-export const filterPostProcess: ProcessorFnSync = (context: FilterContext) => {
- const { scope, submission } = context;
- const filtered = {};
- for (const path in scope.filter) {
- if (scope.filter[path].include) {
- let value = get(submission?.data, path);
- if (isObject(value) && isObject(scope.filter[path].value)) {
- if (scope.filter[path].compModelType === 'dataObject') {
- value = {...value, ...scope.filter[path].value, data: (value as any)?.data}
- } else {
- value = {...value, ...scope.filter[path].value}
- }
- }
- set(filtered, path, value);
- }
+export const filterPostProcess: ProcessorFnSync = (
+ context: FilterContext
+) => {
+ const { scope, component, submission } = context;
+ let filtered = {};
+ for (const path in scope.filter) {
+ const pathFilter = scope.filter[path];
+ if (pathFilter.compModelType === 'array') {
+ continue;
+ }
+ if (pathFilter) {
+ let value = get(submission?.data, path) as any;
+
+ // when it's a dataModel Object, don't set values directly on the data object, let child fields do that.
+ // it can have extra data on updates, so pass all other values except data
+ // standard lodash set function will mutate original value, using the functional version so it doesn't
+ if (pathFilter.compModelType === 'dataObject') {
+ const { data, ...rest } = value;
+ filtered = set(path, rest)(filtered);
+ } else {
+ filtered = set(path, value)(filtered);
+ }
}
- context.data = filtered;
+ }
+ context.data = filtered;
};
export const filterProcessInfo: ProcessorInfo = {
- name: 'filter',
- process: filterProcess,
- processSync: filterProcessSync,
- postProcess: filterPostProcess,
- shouldProcess: (context: FilterContext) => true,
+ name: 'filter',
+ process: filterProcess,
+ processSync: filterProcessSync,
+ postProcess: filterPostProcess,
+ shouldProcess: (context: FilterContext) => true,
};
diff --git a/src/process/process.ts b/src/process/process.ts
index ea5af3cc..1eab42cc 100644
--- a/src/process/process.ts
+++ b/src/process/process.ts
@@ -1,120 +1,155 @@
-import get from "lodash/get";
-import set from "lodash/set";
-import { ProcessContext, ProcessTarget, ProcessorInfo, ProcessorScope } from "types";
-import { eachComponentData, eachComponentDataAsync } from "utils/formUtil";
+import get from 'lodash/get';
+import set from 'lodash/set';
+import {
+ ProcessContext,
+ ProcessTarget,
+ ProcessorInfo,
+ ProcessorScope,
+} from 'types';
+import { eachComponentData, eachComponentDataAsync } from 'utils/formUtil';
import { processOne, processOneSync } from './processOne';
-import { defaultValueProcessInfo, serverDefaultValueProcessInfo, customDefaultValueProcessInfo } from "./defaultValue";
-import { fetchProcessInfo } from "./fetch";
-import { calculateProcessInfo } from "./calculation";
-import { logicProcessInfo } from "./logic";
-import { conditionProcessInfo, customConditionProcessInfo, simpleConditionProcessInfo } from "./conditions";
-import { validateCustomProcessInfo, validateProcessInfo, validateServerProcessInfo } from "./validation";
-import { filterProcessInfo } from "./filter";
-import { normalizeProcessInfo } from "./normalize";
-import { dereferenceProcessInfo } from "./dereference";
-import { clearHiddenProcessInfo } from "./clearHidden";
+import {
+ defaultValueProcessInfo,
+ serverDefaultValueProcessInfo,
+ customDefaultValueProcessInfo,
+} from './defaultValue';
+import { fetchProcessInfo } from './fetch';
+import { calculateProcessInfo } from './calculation';
+import { logicProcessInfo } from './logic';
+import {
+ conditionProcessInfo,
+ customConditionProcessInfo,
+ simpleConditionProcessInfo,
+} from './conditions';
+import {
+ validateCustomProcessInfo,
+ validateProcessInfo,
+ validateServerProcessInfo,
+} from './validation';
+import { filterProcessInfo } from './filter';
+import { normalizeProcessInfo } from './normalize';
+import { dereferenceProcessInfo } from './dereference';
+import { clearHiddenProcessInfo } from './clearHidden';
-export async function process(context: ProcessContext): Promise {
- const { instances, components, data, scope, flat, processors } = context;
- await eachComponentDataAsync(components, data, async (component, compData, row, path, components, index) => {
- // Skip processing if row is null or undefined
- if (!row) {
- return;
- }
- await processOne({...context, ...{
- data: compData,
- component,
- components,
- path,
- row,
- index,
- instance: instances ? instances[path] : undefined
- }});
- if (flat) {
- return true;
- }
- if ((scope as ProcessorScope).noRecurse) {
- (scope as ProcessorScope).noRecurse = false;
- return true;
- }
- });
- for (let i = 0; i < processors?.length; i++) {
- const processor = processors[i];
- if (processor.postProcess) {
- processor.postProcess(context);
- }
+export async function process(
+ context: ProcessContext
+): Promise {
+ const { instances, components, data, scope, flat, processors } = context;
+
+ await eachComponentDataAsync(
+ components,
+ data,
+ async (component, compData, row, path, components, index) => {
+ // Skip processing if row is null or undefined
+ if (!row) {
+ return;
+ }
+ await processOne({
+ ...context,
+ ...{
+ data: compData,
+ component,
+ components,
+ path,
+ row,
+ index,
+ instance: instances ? instances[path] : undefined,
+ },
+ });
+ if (flat) {
+ return true;
+ }
+ if ((scope as ProcessorScope).noRecurse) {
+ (scope as ProcessorScope).noRecurse = false;
+ return true;
+ }
+ }
+ );
+ for (let i = 0; i < processors?.length; i++) {
+ const processor = processors[i];
+ if (processor.postProcess) {
+ processor.postProcess(context);
}
- return scope;
+ }
+ return scope;
}
-export function processSync(context: ProcessContext): ProcessScope {
- const { instances, components, data, scope, flat, processors } = context;
- eachComponentData(components, data, (component, compData, row, path, components, index) => {
- // Skip processing if row is null or undefined
- if (!row) {
- return;
- }
- processOneSync({...context,
- data: compData,
- component,
- components,
- path,
- row,
- index,
- instance: instances ? instances[path] : undefined
- });
- if (flat) {
- return true;
- }
- if ((scope as ProcessorScope).noRecurse) {
- (scope as ProcessorScope).noRecurse = false;
- return true;
- }
- });
- for (let i = 0; i < processors?.length; i++) {
- const processor = processors[i];
- if (processor.postProcess) {
- processor.postProcess(context);
- }
+export function processSync(
+ context: ProcessContext
+): ProcessScope {
+ const { instances, components, data, scope, flat, processors } = context;
+
+ eachComponentData(
+ components,
+ data,
+ (component, compData, row, path, components, index) => {
+ // Skip processing if row is null or undefined
+ if (!row) {
+ return;
+ }
+ processOneSync({
+ ...context,
+ data: compData,
+ component,
+ components,
+ path,
+ row,
+ index,
+ instance: instances ? instances[path] : undefined,
+ });
+ if (flat) {
+ return true;
+ }
+ if ((scope as ProcessorScope).noRecurse) {
+ (scope as ProcessorScope).noRecurse = false;
+ return true;
+ }
+ }
+ );
+ for (let i = 0; i < processors?.length; i++) {
+ const processor = processors[i];
+ if (processor.postProcess) {
+ processor.postProcess(context);
}
- return scope;
+ }
+ return scope;
}
export const ProcessorMap: Record> = {
- filter: filterProcessInfo,
- defaultValue: defaultValueProcessInfo,
- serverDefaultValue: serverDefaultValueProcessInfo,
- customDefaultValue: customDefaultValueProcessInfo,
- calculate: calculateProcessInfo,
- conditions: conditionProcessInfo,
- customConditions: customConditionProcessInfo,
- simpleConditions: simpleConditionProcessInfo,
- normalize: normalizeProcessInfo,
- dereference: dereferenceProcessInfo,
- clearHidden: clearHiddenProcessInfo,
- fetch: fetchProcessInfo,
- logic: logicProcessInfo,
- validate: validateProcessInfo,
- validateCustom: validateCustomProcessInfo,
- validateServer: validateServerProcessInfo
+ filter: filterProcessInfo,
+ defaultValue: defaultValueProcessInfo,
+ serverDefaultValue: serverDefaultValueProcessInfo,
+ customDefaultValue: customDefaultValueProcessInfo,
+ calculate: calculateProcessInfo,
+ conditions: conditionProcessInfo,
+ customConditions: customConditionProcessInfo,
+ simpleConditions: simpleConditionProcessInfo,
+ normalize: normalizeProcessInfo,
+ dereference: dereferenceProcessInfo,
+ clearHidden: clearHiddenProcessInfo,
+ fetch: fetchProcessInfo,
+ logic: logicProcessInfo,
+ validate: validateProcessInfo,
+ validateCustom: validateCustomProcessInfo,
+ validateServer: validateServerProcessInfo,
};
export const ProcessTargets: ProcessTarget = {
- submission: [
- filterProcessInfo,
- serverDefaultValueProcessInfo,
- normalizeProcessInfo,
- dereferenceProcessInfo,
- fetchProcessInfo,
- simpleConditionProcessInfo,
- validateServerProcessInfo
- ],
- evaluator: [
- customDefaultValueProcessInfo,
- calculateProcessInfo,
- logicProcessInfo,
- conditionProcessInfo,
- clearHiddenProcessInfo,
- validateProcessInfo
- ]
+ submission: [
+ filterProcessInfo,
+ serverDefaultValueProcessInfo,
+ normalizeProcessInfo,
+ dereferenceProcessInfo,
+ fetchProcessInfo,
+ simpleConditionProcessInfo,
+ validateServerProcessInfo,
+ ],
+ evaluator: [
+ customDefaultValueProcessInfo,
+ calculateProcessInfo,
+ logicProcessInfo,
+ conditionProcessInfo,
+ clearHiddenProcessInfo,
+ validateProcessInfo,
+ ],
};
diff --git a/src/process/validation/rules/validateMultiple.ts b/src/process/validation/rules/validateMultiple.ts
index b7018ba6..5ab343fa 100644
--- a/src/process/validation/rules/validateMultiple.ts
+++ b/src/process/validation/rules/validateMultiple.ts
@@ -1,95 +1,114 @@
import { isNil } from 'lodash';
import { FieldError } from 'error';
-import { Component, TextAreaComponent, RuleFn, TagsComponent, RuleFnSync, ValidationContext } from 'types';
+import {
+ Component,
+ TextAreaComponent,
+ RuleFn,
+ TagsComponent,
+ RuleFnSync,
+ ValidationContext,
+} from 'types';
import { ProcessorInfo } from 'types/process/ProcessorInfo';
export const isEligible = (component: Component) => {
- // TODO: would be nice if this was type safe
- switch (component.type) {
- case 'hidden':
- case 'address':
- if (!component.multiple) {
- return false;
- }
- return true;
- case 'textarea':
- if (!(component as TextAreaComponent).as || (component as TextAreaComponent).as !== 'json') {
- return false;
- }
- return true;
- // TODO: For backwards compatibility, skip multiple validation for select components until we can investigate
- // how this validation might break existing forms
- case 'select':
- return false;
- default:
- return true;
- }
-}
+ // TODO: would be nice if this was type safe
+ switch (component.type) {
+ case 'hidden':
+ case 'address':
+ if (!component.multiple) {
+ return false;
+ }
+ return true;
+ case 'textarea':
+ if (
+ !(component as TextAreaComponent).as ||
+ (component as TextAreaComponent).as !== 'json'
+ ) {
+ return false;
+ }
+ return true;
+ // TODO: For backwards compatibility, skip multiple validation for select components until we can investigate
+ // how this validation might break existing forms
+ case 'select':
+ return false;
+ default:
+ return true;
+ }
+};
export const emptyValueIsArray = (component: Component) => {
- // TODO: How do we infer the data model of the compoennt given only its JSON? For now, we have to hardcode component types
- switch (component.type) {
- case 'datagrid':
- case 'editgrid':
- case 'tagpad':
- case 'sketchpad':
- case 'datatable':
- case 'dynamicWizard':
- case 'file':
- return true;
- case 'select':
- return !!component.multiple;
- case 'tags':
- return (component as TagsComponent).storeas !== 'string';
- default:
- return false;
- }
-}
+ // TODO: How do we infer the data model of the compoennt given only its JSON? For now, we have to hardcode component types
+ switch (component.type) {
+ case 'datagrid':
+ case 'editgrid':
+ case 'tagpad':
+ case 'sketchpad':
+ case 'datatable':
+ case 'dynamicWizard':
+ case 'file':
+ return true;
+ case 'select':
+ return !!component.multiple;
+ case 'tags':
+ return (component as TagsComponent).storeas !== 'string';
+ default:
+ return false;
+ }
+};
export const shouldValidate = (context: ValidationContext) => {
- const { component } = context;
- if (!isEligible(component)) {
- return false;
- }
- return true;
+ const { component } = context;
+ if (!isEligible(component)) {
+ return false;
+ }
+ return true;
};
export const validateMultiple: RuleFn = async (context: ValidationContext) => {
- return validateMultipleSync(context);
+ return validateMultipleSync(context);
};
-export const validateMultipleSync: RuleFnSync = (context: ValidationContext) => {
- const { component, value } = context;
- // Skip multiple validation if the component tells us to
- if (!isEligible(component)) {
- return null;
- }
+export const validateMultipleSync: RuleFnSync = (
+ context: ValidationContext
+) => {
+ const { component, value } = context;
+ // Skip multiple validation if the component tells us to
+ if (!isEligible(component)) {
+ return null;
+ }
- const shouldBeArray = !!component.multiple;
- const isRequired = !!component.validate?.required;
- const isArray = Array.isArray(value);
+ const shouldBeArray = !!component.multiple;
+ const isRequired = !!component.validate?.required;
+ const isArray = Array.isArray(value);
- if (shouldBeArray) {
- if (isArray) {
- return isRequired ? value.length > 0 ? null : new FieldError('array_nonempty', {...context, setting: true}): null;
- } else {
- const error = new FieldError('array', {...context, setting: true});
- // Null/undefined is ok if this value isn't required; anything else should fail
- return isNil(value) ? isRequired ? error : null : error;
- }
+ if (shouldBeArray) {
+ if (isArray) {
+ return isRequired
+ ? value.length > 0
+ ? null
+ : new FieldError('array_nonempty', { ...context, setting: true })
+ : null;
} else {
- const canBeArray = emptyValueIsArray(component);
- if (!canBeArray && isArray) {
- return new FieldError('nonarray', {...context, setting: false});
- }
- return null;
+ const error = new FieldError('array', { ...context, setting: true });
+ // Null/undefined is ok if this value isn't required; anything else should fail
+ return isNil(value) ? (isRequired ? error : null) : error;
}
-}
+ } else {
+ const canBeArray = emptyValueIsArray(component);
+ if (!canBeArray && isArray) {
+ return new FieldError('nonarray', { ...context, setting: false });
+ }
+ return null;
+ }
+};
-export const validateMultipleInfo: ProcessorInfo = {
- name: 'validateMultiple',
- process: validateMultiple,
- fullValue: true,
- processSync: validateMultipleSync,
- shouldProcess: shouldValidate,
+export const validateMultipleInfo: ProcessorInfo<
+ ValidationContext,
+ FieldError | null
+> = {
+ name: 'validateMultiple',
+ process: validateMultiple,
+ fullValue: true,
+ processSync: validateMultipleSync,
+ shouldProcess: shouldValidate,
};
diff --git a/src/utils/formUtil.ts b/src/utils/formUtil.ts
index 1c4248b5..2f35b58a 100644
--- a/src/utils/formUtil.ts
+++ b/src/utils/formUtil.ts
@@ -604,13 +604,13 @@ export function getComponentActualValue(component: Component, compPath: string,
let value = null;
if (row) {
- value = get(row, compPath);
+ value = get(row, compPath);
}
if (data && isNil(value)) {
- value = get(data, compPath);
+ value = get(data, compPath);
}
if (isNil(value) || (isObject(value) && isEmpty(value))) {
- value = '';
+ value = '';
}
return value;
}
@@ -982,20 +982,20 @@ export function generateFormChange(type: any, data: any) {
export function applyFormChanges(form: any, changes: any) {
const failed: any = [];
- changes.forEach(function(change: any) {
+ changes.forEach(function (change: any) {
var found = false;
switch (change.op) {
case 'add':
var newComponent = change.component;
// Find the container to set the component in.
- findComponent(form.components, change.container, null, function(parent: any) {
+ findComponent(form.components, change.container, null, function (parent: any) {
if (!change.container) {
parent = form;
}
// A move will first run an add so remove any existing components with matching key before inserting.
- findComponent(form.components, change.key, null, function(component: any, path: any) {
+ findComponent(form.components, change.key, null, function (component: any, path: any) {
// If found, use the existing component. (If someone else edited it, the changes would be here)
newComponent = component;
removeComponent(form.components, path);
@@ -1007,7 +1007,7 @@ export function applyFormChanges(form: any, changes: any) {
});
break;
case 'remove':
- findComponent(form.components, change.key, null, function(component: any, path: any) {
+ findComponent(form.components, change.key, null, function (component: any, path: any) {
found = true;
const oldComponent = get(form.components, path);
if (oldComponent.key !== component.key) {
@@ -1017,7 +1017,7 @@ export function applyFormChanges(form: any, changes: any) {
});
break;
case 'edit':
- findComponent(form.components, change.key, null, function(component: any, path: any) {
+ findComponent(form.components, change.key, null, function (component: any, path: any) {
found = true;
try {
const oldComponent = get(form.components, path);
@@ -1048,18 +1048,18 @@ export function applyFormChanges(form: any, changes: any) {
};
}
- /**
- * This function will find a component in a form and return the component AND THE PATH to the component in the form.
- * Path to the component is stored as an array of nested components and their indexes.The Path is being filled recursively
- * when you iterating through the nested structure.
- * If the component is not found the callback won't be called and function won't return anything.
- *
- * @param components
- * @param key
- * @param fn
- * @param path
- * @returns {*}
- */
+/**
+* This function will find a component in a form and return the component AND THE PATH to the component in the form.
+* Path to the component is stored as an array of nested components and their indexes.The Path is being filled recursively
+* when you iterating through the nested structure.
+* If the component is not found the callback won't be called and function won't return anything.
+*
+* @param components
+* @param key
+* @param fn
+* @param path
+* @returns {*}
+*/
export function findComponent(components: any, key: any, path: any, fn: any) {
if (!components) return;
path = path || [];
@@ -1068,7 +1068,7 @@ export function findComponent(components: any, key: any, path: any, fn: any) {
return fn(components);
}
- components.forEach(function(component: any, index: any) {
+ components.forEach(function (component: any, index: any) {
var newPath = path.slice();
// Add an index of the component it iterates through in nested structure
newPath.push(index);
@@ -1076,7 +1076,7 @@ export function findComponent(components: any, key: any, path: any, fn: any) {
if (component.hasOwnProperty('columns') && Array.isArray(component.columns)) {
newPath.push('columns');
- component.columns.forEach(function(column: any, index: any) {
+ component.columns.forEach(function (column: any, index: any) {
var colPath = newPath.slice();
colPath.push(index);
colPath.push('components');
@@ -1086,10 +1086,10 @@ export function findComponent(components: any, key: any, path: any, fn: any) {
if (component.hasOwnProperty('rows') && Array.isArray(component.rows)) {
newPath.push('rows');
- component.rows.forEach(function(row: any, index: any) {
+ component.rows.forEach(function (row: any, index: any) {
var rowPath = newPath.slice();
rowPath.push(index);
- row.forEach(function(column: any, index: any) {
+ row.forEach(function (column: any, index: any) {
var colPath = rowPath.slice();
colPath.push(index);
colPath.push('components');
@@ -1121,20 +1121,20 @@ const isTextAreaComponent = (component: Component): component is TextAreaCompone
const isTextFieldComponent = (component: Component): component is TextFieldComponent => component.type === 'textfield';
export function getEmptyValue(component: Component) {
- switch (component.type) {
- case 'textarea':
- case 'textfield':
- case 'time':
- case 'datetime':
- case 'day':
- return '';
- case 'datagrid':
- case 'editgrid':
- return [];
-
- default:
- return null;
- }
+ switch (component.type) {
+ case 'textarea':
+ case 'textfield':
+ case 'time':
+ case 'datetime':
+ case 'day':
+ return '';
+ case 'datagrid':
+ case 'editgrid':
+ return [];
+
+ default:
+ return null;
+ }
}
const replaceBlanks = (value: unknown) => {
@@ -1146,17 +1146,17 @@ const replaceBlanks = (value: unknown) => {
};
function trimBlanks(value: unknown) {
- if (!value) {
- return value;
- }
-
- if (Array.isArray(value)) {
- value = value.map((val: any) => replaceBlanks(val));
- }
- else {
- value = replaceBlanks(value);
- }
+ if (!value) {
return value;
+ }
+
+ if (Array.isArray(value)) {
+ value = value.map((val: any) => replaceBlanks(val));
+ }
+ else {
+ value = replaceBlanks(value);
+ }
+ return value;
}
function isValueEmpty(component: Component, value: any) {
@@ -1165,42 +1165,42 @@ function isValueEmpty(component: Component, value: any) {
}
export function isComponentDataEmpty(component: Component, data: any, path: string): boolean {
- const value = get(data, path);
- if (isCheckboxComponent(component)) {
- return isValueEmpty(component, value) || value === false;
- } else if (isDataGridComponent(component) || isEditGridComponent(component) || isDataTableComponent(component) || hasChildComponents(component)) {
- if (component.components?.length) {
- let childrenEmpty = true;
- // wrap component in an array to let eachComponentData handle introspection to child components (e.g. this will be different
- // for data grids versus nested forms, etc.)
- eachComponentData([component], data, (thisComponent, data, row, path, components, index) => {
- if (component.key === thisComponent.key) return;
- if (!isComponentDataEmpty(thisComponent, data, path)) {
- childrenEmpty = false;
- }
- });
- return isValueEmpty(component, value) || childrenEmpty;
- }
- return isValueEmpty(component, value);
- } else if (isDateTimeComponent(component)) {
- return isValueEmpty(component, value) || value.toString() === 'Invalid date';
- } else if (isSelectBoxesComponent(component)) {
- let selectBoxEmpty = true;
- for (const key in value) {
- if (value[key]) {
- selectBoxEmpty = false;
- break;
- }
+ const value = get(data, path);
+ if (isCheckboxComponent(component)) {
+ return isValueEmpty(component, value) || value === false;
+ } else if (isDataGridComponent(component) || isEditGridComponent(component) || isDataTableComponent(component) || hasChildComponents(component)) {
+ if (component.components?.length) {
+ let childrenEmpty = true;
+ // wrap component in an array to let eachComponentData handle introspection to child components (e.g. this will be different
+ // for data grids versus nested forms, etc.)
+ eachComponentData([component], data, (thisComponent, data, row, path, components, index) => {
+ if (component.key === thisComponent.key) return;
+ if (!isComponentDataEmpty(thisComponent, data, path)) {
+ childrenEmpty = false;
}
- return isValueEmpty(component, value) || selectBoxEmpty;
- } else if (isTextAreaComponent(component)) {
- const isPlain = !component.wysiwyg && !component.editor;
- return isPlain ? typeof value === 'string' ? isValueEmpty(component, value.trim()) : isValueEmpty(component, value) : isValueEmpty(component, trimBlanks(value));
- } else if (isTextFieldComponent(component)) {
- if (component.allowMultipleMasks && !!component.inputMasks && !!component.inputMasks.length) {
- return isValueEmpty(component, value) || (component.multiple ? value.length === 0 : (!value.maskName || !value.value));
- }
- return isValueEmpty(component, value?.toString().trim());
+ });
+ return isValueEmpty(component, value) || childrenEmpty;
}
return isValueEmpty(component, value);
+ } else if (isDateTimeComponent(component)) {
+ return isValueEmpty(component, value) || value.toString() === 'Invalid date';
+ } else if (isSelectBoxesComponent(component)) {
+ let selectBoxEmpty = true;
+ for (const key in value) {
+ if (value[key]) {
+ selectBoxEmpty = false;
+ break;
+ }
+ }
+ return isValueEmpty(component, value) || selectBoxEmpty;
+ } else if (isTextAreaComponent(component)) {
+ const isPlain = !component.wysiwyg && !component.editor;
+ return isPlain ? typeof value === 'string' ? isValueEmpty(component, value.trim()) : isValueEmpty(component, value) : isValueEmpty(component, trimBlanks(value));
+ } else if (isTextFieldComponent(component)) {
+ if (component.allowMultipleMasks && !!component.inputMasks && !!component.inputMasks.length) {
+ return isValueEmpty(component, value) || (component.multiple ? value.length === 0 : (!value.maskName || !value.value));
+ }
+ return isValueEmpty(component, value?.toString().trim());
+ }
+ return isValueEmpty(component, value);
}
diff --git a/src/utils/index.ts b/src/utils/index.ts
index a1fdbfe6..7f6e9135 100644
--- a/src/utils/index.ts
+++ b/src/utils/index.ts
@@ -1,5 +1,5 @@
export { Evaluator, EvaluatorOptions, BaseEvaluator } from './Evaluator';
-export { JSONLogicEvaluator } from 'modules/jsonlogic';
+export { JSONLogicEvaluator } from '../modules/jsonlogic';
export { sanitize } from './sanitize';
export { override } from './override';
export { unwind } from './unwind';
diff --git a/yarn.lock b/yarn.lock
index fdf9e8dd..a1d33bc8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -17,11 +17,24 @@
dependencies:
"@babel/highlight" "^7.18.6"
+"@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2":
+ version "7.24.2"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae"
+ integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==
+ dependencies:
+ "@babel/highlight" "^7.24.2"
+ picocolors "^1.0.0"
+
"@babel/compat-data@^7.20.5":
version "7.21.0"
resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz"
integrity sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==
+"@babel/compat-data@^7.23.5":
+ version "7.24.4"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a"
+ integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==
+
"@babel/core@^7.0.0":
version "7.21.3"
resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz"
@@ -43,6 +56,27 @@
json5 "^2.2.2"
semver "^6.3.0"
+"@babel/core@^7.7.5":
+ version "7.24.5"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a"
+ integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.24.2"
+ "@babel/generator" "^7.24.5"
+ "@babel/helper-compilation-targets" "^7.23.6"
+ "@babel/helper-module-transforms" "^7.24.5"
+ "@babel/helpers" "^7.24.5"
+ "@babel/parser" "^7.24.5"
+ "@babel/template" "^7.24.0"
+ "@babel/traverse" "^7.24.5"
+ "@babel/types" "^7.24.5"
+ convert-source-map "^2.0.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
"@babel/generator@^7.21.3":
version "7.21.3"
resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz"
@@ -53,6 +87,16 @@
"@jridgewell/trace-mapping" "^0.3.17"
jsesc "^2.5.1"
+"@babel/generator@^7.24.5":
+ version "7.24.5"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3"
+ integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==
+ dependencies:
+ "@babel/types" "^7.24.5"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
+ jsesc "^2.5.1"
+
"@babel/helper-compilation-targets@^7.20.7":
version "7.20.7"
resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz"
@@ -64,11 +108,27 @@
lru-cache "^5.1.1"
semver "^6.3.0"
+"@babel/helper-compilation-targets@^7.23.6":
+ version "7.23.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991"
+ integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==
+ dependencies:
+ "@babel/compat-data" "^7.23.5"
+ "@babel/helper-validator-option" "^7.23.5"
+ browserslist "^4.22.2"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
"@babel/helper-environment-visitor@^7.18.9":
version "7.18.9"
resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz"
integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==
+"@babel/helper-environment-visitor@^7.22.20":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
+ integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
+
"@babel/helper-function-name@^7.21.0":
version "7.21.0"
resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz"
@@ -77,6 +137,14 @@
"@babel/template" "^7.20.7"
"@babel/types" "^7.21.0"
+"@babel/helper-function-name@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759"
+ integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
+ dependencies:
+ "@babel/template" "^7.22.15"
+ "@babel/types" "^7.23.0"
+
"@babel/helper-hoist-variables@^7.18.6":
version "7.18.6"
resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz"
@@ -84,6 +152,13 @@
dependencies:
"@babel/types" "^7.18.6"
+"@babel/helper-hoist-variables@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
+ integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
"@babel/helper-module-imports@^7.18.6":
version "7.18.6"
resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz"
@@ -91,6 +166,13 @@
dependencies:
"@babel/types" "^7.18.6"
+"@babel/helper-module-imports@^7.24.3":
+ version "7.24.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128"
+ integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==
+ dependencies:
+ "@babel/types" "^7.24.0"
+
"@babel/helper-module-transforms@^7.21.2":
version "7.21.2"
resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz"
@@ -105,6 +187,17 @@
"@babel/traverse" "^7.21.2"
"@babel/types" "^7.21.2"
+"@babel/helper-module-transforms@^7.24.5":
+ version "7.24.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545"
+ integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-module-imports" "^7.24.3"
+ "@babel/helper-simple-access" "^7.24.5"
+ "@babel/helper-split-export-declaration" "^7.24.5"
+ "@babel/helper-validator-identifier" "^7.24.5"
+
"@babel/helper-simple-access@^7.20.2":
version "7.20.2"
resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz"
@@ -112,6 +205,13 @@
dependencies:
"@babel/types" "^7.20.2"
+"@babel/helper-simple-access@^7.24.5":
+ version "7.24.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba"
+ integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==
+ dependencies:
+ "@babel/types" "^7.24.5"
+
"@babel/helper-split-export-declaration@^7.18.6":
version "7.18.6"
resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz"
@@ -119,21 +219,43 @@
dependencies:
"@babel/types" "^7.18.6"
+"@babel/helper-split-export-declaration@^7.24.5":
+ version "7.24.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6"
+ integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==
+ dependencies:
+ "@babel/types" "^7.24.5"
+
"@babel/helper-string-parser@^7.19.4":
version "7.19.4"
resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz"
integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==
+"@babel/helper-string-parser@^7.24.1":
+ version "7.24.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e"
+ integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==
+
"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1":
version "7.19.1"
resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz"
integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==
+"@babel/helper-validator-identifier@^7.24.5":
+ version "7.24.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62"
+ integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==
+
"@babel/helper-validator-option@^7.18.6":
version "7.21.0"
resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz"
integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==
+"@babel/helper-validator-option@^7.23.5":
+ version "7.23.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307"
+ integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==
+
"@babel/helpers@^7.21.0":
version "7.21.0"
resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz"
@@ -143,6 +265,15 @@
"@babel/traverse" "^7.21.0"
"@babel/types" "^7.21.0"
+"@babel/helpers@^7.24.5":
+ version "7.24.5"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a"
+ integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==
+ dependencies:
+ "@babel/template" "^7.24.0"
+ "@babel/traverse" "^7.24.5"
+ "@babel/types" "^7.24.5"
+
"@babel/highlight@^7.18.6":
version "7.18.6"
resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz"
@@ -152,11 +283,26 @@
chalk "^2.0.0"
js-tokens "^4.0.0"
+"@babel/highlight@^7.24.2":
+ version "7.24.5"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e"
+ integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.24.5"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+ picocolors "^1.0.0"
+
"@babel/parser@^7.20.7", "@babel/parser@^7.21.3":
version "7.21.3"
resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz"
integrity sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==
+"@babel/parser@^7.24.0", "@babel/parser@^7.24.5":
+ version "7.24.5"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790"
+ integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==
+
"@babel/runtime@^7.0.0":
version "7.21.0"
resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz"
@@ -173,6 +319,15 @@
"@babel/parser" "^7.20.7"
"@babel/types" "^7.20.7"
+"@babel/template@^7.22.15", "@babel/template@^7.24.0":
+ version "7.24.0"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50"
+ integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==
+ dependencies:
+ "@babel/code-frame" "^7.23.5"
+ "@babel/parser" "^7.24.0"
+ "@babel/types" "^7.24.0"
+
"@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.3":
version "7.21.3"
resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz"
@@ -189,6 +344,22 @@
debug "^4.1.0"
globals "^11.1.0"
+"@babel/traverse@^7.24.5":
+ version "7.24.5"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8"
+ integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==
+ dependencies:
+ "@babel/code-frame" "^7.24.2"
+ "@babel/generator" "^7.24.5"
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-function-name" "^7.23.0"
+ "@babel/helper-hoist-variables" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.24.5"
+ "@babel/parser" "^7.24.5"
+ "@babel/types" "^7.24.5"
+ debug "^4.3.1"
+ globals "^11.1.0"
+
"@babel/types@^7.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.3":
version "7.21.3"
resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz"
@@ -198,6 +369,15 @@
"@babel/helper-validator-identifier" "^7.19.1"
to-fast-properties "^2.0.0"
+"@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5":
+ version "7.24.5"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7"
+ integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==
+ dependencies:
+ "@babel/helper-string-parser" "^7.24.1"
+ "@babel/helper-validator-identifier" "^7.24.5"
+ to-fast-properties "^2.0.0"
+
"@cspotcode/source-map-support@^0.8.0":
version "0.8.1"
resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1"
@@ -222,6 +402,22 @@
dependencies:
is-negated-glob "^1.0.0"
+"@istanbuljs/load-nyc-config@^1.0.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
+ integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==
+ dependencies:
+ camelcase "^5.3.1"
+ find-up "^4.1.0"
+ get-package-type "^0.1.0"
+ js-yaml "^3.13.1"
+ resolve-from "^5.0.0"
+
+"@istanbuljs/schema@^0.1.2":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
+ integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
+
"@jridgewell/gen-mapping@^0.1.0":
version "0.1.1"
resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz"
@@ -248,6 +444,15 @@
"@jridgewell/sourcemap-codec" "^1.4.10"
"@jridgewell/trace-mapping" "^0.3.9"
+"@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
+ integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
+ dependencies:
+ "@jridgewell/set-array" "^1.2.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
"@jridgewell/resolve-uri@3.1.0":
version "3.1.0"
resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
@@ -268,6 +473,11 @@
resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz"
integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+"@jridgewell/set-array@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
+ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
+
"@jridgewell/source-map@^0.3.3":
version "0.3.3"
resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda"
@@ -302,9 +512,9 @@
"@jridgewell/resolve-uri" "3.1.0"
"@jridgewell/sourcemap-codec" "1.4.14"
-"@jridgewell/trace-mapping@^0.3.20":
+"@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
version "0.3.25"
- resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
dependencies:
"@jridgewell/resolve-uri" "^3.1.0"
@@ -751,6 +961,14 @@ agent-base@6:
dependencies:
debug "4"
+aggregate-error@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
+ integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
+ dependencies:
+ clean-stack "^2.0.0"
+ indent-string "^4.0.0"
+
ajv-keywords@^3.5.2:
version "3.5.2"
resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
@@ -822,11 +1040,30 @@ anymatch@^3.1.3, anymatch@~3.1.2:
normalize-path "^3.0.0"
picomatch "^2.0.4"
+append-transform@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12"
+ integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==
+ dependencies:
+ default-require-extensions "^3.0.0"
+
+archy@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz"
+ integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==
+
arg@^4.1.0:
version "4.1.3"
resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
argparse@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
@@ -978,6 +1215,14 @@ bl@^5.0.0:
inherits "^2.0.4"
readable-stream "^3.4.0"
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
brace-expansion@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
@@ -1007,9 +1252,9 @@ browser-stdout@1.3.1:
resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz"
integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
-browserslist@^4.21.10:
+browserslist@^4.21.10, browserslist@^4.22.2:
version "4.23.0"
- resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab"
integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==
dependencies:
caniuse-lite "^1.0.30001587"
@@ -1040,11 +1285,26 @@ buffer@^6.0.3:
base64-js "^1.3.1"
ieee754 "^1.2.1"
+caching-transform@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f"
+ integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==
+ dependencies:
+ hasha "^5.0.0"
+ make-dir "^3.0.0"
+ package-hash "^4.0.0"
+ write-file-atomic "^3.0.0"
+
call-signature@0.0.2:
version "0.0.2"
resolved "https://registry.npmjs.org/call-signature/-/call-signature-0.0.2.tgz"
integrity sha512-qvYvkAVcoae0obt8OsZn0VEBHeEpvYIZDy1gGYtZDJG0fHawew+Mi0dBjieFz8F8dzQ2Kr19+nsDm+T5XFVs+Q==
+camelcase@^5.0.0, camelcase@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
camelcase@^6.0.0:
version "6.3.0"
resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz"
@@ -1078,7 +1338,7 @@ chai@4.4.1:
pathval "^1.1.1"
type-detect "^4.0.8"
-chalk@^2.0.0:
+chalk@^2.0.0, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -1127,6 +1387,20 @@ chrome-trace-event@^1.0.2:
resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
+clean-stack@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
+ integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
+
+cliui@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
+ integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^6.2.0"
+
cliui@^7.0.2:
version "7.0.4"
resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz"
@@ -1206,6 +1480,16 @@ commander@^9.0.0:
resolved "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30"
integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+ integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
convert-source-map@^1.7.0:
version "1.9.0"
resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz"
@@ -1259,7 +1543,7 @@ create-require@^1.1.0:
resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
-cross-spawn@^7.0.3:
+cross-spawn@^7.0.0, cross-spawn@^7.0.3:
version "7.0.3"
resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
@@ -1317,13 +1601,18 @@ dayjs@^1.11.11:
resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e"
integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==
-debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1:
+debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
version "4.3.4"
resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
dependencies:
ms "2.1.2"
+decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz"
+ integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
+
decamelize@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz"
@@ -1346,6 +1635,13 @@ deep-is@~0.1.3:
resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+default-require-extensions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.1.tgz#bfae00feeaeada68c2ae256c62540f60b80625bd"
+ integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==
+ dependencies:
+ strip-bom "^4.0.0"
+
define-properties@^1.1.2:
version "1.2.0"
resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz"
@@ -1513,6 +1809,11 @@ es-module-lexer@^1.2.1:
resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527"
integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==
+es6-error@^4.0.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
+ integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==
+
escalade@^3.1.1:
version "3.1.1"
resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
@@ -1548,7 +1849,7 @@ eslint-scope@5.1.1:
esrecurse "^4.3.0"
estraverse "^4.1.1"
-esprima@^4.0.1:
+esprima@^4.0.0, esprima@^4.0.1:
version "4.0.1"
resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
@@ -1713,6 +2014,15 @@ fill-range@^7.0.1:
dependencies:
to-regex-range "^5.0.1"
+find-cache-dir@^3.2.0:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b"
+ integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^3.0.2"
+ pkg-dir "^4.1.0"
+
find-up@5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz"
@@ -1721,7 +2031,7 @@ find-up@5.0.0:
locate-path "^6.0.0"
path-exists "^4.0.0"
-find-up@^4.0.0:
+find-up@^4.0.0, find-up@^4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
@@ -1777,6 +2087,14 @@ for-own@^1.0.0:
dependencies:
for-in "^1.0.1"
+foreground-child@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53"
+ integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==
+ dependencies:
+ cross-spawn "^7.0.0"
+ signal-exit "^3.0.2"
+
forever-agent@~0.6.1:
version "0.6.1"
resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz"
@@ -1800,6 +2118,11 @@ form-data@~2.3.2:
combined-stream "^1.0.6"
mime-types "^2.1.12"
+fromentries@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a"
+ integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==
+
fs-mkdirp-stream@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-2.0.1.tgz#1e82575c4023929ad35cf69269f84f1a8c973aa7"
@@ -1828,7 +2151,7 @@ gensync@^1.0.0-beta.2:
resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
-get-caller-file@^2.0.5:
+get-caller-file@^2.0.1, get-caller-file@^2.0.5:
version "2.0.5"
resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
@@ -1847,6 +2170,11 @@ get-intrinsic@^1.1.1:
has "^1.0.3"
has-symbols "^1.0.3"
+get-package-type@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
+ integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
+
getpass@^0.1.1:
version "0.1.7"
resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz"
@@ -1906,6 +2234,18 @@ glob@8.1.0:
minimatch "^5.0.1"
once "^1.3.0"
+glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
+ version "7.2.3"
+ resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.1.1"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
global-modules@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz"
@@ -1958,7 +2298,7 @@ glogg@^2.2.0:
dependencies:
sparkles "^2.1.0"
-graceful-fs@^4.1.2, graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.8:
+graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.8:
version "4.2.11"
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
@@ -2063,6 +2403,14 @@ has@^1.0.3:
dependencies:
function-bind "^1.1.1"
+hasha@^5.0.0:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1"
+ integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==
+ dependencies:
+ is-stream "^2.0.0"
+ type-fest "^0.8.0"
+
he@1.2.0:
version "1.2.0"
resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz"
@@ -2089,6 +2437,11 @@ html-encoding-sniffer@^3.0.0:
dependencies:
whatwg-encoding "^2.0.0"
+html-escaper@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
+ integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
+
http-proxy-agent@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43"
@@ -2147,6 +2500,16 @@ import-local@^3.0.2:
pkg-dir "^4.2.0"
resolve-cwd "^3.0.0"
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+indent-string@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+ integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+
indexof@0.0.1:
version "0.0.1"
resolved "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz"
@@ -2258,12 +2621,17 @@ is-relative@^1.0.0:
dependencies:
is-unc-path "^1.0.0"
+is-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
is-subset@^0.1.1:
version "0.1.1"
resolved "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz"
integrity sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==
-is-typedarray@~1.0.0:
+is-typedarray@^1.0.0, is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==
@@ -2285,7 +2653,7 @@ is-valid-glob@^1.0.0:
resolved "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz"
integrity sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==
-is-windows@^1.0.1:
+is-windows@^1.0.1, is-windows@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz"
integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
@@ -2315,6 +2683,66 @@ isstream@~0.1.2:
resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz"
integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==
+istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756"
+ integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==
+
+istanbul-lib-hook@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6"
+ integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==
+ dependencies:
+ append-transform "^2.0.0"
+
+istanbul-lib-instrument@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d"
+ integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==
+ dependencies:
+ "@babel/core" "^7.7.5"
+ "@istanbuljs/schema" "^0.1.2"
+ istanbul-lib-coverage "^3.0.0"
+ semver "^6.3.0"
+
+istanbul-lib-processinfo@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169"
+ integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==
+ dependencies:
+ archy "^1.0.0"
+ cross-spawn "^7.0.3"
+ istanbul-lib-coverage "^3.2.0"
+ p-map "^3.0.0"
+ rimraf "^3.0.0"
+ uuid "^8.3.2"
+
+istanbul-lib-report@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d"
+ integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==
+ dependencies:
+ istanbul-lib-coverage "^3.0.0"
+ make-dir "^4.0.0"
+ supports-color "^7.1.0"
+
+istanbul-lib-source-maps@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551"
+ integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==
+ dependencies:
+ debug "^4.1.1"
+ istanbul-lib-coverage "^3.0.0"
+ source-map "^0.6.1"
+
+istanbul-reports@^3.0.2:
+ version "3.1.7"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b"
+ integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==
+ dependencies:
+ html-escaper "^2.0.0"
+ istanbul-lib-report "^3.0.0"
+
jest-worker@^27.4.5:
version "27.5.1"
resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
@@ -2336,6 +2764,14 @@ js-yaml@4.1.0:
dependencies:
argparse "^2.0.1"
+js-yaml@^3.13.1:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz"
@@ -2437,7 +2873,7 @@ json-stringify-safe@~5.0.1:
resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
-json5@^2.2.2:
+json5@^2.2.2, json5@^2.2.3:
version "2.2.3"
resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
@@ -2527,6 +2963,11 @@ locate-path@^6.0.0:
dependencies:
p-locate "^5.0.0"
+lodash.flattendeep@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2"
+ integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==
+
lodash.get@^4.4.2:
version "4.4.2"
resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
@@ -2581,6 +3022,20 @@ lunr@^2.3.9:
resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1"
integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==
+make-dir@^3.0.0, make-dir@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+ integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+ dependencies:
+ semver "^6.0.0"
+
+make-dir@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e"
+ integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==
+ dependencies:
+ semver "^7.5.3"
+
make-error@^1.1.1:
version "1.3.6"
resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
@@ -2640,6 +3095,13 @@ minimatch@5.0.1:
dependencies:
brace-expansion "^2.0.1"
+minimatch@^3.0.4, minimatch@^3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
minimatch@^5.0.1:
version "5.1.6"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96"
@@ -2748,6 +3210,13 @@ node-fetch@~2.6.1:
dependencies:
whatwg-url "^5.0.0"
+node-preload@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301"
+ integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==
+ dependencies:
+ process-on-spawn "^1.0.0"
+
node-releases@^2.0.14:
version "2.0.14"
resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b"
@@ -2780,6 +3249,39 @@ nwsapi@^2.2.4:
resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.9.tgz#7f3303218372db2e9f27c27766bcfc59ae7e61c6"
integrity sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==
+nyc@^15.1.0:
+ version "15.1.0"
+ resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02"
+ integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==
+ dependencies:
+ "@istanbuljs/load-nyc-config" "^1.0.0"
+ "@istanbuljs/schema" "^0.1.2"
+ caching-transform "^4.0.0"
+ convert-source-map "^1.7.0"
+ decamelize "^1.2.0"
+ find-cache-dir "^3.2.0"
+ find-up "^4.1.0"
+ foreground-child "^2.0.0"
+ get-package-type "^0.1.0"
+ glob "^7.1.6"
+ istanbul-lib-coverage "^3.0.0"
+ istanbul-lib-hook "^3.0.0"
+ istanbul-lib-instrument "^4.0.0"
+ istanbul-lib-processinfo "^2.0.2"
+ istanbul-lib-report "^3.0.0"
+ istanbul-lib-source-maps "^4.0.0"
+ istanbul-reports "^3.0.2"
+ make-dir "^3.0.0"
+ node-preload "^0.2.1"
+ p-map "^3.0.0"
+ process-on-spawn "^1.0.0"
+ resolve-from "^5.0.0"
+ rimraf "^3.0.0"
+ signal-exit "^3.0.2"
+ spawn-wrap "^2.0.0"
+ test-exclude "^6.0.0"
+ yargs "^15.0.2"
+
oauth-sign@~0.9.0:
version "0.9.0"
resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz"
@@ -2854,11 +3356,28 @@ p-locate@^5.0.0:
dependencies:
p-limit "^3.0.2"
+p-map@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d"
+ integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==
+ dependencies:
+ aggregate-error "^3.0.0"
+
p-try@^2.0.0:
version "2.2.0"
resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+package-hash@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506"
+ integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==
+ dependencies:
+ graceful-fs "^4.1.15"
+ hasha "^5.0.0"
+ lodash.flattendeep "^4.4.0"
+ release-zalgo "^1.0.0"
+
parse-filepath@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891"
@@ -2890,6 +3409,11 @@ path-exists@^4.0.0:
resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
@@ -2947,7 +3471,7 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-pkg-dir@^4.2.0:
+pkg-dir@^4.1.0, pkg-dir@^4.2.0:
version "4.2.0"
resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
@@ -3086,6 +3610,13 @@ process-nextick-args@~2.0.0:
resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+process-on-spawn@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93"
+ integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==
+ dependencies:
+ fromentries "^1.2.0"
+
process@^0.11.10:
version "0.11.10"
resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
@@ -3194,6 +3725,13 @@ regenerator-runtime@^0.13.11:
resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz"
integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
+release-zalgo@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730"
+ integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==
+ dependencies:
+ es6-error "^4.0.1"
+
remove-trailing-separator@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz"
@@ -3256,6 +3794,11 @@ require-directory@^2.1.1:
resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz"
integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
requires-port@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
@@ -3302,6 +3845,13 @@ reusify@^1.0.4:
resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+rimraf@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
rrweb-cssom@^0.6.0:
version "0.6.0"
resolved "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1"
@@ -3366,6 +3916,11 @@ semver-greatest-satisfied-range@^2.0.0:
dependencies:
sver "^1.8.3"
+semver@^6.0.0, semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
semver@^6.3.0:
version "6.3.0"
resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
@@ -3378,6 +3933,11 @@ semver@^7.3.4:
dependencies:
lru-cache "^6.0.0"
+semver@^7.5.3:
+ version "7.6.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13"
+ integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==
+
serialize-javascript@6.0.0:
version "6.0.0"
resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz"
@@ -3392,6 +3952,11 @@ serialize-javascript@^6.0.1:
dependencies:
randombytes "^2.1.0"
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
+
shallow-clone@^3.0.0:
version "3.0.1"
resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
@@ -3421,6 +3986,11 @@ shiki@^0.14.7:
vscode-oniguruma "^1.7.0"
vscode-textmate "^8.0.0"
+signal-exit@^3.0.2:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
sinon@^17.0.2:
version "17.0.2"
resolved "https://registry.npmjs.org/sinon/-/sinon-17.0.2.tgz#470894bcc2d24b01bad539722ea46da949892405"
@@ -3446,7 +4016,7 @@ source-map-support@~0.5.20:
buffer-from "^1.0.0"
source-map "^0.6.0"
-source-map@^0.6.0, source-map@~0.6.1:
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
@@ -3461,6 +4031,23 @@ sparkles@^2.1.0:
resolved "https://registry.npmjs.org/sparkles/-/sparkles-2.1.0.tgz#8ad4e8cecba7e568bba660c39b6db46625ecf1ad"
integrity sha512-r7iW1bDw8R/cFifrD3JnQJX0K1jqT0kprL48BiBpLZLJPmAm34zsVBsK5lc7HirZYZqMW65dOXZgbAGt/I6frg==
+spawn-wrap@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e"
+ integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==
+ dependencies:
+ foreground-child "^2.0.0"
+ is-windows "^1.0.2"
+ make-dir "^3.0.0"
+ rimraf "^3.0.0"
+ signal-exit "^3.0.2"
+ which "^2.0.1"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
+
sshpk@^1.7.0:
version "1.17.0"
resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz"
@@ -3559,6 +4146,11 @@ strip-bom@^3.0.0:
resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
+strip-bom@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
+ integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
+
strip-json-comments@3.1.1:
version "3.1.1"
resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
@@ -3635,6 +4227,15 @@ terser@^5.26.0:
commander "^2.20.0"
source-map-support "~0.5.20"
+test-exclude@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
+ integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==
+ dependencies:
+ "@istanbuljs/schema" "^0.1.2"
+ glob "^7.1.4"
+ minimatch "^3.0.4"
+
through2@^2.0.0:
version "2.0.5"
resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz"
@@ -3788,11 +4389,23 @@ type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.8:
resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz"
integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+type-fest@^0.8.0:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
+ integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+
type-name@^2.0.1:
version "2.0.2"
resolved "https://registry.npmjs.org/type-name/-/type-name-2.0.2.tgz"
integrity sha512-kkgkuqR/jKdKO5oh/I2SMu2dGbLXoJq0zkdgbxaqYK+hr9S9edwVVGf+tMUFTx2gH9TN2+Zu9JZ/Njonb3cjhA==
+typedarray-to-buffer@^3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+ integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+ dependencies:
+ is-typedarray "^1.0.0"
+
typedoc@^0.25.13:
version "0.25.13"
resolved "https://registry.npmjs.org/typedoc/-/typedoc-0.25.13.tgz#9a98819e3b2d155a6d78589b46fa4c03768f0922"
@@ -3883,6 +4496,11 @@ uuid@^3.3.2:
resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz"
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+uuid@^8.3.2:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+ integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
v8-compile-cache-lib@^3.0.1:
version "3.0.1"
resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
@@ -4125,6 +4743,11 @@ whatwg-url@^7.0.0:
tr46 "^1.0.1"
webidl-conversions "^4.0.2"
+which-module@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409"
+ integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
+
which@^1.2.14:
version "1.3.1"
resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz"
@@ -4154,6 +4777,15 @@ workerpool@6.2.1:
resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz"
integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==
+wrap-ansi@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+ integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"
@@ -4168,6 +4800,16 @@ wrappy@1:
resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+write-file-atomic@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
+ integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
+ dependencies:
+ imurmurhash "^0.1.4"
+ is-typedarray "^1.0.0"
+ signal-exit "^3.0.2"
+ typedarray-to-buffer "^3.1.5"
+
written-number@^0.11.1:
version "0.11.1"
resolved "https://registry.npmjs.org/written-number/-/written-number-0.11.1.tgz#ef060a7b5ad5ff8fbf4ff88daa8fb2260726ecc9"
@@ -4205,6 +4847,11 @@ xtend@^4.0.0, xtend@~4.0.1:
resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+y18n@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
+ integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
y18n@^5.0.5:
version "5.0.8"
resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz"
@@ -4225,6 +4872,14 @@ yargs-parser@20.2.4:
resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz"
integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==
+yargs-parser@^18.1.2:
+ version "18.1.3"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
+ integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
yargs-parser@^20.2.2:
version "20.2.9"
resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz"
@@ -4253,6 +4908,28 @@ yargs@16.2.0, yargs@^16.2.0:
y18n "^5.0.5"
yargs-parser "^20.2.2"
+yargs@^15.0.2:
+ version "15.4.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
+ integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
+ dependencies:
+ cliui "^6.0.0"
+ decamelize "^1.2.0"
+ find-up "^4.1.0"
+ get-caller-file "^2.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^2.0.0"
+ set-blocking "^2.0.0"
+ string-width "^4.2.0"
+ which-module "^2.0.0"
+ y18n "^4.0.0"
+ yargs-parser "^18.1.2"
+
+yarn.lock@^0.0.1-security:
+ version "0.0.1-security"
+ resolved "https://registry.yarnpkg.com/yarn.lock/-/yarn.lock-0.0.1-security.tgz#8e7117924bfe916671b21f14212ba1bb49dfe0c7"
+ integrity sha512-ZRX6v5zGCJMI1T2aO+BQxJggy1vvorXEwonQhWXIC+brO7lkDB3zWelVNAti183ddH6FmJP8z4UDCJnJlioK4Q==
+
yn@3.1.1:
version "3.1.1"
resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"