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"